happy-css-modules 3.1.0 → 3.1.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 (130) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.js +121 -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 +14 -0
  11. package/dist/emitter/dts.js +128 -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 +205 -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 +34 -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 +68 -0
  27. package/dist/emitter/index.test.js.map +1 -0
  28. package/dist/emitter/source-map.d.ts +8 -0
  29. package/dist/emitter/source-map.js +16 -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/library/source-map/index.d.ts +8 -0
  41. package/dist/library/source-map/index.js +5 -0
  42. package/dist/library/source-map/index.js.map +1 -0
  43. package/dist/locator/index.d.ts +46 -0
  44. package/dist/locator/index.js +173 -0
  45. package/dist/locator/index.js.map +1 -0
  46. package/dist/locator/index.test.d.ts +1 -0
  47. package/dist/locator/index.test.js +393 -0
  48. package/dist/locator/index.test.js.map +1 -0
  49. package/dist/locator/postcss.d.ts +91 -0
  50. package/dist/locator/postcss.js +241 -0
  51. package/dist/locator/postcss.js.map +1 -0
  52. package/dist/locator/postcss.test.d.ts +1 -0
  53. package/dist/locator/postcss.test.js +256 -0
  54. package/dist/locator/postcss.test.js.map +1 -0
  55. package/dist/logger.d.ts +9 -0
  56. package/dist/logger.js +28 -0
  57. package/dist/logger.js.map +1 -0
  58. package/dist/regression-test/issue-168.test.d.ts +1 -0
  59. package/dist/regression-test/issue-168.test.js +30 -0
  60. package/dist/regression-test/issue-168.test.js.map +1 -0
  61. package/dist/resolver/index.d.ts +22 -0
  62. package/dist/resolver/index.js +44 -0
  63. package/dist/resolver/index.js.map +1 -0
  64. package/dist/resolver/index.test.d.ts +1 -0
  65. package/dist/resolver/index.test.js +16 -0
  66. package/dist/resolver/index.test.js.map +1 -0
  67. package/dist/resolver/node-resolver.d.ts +2 -0
  68. package/dist/resolver/node-resolver.js +6 -0
  69. package/dist/resolver/node-resolver.js.map +1 -0
  70. package/dist/resolver/node-resolver.test.d.ts +1 -0
  71. package/dist/resolver/node-resolver.test.js +25 -0
  72. package/dist/resolver/node-resolver.test.js.map +1 -0
  73. package/dist/resolver/relative-resolver.d.ts +2 -0
  74. package/dist/resolver/relative-resolver.js +5 -0
  75. package/dist/resolver/relative-resolver.js.map +1 -0
  76. package/dist/resolver/relative-resolver.test.d.ts +1 -0
  77. package/dist/resolver/relative-resolver.test.js +12 -0
  78. package/dist/resolver/relative-resolver.test.js.map +1 -0
  79. package/dist/resolver/webpack-resolver.d.ts +24 -0
  80. package/dist/resolver/webpack-resolver.js +91 -0
  81. package/dist/resolver/webpack-resolver.js.map +1 -0
  82. package/dist/resolver/webpack-resolver.test.d.ts +1 -0
  83. package/dist/resolver/webpack-resolver.test.js +89 -0
  84. package/dist/resolver/webpack-resolver.test.js.map +1 -0
  85. package/dist/runner.d.ts +76 -0
  86. package/dist/runner.js +120 -0
  87. package/dist/runner.js.map +1 -0
  88. package/dist/runner.test.d.ts +1 -0
  89. package/dist/runner.test.js +287 -0
  90. package/dist/runner.test.js.map +1 -0
  91. package/dist/test-util/jest/resolver.cjs +31 -0
  92. package/dist/test-util/jest/resolver.cjs.map +1 -0
  93. package/dist/test-util/jest/resolver.d.cts +16 -0
  94. package/dist/test-util/tsserver.d.ts +31 -0
  95. package/dist/test-util/tsserver.js +112 -0
  96. package/dist/test-util/tsserver.js.map +1 -0
  97. package/dist/test-util/util.d.ts +29 -0
  98. package/dist/test-util/util.js +85 -0
  99. package/dist/test-util/util.js.map +1 -0
  100. package/dist/transformer/index.d.ts +30 -0
  101. package/dist/transformer/index.js +25 -0
  102. package/dist/transformer/index.js.map +1 -0
  103. package/dist/transformer/index.test.d.ts +1 -0
  104. package/dist/transformer/index.test.js +66 -0
  105. package/dist/transformer/index.test.js.map +1 -0
  106. package/dist/transformer/less-transformer.d.ts +2 -0
  107. package/dist/transformer/less-transformer.js +45 -0
  108. package/dist/transformer/less-transformer.js.map +1 -0
  109. package/dist/transformer/less-transformer.test.d.ts +1 -0
  110. package/dist/transformer/less-transformer.test.js +134 -0
  111. package/dist/transformer/less-transformer.test.js.map +1 -0
  112. package/dist/transformer/postcss-transformer.d.ts +12 -0
  113. package/dist/transformer/postcss-transformer.js +32 -0
  114. package/dist/transformer/postcss-transformer.js.map +1 -0
  115. package/dist/transformer/postcss-transformer.test.d.ts +1 -0
  116. package/dist/transformer/postcss-transformer.test.js +178 -0
  117. package/dist/transformer/postcss-transformer.test.js.map +1 -0
  118. package/dist/transformer/scss-transformer.d.ts +2 -0
  119. package/dist/transformer/scss-transformer.js +40 -0
  120. package/dist/transformer/scss-transformer.js.map +1 -0
  121. package/dist/transformer/scss-transformer.test.d.ts +1 -0
  122. package/dist/transformer/scss-transformer.test.js +149 -0
  123. package/dist/transformer/scss-transformer.test.js.map +1 -0
  124. package/dist/util.d.ts +21 -0
  125. package/dist/util.js +72 -0
  126. package/dist/util.js.map +1 -0
  127. package/dist/util.test.d.ts +1 -0
  128. package/dist/util.test.js +74 -0
  129. package/dist/util.test.js.map +1 -0
  130. package/package.json +1 -1
