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.
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +121 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +66 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/emitter/dts.d.ts +14 -0
- package/dist/emitter/dts.js +128 -0
- package/dist/emitter/dts.js.map +1 -0
- package/dist/emitter/dts.test.d.ts +1 -0
- package/dist/emitter/dts.test.js +205 -0
- package/dist/emitter/dts.test.js.map +1 -0
- package/dist/emitter/file-system.d.ts +6 -0
- package/dist/emitter/file-system.js +26 -0
- package/dist/emitter/file-system.js.map +1 -0
- package/dist/emitter/file-system.test.d.ts +1 -0
- package/dist/emitter/file-system.test.js +34 -0
- package/dist/emitter/file-system.test.js.map +1 -0
- package/dist/emitter/index.d.ts +34 -0
- package/dist/emitter/index.js +49 -0
- package/dist/emitter/index.js.map +1 -0
- package/dist/emitter/index.test.d.ts +1 -0
- package/dist/emitter/index.test.js +68 -0
- package/dist/emitter/index.test.js.map +1 -0
- package/dist/emitter/source-map.d.ts +8 -0
- package/dist/emitter/source-map.js +16 -0
- package/dist/emitter/source-map.js.map +1 -0
- package/dist/emitter/source-map.test.d.ts +1 -0
- package/dist/emitter/source-map.test.js +13 -0
- package/dist/emitter/source-map.test.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/integration-test/go-to-definition.test.d.ts +1 -0
- package/dist/integration-test/go-to-definition.test.js +334 -0
- package/dist/integration-test/go-to-definition.test.js.map +1 -0
- package/dist/library/source-map/index.d.ts +8 -0
- package/dist/library/source-map/index.js +5 -0
- package/dist/library/source-map/index.js.map +1 -0
- package/dist/locator/index.d.ts +46 -0
- package/dist/locator/index.js +173 -0
- package/dist/locator/index.js.map +1 -0
- package/dist/locator/index.test.d.ts +1 -0
- package/dist/locator/index.test.js +393 -0
- package/dist/locator/index.test.js.map +1 -0
- package/dist/locator/postcss.d.ts +91 -0
- package/dist/locator/postcss.js +241 -0
- package/dist/locator/postcss.js.map +1 -0
- package/dist/locator/postcss.test.d.ts +1 -0
- package/dist/locator/postcss.test.js +256 -0
- package/dist/locator/postcss.test.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.js +28 -0
- package/dist/logger.js.map +1 -0
- package/dist/regression-test/issue-168.test.d.ts +1 -0
- package/dist/regression-test/issue-168.test.js +30 -0
- package/dist/regression-test/issue-168.test.js.map +1 -0
- package/dist/resolver/index.d.ts +22 -0
- package/dist/resolver/index.js +44 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/index.test.d.ts +1 -0
- package/dist/resolver/index.test.js +16 -0
- package/dist/resolver/index.test.js.map +1 -0
- package/dist/resolver/node-resolver.d.ts +2 -0
- package/dist/resolver/node-resolver.js +6 -0
- package/dist/resolver/node-resolver.js.map +1 -0
- package/dist/resolver/node-resolver.test.d.ts +1 -0
- package/dist/resolver/node-resolver.test.js +25 -0
- package/dist/resolver/node-resolver.test.js.map +1 -0
- package/dist/resolver/relative-resolver.d.ts +2 -0
- package/dist/resolver/relative-resolver.js +5 -0
- package/dist/resolver/relative-resolver.js.map +1 -0
- package/dist/resolver/relative-resolver.test.d.ts +1 -0
- package/dist/resolver/relative-resolver.test.js +12 -0
- package/dist/resolver/relative-resolver.test.js.map +1 -0
- package/dist/resolver/webpack-resolver.d.ts +24 -0
- package/dist/resolver/webpack-resolver.js +91 -0
- package/dist/resolver/webpack-resolver.js.map +1 -0
- package/dist/resolver/webpack-resolver.test.d.ts +1 -0
- package/dist/resolver/webpack-resolver.test.js +89 -0
- package/dist/resolver/webpack-resolver.test.js.map +1 -0
- package/dist/runner.d.ts +76 -0
- package/dist/runner.js +120 -0
- package/dist/runner.js.map +1 -0
- package/dist/runner.test.d.ts +1 -0
- package/dist/runner.test.js +287 -0
- package/dist/runner.test.js.map +1 -0
- package/dist/test-util/jest/resolver.cjs +31 -0
- package/dist/test-util/jest/resolver.cjs.map +1 -0
- package/dist/test-util/jest/resolver.d.cts +16 -0
- package/dist/test-util/tsserver.d.ts +31 -0
- package/dist/test-util/tsserver.js +112 -0
- package/dist/test-util/tsserver.js.map +1 -0
- package/dist/test-util/util.d.ts +29 -0
- package/dist/test-util/util.js +85 -0
- package/dist/test-util/util.js.map +1 -0
- package/dist/transformer/index.d.ts +30 -0
- package/dist/transformer/index.js +25 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/index.test.d.ts +1 -0
- package/dist/transformer/index.test.js +66 -0
- package/dist/transformer/index.test.js.map +1 -0
- package/dist/transformer/less-transformer.d.ts +2 -0
- package/dist/transformer/less-transformer.js +45 -0
- package/dist/transformer/less-transformer.js.map +1 -0
- package/dist/transformer/less-transformer.test.d.ts +1 -0
- package/dist/transformer/less-transformer.test.js +134 -0
- package/dist/transformer/less-transformer.test.js.map +1 -0
- package/dist/transformer/postcss-transformer.d.ts +12 -0
- package/dist/transformer/postcss-transformer.js +32 -0
- package/dist/transformer/postcss-transformer.js.map +1 -0
- package/dist/transformer/postcss-transformer.test.d.ts +1 -0
- package/dist/transformer/postcss-transformer.test.js +178 -0
- package/dist/transformer/postcss-transformer.test.js.map +1 -0
- package/dist/transformer/scss-transformer.d.ts +2 -0
- package/dist/transformer/scss-transformer.js +40 -0
- package/dist/transformer/scss-transformer.js.map +1 -0
- package/dist/transformer/scss-transformer.test.d.ts +1 -0
- package/dist/transformer/scss-transformer.test.js +149 -0
- package/dist/transformer/scss-transformer.test.js.map +1 -0
- package/dist/util.d.ts +21 -0
- package/dist/util.js +72 -0
- package/dist/util.js.map +1 -0
- package/dist/util.test.d.ts +1 -0
- package/dist/util.test.js +74 -0
- package/dist/util.test.js.map +1 -0
- 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
|