Skip to content

Commit 40132a4

Browse files
fix(verify): Show diff when ‘verify’ mode fails (#3)
1 parent 9442875 commit 40132a4

File tree

9 files changed

+66
-23
lines changed

9 files changed

+66
-23
lines changed

index.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
const fs = require('fs');
22
const path = require('path');
33
const loaderUtils = require('loader-utils');
4+
const LineDiff = require('line-diff');
45

56
const bannerMessage =
67
'// This file is automatically generated.\n// Please do not change this file!';
78

8-
const getNoDeclarationFileError = cssModuleInterfaceFilename =>
9+
const getNoDeclarationFileError = ({ filename }) =>
910
new Error(
10-
`Generated type declaration does not exist. Run webpack and commit the type declaration for '${cssModuleInterfaceFilename}'`
11+
`Generated type declaration does not exist. Run webpack and commit the type declaration for '${filename}'`
1112
);
1213

13-
const getTypeMismatchError = cssModuleInterfaceFilename =>
14-
new Error(
15-
`Generated type declaration file is outdated. Run webpack and commit the updated type declaration for '${cssModuleInterfaceFilename}'`
14+
const getTypeMismatchError = ({ filename, expected, actual }) => {
15+
const diff = new LineDiff(actual, expected).toString();
16+
17+
return new Error(
18+
`Generated type declaration file is outdated. Run webpack and commit the updated type declaration for '${filename}'\n\n${diff}`
1619
);
20+
}
1721

1822
const cssModuleToNamedExports = cssModuleKeys => {
1923
return cssModuleKeys
@@ -63,13 +67,19 @@ module.exports = function(content, ...rest) {
6367
if (err) {
6468
const error =
6569
err.code === 'ENOENT'
66-
? getNoDeclarationFileError(cssModuleInterfaceFilename)
70+
? getNoDeclarationFileError({
71+
filename: cssModuleInterfaceFilename
72+
})
6773
: err;
6874
return callback(error);
6975
}
7076

7177
if (cssModuleDefinition !== fileContents) {
72-
return callback(getTypeMismatchError(cssModuleInterfaceFilename));
78+
return callback(getTypeMismatchError({
79+
filename: cssModuleInterfaceFilename,
80+
expected: cssModuleDefinition,
81+
actual: fileContents
82+
}));
7383
}
7484

7585
return callback(null, content, ...rest);

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
}
2828
},
2929
"homepage": "https://github.com/seek-oss/css-modules-typescript-loader#readme",
30+
"dependencies": {
31+
"line-diff": "^2.0.1"
32+
},
3033
"devDependencies": {
3134
"@commitlint/cli": "^7.2.1",
3235
"commitizen": "^3.0.2",

test/getErrorMessage.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = error => error
2+
.split(process.cwd())
3+
.join('')
4+
.match(/(Error: .*?)\s{4}at /s)[1];
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Can error on invalid declaration 1`] = `
4+
"Error: Generated type declaration file is outdated. Run webpack and commit the updated type declaration for '/test/verify-invalid-declaration/index.css.d.ts'
5+
6+
// This file is automatically generated.
7+
// Please do not change this file!
8+
export const classInBothFiles: string;
9+
- export const classInTypeScriptFile: string;
10+
+ export const classInCssFile: string;
11+
12+
13+
"
14+
`;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
.someClass {
1+
.classInBothFiles {
22
position: relative;
33
}
44

5-
.otherClass {
5+
.classInCssFile {
66
display: block;
77
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
// This file is automatically generated.
22
// Please do not change this file!
3-
export const someClass: string;
4-
export const differentClass: string;
3+
export const classInBothFiles: string;
4+
export const classInTypeScriptFile: string;
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
const compiler = require('../compiler.js');
2+
const getErrorMessage = require('../getErrorMessage');
23

34
test('Can error on invalid declaration', async () => {
4-
await expect(
5-
compiler(require.resolve('./index.js'), {
5+
expect.assertions(1);
6+
7+
try {
8+
await compiler(require.resolve('./index.js'), {
69
mode: 'verify'
7-
})
8-
).rejects.toMatchObject({
9-
failed: true
10-
});
10+
});
11+
} catch (err) {
12+
expect(getErrorMessage(err.errors[0])).toMatchSnapshot();
13+
}
1114
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Can error on invalid declaration 1`] = `
4+
"Error: Generated type declaration does not exist. Run webpack and commit the type declaration for '/test/verify-missing-declaration/index.css.d.ts'
5+
"
6+
`;
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
const compiler = require('../compiler.js');
2+
const getErrorMessage = require('../getErrorMessage');
23

34
test('Can error on invalid declaration', async () => {
4-
await expect(
5-
compiler(require.resolve('./index.js'), {
5+
expect.assertions(1);
6+
7+
try {
8+
await compiler(require.resolve('./index.js'), {
69
mode: 'verify'
7-
})
8-
).rejects.toMatchObject({
9-
failed: true
10-
});
10+
});
11+
} catch (err) {
12+
expect(getErrorMessage(err.errors[0])).toMatchSnapshot();
13+
}
1114
});

0 commit comments

Comments
 (0)