package/dist/runner.js ADDED
@@ -0,0 +1,120 @@
1
+ import { resolve, relative } from 'path';
2
+ import * as process from 'process';
3
+ import { createCache } from '@file-cache/core';
4
+ import { createNpmPackageKey } from '@file-cache/npm';
5
+ import AwaitLock from 'await-lock';
6
+ import chalk from 'chalk';
7
+ import * as chokidar from 'chokidar';
8
+ import { glob } from 'glob';
9
+ import { DEFAULT_ARBITRARY_EXTENSIONS } from './config.js';
10
+ import { isGeneratedFilesExist, emitGeneratedFiles } from './emitter/index.js';
11
+ import { Locator } from './locator/index.js';
12
+ import { Logger } from './logger.js';
13
+ import { createDefaultResolver } from './resolver/index.js';
14
+ import { createDefaultTransformer } from './transformer/index.js';
15
+ import { getInstalledPeerDependencies, isMatchByGlob } from './util.js';
16
+ export async function run(options) {
17
+ // eslint-disable-next-line new-cap
18
+ const lock = new AwaitLock.default();
19
+ const logger = new Logger(options.logLevel ?? 'info');
20
+ const cwd = options.cwd ?? process.cwd();
21
+ const resolver = options.resolver ??
22
+ createDefaultResolver({
23
+ cwd,
24
+ sassLoadPaths: options.sassLoadPaths,
25
+ lessIncludePaths: options.lessIncludePaths,
26
+ webpackResolveAlias: options.webpackResolveAlias,
27
+ });
28
+ const transformer = options.transformer ?? createDefaultTransformer({ cwd, postcssConfig: options.postcssConfig });
29
+ const installedPeerDependencies = getInstalledPeerDependencies();
30
+ const cache = await createCache({
31
+ name: 'happy-css-modules',
32
+ mode: options.cacheStrategy ?? 'content',
33
+ keys: [
34
+ () => createNpmPackageKey(['happy-css-modules', ...installedPeerDependencies]),
35
+ () => {
36
+ return JSON.stringify(options);
37
+ },
38
+ ],
39
+ noCache: !(options.cache ?? true),
40
+ });
41
+ const locator = new Locator({ transformer, resolver });
42
+ const isExternalFile = (filePath) => {
43
+ return !isMatchByGlob(filePath, options.pattern, { cwd });
44
+ };
45
+ async function processFile(filePath) {
46
+ async function isChangedFile(filePath) {
47
+ const result = await cache.getAndUpdateCache(filePath);
48
+ // eslint-disable-next-line @typescript-eslint/no-throw-literal
49
+ if (result.error)
50
+ throw result.error;
51
+ return result.changed;
52
+ }
53
+ // Locator#load cannot be called concurrently. Therefore, it takes a lock and waits.
54
+ await lock.acquireAsync();
55
+ try {
56
+ const _isGeneratedFilesExist = await isGeneratedFilesExist(filePath, options.declarationMap, options.arbitraryExtensions ?? DEFAULT_ARBITRARY_EXTENSIONS);
57
+ const _isChangedFile = await isChangedFile(filePath);
58
+ // Generate .d.ts and .d.ts.map only when the file has been updated.
59
+ // However, if .d.ts or .d.ts.map has not yet been generated, always generate.
60
+ if (_isGeneratedFilesExist && !_isChangedFile) {
61
+ logger.debug(chalk.gray(`${relative(cwd, filePath)} (skipped)`));
62
+ return;
63
+ }
64
+ const result = await locator.load(filePath);
65
+ await emitGeneratedFiles({
66
+ filePath,
67
+ tokens: result.tokens,
68
+ emitDeclarationMap: options.declarationMap,
69
+ dtsFormatOptions: {
70
+ localsConvention: options.localsConvention,
71
+ arbitraryExtensions: options.arbitraryExtensions,
72
+ },
73
+ isExternalFile,
74
+ });
75
+ logger.info(chalk.green(`${relative(cwd, filePath)} (generated)`));
76
+ await cache.reconcile(); // Update cache for the file
77
+ }
78
+ finally {
79
+ lock.release();
80
+ }
81
+ }
82
+ async function processAllFiles() {
83
+ const filePaths = (await glob(options.pattern, { dot: true, cwd }))
84
+ // convert relative path to absolute path
85
+ .map((file) => resolve(cwd, file));
86
+ const errors = [];
87
+ for (const filePath of filePaths) {
88
+ // eslint-disable-next-line no-await-in-loop
89
+ await processFile(filePath).catch((e) => errors.push(e));
90
+ }
91
+ if (errors.length > 0) {
92
+ throw new AggregateError(errors, 'Failed to process files');
93
+ }
94
+ }
95
+ if (!options.watch) {
96
+ logger.info(`Generate .d.ts for ${options.pattern}...`);
97
+ await processAllFiles();
98
+ // Write cache state to file for persistence
99
+ }
100
+ else {
101
+ // First, watch files.
102
+ logger.info(`Watch ${options.pattern}...`);
103
+ const watcher = chokidar.watch([options.pattern.replace(/\\/gu, '/')], { cwd });
104
+ watcher.on('all', (eventName, relativeFilePath) => {
105
+ const filePath = resolve(cwd, relativeFilePath);
106
+ // There is a bug in chokidar that matches symlinks that do not match the pattern.
107
+ // ref: https://github.com/paulmillr/chokidar/issues/967
108
+ if (isExternalFile(filePath))
109
+ return;
110
+ if (eventName !== 'add' && eventName !== 'change')
111
+ return;
112
+ processFile(filePath).catch((e) => {
113
+ logger.error(e);
114
+ // TODO: Emit a error by `Watcher#onerror`
115
+ });
116
+ });
117
+ return { close: async () => watcher.close() };
118
+ }
119
+ }
120
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,287 @@
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
+ //# 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