happy-css-modules 3.1.0 → 3.2.0

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 (138) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.js +127 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/cli.test.d.ts +1 -0
  5. package/dist/cli.test.js +66 -0
  6. package/dist/cli.test.js.map +1 -0
  7. package/dist/config.d.ts +1 -0
  8. package/dist/config.js +2 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/emitter/dts.d.ts +15 -0
  11. package/dist/emitter/dts.js +134 -0
  12. package/dist/emitter/dts.js.map +1 -0
  13. package/dist/emitter/dts.test.d.ts +1 -0
  14. package/dist/emitter/dts.test.js +206 -0
  15. package/dist/emitter/dts.test.js.map +1 -0
  16. package/dist/emitter/file-system.d.ts +6 -0
  17. package/dist/emitter/file-system.js +26 -0
  18. package/dist/emitter/file-system.js.map +1 -0
  19. package/dist/emitter/file-system.test.d.ts +1 -0
  20. package/dist/emitter/file-system.test.js +34 -0
  21. package/dist/emitter/file-system.test.js.map +1 -0
  22. package/dist/emitter/index.d.ts +42 -0
  23. package/dist/emitter/index.js +49 -0
  24. package/dist/emitter/index.js.map +1 -0
  25. package/dist/emitter/index.test.d.ts +1 -0
  26. package/dist/emitter/index.test.js +76 -0
  27. package/dist/emitter/index.test.js.map +1 -0
  28. package/dist/emitter/source-map.d.ts +10 -0
  29. package/dist/emitter/source-map.js +17 -0
  30. package/dist/emitter/source-map.js.map +1 -0
  31. package/dist/emitter/source-map.test.d.ts +1 -0
  32. package/dist/emitter/source-map.test.js +13 -0
  33. package/dist/emitter/source-map.test.js.map +1 -0
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.js +6 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/integration-test/go-to-definition.test.d.ts +1 -0
  38. package/dist/integration-test/go-to-definition.test.js +334 -0
  39. package/dist/integration-test/go-to-definition.test.js.map +1 -0
  40. package/dist/locator/index.d.ts +46 -0
  41. package/dist/locator/index.js +173 -0
  42. package/dist/locator/index.js.map +1 -0
  43. package/dist/locator/index.test.d.ts +1 -0
  44. package/dist/locator/index.test.js +393 -0
  45. package/dist/locator/index.test.js.map +1 -0
  46. package/dist/locator/postcss.d.ts +91 -0
  47. package/dist/locator/postcss.js +241 -0
  48. package/dist/locator/postcss.js.map +1 -0
  49. package/dist/locator/postcss.test.d.ts +1 -0
  50. package/dist/locator/postcss.test.js +256 -0
  51. package/dist/locator/postcss.test.js.map +1 -0
  52. package/dist/logger.d.ts +9 -0
  53. package/dist/logger.js +28 -0
  54. package/dist/logger.js.map +1 -0
  55. package/dist/regression-test/issue-168.test.d.ts +1 -0
  56. package/dist/regression-test/issue-168.test.js +30 -0
  57. package/dist/regression-test/issue-168.test.js.map +1 -0
  58. package/dist/resolver/index.d.ts +22 -0
  59. package/dist/resolver/index.js +44 -0
  60. package/dist/resolver/index.js.map +1 -0
  61. package/dist/resolver/index.test.d.ts +1 -0
  62. package/dist/resolver/index.test.js +16 -0
  63. package/dist/resolver/index.test.js.map +1 -0
  64. package/dist/resolver/node-resolver.d.ts +2 -0
  65. package/dist/resolver/node-resolver.js +6 -0
  66. package/dist/resolver/node-resolver.js.map +1 -0
  67. package/dist/resolver/node-resolver.test.d.ts +1 -0
  68. package/dist/resolver/node-resolver.test.js +25 -0
  69. package/dist/resolver/node-resolver.test.js.map +1 -0
  70. package/dist/resolver/relative-resolver.d.ts +2 -0
  71. package/dist/resolver/relative-resolver.js +5 -0
  72. package/dist/resolver/relative-resolver.js.map +1 -0
  73. package/dist/resolver/relative-resolver.test.d.ts +1 -0
  74. package/dist/resolver/relative-resolver.test.js +12 -0
  75. package/dist/resolver/relative-resolver.test.js.map +1 -0
  76. package/dist/resolver/webpack-resolver.d.ts +24 -0
  77. package/dist/resolver/webpack-resolver.js +91 -0
  78. package/dist/resolver/webpack-resolver.js.map +1 -0
  79. package/dist/resolver/webpack-resolver.test.d.ts +1 -0
  80. package/dist/resolver/webpack-resolver.test.js +89 -0
  81. package/dist/resolver/webpack-resolver.test.js.map +1 -0
  82. package/dist/runner.d.ts +78 -0
  83. package/dist/runner.js +122 -0
  84. package/dist/runner.js.map +1 -0
  85. package/dist/runner.test.d.ts +1 -0
  86. package/dist/runner.test.js +304 -0
  87. package/dist/runner.test.js.map +1 -0
  88. package/dist/test-util/jest/resolver.cjs +31 -0
  89. package/dist/test-util/jest/resolver.cjs.map +1 -0
  90. package/dist/test-util/jest/resolver.d.cts +16 -0
  91. package/dist/test-util/tsserver.d.ts +31 -0
  92. package/dist/test-util/tsserver.js +112 -0
  93. package/dist/test-util/tsserver.js.map +1 -0
  94. package/dist/test-util/util.d.ts +29 -0
  95. package/dist/test-util/util.js +85 -0
  96. package/dist/test-util/util.js.map +1 -0
  97. package/dist/transformer/index.d.ts +30 -0
  98. package/dist/transformer/index.js +25 -0
  99. package/dist/transformer/index.js.map +1 -0
  100. package/dist/transformer/index.test.d.ts +1 -0
  101. package/dist/transformer/index.test.js +66 -0
  102. package/dist/transformer/index.test.js.map +1 -0
  103. package/dist/transformer/less-transformer.d.ts +2 -0
  104. package/dist/transformer/less-transformer.js +45 -0
  105. package/dist/transformer/less-transformer.js.map +1 -0
  106. package/dist/transformer/less-transformer.test.d.ts +1 -0
  107. package/dist/transformer/less-transformer.test.js +134 -0
  108. package/dist/transformer/less-transformer.test.js.map +1 -0
  109. package/dist/transformer/postcss-transformer.d.ts +12 -0
  110. package/dist/transformer/postcss-transformer.js +32 -0
  111. package/dist/transformer/postcss-transformer.js.map +1 -0
  112. package/dist/transformer/postcss-transformer.test.d.ts +1 -0
  113. package/dist/transformer/postcss-transformer.test.js +178 -0
  114. package/dist/transformer/postcss-transformer.test.js.map +1 -0
  115. package/dist/transformer/scss-transformer.d.ts +2 -0
  116. package/dist/transformer/scss-transformer.js +40 -0
  117. package/dist/transformer/scss-transformer.js.map +1 -0
  118. package/dist/transformer/scss-transformer.test.d.ts +1 -0
  119. package/dist/transformer/scss-transformer.test.js +149 -0
  120. package/dist/transformer/scss-transformer.test.js.map +1 -0
  121. package/dist/util.d.ts +21 -0
  122. package/dist/util.js +72 -0
  123. package/dist/util.js.map +1 -0
  124. package/dist/util.test.d.ts +1 -0
  125. package/dist/util.test.js +74 -0
  126. package/dist/util.test.js.map +1 -0
  127. package/package.json +1 -1
  128. package/src/cli.ts +6 -0
  129. package/src/emitter/dts.test.ts +7 -4
  130. package/src/emitter/dts.ts +22 -10
  131. package/src/emitter/index.test.ts +10 -0
  132. package/src/emitter/index.ts +17 -4
  133. package/src/emitter/source-map.test.ts +4 -4
  134. package/src/emitter/source-map.ts +8 -2
  135. package/src/runner.test.ts +23 -0
  136. package/src/runner.ts +6 -0
  137. package/src/library/README.md +0 -3
  138. package/src/library/source-map/index.ts +0 -26
