happy-css-modules 0.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.
- package/LICENSE.txt +23 -0
- package/README.md +124 -0
- package/bin/hcm.js +9 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.d.ts +1 -0
- package/dist/cli.test.js +34 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/emitter/dts.d.ts +14 -0
- package/dist/emitter/dts.js +106 -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 +42 -0
- package/dist/emitter/index.js.map +1 -0
- package/dist/emitter/index.test.d.ts +1 -0
- package/dist/emitter/index.test.js +118 -0
- package/dist/emitter/index.test.js.map +1 -0
- package/dist/emitter/source-map.d.ts +9 -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 +3 -0
- package/dist/index.js +3 -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 +367 -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/loader/index.d.ts +42 -0
- package/dist/loader/index.js +145 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/index.test.d.ts +1 -0
- package/dist/loader/index.test.js +290 -0
- package/dist/loader/index.test.js.map +1 -0
- package/dist/loader/postcss.d.ts +60 -0
- package/dist/loader/postcss.js +209 -0
- package/dist/loader/postcss.js.map +1 -0
- package/dist/loader/postcss.test.d.ts +1 -0
- package/dist/loader/postcss.test.js +236 -0
- package/dist/loader/postcss.test.js.map +1 -0
- package/dist/resolver/index.d.ts +20 -0
- package/dist/resolver/index.js +39 -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 +2 -0
- package/dist/resolver/webpack-resolver.js +69 -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 +26 -0
- package/dist/resolver/webpack-resolver.test.js.map +1 -0
- package/dist/runner.d.ts +33 -0
- package/dist/runner.js +75 -0
- package/dist/runner.js.map +1 -0
- package/dist/runner.test.d.ts +1 -0
- package/dist/runner.test.js +113 -0
- package/dist/runner.test.js.map +1 -0
- package/dist/test/jest/resolver.cjs +30 -0
- package/dist/test/jest/resolver.cjs.map +1 -0
- package/dist/test/jest/resolver.d.cts +30 -0
- package/dist/test/tsserver.d.ts +27 -0
- package/dist/test/tsserver.js +104 -0
- package/dist/test/tsserver.js.map +1 -0
- package/dist/test/util.d.ts +29 -0
- package/dist/test/util.js +78 -0
- package/dist/test/util.js.map +1 -0
- package/dist/transformer/index.d.ts +23 -0
- package/dist/transformer/index.js +19 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/less-transformer.d.ts +2 -0
- package/dist/transformer/less-transformer.js +43 -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 +126 -0
- package/dist/transformer/less-transformer.test.js.map +1 -0
- package/dist/transformer/scss-transformer.d.ts +2 -0
- package/dist/transformer/scss-transformer.js +84 -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 +132 -0
- package/dist/transformer/scss-transformer.test.js.map +1 -0
- package/dist/util.d.ts +19 -0
- package/dist/util.js +52 -0
- package/dist/util.js.map +1 -0
- package/dist/util.test.d.ts +1 -0
- package/dist/util.test.js +75 -0
- package/dist/util.test.js.map +1 -0
- package/package.json +106 -0
- package/src/__snapshots__/runner.test.ts.snap +34 -0
- package/src/cli.test.ts +38 -0
- package/src/cli.ts +70 -0
- package/src/emitter/dts.test.ts +266 -0
- package/src/emitter/dts.ts +134 -0
- package/src/emitter/file-system.test.ts +36 -0
- package/src/emitter/file-system.ts +24 -0
- package/src/emitter/index.test.ts +130 -0
- package/src/emitter/index.ts +92 -0
- package/src/emitter/source-map.test.ts +20 -0
- package/src/emitter/source-map.ts +17 -0
- package/src/index.ts +3 -0
- package/src/integration-test/go-to-definition.test.ts +371 -0
- package/src/library/README.md +3 -0
- package/src/library/source-map/index.ts +26 -0
- package/src/loader/index.test.ts +306 -0
- package/src/loader/index.ts +199 -0
- package/src/loader/postcss.test.ts +336 -0
- package/src/loader/postcss.ts +239 -0
- package/src/resolver/index.test.ts +17 -0
- package/src/resolver/index.ts +48 -0
- package/src/resolver/node-resolver.test.ts +26 -0
- package/src/resolver/node-resolver.ts +7 -0
- package/src/resolver/relative-resolver.test.ts +13 -0
- package/src/resolver/relative-resolver.ts +6 -0
- package/src/resolver/webpack-resolver.test.ts +33 -0
- package/src/resolver/webpack-resolver.ts +71 -0
- package/src/runner.test.ts +122 -0
- package/src/runner.ts +105 -0
- package/src/test/jest/resolver.cjs +30 -0
- package/src/test/tsserver.ts +176 -0
- package/src/test/util.ts +100 -0
- package/src/transformer/index.ts +44 -0
- package/src/transformer/less-transformer.test.ts +135 -0
- package/src/transformer/less-transformer.ts +55 -0
- package/src/transformer/scss-transformer.test.ts +142 -0
- package/src/transformer/scss-transformer.ts +94 -0
- package/src/util.test.ts +89 -0
- package/src/util.ts +67 -0
package/dist/runner.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { resolve } from 'path';
|
|
2
|
+
import * as process from 'process';
|
|
3
|
+
import * as util from 'util';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import * as chokidar from 'chokidar';
|
|
6
|
+
import AggregateError from 'es-aggregate-error';
|
|
7
|
+
import _glob from 'glob';
|
|
8
|
+
import { emitGeneratedFiles } from './emitter/index.js';
|
|
9
|
+
import { Loader } from './loader/index.js';
|
|
10
|
+
import { isMatchByGlob } from './util.js';
|
|
11
|
+
const glob = util.promisify(_glob);
|
|
12
|
+
export async function run(options) {
|
|
13
|
+
var _a;
|
|
14
|
+
const loader = new Loader({ transformer: options.transformer, resolver: options.resolver });
|
|
15
|
+
const distOptions = options.outDir
|
|
16
|
+
? {
|
|
17
|
+
rootDir: process.cwd(),
|
|
18
|
+
outDir: options.outDir,
|
|
19
|
+
}
|
|
20
|
+
: undefined;
|
|
21
|
+
const isExternalFile = (filePath) => {
|
|
22
|
+
var _a;
|
|
23
|
+
return !isMatchByGlob(filePath, options.pattern, { cwd: (_a = options.cwd) !== null && _a !== void 0 ? _a : process.cwd() });
|
|
24
|
+
};
|
|
25
|
+
async function processFile(filePath) {
|
|
26
|
+
var _a, _b;
|
|
27
|
+
try {
|
|
28
|
+
const result = await loader.load(filePath);
|
|
29
|
+
await emitGeneratedFiles({
|
|
30
|
+
filePath,
|
|
31
|
+
tokens: result.tokens,
|
|
32
|
+
distOptions,
|
|
33
|
+
emitDeclarationMap: options.declarationMap,
|
|
34
|
+
dtsFormatOptions: {
|
|
35
|
+
localsConvention: options.localsConvention,
|
|
36
|
+
},
|
|
37
|
+
silent: (_a = options.silent) !== null && _a !== void 0 ? _a : false,
|
|
38
|
+
cwd: (_b = options.cwd) !== null && _b !== void 0 ? _b : process.cwd(),
|
|
39
|
+
isExternalFile,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
|
44
|
+
console.error(chalk.red('[Error] ' + error));
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (options.watch) {
|
|
49
|
+
if (!options.silent)
|
|
50
|
+
console.log('Watch ' + options.pattern + '...');
|
|
51
|
+
const watcher = chokidar.watch([options.pattern.replace(/\\/g, '/')], options.cwd ? { cwd: options.cwd } : {});
|
|
52
|
+
watcher.on('all', (eventName, filePath) => {
|
|
53
|
+
var _a;
|
|
54
|
+
if (eventName === 'add' || eventName === 'change') {
|
|
55
|
+
processFile(resolve((_a = options.cwd) !== null && _a !== void 0 ? _a : process.cwd(), filePath)).catch(() => {
|
|
56
|
+
// TODO: Emit a error by `Watcher#onerror`
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return { close: async () => watcher.close() };
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const filePaths = (await glob(options.pattern, { dot: true, cwd: (_a = options.cwd) !== null && _a !== void 0 ? _a : process.cwd() }))
|
|
64
|
+
// convert relative path to absolute path
|
|
65
|
+
.map((file) => { var _a; return resolve((_a = options.cwd) !== null && _a !== void 0 ? _a : process.cwd(), file); });
|
|
66
|
+
// TODO: Use `@file-cache/core` to process only files that have changed
|
|
67
|
+
const errors = [];
|
|
68
|
+
for (const filePath of filePaths) {
|
|
69
|
+
await processFile(filePath).catch((e) => errors.push(e));
|
|
70
|
+
}
|
|
71
|
+
if (errors.length > 0)
|
|
72
|
+
throw new AggregateError(errors, 'Failed to process files');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# 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,113 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
2
|
+
import { jest } from '@jest/globals';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import dedent from 'dedent';
|
|
5
|
+
import AggregateError from 'es-aggregate-error';
|
|
6
|
+
import { run } from './runner.js';
|
|
7
|
+
import { createFixtures, exists, getFixturePath, waitForAsyncTask } from './test/util.js';
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
9
|
+
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
10
|
+
const defaultOptions = {
|
|
11
|
+
pattern: 'test/**/*.{css,scss}',
|
|
12
|
+
declarationMap: true,
|
|
13
|
+
silent: true,
|
|
14
|
+
cwd: getFixturePath('/'),
|
|
15
|
+
};
|
|
16
|
+
test('generates .d.ts and .d.ts.map', async () => {
|
|
17
|
+
createFixtures({
|
|
18
|
+
'/test/1.css': '.a {}',
|
|
19
|
+
'/test/2.css': '.b {}',
|
|
20
|
+
});
|
|
21
|
+
await run({ ...defaultOptions });
|
|
22
|
+
expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatchSnapshot();
|
|
23
|
+
expect(await readFile(getFixturePath('/test/1.css.d.ts.map'), 'utf8')).toMatchSnapshot();
|
|
24
|
+
expect(await readFile(getFixturePath('/test/2.css.d.ts'), 'utf8')).toMatchSnapshot();
|
|
25
|
+
expect(await readFile(getFixturePath('/test/2.css.d.ts.map'), 'utf8')).toMatchSnapshot();
|
|
26
|
+
});
|
|
27
|
+
test.todo('changes dts format with localsConvention options');
|
|
28
|
+
test('does not emit declaration map if declarationMap is false', async () => {
|
|
29
|
+
createFixtures({
|
|
30
|
+
'/test/1.css': '.a {}',
|
|
31
|
+
});
|
|
32
|
+
await run({ ...defaultOptions, declarationMap: false });
|
|
33
|
+
await expect(readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).resolves.not.toThrow();
|
|
34
|
+
await expect(readFile(getFixturePath('/test/1.css.d.ts.map'), 'utf8')).rejects.toThrow(/ENOENT/);
|
|
35
|
+
});
|
|
36
|
+
test('supports transformer', async () => {
|
|
37
|
+
createFixtures({
|
|
38
|
+
'/test/1.scss': `.a { dummy: ''; }`,
|
|
39
|
+
});
|
|
40
|
+
await run({ ...defaultOptions });
|
|
41
|
+
expect(await readFile(getFixturePath('/test/1.scss.d.ts'), 'utf8')).toMatchSnapshot();
|
|
42
|
+
expect(await readFile(getFixturePath('/test/1.scss.d.ts.map'), 'utf8')).toMatchSnapshot();
|
|
43
|
+
});
|
|
44
|
+
test('watches for changes in files', async () => {
|
|
45
|
+
createFixtures({
|
|
46
|
+
'/test': {}, // empty directory
|
|
47
|
+
});
|
|
48
|
+
const watcher = await run({ ...defaultOptions, watch: true });
|
|
49
|
+
await writeFile(getFixturePath('/test/1.css'), '.a-1 {}');
|
|
50
|
+
await waitForAsyncTask(500); // Wait until the file is written
|
|
51
|
+
expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatch(/a-1/);
|
|
52
|
+
await writeFile(getFixturePath('/test/1.css'), '.a-2 {}');
|
|
53
|
+
await waitForAsyncTask(500); // Wait until the file is written
|
|
54
|
+
expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatch(/a-2/);
|
|
55
|
+
await watcher.close();
|
|
56
|
+
});
|
|
57
|
+
test('returns an error if the file fails to process in non-watch mode', async () => {
|
|
58
|
+
createFixtures({
|
|
59
|
+
'/test/1.css': '.a {}',
|
|
60
|
+
'/test/2.css': 'INVALID SYNTAX',
|
|
61
|
+
'/test/3.css': 'INVALID SYNTAX',
|
|
62
|
+
});
|
|
63
|
+
const maybeError = await run({ ...defaultOptions, watch: false }).catch((e) => e);
|
|
64
|
+
// The errors are aggregated into AggregateError.
|
|
65
|
+
expect(maybeError).toBeInstanceOf(AggregateError);
|
|
66
|
+
const error = maybeError;
|
|
67
|
+
expect(error.message).toMatchInlineSnapshot(`"Failed to process files"`);
|
|
68
|
+
expect(error.errors).toHaveLength(2);
|
|
69
|
+
expect(error.errors[0]).toMatchInlineSnapshot(`<fixtures>/test/2.css:1:1: Unknown word`);
|
|
70
|
+
expect(error.errors[1]).toMatchInlineSnapshot(`<fixtures>/test/3.css:1:1: Unknown word`);
|
|
71
|
+
// The error is logged to console.error.
|
|
72
|
+
expect(consoleErrorSpy).toHaveBeenCalledTimes(2);
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
|
74
|
+
expect(consoleErrorSpy).toHaveBeenNthCalledWith(1, chalk.red('[Error] ' + error.errors[0]));
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
|
76
|
+
expect(consoleErrorSpy).toHaveBeenNthCalledWith(2, chalk.red('[Error] ' + error.errors[1]));
|
|
77
|
+
// The valid files are emitted.
|
|
78
|
+
expect(await exists(getFixturePath('/test/1.css.d.ts'))).toBe(true);
|
|
79
|
+
expect(await exists(getFixturePath('/test/1.css.d.ts.map'))).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
describe('handles external files', () => {
|
|
82
|
+
beforeEach(() => {
|
|
83
|
+
createFixtures({
|
|
84
|
+
'/test/1.css': dedent `
|
|
85
|
+
@import './2.css';
|
|
86
|
+
@import 'external-library';
|
|
87
|
+
.a {}
|
|
88
|
+
`,
|
|
89
|
+
'/test/2.css': `.b {}`,
|
|
90
|
+
'/node_modules/external-library/index.css': `.c {}`,
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
test('do not emit .dts for external files', async () => {
|
|
94
|
+
await run({ ...defaultOptions });
|
|
95
|
+
expect(await exists(getFixturePath('/test/1.css.d.ts'))).toBe(true);
|
|
96
|
+
expect(await exists(getFixturePath('/test/2.css.d.ts'))).toBe(true);
|
|
97
|
+
expect(await exists(getFixturePath('/node_modules/external-library/index.css.d.ts'))).toBe(false);
|
|
98
|
+
});
|
|
99
|
+
test('treats imported tokens from external files the same as local tokens', async () => {
|
|
100
|
+
await run({ ...defaultOptions });
|
|
101
|
+
expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toMatchInlineSnapshot(`
|
|
102
|
+
"declare const styles:
|
|
103
|
+
& Readonly<Pick<(typeof import("./2.css"))["default"], "b">>
|
|
104
|
+
& Readonly<{ "c": string }>
|
|
105
|
+
& Readonly<{ "a": string }>
|
|
106
|
+
;
|
|
107
|
+
export default styles;
|
|
108
|
+
//# sourceMappingURL=./1.css.d.ts.map
|
|
109
|
+
"
|
|
110
|
+
`);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# 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,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const nativeModule = require('node:module');
|
|
4
|
+
// workaround for https://github.com/facebook/jest/issues/12270#issuecomment-1194746382
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {{
|
|
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
|
+
* }} ResolverOptions
|
|
17
|
+
* */
|
|
18
|
+
/** @type {(path: string, options: ResolverOptions) => string} */
|
|
19
|
+
function resolver(module, options) {
|
|
20
|
+
const { basedir, defaultResolver } = options;
|
|
21
|
+
try {
|
|
22
|
+
return defaultResolver(module, options);
|
|
23
|
+
// eslint-disable-next-line no-unused-vars
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return nativeModule.createRequire(basedir).resolve(module);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
module.exports = resolver;
|
|
30
|
+
//# sourceMappingURL=resolver.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.cjs","sourceRoot":"","sources":["../../../src/test/jest/resolver.cjs"],"names":[],"mappings":";;AAAA,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5C,uFAAuF;AAEvF;;;;;;;;;;;;KAYK;AAEL,iEAAiE;AACjE,SAAS,QAAQ,CAAC,MAAM,EAAE,OAAO;IAC/B,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAC7C,IAAI;QACF,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,0CAA0C;KAC3C;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;KAC5D;AACH,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export = resolver;
|
|
2
|
+
/**
|
|
3
|
+
* @typedef {{
|
|
4
|
+
* basedir: string;
|
|
5
|
+
* conditions?: Array<string>;
|
|
6
|
+
* defaultResolver: (path: string, options: ResolverOptions) => string;
|
|
7
|
+
* extensions?: Array<string>;
|
|
8
|
+
* moduleDirectory?: Array<string>;
|
|
9
|
+
* paths?: Array<string>;
|
|
10
|
+
* packageFilter?: (pkg: any, file: string, dir: string) => any;
|
|
11
|
+
* pathFilter?: (pkg: any, path: string, relativePath: string) => string;
|
|
12
|
+
* rootDir?: string;
|
|
13
|
+
* }} ResolverOptions
|
|
14
|
+
* */
|
|
15
|
+
/** @type {(path: string, options: ResolverOptions) => string} */
|
|
16
|
+
declare function resolver(module: string, options: ResolverOptions): string;
|
|
17
|
+
declare namespace resolver {
|
|
18
|
+
export { ResolverOptions };
|
|
19
|
+
}
|
|
20
|
+
type ResolverOptions = {
|
|
21
|
+
basedir: string;
|
|
22
|
+
conditions?: Array<string>;
|
|
23
|
+
defaultResolver: (path: string, options: ResolverOptions) => string;
|
|
24
|
+
extensions?: Array<string>;
|
|
25
|
+
moduleDirectory?: Array<string>;
|
|
26
|
+
paths?: Array<string>;
|
|
27
|
+
packageFilter?: (pkg: any, file: string, dir: string) => any;
|
|
28
|
+
pathFilter?: (pkg: any, path: string, relativePath: string) => string;
|
|
29
|
+
rootDir?: string;
|
|
30
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
declare 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 getIdentifierDefinitions(filePath: string, identifier: string): Promise<Definition[]>;
|
|
22
|
+
export declare function getMultipleIdentifierDefinitions(filePath: string, identifiers: string[]): Promise<{
|
|
23
|
+
identifier: string;
|
|
24
|
+
definitions: Definition[];
|
|
25
|
+
}[]>;
|
|
26
|
+
export declare function getModuleDefinitions(filePath: string): Promise<Definition[]>;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import serverHarness from '@typescript/server-harness';
|
|
4
|
+
import { resolve } from 'import-meta-resolve';
|
|
5
|
+
import lineColumn from 'line-column';
|
|
6
|
+
import { getFixturePath } from './util.js';
|
|
7
|
+
export async function getIdentifierDefinitions(filePath, identifier) {
|
|
8
|
+
const results = await getMultipleIdentifierDefinitions(filePath, [identifier]);
|
|
9
|
+
return results[0].definitions;
|
|
10
|
+
}
|
|
11
|
+
export async function getMultipleIdentifierDefinitions(filePath, identifiers) {
|
|
12
|
+
const server = serverHarness.launchServer(fileURLToPath(await resolve('typescript/lib/tsserver.js', import.meta.url)), [
|
|
13
|
+
// ATA generates some extra network traffic and isn't usually relevant when profiling
|
|
14
|
+
'--disableAutomaticTypingAcquisition',
|
|
15
|
+
]);
|
|
16
|
+
const tmpFilePath = getFixturePath('/server-harness/tmp.ts');
|
|
17
|
+
const tmpFileContent = [
|
|
18
|
+
`import styles from '${filePath}';`,
|
|
19
|
+
...identifiers.map((identifier) => `styles.${identifier};`),
|
|
20
|
+
].join('\n');
|
|
21
|
+
await server.message({
|
|
22
|
+
type: 'request',
|
|
23
|
+
command: 'updateOpen',
|
|
24
|
+
arguments: {
|
|
25
|
+
changedFiles: [],
|
|
26
|
+
closedFiles: [],
|
|
27
|
+
openFiles: [
|
|
28
|
+
{
|
|
29
|
+
file: tmpFilePath,
|
|
30
|
+
fileContent: tmpFileContent,
|
|
31
|
+
projectRootPath: getFixturePath('/server-harness'),
|
|
32
|
+
scriptKindName: 'TS', // It's easy to get this wrong when copy-pasting
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
const results = [];
|
|
38
|
+
for (let i = 0; i < identifiers.length; i++) {
|
|
39
|
+
const response = await server.message({
|
|
40
|
+
type: 'request',
|
|
41
|
+
command: 'definition',
|
|
42
|
+
arguments: {
|
|
43
|
+
file: tmpFilePath,
|
|
44
|
+
line: i + 2,
|
|
45
|
+
offset: 8, // column, 1-based
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
const definitions = response.body.map((definition) => {
|
|
49
|
+
const { file, start, end } = definition;
|
|
50
|
+
const fileContent = readFileSync(file, 'utf-8');
|
|
51
|
+
const startIndex = lineColumn(fileContent).toIndex(start.line, start.offset);
|
|
52
|
+
const endIndex = lineColumn(fileContent).toIndex(end.line, end.offset);
|
|
53
|
+
const text = fileContent.slice(startIndex, endIndex);
|
|
54
|
+
return { file, text, start, end };
|
|
55
|
+
});
|
|
56
|
+
results.push({ identifier: identifiers[i], definitions });
|
|
57
|
+
}
|
|
58
|
+
await server.message({ command: 'exit' });
|
|
59
|
+
return results;
|
|
60
|
+
}
|
|
61
|
+
export async function getModuleDefinitions(filePath) {
|
|
62
|
+
const server = serverHarness.launchServer(fileURLToPath(await resolve('typescript/lib/tsserver.js', import.meta.url)), [
|
|
63
|
+
// ATA generates some extra network traffic and isn't usually relevant when profiling
|
|
64
|
+
'--disableAutomaticTypingAcquisition',
|
|
65
|
+
]);
|
|
66
|
+
const tmpFilePath = getFixturePath('/server-harness/tmp.ts');
|
|
67
|
+
const tmpFileContent = `import styles from '${filePath}';`;
|
|
68
|
+
await server.message({
|
|
69
|
+
type: 'request',
|
|
70
|
+
command: 'updateOpen',
|
|
71
|
+
arguments: {
|
|
72
|
+
changedFiles: [],
|
|
73
|
+
closedFiles: [],
|
|
74
|
+
openFiles: [
|
|
75
|
+
{
|
|
76
|
+
file: tmpFilePath,
|
|
77
|
+
fileContent: tmpFileContent,
|
|
78
|
+
projectRootPath: getFixturePath('/server-harness'),
|
|
79
|
+
scriptKindName: 'TS', // It's easy to get this wrong when copy-pasting
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
const response = await server.message({
|
|
85
|
+
type: 'request',
|
|
86
|
+
command: 'definition',
|
|
87
|
+
arguments: {
|
|
88
|
+
file: tmpFilePath,
|
|
89
|
+
line: 1,
|
|
90
|
+
offset: 20, // column, 1-based
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
const definitions = response.body.map((definition) => {
|
|
94
|
+
const { file, start, end } = definition;
|
|
95
|
+
const fileContent = readFileSync(file, 'utf-8');
|
|
96
|
+
const startIndex = lineColumn(fileContent).toIndex(start.line, start.offset);
|
|
97
|
+
const endIndex = lineColumn(fileContent).toIndex(end.line, end.offset);
|
|
98
|
+
const text = fileContent.slice(startIndex, endIndex);
|
|
99
|
+
return { file, text, start, end };
|
|
100
|
+
});
|
|
101
|
+
await server.message({ command: 'exit' });
|
|
102
|
+
return definitions;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=tsserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsserver.js","sourceRoot":"","sources":["../../src/test/tsserver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Root, type Rule, type AtRule, type Declaration } from 'postcss';
|
|
2
|
+
import { type ClassName } from 'postcss-selector-parser';
|
|
3
|
+
import { type Token, type Location } from '../loader/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 createClassSelectors(root: Root): {
|
|
8
|
+
rule: Rule;
|
|
9
|
+
classSelector: ClassName;
|
|
10
|
+
}[];
|
|
11
|
+
export declare function createComposesDeclarations(root: Root): Declaration[];
|
|
12
|
+
export declare function fakeToken(args: {
|
|
13
|
+
name: Token['name'];
|
|
14
|
+
originalLocations: {
|
|
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
|
+
declare type File = string;
|
|
22
|
+
declare type DirectoryItem = File | DirectoryItems;
|
|
23
|
+
declare 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,78 @@
|
|
|
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 '../loader/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 createClassSelectors(root) {
|
|
16
|
+
return collectNodes(root).classSelectors;
|
|
17
|
+
}
|
|
18
|
+
export function createComposesDeclarations(root) {
|
|
19
|
+
return collectNodes(root).composesDeclarations;
|
|
20
|
+
}
|
|
21
|
+
export function fakeToken(args) {
|
|
22
|
+
return {
|
|
23
|
+
name: args.name,
|
|
24
|
+
originalLocations: args.originalLocations.map((location) => {
|
|
25
|
+
var _a;
|
|
26
|
+
return ({
|
|
27
|
+
filePath: (_a = location.filePath) !== null && _a !== void 0 ? _a : getFixturePath('/test/1.css'),
|
|
28
|
+
start: location.start,
|
|
29
|
+
end: {
|
|
30
|
+
line: location.start.line,
|
|
31
|
+
column: location.start.column + args.name.length - 1,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export async function waitForAsyncTask(ms) {
|
|
38
|
+
await new Promise((resolve) => setTimeout(resolve, ms !== null && ms !== void 0 ? ms : 0));
|
|
39
|
+
}
|
|
40
|
+
export async function exists(path) {
|
|
41
|
+
try {
|
|
42
|
+
await access(path, constants.F_OK);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function isFile(item) {
|
|
50
|
+
return typeof item === 'string';
|
|
51
|
+
}
|
|
52
|
+
export function createFixtures(items) {
|
|
53
|
+
function createFixturesImpl(items, baseDir) {
|
|
54
|
+
for (const [name, item] of Object.entries(items)) {
|
|
55
|
+
const path = join(baseDir, name);
|
|
56
|
+
if (isFile(item)) {
|
|
57
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
58
|
+
if (typeof item === 'string') {
|
|
59
|
+
writeFileSync(path, item);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
mkdirSync(path, { recursive: true });
|
|
64
|
+
createFixturesImpl(item, path);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
removeFixtures();
|
|
69
|
+
sleepSync(2); // Wait 2 ms for mtime to change from the previous fixture.
|
|
70
|
+
createFixturesImpl(items, FIXTURE_DIR_PATH);
|
|
71
|
+
}
|
|
72
|
+
export function removeFixtures() {
|
|
73
|
+
rmSync(FIXTURE_DIR_PATH, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
export function getFixturePath(path) {
|
|
76
|
+
return join(FIXTURE_DIR_PATH, path);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/test/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import type { StrictlyResolver } from '../loader/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* The value returned from the transformer.
|
|
5
|
+
* `false` means to skip transpiling on that file.
|
|
6
|
+
* */
|
|
7
|
+
export declare type TransformResult = {
|
|
8
|
+
/** The transformed code. */
|
|
9
|
+
css: string;
|
|
10
|
+
/** The source map from the transformed code to the original code. */
|
|
11
|
+
map: string | object;
|
|
12
|
+
dependencies: (string | URL)[];
|
|
13
|
+
} | false;
|
|
14
|
+
export declare type TransformerOptions = {
|
|
15
|
+
/** The path of the file to transform. */
|
|
16
|
+
from: string;
|
|
17
|
+
/** The function to resolve the path of the imported file. */
|
|
18
|
+
resolver: StrictlyResolver;
|
|
19
|
+
};
|
|
20
|
+
/** The function to transform source code. */
|
|
21
|
+
export declare type Transformer = (source: string, options: TransformerOptions) => TransformResult | Promise<TransformResult>;
|
|
22
|
+
export declare const handleImportError: (packageName: string) => (e: unknown) => never;
|
|
23
|
+
export declare const createDefaultTransformer: () => Transformer;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createLessTransformer } from './less-transformer.js';
|
|
2
|
+
import { createScssTransformer } from './scss-transformer.js';
|
|
3
|
+
export const handleImportError = (packageName) => (e) => {
|
|
4
|
+
console.error(`${packageName} import failed. Did you forget to \`npm install -D ${packageName}\`?`);
|
|
5
|
+
throw e;
|
|
6
|
+
};
|
|
7
|
+
export const createDefaultTransformer = () => async (source, options) => {
|
|
8
|
+
const scssTransformer = createScssTransformer();
|
|
9
|
+
const lessTransformer = createLessTransformer();
|
|
10
|
+
if (options.from.endsWith('.scss')) {
|
|
11
|
+
return scssTransformer(source, options);
|
|
12
|
+
}
|
|
13
|
+
else if (options.from.endsWith('.less')) {
|
|
14
|
+
return lessTransformer(source, options);
|
|
15
|
+
}
|
|
16
|
+
// TODO: support postcss
|
|
17
|
+
return false;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AA0B9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE;IACvE,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,sDAAsD,WAAW,KAAK,CAAC,CAAC;IACpG,MAAM,CAAC,CAAC;AACV,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAsB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IACzF,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;IAChD,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAClC,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACzC;SAAM,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACzC,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACzC;IACD,wBAAwB;IACxB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { handleImportError } from './index.js';
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/consistent-type-imports
|
|
3
|
+
function createLessPluginResolver(Less, options) {
|
|
4
|
+
class ResolverFileManager extends Less.FileManager {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
super();
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
10
|
+
supports(filename) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
async loadFile(filename, currentDirectory, options, environment) {
|
|
14
|
+
const resolved = await this.options.resolver(filename, { request: currentDirectory });
|
|
15
|
+
return super.loadFile(resolved, currentDirectory, options, environment);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
class LessPluginResolver {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.minVersion = [2, 1, 1];
|
|
21
|
+
this.options = options;
|
|
22
|
+
}
|
|
23
|
+
install(less, pluginManager) {
|
|
24
|
+
pluginManager.addFileManager(new ResolverFileManager(this.options));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return new LessPluginResolver(options);
|
|
28
|
+
}
|
|
29
|
+
export const createLessTransformer = () => {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
31
|
+
let less;
|
|
32
|
+
return async (source, options) => {
|
|
33
|
+
less !== null && less !== void 0 ? less : (less = (await import('less').catch(handleImportError('less'))).default);
|
|
34
|
+
const result = await less.render(source, {
|
|
35
|
+
filename: options.from,
|
|
36
|
+
sourceMap: {},
|
|
37
|
+
plugins: [createLessPluginResolver(less, options)],
|
|
38
|
+
syncImport: false, // Don't use `Less.FileManager#loadFileSync`.
|
|
39
|
+
});
|
|
40
|
+
return { css: result.css, map: result.map, dependencies: result.imports };
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=less-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"less-transformer.js","sourceRoot":"","sources":["../../src/transformer/less-transformer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,4GAA4G;AAC5G,SAAS,wBAAwB,CAAC,IAA2B,EAAE,OAA2B;IACxF,MAAM,mBAAoB,SAAQ,IAAI,CAAC,WAAW;QAEhD,YAAY,OAA2B;YACrC,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;QACD,6DAA6D;QAC7C,QAAQ,CAAC,QAAgB;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QACe,KAAK,CAAC,QAAQ,CAC5B,QAAgB,EAChB,gBAAwB,EACxB,OAA6B,EAC7B,WAA6B;YAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACtF,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1E,CAAC;KACF;IAED,MAAM,kBAAkB;QAEtB,YAAY,OAA2B;YAMhC,eAAU,GAA6B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YALtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;QACM,OAAO,CAAC,IAAgB,EAAE,aAAiC;YAChE,aAAa,CAAC,cAAc,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,CAAC;KAEF;IAED,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAsB,GAAG,EAAE;IAC3D,sEAAsE;IACtE,IAAI,IAA2B,CAAC;IAChC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,aAAJ,IAAI,cAAJ,IAAI,IAAJ,IAAI,GAAK,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAC;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACvC,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClD,UAAU,EAAE,KAAK,EAAE,6CAA6C;SACjE,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|