Skip to content

Commit 90f3131

Browse files
mattcompilesmichaeltaranto
authored andcommitted
fix: Only emit files if contents changed (#7)
fix #5
1 parent 073b1d4 commit 90f3131

File tree

1 file changed

+49
-34
lines changed

1 file changed

+49
-34
lines changed

index.js

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const getTypeMismatchError = ({ filename, expected, actual }) => {
1717
return new Error(
1818
`Generated type declaration file is outdated. Run webpack and commit the updated type declaration for '${filename}'\n\n${diff}`
1919
);
20-
}
20+
};
2121

2222
const cssModuleToNamedExports = cssModuleKeys => {
2323
return cssModuleKeys
@@ -35,8 +35,21 @@ const filenameToTypingsFilename = filename => {
3535

3636
const validModes = ['emit', 'verify'];
3737

38+
const isFileNotFound = err => err && err.code === 'ENOENT';
39+
40+
const makeDoneHandlers = (callback, content, rest) => ({
41+
failed: e => callback(e),
42+
success: () => callback(null, content, ...rest)
43+
});
44+
45+
const makeFileHandlers = filename => ({
46+
read: handler => fs.readFile(filename, { encoding: 'utf-8' }, handler),
47+
write: (content, handler) =>
48+
fs.writeFile(filename, content, { encoding: 'utf-8' }, handler)
49+
});
50+
3851
module.exports = function(content, ...rest) {
39-
const callback = this.async();
52+
const { failed, success } = makeDoneHandlers(this.async(), content, rest);
4053

4154
const filename = this.resourcePath;
4255
const { mode = 'emit' } = loaderUtils.getOptions(this) || {};
@@ -45,6 +58,7 @@ module.exports = function(content, ...rest) {
4558
}
4659

4760
const cssModuleInterfaceFilename = filenameToTypingsFilename(filename);
61+
const { read, write } = makeFileHandlers(cssModuleInterfaceFilename);
4862

4963
const keyRegex = /"([^\\"]+)":/g;
5064
let match;
@@ -61,43 +75,44 @@ module.exports = function(content, ...rest) {
6175
)}`;
6276

6377
if (mode === 'verify') {
64-
fs.readFile(
65-
cssModuleInterfaceFilename,
66-
{ encoding: 'utf-8' },
67-
(err, fileContents) => {
68-
if (err) {
69-
const error =
70-
err.code === 'ENOENT'
71-
? getNoDeclarationFileError({
72-
filename: cssModuleInterfaceFilename
73-
})
74-
: err;
75-
return callback(error);
76-
}
77-
78-
if (cssModuleDefinition !== fileContents) {
79-
return callback(getTypeMismatchError({
78+
read((err, fileContents) => {
79+
if (isFileNotFound(err)) {
80+
return failed(
81+
getNoDeclarationFileError({
82+
filename: cssModuleInterfaceFilename
83+
})
84+
);
85+
}
86+
87+
if (err) {
88+
return failed(err);
89+
}
90+
91+
if (cssModuleDefinition !== fileContents) {
92+
return failed(
93+
getTypeMismatchError({
8094
filename: cssModuleInterfaceFilename,
8195
expected: cssModuleDefinition,
8296
actual: fileContents
83-
}));
84-
}
85-
86-
return callback(null, content, ...rest);
97+
})
98+
);
8799
}
88-
);
100+
101+
return success();
102+
});
89103
} else {
90-
fs.writeFile(
91-
cssModuleInterfaceFilename,
92-
cssModuleDefinition,
93-
{ encoding: 'utf-8' },
94-
err => {
95-
if (err) {
96-
return callback(err);
97-
} else {
98-
return callback(null, content, ...rest);
99-
}
104+
read((_, fileContents) => {
105+
if (cssModuleDefinition !== fileContents) {
106+
write(cssModuleDefinition, err => {
107+
if (err) {
108+
failed(err);
109+
} else {
110+
success();
111+
}
112+
});
113+
} else {
114+
success();
100115
}
101-
);
116+
});
102117
}
103118
};

0 commit comments

Comments
 (0)