happy-css-modules 2.1.2 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/emitter/dts.js +8 -7
- package/dist/emitter/dts.js.map +1 -1
- package/dist/emitter/dts.test.js +1 -1
- package/dist/emitter/dts.test.js.map +1 -1
- package/dist/emitter/file-system.js.map +1 -1
- package/dist/emitter/index.js +1 -1
- package/dist/emitter/index.js.map +1 -1
- package/dist/emitter/source-map.js +2 -2
- package/dist/emitter/source-map.js.map +1 -1
- package/dist/emitter/source-map.test.js +2 -2
- package/dist/emitter/source-map.test.js.map +1 -1
- package/dist/integration-test/go-to-definition.test.js +1 -36
- package/dist/integration-test/go-to-definition.test.js.map +1 -1
- package/dist/locator/index.d.ts +1 -1
- package/dist/locator/index.js +6 -16
- package/dist/locator/index.js.map +1 -1
- package/dist/locator/index.test.js +23 -119
- package/dist/locator/index.test.js.map +1 -1
- package/dist/locator/postcss.d.ts +1 -12
- package/dist/locator/postcss.js +3 -42
- package/dist/locator/postcss.js.map +1 -1
- package/dist/locator/postcss.test.js +7 -53
- package/dist/locator/postcss.test.js.map +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/regression-test/issue-168.test.js.map +1 -1
- package/dist/resolver/index.d.ts +1 -1
- package/dist/resolver/index.js +2 -0
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/node-resolver.js +2 -2
- package/dist/resolver/node-resolver.js.map +1 -1
- package/dist/resolver/webpack-resolver.js +7 -8
- package/dist/resolver/webpack-resolver.js.map +1 -1
- package/dist/runner.js +9 -7
- package/dist/runner.js.map +1 -1
- package/dist/runner.test.js +16 -15
- package/dist/runner.test.js.map +1 -1
- package/dist/test-util/jest/resolver.cjs +3 -2
- package/dist/test-util/jest/resolver.cjs.map +1 -1
- package/dist/test-util/tsserver.d.ts +2 -2
- package/dist/test-util/tsserver.js +6 -7
- package/dist/test-util/tsserver.js.map +1 -1
- package/dist/test-util/util.d.ts +1 -2
- package/dist/test-util/util.js +3 -4
- package/dist/test-util/util.js.map +1 -1
- package/dist/transformer/index.d.ts +1 -1
- package/dist/transformer/index.js.map +1 -1
- package/dist/transformer/less-transformer.js +1 -0
- package/dist/transformer/less-transformer.js.map +1 -1
- package/dist/transformer/less-transformer.test.js +1 -9
- package/dist/transformer/less-transformer.test.js.map +1 -1
- package/dist/transformer/scss-transformer.js +3 -3
- package/dist/transformer/scss-transformer.js.map +1 -1
- package/dist/transformer/scss-transformer.test.js +1 -9
- package/dist/transformer/scss-transformer.test.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.js +10 -7
- package/dist/util.js.map +1 -1
- package/package.json +17 -17
- package/src/emitter/dts.test.ts +1 -1
- package/src/emitter/dts.ts +10 -9
- package/src/emitter/index.ts +1 -1
- package/src/emitter/source-map.test.ts +2 -2
- package/src/emitter/source-map.ts +2 -2
- package/src/integration-test/go-to-definition.test.ts +1 -36
- package/src/locator/index.test.ts +23 -124
- package/src/locator/index.ts +7 -23
- package/src/locator/postcss.test.ts +7 -74
- package/src/locator/postcss.ts +3 -44
- package/src/resolver/index.ts +3 -1
- package/src/resolver/node-resolver.ts +2 -2
- package/src/resolver/webpack-resolver.ts +7 -8
- package/src/runner.test.ts +17 -17
- package/src/runner.ts +9 -8
- package/src/test-util/jest/resolver.cjs +3 -2
- package/src/test-util/tsserver.ts +7 -11
- package/src/test-util/util.ts +4 -6
- package/src/transformer/index.ts +1 -1
- package/src/transformer/less-transformer.test.ts +1 -9
- package/src/transformer/less-transformer.ts +1 -0
- package/src/transformer/postcss-transformer.ts +1 -1
- package/src/transformer/scss-transformer.test.ts +1 -9
- package/src/transformer/scss-transformer.ts +2 -2
- package/src/util.ts +10 -7
|
@@ -19,8 +19,6 @@ test('handles sass features', async () => {
|
|
|
19
19
|
// sass feature test (nesting)
|
|
20
20
|
.a_2_1 { dummy: ''; }
|
|
21
21
|
&_2 { dummy: ''; }
|
|
22
|
-
composes: a_1; // css module feature test (composes)
|
|
23
|
-
composes: d from './4.scss'; // css module feature test (composes from other file)
|
|
24
22
|
}
|
|
25
23
|
`,
|
|
26
24
|
'/test/2.scss': dedent `
|
|
@@ -41,7 +39,7 @@ test('handles sass features', async () => {
|
|
|
41
39
|
// FIXME: The end position of 'a_2_2' is incorrect.
|
|
42
40
|
expect(result).toMatchInlineSnapshot(`
|
|
43
41
|
{
|
|
44
|
-
dependencies: ["<fixtures>/test/2.scss", "<fixtures>/test/3.scss"
|
|
42
|
+
dependencies: ["<fixtures>/test/2.scss", "<fixtures>/test/3.scss"],
|
|
45
43
|
tokens: [
|
|
46
44
|
{
|
|
47
45
|
name: "b_1",
|
|
@@ -80,12 +78,6 @@ test('handles sass features', async () => {
|
|
|
80
78
|
{ filePath: "<fixtures>/test/1.scss", start: { line: 8, column: 3 }, end: { line: 8, column: 8 } },
|
|
81
79
|
],
|
|
82
80
|
},
|
|
83
|
-
{
|
|
84
|
-
name: "d",
|
|
85
|
-
originalLocations: [
|
|
86
|
-
{ filePath: "<fixtures>/test/4.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
|
|
87
|
-
],
|
|
88
|
-
},
|
|
89
81
|
],
|
|
90
82
|
}
|
|
91
83
|
`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scss-transformer.test.js","sourceRoot":"","sources":["../../src/transformer/scss-transformer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;AACtE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAE5C,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,SAAS,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;IACvC,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA
|
|
1
|
+
{"version":3,"file":"scss-transformer.test.js","sourceRoot":"","sources":["../../src/transformer/scss-transformer.test.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -18,4 +18,4 @@ export declare function isMatchByGlob(filePath: string, pattern: string, options
|
|
|
18
18
|
cwd: string;
|
|
19
19
|
}): boolean;
|
|
20
20
|
export declare function getPackageJson(): any;
|
|
21
|
-
export declare function getInstalledPeerDependencies():
|
|
21
|
+
export declare function getInstalledPeerDependencies(): string[];
|
package/dist/util.js
CHANGED
|
@@ -3,7 +3,7 @@ import { access } from 'fs/promises';
|
|
|
3
3
|
import { join, dirname, resolve } from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { resolve as importMetaResolve } from 'import-meta-resolve';
|
|
6
|
-
import minimatch from 'minimatch';
|
|
6
|
+
import { minimatch } from 'minimatch';
|
|
7
7
|
export function isSystemError(value) {
|
|
8
8
|
return (isObject(value) &&
|
|
9
9
|
hasProp(value, 'constructor') &&
|
|
@@ -49,20 +49,23 @@ export async function exists(path) {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
export function isMatchByGlob(filePath, pattern, options) {
|
|
52
|
-
return minimatch(filePath, join(options.cwd, pattern));
|
|
52
|
+
return minimatch(filePath, join(options.cwd, pattern), { windowsPathsNoEscape: true });
|
|
53
53
|
}
|
|
54
54
|
export function getPackageJson() {
|
|
55
55
|
return JSON.parse(readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '../package.json'), 'utf-8'));
|
|
56
56
|
}
|
|
57
|
-
export
|
|
57
|
+
export function getInstalledPeerDependencies() {
|
|
58
58
|
const pkgJson = getPackageJson();
|
|
59
59
|
const result = [];
|
|
60
60
|
for (const deps of Object.keys(pkgJson.peerDependencies)) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (isInstalled)
|
|
61
|
+
try {
|
|
62
|
+
importMetaResolve(deps, import.meta.url);
|
|
63
|
+
// If the package is installed, push it to the result array.
|
|
65
64
|
result.push(deps);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// If the package is not installed, do nothing.
|
|
68
|
+
}
|
|
66
69
|
}
|
|
67
70
|
return result;
|
|
68
71
|
}
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,SAAS,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "happy-css-modules",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Creates .d.ts files from CSS Modules .css files",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,31 +28,31 @@
|
|
|
28
28
|
"author": "mizdra",
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"engines": {
|
|
31
|
-
"node": ">=
|
|
31
|
+
"node": ">=18.0.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@file-cache/core": "^
|
|
35
|
-
"@file-cache/npm": "^
|
|
34
|
+
"@file-cache/core": "^2.0.0",
|
|
35
|
+
"@file-cache/npm": "^2.0.0",
|
|
36
36
|
"await-lock": "^2.2.2",
|
|
37
|
-
"camelcase": "^
|
|
38
|
-
"chalk": "^5.0
|
|
39
|
-
"chokidar": "^3.
|
|
40
|
-
"enhanced-resolve": "^5.
|
|
41
|
-
"glob": "^
|
|
42
|
-
"import-meta-resolve": "^
|
|
43
|
-
"minimatch": "^
|
|
44
|
-
"postcss": "^8.4.
|
|
45
|
-
"postcss-load-config": "^
|
|
46
|
-
"postcss-modules": "^
|
|
47
|
-
"postcss-selector-parser": "^6.0.
|
|
37
|
+
"camelcase": "^8.0.0",
|
|
38
|
+
"chalk": "^5.3.0",
|
|
39
|
+
"chokidar": "^3.6.0",
|
|
40
|
+
"enhanced-resolve": "^5.16.1",
|
|
41
|
+
"glob": "^10.3.15",
|
|
42
|
+
"import-meta-resolve": "^4.1.0",
|
|
43
|
+
"minimatch": "^9.0.4",
|
|
44
|
+
"postcss": "^8.4.38",
|
|
45
|
+
"postcss-load-config": "^5.1.0",
|
|
46
|
+
"postcss-modules": "^6.0.0",
|
|
47
|
+
"postcss-selector-parser": "^6.0.16",
|
|
48
48
|
"postcss-value-parser": "^4.2.0",
|
|
49
49
|
"source-map": "^0.7.4",
|
|
50
|
-
"yargs": "^17.
|
|
50
|
+
"yargs": "^17.7.2"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
53
|
"less": "^3.0.0 || ^4.0.0",
|
|
54
54
|
"postcss": "^8.0.0",
|
|
55
|
-
"sass": "^1.
|
|
55
|
+
"sass": "^1.63.3"
|
|
56
56
|
},
|
|
57
57
|
"peerDependenciesMeta": {
|
|
58
58
|
"sass": {
|
package/src/emitter/dts.test.ts
CHANGED
package/src/emitter/dts.ts
CHANGED
|
@@ -15,14 +15,14 @@ import { getRelativePath, type DtsFormatOptions } from './index.js';
|
|
|
15
15
|
export function getDtsFilePath(filePath: string, arbitraryExtensions: boolean): string {
|
|
16
16
|
if (arbitraryExtensions) {
|
|
17
17
|
const { dir, name, ext } = parse(filePath);
|
|
18
|
-
return join(dir, name
|
|
18
|
+
return join(dir, `${name}.d${ext}.ts`);
|
|
19
19
|
} else {
|
|
20
|
-
return filePath
|
|
20
|
+
return `${filePath}.d.ts`;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
function dashesCamelCase(str: string): string {
|
|
25
|
-
return str.replace(/-+(\w)/
|
|
25
|
+
return str.replace(/-+(\w)/gu, (match, firstLetter) => {
|
|
26
26
|
return firstLetter.toUpperCase();
|
|
27
27
|
});
|
|
28
28
|
}
|
|
@@ -53,9 +53,9 @@ function generateTokenDeclarations(
|
|
|
53
53
|
tokens: Token[],
|
|
54
54
|
dtsFormatOptions: DtsFormatOptions | undefined,
|
|
55
55
|
isExternalFile: (filePath: string) => boolean,
|
|
56
|
-
): typeof SourceNode[] {
|
|
56
|
+
): (typeof SourceNode)[] {
|
|
57
57
|
const formattedTokens = formatTokens(tokens, dtsFormatOptions?.localsConvention);
|
|
58
|
-
const result: typeof SourceNode[] = [];
|
|
58
|
+
const result: (typeof SourceNode)[] = [];
|
|
59
59
|
|
|
60
60
|
for (const token of formattedTokens) {
|
|
61
61
|
// Only one original position can be associated with one generated position.
|
|
@@ -66,7 +66,7 @@ function generateTokenDeclarations(
|
|
|
66
66
|
if (originalLocation.filePath === undefined) {
|
|
67
67
|
// If the original location is not specified, fallback to the source file.
|
|
68
68
|
originalLocation = {
|
|
69
|
-
filePath
|
|
69
|
+
filePath,
|
|
70
70
|
start: { line: 1, column: 1 },
|
|
71
71
|
end: { line: 1, column: 1 },
|
|
72
72
|
};
|
|
@@ -101,6 +101,7 @@ function generateTokenDeclarations(
|
|
|
101
101
|
return result;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
// eslint-disable-next-line max-params
|
|
104
105
|
export function generateDtsContentWithSourceMap(
|
|
105
106
|
filePath: string,
|
|
106
107
|
dtsFilePath: string,
|
|
@@ -122,10 +123,10 @@ export function generateDtsContentWithSourceMap(
|
|
|
122
123
|
sourceNode = new SourceNode(null, null, null, '');
|
|
123
124
|
} else {
|
|
124
125
|
sourceNode = new SourceNode(1, 0, getRelativePath(sourceMapFilePath, filePath), [
|
|
125
|
-
|
|
126
|
+
`declare const styles:${EOL}`,
|
|
126
127
|
...tokenDeclarations.map((tokenDeclaration) => [' ', tokenDeclaration, EOL]),
|
|
127
|
-
|
|
128
|
-
|
|
128
|
+
`;${EOL}`,
|
|
129
|
+
`export default styles;${EOL}`,
|
|
129
130
|
]);
|
|
130
131
|
}
|
|
131
132
|
const codeWithSourceMap = sourceNode.toStringWithSourceMap({
|
package/src/emitter/index.ts
CHANGED
|
@@ -10,9 +10,9 @@ test('getSourceMapFilePath', () => {
|
|
|
10
10
|
|
|
11
11
|
test('generateSourceMappingURLComment', () => {
|
|
12
12
|
expect(generateSourceMappingURLComment('/app/src/dir/1.css.d.ts', '/app/src/dir/1.css.d.ts.map')).toBe(
|
|
13
|
-
|
|
13
|
+
`//# sourceMappingURL=./1.css.d.ts.map${EOL}`,
|
|
14
14
|
);
|
|
15
15
|
expect(generateSourceMappingURLComment('/app/src/dir1/1.css.d.ts', '/app/src/dir2/1.css.d.ts.map')).toBe(
|
|
16
|
-
|
|
16
|
+
`//# sourceMappingURL=../dir2/1.css.d.ts.map${EOL}`,
|
|
17
17
|
);
|
|
18
18
|
});
|
|
@@ -9,9 +9,9 @@ import { getRelativePath } from './index.js';
|
|
|
9
9
|
* @returns The path to the .d.ts.map file. It is absolute.
|
|
10
10
|
*/
|
|
11
11
|
export function getSourceMapFilePath(filePath: string, arbitraryExtensions: boolean): string {
|
|
12
|
-
return getDtsFilePath(filePath, arbitraryExtensions)
|
|
12
|
+
return `${getDtsFilePath(filePath, arbitraryExtensions)}.map`;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export function generateSourceMappingURLComment(dtsFilePath: string, sourceMapFilePath: string): string {
|
|
16
|
-
return `//# sourceMappingURL=${getRelativePath(dtsFilePath, sourceMapFilePath)}
|
|
16
|
+
return `//# sourceMappingURL=${getRelativePath(dtsFilePath, sourceMapFilePath)}${EOL}`;
|
|
17
17
|
}
|
|
@@ -4,7 +4,7 @@ import { run } from '../runner.js';
|
|
|
4
4
|
import { createTSServer } from '../test-util/tsserver.js';
|
|
5
5
|
import { createFixtures, getFixturePath } from '../test-util/util.js';
|
|
6
6
|
|
|
7
|
-
const server =
|
|
7
|
+
const server = createTSServer();
|
|
8
8
|
|
|
9
9
|
const defaultOptions: RunnerOptions = {
|
|
10
10
|
pattern: 'test/**/*.{css,scss}',
|
|
@@ -41,10 +41,6 @@ test('basic', async () => {
|
|
|
41
41
|
.local_class_name_3 {}
|
|
42
42
|
}
|
|
43
43
|
:local(.local_class_name_4) {}
|
|
44
|
-
.composes_target {}
|
|
45
|
-
.composes {
|
|
46
|
-
composes: composes_target;
|
|
47
|
-
}
|
|
48
44
|
`,
|
|
49
45
|
});
|
|
50
46
|
await run({ ...defaultOptions });
|
|
@@ -65,8 +61,6 @@ test('basic', async () => {
|
|
|
65
61
|
'local_class_name_2',
|
|
66
62
|
'local_class_name_3',
|
|
67
63
|
'local_class_name_4',
|
|
68
|
-
'composes_target',
|
|
69
|
-
'composes',
|
|
70
64
|
]);
|
|
71
65
|
// FIXME: Fix an issue where the text at definition destination was incorrect.
|
|
72
66
|
expect(results).toMatchInlineSnapshot(`
|
|
@@ -208,23 +202,6 @@ test('basic', async () => {
|
|
|
208
202
|
],
|
|
209
203
|
"identifier": "local_class_name_4",
|
|
210
204
|
},
|
|
211
|
-
{
|
|
212
|
-
"definitions": [
|
|
213
|
-
{
|
|
214
|
-
file: "<fixtures>/test/1.css",
|
|
215
|
-
text: ".composes_target ",
|
|
216
|
-
start: { line: 21, offset: 1 },
|
|
217
|
-
end: { line: 21, offset: 18 },
|
|
218
|
-
},
|
|
219
|
-
],
|
|
220
|
-
"identifier": "composes_target",
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
"definitions": [
|
|
224
|
-
{ file: "<fixtures>/test/1.css", text: ".composes ", start: { line: 22, offset: 1 }, end: { line: 22, offset: 11 } },
|
|
225
|
-
],
|
|
226
|
-
"identifier": "composes",
|
|
227
|
-
},
|
|
228
205
|
]
|
|
229
206
|
`);
|
|
230
207
|
const moduleDefinitions = await server.getModuleDefinitions(getFixturePath('/test/1.css'));
|
|
@@ -295,8 +272,6 @@ test('with transformer', async () => {
|
|
|
295
272
|
// sass feature test (nesting)
|
|
296
273
|
.nesting_1 { dummy: ''; }
|
|
297
274
|
&_2 { dummy: ''; }
|
|
298
|
-
composes: basic; // css module feature test (composes)
|
|
299
|
-
composes: d from './4.scss'; // css module feature test (composes from other file)
|
|
300
275
|
}
|
|
301
276
|
`,
|
|
302
277
|
'/test/2.scss': dedent`
|
|
@@ -306,9 +281,6 @@ test('with transformer', async () => {
|
|
|
306
281
|
'/test/3.scss': dedent`
|
|
307
282
|
.c { dummy: ''; }
|
|
308
283
|
`,
|
|
309
|
-
'/test/4.scss': dedent`
|
|
310
|
-
.d { dummy: ''; }
|
|
311
|
-
`,
|
|
312
284
|
});
|
|
313
285
|
await run({ ...defaultOptions });
|
|
314
286
|
const results = await server.getMultipleIdentifierDefinitions(getFixturePath(`/test/1.scss`), [
|
|
@@ -319,7 +291,6 @@ test('with transformer', async () => {
|
|
|
319
291
|
'b_1',
|
|
320
292
|
'b_2',
|
|
321
293
|
'c',
|
|
322
|
-
'd',
|
|
323
294
|
]);
|
|
324
295
|
expect(results).toMatchInlineSnapshot(`
|
|
325
296
|
[
|
|
@@ -364,12 +335,6 @@ test('with transformer', async () => {
|
|
|
364
335
|
],
|
|
365
336
|
"identifier": "c",
|
|
366
337
|
},
|
|
367
|
-
{
|
|
368
|
-
"definitions": [
|
|
369
|
-
{ file: "<fixtures>/test/4.scss", text: ".d ", start: { line: 1, offset: 1 }, end: { line: 1, offset: 4 } },
|
|
370
|
-
],
|
|
371
|
-
"identifier": "d",
|
|
372
|
-
},
|
|
373
338
|
]
|
|
374
339
|
`);
|
|
375
340
|
});
|
|
@@ -1,29 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import { jest } from '@jest/globals';
|
|
4
4
|
import dedent from 'dedent';
|
|
5
|
-
import { createDefaultTransformer } from '../index.js';
|
|
6
|
-
import { createFixtures,
|
|
5
|
+
import { Locator, createDefaultTransformer } from '../index.js';
|
|
6
|
+
import { createFixtures, getFixturePath } from '../test-util/util.js';
|
|
7
7
|
import { sleepSync } from '../util.js';
|
|
8
8
|
|
|
9
|
-
const readFileSpy = jest.spyOn(fs, 'readFile');
|
|
10
|
-
// In ESM, for some reason, we need to explicitly mock module
|
|
11
|
-
jest.unstable_mockModule('fs/promises', () => ({
|
|
12
|
-
...fs, // Inherit native functions (e.g., fs.stat)
|
|
13
|
-
readFile: readFileSpy,
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
// After the mock of fs/promises is complete, . /index.js after the mock of fs/promises is complete.
|
|
17
|
-
// ref: https://www.coolcomputerclub.com/posts/jest-hoist-await/
|
|
18
|
-
const { Locator } = await import('./index.js');
|
|
19
|
-
// NOTE: ../test/util.js depends on . /index.js, so it must also be imported dynamically...
|
|
20
|
-
|
|
21
9
|
const locator = new Locator();
|
|
22
10
|
|
|
23
|
-
afterEach(() => {
|
|
24
|
-
readFileSpy.mockClear();
|
|
25
|
-
});
|
|
26
|
-
|
|
27
11
|
test('basic', async () => {
|
|
28
12
|
createFixtures({
|
|
29
13
|
'/test/1.css': dedent`
|
|
@@ -117,30 +101,22 @@ test('tracks other files when `@import` is present', async () => {
|
|
|
117
101
|
`);
|
|
118
102
|
});
|
|
119
103
|
|
|
120
|
-
test('
|
|
104
|
+
test('does not track other files by `composes`', async () => {
|
|
121
105
|
createFixtures({
|
|
122
106
|
'/test/1.css': dedent`
|
|
123
107
|
.a {
|
|
124
108
|
composes: b from './2.css';
|
|
125
|
-
composes: c
|
|
126
|
-
composes: e from '${getFixturePath('/test/4.css')}';
|
|
109
|
+
composes: c from './3.css'; /* non-existent file */
|
|
127
110
|
}
|
|
128
111
|
`,
|
|
129
112
|
'/test/2.css': dedent`
|
|
130
113
|
.b {}
|
|
131
114
|
`,
|
|
132
|
-
'/test/3.css': dedent`
|
|
133
|
-
.c {}
|
|
134
|
-
.d {}
|
|
135
|
-
`,
|
|
136
|
-
'/test/4.css': dedent`
|
|
137
|
-
.e {}
|
|
138
|
-
`,
|
|
139
115
|
});
|
|
140
116
|
const result = await locator.load(getFixturePath('/test/1.css'));
|
|
141
117
|
expect(result).toMatchInlineSnapshot(`
|
|
142
118
|
{
|
|
143
|
-
dependencies: [
|
|
119
|
+
dependencies: [],
|
|
144
120
|
tokens: [
|
|
145
121
|
{
|
|
146
122
|
name: "a",
|
|
@@ -148,30 +124,6 @@ test('tracks other files when `composes` is present', async () => {
|
|
|
148
124
|
{ filePath: "<fixtures>/test/1.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
|
|
149
125
|
],
|
|
150
126
|
},
|
|
151
|
-
{
|
|
152
|
-
name: "b",
|
|
153
|
-
originalLocations: [
|
|
154
|
-
{ filePath: "<fixtures>/test/2.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
|
|
155
|
-
],
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
name: "c",
|
|
159
|
-
originalLocations: [
|
|
160
|
-
{ filePath: "<fixtures>/test/3.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
|
|
161
|
-
],
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
name: "d",
|
|
165
|
-
originalLocations: [
|
|
166
|
-
{ filePath: "<fixtures>/test/3.css", start: { line: 2, column: 1 }, end: { line: 2, column: 2 } },
|
|
167
|
-
],
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
name: "e",
|
|
171
|
-
originalLocations: [
|
|
172
|
-
{ filePath: "<fixtures>/test/4.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
|
|
173
|
-
],
|
|
174
|
-
},
|
|
175
127
|
],
|
|
176
128
|
}
|
|
177
129
|
`);
|
|
@@ -183,14 +135,7 @@ test('normalizes tokens', async () => {
|
|
|
183
135
|
/* duplicate import */
|
|
184
136
|
@import './2.css';
|
|
185
137
|
@import '2.css';
|
|
186
|
-
.a {
|
|
187
|
-
/* duplicate composes */
|
|
188
|
-
composes: c from './3.css';
|
|
189
|
-
composes: c from '3.css';
|
|
190
|
-
composes: c c from './3.css';
|
|
191
|
-
/* duplicate import and composes */
|
|
192
|
-
composes: b from './2.css';
|
|
193
|
-
}
|
|
138
|
+
.a {}
|
|
194
139
|
.a {} /* duplicate class selector */
|
|
195
140
|
`,
|
|
196
141
|
'/test/2.css': dedent`
|
|
@@ -204,14 +149,14 @@ test('normalizes tokens', async () => {
|
|
|
204
149
|
const result = await locator.load(getFixturePath('/test/1.css'));
|
|
205
150
|
expect(result).toMatchInlineSnapshot(`
|
|
206
151
|
{
|
|
207
|
-
dependencies: ["<fixtures>/test/2.css"
|
|
152
|
+
dependencies: ["<fixtures>/test/2.css"],
|
|
208
153
|
tokens: [
|
|
209
154
|
{
|
|
210
155
|
name: "a",
|
|
211
156
|
originalLocations: [
|
|
212
157
|
{ filePath: "<fixtures>/test/2.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
|
|
213
158
|
{ filePath: "<fixtures>/test/1.css", start: { line: 4, column: 1 }, end: { line: 4, column: 2 } },
|
|
214
|
-
{ filePath: "<fixtures>/test/1.css", start: { line:
|
|
159
|
+
{ filePath: "<fixtures>/test/1.css", start: { line: 5, column: 1 }, end: { line: 5, column: 2 } },
|
|
215
160
|
],
|
|
216
161
|
},
|
|
217
162
|
{
|
|
@@ -220,27 +165,16 @@ test('normalizes tokens', async () => {
|
|
|
220
165
|
{ filePath: "<fixtures>/test/2.css", start: { line: 2, column: 1 }, end: { line: 2, column: 2 } },
|
|
221
166
|
],
|
|
222
167
|
},
|
|
223
|
-
{
|
|
224
|
-
name: "c",
|
|
225
|
-
originalLocations: [
|
|
226
|
-
{ filePath: "<fixtures>/test/3.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
|
|
227
|
-
],
|
|
228
|
-
},
|
|
229
168
|
],
|
|
230
169
|
}
|
|
231
170
|
`);
|
|
232
171
|
});
|
|
233
172
|
|
|
234
|
-
test
|
|
173
|
+
test('returns the result from the cache when the file has not been modified', async () => {
|
|
235
174
|
createFixtures({
|
|
236
175
|
'/test/1.css': dedent`
|
|
237
176
|
@import './2.css';
|
|
238
|
-
@import './
|
|
239
|
-
.a {
|
|
240
|
-
composes: b from './2.css';
|
|
241
|
-
composes: c from './3.css';
|
|
242
|
-
composes: d from './3.css';
|
|
243
|
-
}
|
|
177
|
+
@import './3.css';
|
|
244
178
|
`,
|
|
245
179
|
'/test/2.css': dedent`
|
|
246
180
|
.b {}
|
|
@@ -250,12 +184,14 @@ test.failing('returns the result from the cache when the file has not been modif
|
|
|
250
184
|
.d {}
|
|
251
185
|
`,
|
|
252
186
|
});
|
|
187
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
188
|
+
const readCSSSpy = jest.spyOn(locator, 'readCSS' as any);
|
|
253
189
|
await locator.load(getFixturePath('/test/1.css'));
|
|
254
|
-
expect(
|
|
255
|
-
expect(
|
|
256
|
-
expect(
|
|
257
|
-
expect(
|
|
258
|
-
|
|
190
|
+
expect(readCSSSpy).toHaveBeenCalledTimes(3);
|
|
191
|
+
expect(readCSSSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.css'));
|
|
192
|
+
expect(readCSSSpy).toHaveBeenNthCalledWith(2, getFixturePath('/test/2.css'));
|
|
193
|
+
expect(readCSSSpy).toHaveBeenNthCalledWith(3, getFixturePath('/test/3.css'));
|
|
194
|
+
readCSSSpy.mockClear();
|
|
259
195
|
|
|
260
196
|
// update `/test/2.css`
|
|
261
197
|
sleepSync(1); // wait for the file system to update the mtime
|
|
@@ -263,54 +199,17 @@ test.failing('returns the result from the cache when the file has not been modif
|
|
|
263
199
|
|
|
264
200
|
// `3.css` is not updated, so the cache is used. Therefore, `readFile` is not called.
|
|
265
201
|
await locator.load(getFixturePath('/test/3.css'));
|
|
266
|
-
expect(
|
|
202
|
+
expect(readCSSSpy).toHaveBeenCalledTimes(0);
|
|
267
203
|
|
|
268
204
|
// `1.css` is not updated, but dependencies are updated, so the cache is used. Therefore, `readFile` is called.
|
|
269
205
|
await locator.load(getFixturePath('/test/1.css'));
|
|
270
|
-
expect(
|
|
271
|
-
expect(
|
|
272
|
-
expect(
|
|
206
|
+
expect(readCSSSpy).toHaveBeenCalledTimes(2);
|
|
207
|
+
expect(readCSSSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.css'));
|
|
208
|
+
expect(readCSSSpy).toHaveBeenNthCalledWith(2, getFixturePath('/test/2.css'));
|
|
273
209
|
|
|
274
210
|
// ``2.css` is updated, but the cache is already available because it was updated in the previous step. Therefore, `readFile` is not called.
|
|
275
211
|
await locator.load(getFixturePath('/test/2.css'));
|
|
276
|
-
expect(
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
test('ignores the composition of non-existent tokens', async () => {
|
|
280
|
-
// In css-loader and postcss-modules, compositions of non-existent tokens are simply ignored.
|
|
281
|
-
// Therefore, happy-css-modules follows suit.
|
|
282
|
-
// It may be preferable to warn rather than ignore, but for now, we will focus on compatibility.
|
|
283
|
-
// ref: https://github.com/css-modules/css-modules/issues/356
|
|
284
|
-
createFixtures({
|
|
285
|
-
'/test/1.css': dedent`
|
|
286
|
-
.a {
|
|
287
|
-
composes: b c from './2.css';
|
|
288
|
-
}
|
|
289
|
-
`,
|
|
290
|
-
'/test/2.css': dedent`
|
|
291
|
-
.b {}
|
|
292
|
-
`,
|
|
293
|
-
});
|
|
294
|
-
const result = await locator.load(getFixturePath('/test/1.css'));
|
|
295
|
-
expect(result.tokens.map((t) => t.name)).toStrictEqual(['a', 'b']);
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
test('throws error the composition of non-existent file', async () => {
|
|
299
|
-
// In postcss-modules, compositions of non-existent file are causes an error.
|
|
300
|
-
// Therefore, happy-css-modules follows suit.
|
|
301
|
-
createFixtures({
|
|
302
|
-
'/test/1.css': dedent`
|
|
303
|
-
.a {
|
|
304
|
-
composes: a from './2.css';
|
|
305
|
-
}
|
|
306
|
-
`,
|
|
307
|
-
});
|
|
308
|
-
await expect(async () => {
|
|
309
|
-
await locator.load(getFixturePath('/test/1.css')).catch((e) => {
|
|
310
|
-
e.message = e.message.replace(FIXTURE_DIR_PATH, '<fixtures>');
|
|
311
|
-
throw e;
|
|
312
|
-
});
|
|
313
|
-
}).rejects.toThrowError(`Could not resolve './2.css' in '<fixtures>/test/1.css'`);
|
|
212
|
+
expect(readCSSSpy).toHaveBeenCalledTimes(2);
|
|
314
213
|
});
|
|
315
214
|
|
|
316
215
|
describe('supports sourcemap', () => {
|