@@ -0,0 +1,304 @@
1
+ import { readFile, rm, symlink, writeFile } from 'fs/promises';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { createRequire } from 'node:module';
4
+ import { dirname, join, resolve } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import * as fileCacheCore from '@file-cache/core';
7
+ import { jest } from '@jest/globals';
8
+ import dedent from 'dedent';
9
+ import { createFixtures, exists, getFixturePath, waitForAsyncTask } from './test-util/util.js';
10
+ const require = createRequire(import.meta.url);
11
+ const uuid = randomUUID();
12
+ jest.unstable_mockModule('@file-cache/core', () => ({
13
+ ...fileCacheCore, // Inherit native functions
14
+ createCache: async (options) => {
15
+ options.keys.push(() => uuid); // Add a random key to avoid cache collision
16
+ return fileCacheCore.createCache(options);
17
+ },
18
+ }));
19
+ const { run } = await import('./runner.js');
20
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
21
+ const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
22
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
23
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
24
+ const defaultOptions = {
25
+ pattern: 'test/**/*.{css,scss}',
26
+ declarationMap: true,
27
+ logLevel: 'silent',
28
+ cwd: getFixturePath('/'),
29
+ cache: false,
30
+ };
31
+ const dir = join(dirname(fileURLToPath(import.meta.url)));
32
+ beforeEach(async () => {
33
+ consoleLogSpy.mockClear();
34
+ consoleErrorSpy.mockClear();
35
+ await rm(resolve(dir, '../node_modules/.cache/happy-css-modules'), { recursive: true, force: true }); // clear cache
36
+ });
37
+ // Exit the watcher even if the test fails
38
+ let watcher;
39
+ afterEach(async () => {
40
+ if (watcher) {
41
+ await watcher.close();
42
+ }
43
+ });
44
+ test('generates .d.ts and .d.ts.map', async () => {
45
+ createFixtures({
46
+ '/test/1.css': '.a {}',
47
+ '/test/2.css': '.b {}',
48
+ });
49
+ await run({ ...defaultOptions });
50
+ expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatchSnapshot();
51
+ expect(await readFile(getFixturePath('/test/1.css.d.ts.map'), 'utf8')).toMatchSnapshot();
52
+ expect(await readFile(getFixturePath('/test/2.css.d.ts'), 'utf8')).toMatchSnapshot();
53
+ expect(await readFile(getFixturePath('/test/2.css.d.ts.map'), 'utf8')).toMatchSnapshot();
54
+ });
55
+ test('uses cache in non-watch mode', async () => {
56
+ createFixtures({
57
+ '/test/1.css': '.a {}',
58
+ });
59
+ await run({ ...defaultOptions, declarationMap: true, logLevel: 'debug', cache: true });
60
+ expect(consoleLogSpy).toBeCalledTimes(2);
61
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('Generate .d.ts for'));
62
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(2, expect.anything(), expect.stringContaining('generated'));
63
+ consoleLogSpy.mockClear();
64
+ // Skip generation
65
+ await run({ ...defaultOptions, declarationMap: true, logLevel: 'debug', cache: true });
66
+ expect(consoleLogSpy).toBeCalledTimes(2);
67
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('Generate .d.ts for'));
68
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(2, expect.anything(), expect.stringContaining('skipped'));
69
+ consoleLogSpy.mockClear();
70
+ // Generates if generated files are missing
71
+ await rm(getFixturePath('/test/1.css.d.ts'));
72
+ await run({ ...defaultOptions, declarationMap: true, logLevel: 'debug', cache: true });
73
+ expect(consoleLogSpy).toBeCalledTimes(2);
74
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('Generate .d.ts for'));
75
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(2, expect.anything(), expect.stringContaining('generated'));
76
+ consoleLogSpy.mockClear();
77
+ // Generates if options are changed
78
+ await run({ ...defaultOptions, declarationMap: false, logLevel: 'debug', cache: true });
79
+ expect(consoleLogSpy).toBeCalledTimes(2);
80
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('Generate .d.ts for'));
81
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(2, expect.anything(), expect.stringContaining('generated'));
82
+ consoleLogSpy.mockClear();
83
+ });
84
+ test('uses cache in watch mode', async () => {
85
+ createFixtures({
86
+ '/test/1.css': '.a-1 {}',
87
+ '/test/2.css': '.b-1 {}',
88
+ });
89
+ // At first, process all files
90
+ watcher = await run({ ...defaultOptions, declarationMap: true, logLevel: 'debug', cache: true, watch: true });
91
+ await waitForAsyncTask(1000); // Wait until the watcher is ready
92
+ expect(consoleLogSpy).toBeCalledTimes(3);
93
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('Watch test/**/*.{css,scss}...'));
94
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(2, expect.anything(), expect.stringContaining('test/1.css (generated)'));
95
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(3, expect.anything(), expect.stringContaining('test/2.css (generated)'));
96
+ consoleLogSpy.mockClear();
97
+ // Updating 1.css, it will only be processed
98
+ await writeFile(getFixturePath('/test/1.css'), '.a-2 {}');
99
+ await waitForAsyncTask(500); // Wait until the file is written
100
+ expect(consoleLogSpy).toBeCalledTimes(1);
101
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('test/1.css (generated)'));
102
+ // Close the watcher
103
+ await watcher.close();
104
+ consoleLogSpy.mockClear();
105
+ // Update 1.css
106
+ await writeFile(getFixturePath('/test/1.css'), '.a-1 {}');
107
+ await waitForAsyncTask(500); // Wait until the file is written
108
+ // The updated 1.css will be processed, and the non-updated 2.css will be skipped.
109
+ // eslint-disable-next-line require-atomic-updates
110
+ watcher = await run({ ...defaultOptions, declarationMap: true, logLevel: 'debug', cache: true, watch: true });
111
+ await waitForAsyncTask(1000); // Wait until the watcher is ready
112
+ expect(consoleLogSpy).toBeCalledTimes(3);
113
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('Watch test/**/*.{css,scss}...'));
114
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(2, expect.anything(), expect.stringContaining('test/1.css (generated)'));
115
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(3, expect.anything(), expect.stringContaining('test/2.css (skipped)'));
116
+ });
117
+ test('outputs logs', async () => {
118
+ createFixtures({
119
+ '/test/1.css': '.a {}',
120
+ });
121
+ await run({ ...defaultOptions, logLevel: 'debug', cache: true });
122
+ expect(consoleLogSpy).toBeCalledTimes(2);
123
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('Generate .d.ts for'));
124
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(2, expect.anything(), expect.stringContaining('test/1.css (generated)'));
125
+ consoleLogSpy.mockClear();
126
+ await run({ ...defaultOptions, logLevel: 'debug', cache: true });
127
+ expect(consoleLogSpy).toBeCalledTimes(2);
128
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(1, expect.anything(), expect.stringContaining('Generate .d.ts for'));
129
+ expect(consoleLogSpy).toHaveBeenNthCalledWith(2, expect.anything(), expect.stringContaining('test/1.css (skipped)'));
130
+ });
131
+ test.todo('changes dts format with localsConvention options');
132
+ test('does not emit declaration map if declarationMap is false', async () => {
133
+ createFixtures({
134
+ '/test/1.css': '.a {}',
135
+ });
136
+ await run({ ...defaultOptions, declarationMap: false });
137
+ await expect(readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).resolves.not.toThrow();
138
+ await expect(readFile(getFixturePath('/test/1.css.d.ts.map'), 'utf8')).rejects.toThrow(/ENOENT/u);
139
+ });
140
+ test('supports transformer', async () => {
141
+ createFixtures({
142
+ '/test/1.scss': `.a { dummy: ''; }`,
143
+ });
144
+ await run({ ...defaultOptions });
145
+ expect(await readFile(getFixturePath('/test/1.scss.d.ts'), 'utf8')).toMatchSnapshot();
146
+ expect(await readFile(getFixturePath('/test/1.scss.d.ts.map'), 'utf8')).toMatchSnapshot();
147
+ });
148
+ test('watches for changes in files', async () => {
149
+ createFixtures({
150
+ '/test': {}, // empty directory
151
+ });
152
+ watcher = await run({ ...defaultOptions, watch: true });
153
+ await writeFile(getFixturePath('/test/1.css'), '.a-1 {}');
154
+ await waitForAsyncTask(500); // Wait until the file is written
155
+ expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatch(/a-1/u);
156
+ await writeFile(getFixturePath('/test/1.css'), '.a-2 {}');
157
+ await waitForAsyncTask(500); // Wait until the file is written
158
+ expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatch(/a-2/u);
159
+ await writeFile(getFixturePath('/test/2.css'), '.b {}');
160
+ await writeFile(getFixturePath('/test/3.css'), '.c {}');
161
+ await waitForAsyncTask(500); // Wait until the file is written
162
+ expect(await readFile(getFixturePath('/test/2.css.d.ts'), 'utf8')).toMatch(/b/u);
163
+ expect(await readFile(getFixturePath('/test/3.css.d.ts'), 'utf8')).toMatch(/c/u);
164
+ });
165
+ test('returns an error if the file fails to process in non-watch mode', async () => {
166
+ createFixtures({
167
+ '/test/1.css': '.a {}',
168
+ '/test/2.css': 'INVALID SYNTAX',
169
+ '/test/3.css': 'INVALID SYNTAX',
170
+ });
171
+ const maybeError = await run({ ...defaultOptions, watch: false }).catch((e) => e);
172
+ // The errors are aggregated into AggregateError.
173
+ expect(maybeError).toBeInstanceOf(AggregateError);
174
+ const error = maybeError;
175
+ expect(error.message).toMatchInlineSnapshot(`"Failed to process files"`);
176
+ expect(error.errors).toHaveLength(2);
177
+ expect(error.errors[0]).toMatchInlineSnapshot(`<fixtures>/test/3.css:1:1: Unknown word`);
178
+ expect(error.errors[1]).toMatchInlineSnapshot(`<fixtures>/test/2.css:1:1: Unknown word`);
179
+ // The valid files are emitted.
180
+ expect(await exists(getFixturePath('/test/1.css.d.ts'))).toBe(true);
181
+ expect(await exists(getFixturePath('/test/1.css.d.ts.map'))).toBe(true);
182
+ });
183
+ describe('handles external files', () => {
184
+ beforeEach(() => {
185
+ createFixtures({
186
+ '/test/1.css': dedent `
187
+ @import './2.css';
188
+ @import 'external-library';
189
+ .a {}
190
+ `,
191
+ '/test/2.css': `.b {}`,
192
+ '/node_modules/external-library/index.css': `.c {}`,
193
+ });
194
+ });
195
+ test('do not emit .dts for external files', async () => {
196
+ await run({ ...defaultOptions });
197
+ expect(await exists(getFixturePath('/test/1.css.d.ts'))).toBe(true);
198
+ expect(await exists(getFixturePath('/test/2.css.d.ts'))).toBe(true);
199
+ expect(await exists(getFixturePath('/node_modules/external-library/index.css.d.ts'))).toBe(false);
200
+ });
201
+ test('treats imported tokens from external files the same as local tokens', async () => {
202
+ await run({ ...defaultOptions });
203
+ expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatchInlineSnapshot(`
204
+ "declare const styles:
205
+ & Readonly<Pick<(typeof import("./2.css"))["default"], "b">>
206
+ & Readonly<{ "c": string }>
207
+ & Readonly<{ "a": string }>
208
+ ;
209
+ export default styles;
210
+ //# sourceMappingURL=./1.css.d.ts.map
211
+ "
212
+ `);
213
+ });
214
+ });
215
+ test('sassLoadPaths', async () => {
216
+ const sassLoadPaths = ['test/relative'];
217
+ createFixtures({
218
+ '/test/1.scss': dedent `
219
+ @import '2.scss';
220
+ `,
221
+ '/test/relative/2.scss': `.a { dummy: ''; }`,
222
+ });
223
+ await run({ ...defaultOptions, sassLoadPaths }); // not throw
224
+ });
225
+ test('lessIncludePaths', async () => {
226
+ const lessIncludePaths = ['test/relative'];
227
+ createFixtures({
228
+ '/test/1.less': dedent `
229
+ @import '2.less';
230
+ `,
231
+ '/test/relative/2.less': `.a { dummy: ''; }`,
232
+ });
233
+ await run({ ...defaultOptions, lessIncludePaths }); // not throw
234
+ });
235
+ test('webpackResolveAlias', async () => {
236
+ const webpackResolveAlias = { '@relative': 'test/relative' };
237
+ createFixtures({
238
+ '/test/1.less': dedent `
239
+ @import '@relative/2.less';
240
+ `,
241
+ '/test/relative/2.less': `.a { dummy: ''; }`,
242
+ });
243
+ await run({ ...defaultOptions, webpackResolveAlias }); // not throw
244
+ });
245
+ test('postcssConfig', async () => {
246
+ const uuid = randomUUID();
247
+ const postcssConfig = `${uuid}/postcss.config.js`;
248
+ createFixtures({
249
+ [`/${uuid}/postcss.config.js`]: dedent `
250
+ module.exports = {
251
+ plugins: [
252
+ require('${require.resolve('postcss-simple-vars')}'),
253
+ ],
254
+ };
255
+ `,
256
+ '/test/1.css': dedent `
257
+ $prefix: foo;
258
+ .$(prefix)_bar {}
259
+ `,
260
+ });
261
+ await run({ ...defaultOptions, postcssConfig }); // not throw
262
+ });
263
+ test('support symlink', async () => {
264
+ createFixtures({
265
+ '/external/1.css': '.a {}',
266
+ '/external/2.css': '.b {}',
267
+ '/test': {}, // empty directory
268
+ });
269
+ await symlink(getFixturePath('/external/1.css'), getFixturePath('/test/1.css'));
270
+ await symlink(getFixturePath('/external/2.css'), getFixturePath('/test/2.txt'));
271
+ await run({ ...defaultOptions, watch: false });
272
+ // Symlinks that do not match the pattern are not processed.
273
+ expect(await exists(getFixturePath('/test/1.css.d.ts'))).toBe(true);
274
+ expect(await exists(getFixturePath('/test/2.css.d.ts'))).toBe(false);
275
+ expect(await exists(getFixturePath('/test/2.txt.d.ts'))).toBe(false);
276
+ // The path referred to by sourceMappingURL or sources field is the path before symlink resolution.
277
+ expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatchInlineSnapshot(`
278
+ "declare const styles:
279
+ & Readonly<{ "a": string }>
280
+ ;
281
+ export default styles;
282
+ //# sourceMappingURL=./1.css.d.ts.map
283
+ "
284
+ `);
285
+ expect(await readFile(getFixturePath('/test/1.css.d.ts.map'), 'utf8')).toMatchInlineSnapshot(`"{"version":3,"sources":["./1.css"],"names":["a"],"mappings":"AAAA;AAAA,E,aAAAA,G,WAAA;AAAA;AAAA","file":"1.css.d.ts","sourceRoot":""}"`);
286
+ });
287
+ test('changes output directory by outDir', async () => {
288
+ createFixtures({
289
+ '/test/1.css': '.a {}',
290
+ });
291
+ await run({ ...defaultOptions, outDir: getFixturePath('/dist'), cache: false, watch: false });
292
+ expect(await exists(getFixturePath('/dist/test/1.css.d.ts'))).toBe(true);
293
+ expect(await exists(getFixturePath('/dist/test/1.css.d.ts.map'))).toBe(true);
294
+ expect(await readFile(getFixturePath('/dist/test/1.css.d.ts'), 'utf8')).toMatchInlineSnapshot(`
295
+ "declare const styles:
296
+ & Readonly<{ "a": string }>
297
+ ;
298
+ export default styles;
299
+ //# sourceMappingURL=./1.css.d.ts.map
300
+ "
301
+ `);
302
+ expect(await readFile(getFixturePath('/dist/test/1.css.d.ts.map'), 'utf8')).toMatchInlineSnapshot(`"{"version":3,"sources":["../../test/1.css"],"names":["a"],"mappings":"AAAA;AAAA,E,aAAAA,G,WAAA;AAAA;AAAA","file":"1.css.d.ts","sourceRoot":""}"`);
303
+ });
304
+ //# sourceMappingURL=runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../src/runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
4
+ const nativeModule = require('node:module');
5
+ // workaround for https://github.com/facebook/jest/issues/12270#issuecomment-1194746382
6
+ /**
7
+ * @typedef {{
8
+ * basedir: string;
9
+ * conditions?: Array<string>;
10
+ * defaultResolver: (path: string, options: ResolverOptions) => string;
11
+ * extensions?: Array<string>;
12
+ * moduleDirectory?: Array<string>;
13
+ * paths?: Array<string>;
14
+ * packageFilter?: (pkg: any, file: string, dir: string) => any;
15
+ * pathFilter?: (pkg: any, path: string, relativePath: string) => string;
16
+ * rootDir?: string;
17
+ * }} ResolverOptions
18
+ */
19
+ /** @type {(path: string, options: ResolverOptions) => string} */
20
+ function resolver(module, options) {
21
+ const { basedir, defaultResolver } = options;
22
+ try {
23
+ return defaultResolver(module, options);
24
+ // eslint-disable-next-line no-unused-vars
25
+ }
26
+ catch (_error) {
27
+ return nativeModule.createRequire(basedir).resolve(module);
28
+ }
29
+ }
30
+ module.exports = resolver;
31
+ //# sourceMappingURL=resolver.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.cjs","sourceRoot":"","sources":["../../../src/test-util/jest/resolver.cjs"],"names":[],"mappings":";;AAAA,qGAAqG;AACrG,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5C,uFAAuF;AAEvF;;;;;;;;;;;;GAYG;AAEH,iEAAiE;AACjE,SAAS,QAAQ,CAAC,MAAM,EAAE,OAAO;IAC/B,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,0CAA0C;IAC5C,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export = resolver;
2
+ declare function resolver(path: string, options: ResolverOptions): string;
3
+ declare namespace resolver {
4
+ export { ResolverOptions };
5
+ }
6
+ type ResolverOptions = {
7
+ basedir: string;
8
+ conditions?: Array<string>;
9
+ defaultResolver: (path: string, options: ResolverOptions) => string;
10
+ extensions?: Array<string>;
11
+ moduleDirectory?: Array<string>;
12
+ paths?: Array<string>;
13
+ packageFilter?: (pkg: any, file: string, dir: string) => any;
14
+ pathFilter?: (pkg: any, path: string, relativePath: string) => string;
15
+ rootDir?: string;
16
+ };
@@ -0,0 +1,31 @@
1
+ type Definition = {
2
+ /** The path of the destination file */
3
+ file: string;
4
+ /** The text at definition destination */
5
+ text: string;
6
+ /** inclusive */
7
+ start: {
8
+ /** line, 1-based */
9
+ line: number;
10
+ /** column, 1-based */
11
+ offset: number;
12
+ };
13
+ /** exclusive */
14
+ end: {
15
+ /** line, 1-based */
16
+ line: number;
17
+ /** column, 1-based */
18
+ offset: number;
19
+ };
20
+ };
21
+ export declare function createTSServer(): {
22
+ getIdentifierDefinitions(filePath: string, identifier: string): Promise<Definition[]>;
23
+ getMultipleIdentifierDefinitions(filePath: string, identifiers: string[]): Promise<{
24
+ identifier: string;
25
+ definitions: Definition[];
26
+ }[]>;
27
+ getModuleDefinitions(filePath: string): Promise<Definition[]>;
28
+ refreshCache(): Promise<void>;
29
+ exit: () => Promise<void>;
30
+ };
31
+ export {};
@@ -0,0 +1,112 @@
1
+ import { readFileSync } from 'fs';
2
+ import { mkdir, writeFile as nativeWriteFile } from 'fs/promises';
3
+ import { dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import serverHarness from '@typescript/server-harness';
6
+ import { glob } from 'glob';
7
+ import { resolve } from 'import-meta-resolve';
8
+ import lineColumn from 'line-column';
9
+ import { getFixturePath } from './util.js';
10
+ async function writeFile(path, content) {
11
+ await mkdir(dirname(path), { recursive: true });
12
+ return nativeWriteFile(path, content, 'utf8');
13
+ }
14
+ export function createTSServer() {
15
+ const server = serverHarness.launchServer(fileURLToPath(resolve('typescript/lib/tsserver.js', import.meta.url)), [
16
+ // ATA generates some extra network traffic and isn't usually relevant when profiling
17
+ '--disableAutomaticTypingAcquisition',
18
+ ]);
19
+ return {
20
+ async getIdentifierDefinitions(filePath, identifier) {
21
+ const results = await this.getMultipleIdentifierDefinitions(filePath, [identifier]);
22
+ return results[0].definitions;
23
+ },
24
+ async getMultipleIdentifierDefinitions(filePath, identifiers) {
25
+ const tmpFilePath = getFixturePath('/server-harness/tmp.ts');
26
+ const tmpFileContent = [
27
+ `import styles from '${filePath}';`,
28
+ ...identifiers.map((identifier) => `styles.${identifier};`),
29
+ ].join('\n');
30
+ await writeFile(tmpFilePath, tmpFileContent);
31
+ await this.refreshCache();
32
+ const results = [];
33
+ for (let i = 0; i < identifiers.length; i++) {
34
+ // eslint-disable-next-line no-await-in-loop
35
+ const response = await server.message({
36
+ seq: 0,
37
+ type: 'request',
38
+ command: 'definition',
39
+ arguments: {
40
+ file: tmpFilePath,
41
+ line: i + 2, // line, 1-based
42
+ offset: 8, // column, 1-based
43
+ },
44
+ });
45
+ const definitions = response.body.map((definition) => {
46
+ const { file, start, end } = definition;
47
+ const fileContent = readFileSync(file, 'utf-8');
48
+ const startIndex = lineColumn(fileContent).toIndex(start.line, start.offset);
49
+ const endIndex = lineColumn(fileContent).toIndex(end.line, end.offset);
50
+ const text = fileContent.slice(startIndex, endIndex);
51
+ return { file, text, start, end };
52
+ });
53
+ results.push({ identifier: identifiers[i], definitions });
54
+ }
55
+ return results;
56
+ },
57
+ async getModuleDefinitions(filePath) {
58
+ await this.refreshCache();
59
+ const tmpFilePath = getFixturePath('/server-harness/tmp.ts');
60
+ const tmpFileContent = `import styles from '${filePath}';`;
61
+ await writeFile(tmpFilePath, tmpFileContent);
62
+ await this.refreshCache();
63
+ const response = await server.message({
64
+ seq: 0,
65
+ type: 'request',
66
+ command: 'definition',
67
+ arguments: {
68
+ file: tmpFilePath,
69
+ line: 1, // line, 1-based
70
+ offset: 20, // column, 1-based
71
+ },
72
+ });
73
+ const definitions = response.body.map((definition) => {
74
+ const { file, start, end } = definition;
75
+ const fileContent = readFileSync(file, 'utf-8');
76
+ const startIndex = lineColumn(fileContent).toIndex(start.line, start.offset);
77
+ const endIndex = lineColumn(fileContent).toIndex(end.line, end.offset);
78
+ const text = fileContent.slice(startIndex, endIndex);
79
+ return { file, text, start, end };
80
+ });
81
+ return definitions;
82
+ },
83
+ async refreshCache() {
84
+ // tsserver caches the contents of opened files.
85
+ // When a file is updated, its cache remains with the old content.
86
+ // Therefore we need to overwrite the cache with the latest content.
87
+ const fixtureFilePaths = await glob(getFixturePath('/**/*.ts'), { dot: true });
88
+ // latest contents
89
+ const openFiles = fixtureFilePaths.map((filePath) => ({
90
+ file: filePath,
91
+ fileContent: readFileSync(filePath, 'utf-8'),
92
+ projectRootPath: getFixturePath('/server-harness'),
93
+ scriptKindName: 'TS', // It's easy to get this wrong when copy-pasting
94
+ }));
95
+ // override the cache
96
+ await server.message({
97
+ seq: 0,
98
+ type: 'request',
99
+ command: 'updateOpen',
100
+ arguments: {
101
+ changedFiles: [],
102
+ closedFiles: [],
103
+ openFiles,
104
+ },
105
+ });
106
+ },
107
+ exit: async () => {
108
+ await server.message({ command: 'exit' });
109
+ },
110
+ };
111
+ }
112
+ //# sourceMappingURL=tsserver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsserver.js","sourceRoot":"","sources":["../../src/test-util/tsserver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type Root, type Rule, type AtRule } from 'postcss';
2
+ import { type ClassName } from 'postcss-selector-parser';
3
+ import { type Token, type Location } from '../locator/index.js';
4
+ export declare const FIXTURE_DIR_PATH: string;
5
+ export declare function createRoot(code: string, from?: string): Root;
6
+ export declare function createAtImports(root: Root): AtRule[];
7
+ export declare function createAtValues(root: Root): AtRule[];
8
+ export declare function createClassSelectors(root: Root): {
9
+ rule: Rule;
10
+ classSelector: ClassName;
11
+ }[];
12
+ export declare function fakeToken(args: {
13
+ name: Token['name'];
14
+ originalLocation: {
15
+ filePath?: Location['filePath'];
16
+ start?: Location['start'];
17
+ };
18
+ }): Token;
19
+ export declare function waitForAsyncTask(ms?: number): Promise<void>;
20
+ export declare function exists(path: string): Promise<boolean>;
21
+ type File = string;
22
+ type DirectoryItem = File | DirectoryItems;
23
+ type DirectoryItems = {
24
+ [name: string]: DirectoryItem;
25
+ };
26
+ export declare function createFixtures(items: DirectoryItems): void;
27
+ export declare function removeFixtures(): void;
28
+ export declare function getFixturePath(path: string): string;
29
+ export {};
@@ -0,0 +1,85 @@
1
+ import { constants, mkdirSync, realpathSync, rmSync, writeFileSync } from 'fs';
2
+ import { access } from 'fs/promises';
3
+ import { tmpdir } from 'os';
4
+ import { dirname, join, resolve } from 'path';
5
+ import postcss from 'postcss';
6
+ import { collectNodes } from '../locator/index.js';
7
+ import { sleepSync } from '../util.js';
8
+ export const FIXTURE_DIR_PATH = resolve(realpathSync(tmpdir()), 'happy-css-modules/fixtures', process.env['JEST_WORKER_ID']);
9
+ export function createRoot(code, from) {
10
+ return postcss.parse(code, { from: from || '/test/test.css' });
11
+ }
12
+ export function createAtImports(root) {
13
+ return collectNodes(root).atImports;
14
+ }
15
+ export function createAtValues(root) {
16
+ return collectNodes(root).atValues;
17
+ }
18
+ export function createClassSelectors(root) {
19
+ return collectNodes(root).classSelectors;
20
+ }
21
+ export function fakeToken(args) {
22
+ if (args.originalLocation.filePath === undefined || args.originalLocation.start === undefined) {
23
+ return {
24
+ name: args.name,
25
+ originalLocation: { filePath: undefined, start: undefined, end: undefined },
26
+ };
27
+ }
28
+ else {
29
+ return {
30
+ name: args.name,
31
+ originalLocation: {
32
+ filePath: args.originalLocation.filePath ?? getFixturePath('/test/1.css'),
33
+ start: args.originalLocation.start,
34
+ end: {
35
+ line: args.originalLocation.start.line,
36
+ column: args.originalLocation.start.column + args.name.length - 1,
37
+ },
38
+ },
39
+ };
40
+ }
41
+ }
42
+ export async function waitForAsyncTask(ms) {
43
+ await new Promise((resolve) => {
44
+ setTimeout(resolve, ms ?? 0);
45
+ });
46
+ }
47
+ export async function exists(path) {
48
+ try {
49
+ await access(path, constants.F_OK);
50
+ return true;
51
+ }
52
+ catch (e) {
53
+ return false;
54
+ }
55
+ }
56
+ function isFile(item) {
57
+ return typeof item === 'string';
58
+ }
59
+ export function createFixtures(items) {
60
+ function createFixturesImpl(items, baseDir) {
61
+ for (const [name, item] of Object.entries(items)) {
62
+ const path = join(baseDir, name);
63
+ if (isFile(item)) {
64
+ mkdirSync(dirname(path), { recursive: true });
65
+ if (typeof item === 'string') {
66
+ writeFileSync(path, item);
67
+ }
68
+ }
69
+ else {
70
+ mkdirSync(path, { recursive: true });
71
+ createFixturesImpl(item, path);
72
+ }
73
+ }
74
+ }
75
+ removeFixtures();
76
+ sleepSync(2); // Wait 2 ms for mtime to change from the previous fixture.
77
+ createFixturesImpl(items, FIXTURE_DIR_PATH);
78
+ }
79
+ export function removeFixtures() {
80
+ rmSync(FIXTURE_DIR_PATH, { recursive: true, force: true });
81
+ }
82
+ export function getFixturePath(path) {
83
+ return join(FIXTURE_DIR_PATH, path);
84
+ }
85
+ //# sourceMappingURL=util.js.map