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.
Files changed (85) hide show
  1. package/README.md +5 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/emitter/dts.js +8 -7
  4. package/dist/emitter/dts.js.map +1 -1
  5. package/dist/emitter/dts.test.js +1 -1
  6. package/dist/emitter/dts.test.js.map +1 -1
  7. package/dist/emitter/file-system.js.map +1 -1
  8. package/dist/emitter/index.js +1 -1
  9. package/dist/emitter/index.js.map +1 -1
  10. package/dist/emitter/source-map.js +2 -2
  11. package/dist/emitter/source-map.js.map +1 -1
  12. package/dist/emitter/source-map.test.js +2 -2
  13. package/dist/emitter/source-map.test.js.map +1 -1
  14. package/dist/integration-test/go-to-definition.test.js +1 -36
  15. package/dist/integration-test/go-to-definition.test.js.map +1 -1
  16. package/dist/locator/index.d.ts +1 -1
  17. package/dist/locator/index.js +6 -16
  18. package/dist/locator/index.js.map +1 -1
  19. package/dist/locator/index.test.js +23 -119
  20. package/dist/locator/index.test.js.map +1 -1
  21. package/dist/locator/postcss.d.ts +1 -12
  22. package/dist/locator/postcss.js +3 -42
  23. package/dist/locator/postcss.js.map +1 -1
  24. package/dist/locator/postcss.test.js +7 -53
  25. package/dist/locator/postcss.test.js.map +1 -1
  26. package/dist/logger.js.map +1 -1
  27. package/dist/regression-test/issue-168.test.js.map +1 -1
  28. package/dist/resolver/index.d.ts +1 -1
  29. package/dist/resolver/index.js +2 -0
  30. package/dist/resolver/index.js.map +1 -1
  31. package/dist/resolver/node-resolver.js +2 -2
  32. package/dist/resolver/node-resolver.js.map +1 -1
  33. package/dist/resolver/webpack-resolver.js +7 -8
  34. package/dist/resolver/webpack-resolver.js.map +1 -1
  35. package/dist/runner.js +9 -7
  36. package/dist/runner.js.map +1 -1
  37. package/dist/runner.test.js +16 -15
  38. package/dist/runner.test.js.map +1 -1
  39. package/dist/test-util/jest/resolver.cjs +3 -2
  40. package/dist/test-util/jest/resolver.cjs.map +1 -1
  41. package/dist/test-util/tsserver.d.ts +2 -2
  42. package/dist/test-util/tsserver.js +6 -7
  43. package/dist/test-util/tsserver.js.map +1 -1
  44. package/dist/test-util/util.d.ts +1 -2
  45. package/dist/test-util/util.js +3 -4
  46. package/dist/test-util/util.js.map +1 -1
  47. package/dist/transformer/index.d.ts +1 -1
  48. package/dist/transformer/index.js.map +1 -1
  49. package/dist/transformer/less-transformer.js +1 -0
  50. package/dist/transformer/less-transformer.js.map +1 -1
  51. package/dist/transformer/less-transformer.test.js +1 -9
  52. package/dist/transformer/less-transformer.test.js.map +1 -1
  53. package/dist/transformer/scss-transformer.js +3 -3
  54. package/dist/transformer/scss-transformer.js.map +1 -1
  55. package/dist/transformer/scss-transformer.test.js +1 -9
  56. package/dist/transformer/scss-transformer.test.js.map +1 -1
  57. package/dist/util.d.ts +1 -1
  58. package/dist/util.js +10 -7
  59. package/dist/util.js.map +1 -1
  60. package/package.json +17 -17
  61. package/src/emitter/dts.test.ts +1 -1
  62. package/src/emitter/dts.ts +10 -9
  63. package/src/emitter/index.ts +1 -1
  64. package/src/emitter/source-map.test.ts +2 -2
  65. package/src/emitter/source-map.ts +2 -2
  66. package/src/integration-test/go-to-definition.test.ts +1 -36
  67. package/src/locator/index.test.ts +23 -124
  68. package/src/locator/index.ts +7 -23
  69. package/src/locator/postcss.test.ts +7 -74
  70. package/src/locator/postcss.ts +3 -44
  71. package/src/resolver/index.ts +3 -1
  72. package/src/resolver/node-resolver.ts +2 -2
  73. package/src/resolver/webpack-resolver.ts +7 -8
  74. package/src/runner.test.ts +17 -17
  75. package/src/runner.ts +9 -8
  76. package/src/test-util/jest/resolver.cjs +3 -2
  77. package/src/test-util/tsserver.ts +7 -11
  78. package/src/test-util/util.ts +4 -6
  79. package/src/transformer/index.ts +1 -1
  80. package/src/transformer/less-transformer.test.ts +1 -9
  81. package/src/transformer/less-transformer.ts +1 -0
  82. package/src/transformer/postcss-transformer.ts +1 -1
  83. package/src/transformer/scss-transformer.test.ts +1 -9
  84. package/src/transformer/scss-transformer.ts +2 -2
  85. 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", "<fixtures>/test/4.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":"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"}
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;;;;;;;;;;OAUnB;QACH,cAAc,EAAE,MAAM,CAAA;;;OAGnB;QACH,cAAc,EAAE,MAAM,CAAA;;OAEnB;QACH,cAAc,EAAE,MAAM,CAAA;;OAEnB;KACJ,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAElE,sFAAsF;IACtF,8EAA8E;IAC9E,uEAAuE;IAEvE,mDAAmD;IACnD,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IACjF,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;KAGrB;QACD,cAAc,EAAE,MAAM,CAAA;KACrB;QACD,cAAc,EAAE,MAAM,CAAA;;KAErB;QACD,cAAc,EAAE,MAAM,CAAA;KACrB;KACF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAElE,oEAAoE;IACpE,kEAAkE;IAClE,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAE3E,mFAAmF;IACnF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AAClH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;IACnD,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;KAGrB;QACD,mCAAmC,EAAE,OAAO;QAC5C,oCAAoC,EAAE,OAAO;KAC9C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CACvC,CAAC,mCAAmC,EAAE,oCAAoC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAChG,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;IAC/C,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;;KAIrB;KACF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC"}
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(): Promise<string[]>;
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 async function getInstalledPeerDependencies() {
57
+ export function getInstalledPeerDependencies() {
58
58
  const pkgJson = getPackageJson();
59
59
  const result = [];
60
60
  for (const deps of Object.keys(pkgJson.peerDependencies)) {
61
- const isInstalled = await importMetaResolve(deps, import.meta.url)
62
- .then(() => true)
63
- .catch(() => false);
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":"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"}
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": "2.1.2",
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": ">=16.0.0"
31
+ "node": ">=18.0.0"
32
32
  },
33
33
  "dependencies": {
34
- "@file-cache/core": "^1.1.3",
35
- "@file-cache/npm": "^1.1.3",
34
+ "@file-cache/core": "^2.0.0",
35
+ "@file-cache/npm": "^2.0.0",
36
36
  "await-lock": "^2.2.2",
37
- "camelcase": "^7.0.1",
38
- "chalk": "^5.0.1",
39
- "chokidar": "^3.5.3",
40
- "enhanced-resolve": "^5.10.0",
41
- "glob": "^8.0.3",
42
- "import-meta-resolve": "^2.1.0",
43
- "minimatch": "^5.1.6",
44
- "postcss": "^8.4.23",
45
- "postcss-load-config": "^4.0.1",
46
- "postcss-modules": "^4.3.1",
47
- "postcss-selector-parser": "^6.0.12",
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.5.1"
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.0.0"
55
+ "sass": "^1.63.3"
56
56
  },
57
57
  "peerDependenciesMeta": {
58
58
  "sass": {
@@ -92,7 +92,7 @@ describe('generateDtsContentWithSourceMap', () => {
92
92
  .foo_bar {}
93
93
  `,
94
94
  });
95
- return await locator.load(filePath);
95
+ return locator.load(filePath);
96
96
  }
97
97
  test('undefined', async () => {
98
98
  const result = await getResult(filePath);
@@ -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 + '.d' + ext + '.ts');
18
+ return join(dir, `${name}.d${ext}.ts`);
19
19
  } else {
20
- return filePath + '.d.ts';
20
+ return `${filePath}.d.ts`;
21
21
  }
22
22
  }
23
23
 
24
24
  function dashesCamelCase(str: string): string {
25
- return str.replace(/-+(\w)/g, function (match, firstLetter) {
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: 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
- 'declare const styles:' + EOL,
126
+ `declare const styles:${EOL}`,
126
127
  ...tokenDeclarations.map((tokenDeclaration) => [' ', tokenDeclaration, EOL]),
127
- ';' + EOL,
128
- 'export default styles;' + EOL,
128
+ `;${EOL}`,
129
+ `export default styles;${EOL}`,
129
130
  ]);
130
131
  }
131
132
  const codeWithSourceMap = sourceNode.toStringWithSourceMap({
@@ -12,7 +12,7 @@ export function getRelativePath(fromFilePath: string, toFilePath: string): strin
12
12
  if (resolved.startsWith('..')) {
13
13
  return resolved;
14
14
  } else {
15
- return './' + resolved;
15
+ return `./${resolved}`;
16
16
  }
17
17
  }
18
18
 
@@ -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
- '//# sourceMappingURL=./1.css.d.ts.map' + EOL,
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
- '//# sourceMappingURL=../dir2/1.css.d.ts.map' + EOL,
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) + '.map';
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)}` + EOL;
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 = await createTSServer();
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 fs, { readFile, writeFile } from 'fs/promises';
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, FIXTURE_DIR_PATH, getFixturePath } from '../test-util/util.js';
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('tracks other files when `composes` is present', async () => {
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 d from './3.css';
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: ["<fixtures>/test/2.css", "<fixtures>/test/3.css", "<fixtures>/test/4.css"],
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", "<fixtures>/test/3.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: 12, column: 1 }, end: { line: 12, column: 2 } },
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.failing('returns the result from the cache when the file has not been modified', async () => {
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 './2.css';
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(readFileSpy).toHaveBeenCalledTimes(3);
255
- expect(readFileSpy).toHaveBeenNthCalledWith(1, '/test/1.css', 'utf-8');
256
- expect(readFileSpy).toHaveBeenNthCalledWith(2, '/test/2.css', 'utf-8');
257
- expect(readFileSpy).toHaveBeenNthCalledWith(3, '/test/3.css', 'utf-8');
258
- readFileSpy.mockClear();
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(readFileSpy).toHaveBeenCalledTimes(0);
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(readFileSpy).toHaveBeenCalledTimes(2);
271
- expect(readFileSpy).toHaveBeenNthCalledWith(1, '/test/1.css', 'utf-8');
272
- expect(readFileSpy).toHaveBeenNthCalledWith(2, '/test/2.css', 'utf-8');
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(readFileSpy).toHaveBeenCalledTimes(2);
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', () => {