happy-css-modules 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +127 -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 +15 -0
- package/dist/emitter/dts.js +134 -0
- package/dist/emitter/dts.js.map +1 -0
- package/dist/emitter/dts.test.d.ts +1 -0
- package/dist/emitter/dts.test.js +206 -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 +42 -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 +76 -0
- package/dist/emitter/index.test.js.map +1 -0
- package/dist/emitter/source-map.d.ts +10 -0
- package/dist/emitter/source-map.js +17 -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/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 +78 -0
- package/dist/runner.js +122 -0
- package/dist/runner.js.map +1 -0
- package/dist/runner.test.d.ts +1 -0
- package/dist/runner.test.js +304 -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/src/cli.ts +6 -0
- package/src/emitter/dts.test.ts +7 -4
- package/src/emitter/dts.ts +22 -10
- package/src/emitter/index.test.ts +10 -0
- package/src/emitter/index.ts +17 -4
- package/src/emitter/source-map.test.ts +4 -4
- package/src/emitter/source-map.ts +8 -2
- package/src/runner.test.ts +23 -0
- package/src/runner.ts +6 -0
- package/src/library/README.md +0 -3
- package/src/library/source-map/index.ts +0 -26
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
import dedent from 'dedent';
|
|
3
|
+
import { Locator } from '../locator/index.js';
|
|
4
|
+
import { createFixtures, getFixturePath } from '../test-util/util.js';
|
|
5
|
+
import { createScssTransformer } from './scss-transformer.js';
|
|
6
|
+
const locator = new Locator({ transformer: createScssTransformer() });
|
|
7
|
+
const loadSpy = jest.spyOn(locator, 'load');
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
loadSpy.mockClear();
|
|
10
|
+
});
|
|
11
|
+
test('handles sass features', async () => {
|
|
12
|
+
createFixtures({
|
|
13
|
+
'/test/1.scss': dedent `
|
|
14
|
+
@use './2.scss' as two; // sass feature test (@use)
|
|
15
|
+
@import './3.scss'; // css feature test (@import)
|
|
16
|
+
.a_1 { dummy: ''; }
|
|
17
|
+
.a_2 {
|
|
18
|
+
dummy: '';
|
|
19
|
+
// sass feature test (nesting)
|
|
20
|
+
.a_2_1 { dummy: ''; }
|
|
21
|
+
&_2 { dummy: ''; }
|
|
22
|
+
}
|
|
23
|
+
`,
|
|
24
|
+
'/test/2.scss': dedent `
|
|
25
|
+
.b_1 { dummy: ''; }
|
|
26
|
+
@mixin b_2 { dummy: ''; }
|
|
27
|
+
`,
|
|
28
|
+
'/test/3.scss': dedent `
|
|
29
|
+
.c { dummy: ''; }
|
|
30
|
+
`,
|
|
31
|
+
'/test/4.scss': dedent `
|
|
32
|
+
.d { dummy: ''; }
|
|
33
|
+
`,
|
|
34
|
+
});
|
|
35
|
+
const result = await locator.load(getFixturePath('/test/1.scss'));
|
|
36
|
+
// NOTE: There should be only one originalLocations for 'a_2', but there are multiple.
|
|
37
|
+
// This is probably due to an incorrect sourcemap output by the sass compiler.
|
|
38
|
+
// FIXME: The sass compiler or Loader implementation needs to be fixed.
|
|
39
|
+
// FIXME: The end position of 'a_2_2' is incorrect.
|
|
40
|
+
expect(result).toMatchInlineSnapshot(`
|
|
41
|
+
{
|
|
42
|
+
dependencies: ["<fixtures>/test/2.scss", "<fixtures>/test/3.scss"],
|
|
43
|
+
tokens: [
|
|
44
|
+
{
|
|
45
|
+
name: "b_1",
|
|
46
|
+
originalLocation: {
|
|
47
|
+
filePath: "<fixtures>/test/2.scss",
|
|
48
|
+
start: { line: 1, column: 1 },
|
|
49
|
+
end: { line: 1, column: 4 },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "c",
|
|
54
|
+
originalLocation: {
|
|
55
|
+
filePath: "<fixtures>/test/3.scss",
|
|
56
|
+
start: { line: 1, column: 1 },
|
|
57
|
+
end: { line: 1, column: 2 },
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "a_1",
|
|
62
|
+
originalLocation: {
|
|
63
|
+
filePath: "<fixtures>/test/1.scss",
|
|
64
|
+
start: { line: 3, column: 1 },
|
|
65
|
+
end: { line: 3, column: 4 },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "a_2",
|
|
70
|
+
originalLocation: {
|
|
71
|
+
filePath: "<fixtures>/test/1.scss",
|
|
72
|
+
start: { line: 4, column: 1 },
|
|
73
|
+
end: { line: 4, column: 4 },
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: "a_2",
|
|
78
|
+
originalLocation: {
|
|
79
|
+
filePath: "<fixtures>/test/1.scss",
|
|
80
|
+
start: { line: 7, column: 3 },
|
|
81
|
+
end: { line: 7, column: 6 },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "a_2_1",
|
|
86
|
+
originalLocation: {
|
|
87
|
+
filePath: "<fixtures>/test/1.scss",
|
|
88
|
+
start: { line: 7, column: 3 },
|
|
89
|
+
end: { line: 7, column: 8 },
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "a_2_2",
|
|
94
|
+
originalLocation: {
|
|
95
|
+
filePath: "<fixtures>/test/1.scss",
|
|
96
|
+
start: { line: 8, column: 3 },
|
|
97
|
+
end: { line: 8, column: 8 },
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
}
|
|
102
|
+
`);
|
|
103
|
+
});
|
|
104
|
+
test('tracks dependencies that have been pre-bundled by sass compiler', async () => {
|
|
105
|
+
createFixtures({
|
|
106
|
+
'/test/1.scss': dedent `
|
|
107
|
+
@import './2.scss';
|
|
108
|
+
@import './3.scss';
|
|
109
|
+
`,
|
|
110
|
+
'/test/2.scss': dedent `
|
|
111
|
+
`,
|
|
112
|
+
'/test/3.scss': dedent `
|
|
113
|
+
@import './4.scss';
|
|
114
|
+
`,
|
|
115
|
+
'/test/4.scss': dedent `
|
|
116
|
+
`,
|
|
117
|
+
});
|
|
118
|
+
const result = await locator.load(getFixturePath('/test/1.scss'));
|
|
119
|
+
// The files imported using @import are pre-bundled by the compiler.
|
|
120
|
+
// Therefore, `Locator#load` is not called to process other files.
|
|
121
|
+
expect(loadSpy).toBeCalledTimes(1);
|
|
122
|
+
expect(loadSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.scss'));
|
|
123
|
+
// The files pre-bundled by the compiler are also included in `result.dependencies`
|
|
124
|
+
expect(result.dependencies).toStrictEqual(['/test/2.scss', '/test/3.scss', '/test/4.scss'].map(getFixturePath));
|
|
125
|
+
});
|
|
126
|
+
test('resolves specifier using resolver', async () => {
|
|
127
|
+
createFixtures({
|
|
128
|
+
'/test/1.scss': dedent `
|
|
129
|
+
@import 'package-1';
|
|
130
|
+
@import 'package-2';
|
|
131
|
+
`,
|
|
132
|
+
'/node_modules/package-1/index.css': `.a {}`,
|
|
133
|
+
'/node_modules/package-2/index.scss': `.a {}`,
|
|
134
|
+
});
|
|
135
|
+
const result = await locator.load(getFixturePath('/test/1.scss'));
|
|
136
|
+
expect(result.dependencies).toStrictEqual(['/node_modules/package-1/index.css', '/node_modules/package-2/index.scss'].map(getFixturePath));
|
|
137
|
+
});
|
|
138
|
+
test('ignores http(s) protocol file', async () => {
|
|
139
|
+
createFixtures({
|
|
140
|
+
'/test/1.scss': dedent `
|
|
141
|
+
@import 'http://example.com/path/http.css';
|
|
142
|
+
@import 'https://example.com/path/https.css';
|
|
143
|
+
@import 'https://example.com/path/scss.scss';
|
|
144
|
+
`,
|
|
145
|
+
});
|
|
146
|
+
const result = await locator.load(getFixturePath('/test/1.scss'));
|
|
147
|
+
expect(result.dependencies).toStrictEqual([]);
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=scss-transformer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scss-transformer.test.js","sourceRoot":"","sources":["../../src/transformer/scss-transformer.test.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SystemError type of Node.js.
|
|
3
|
+
* @see https://nodejs.org/api/errors.html#class-systemerror
|
|
4
|
+
*/
|
|
5
|
+
export interface SystemError {
|
|
6
|
+
code: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function isSystemError(value: unknown): value is SystemError;
|
|
9
|
+
export declare function isObject(value: unknown): value is object;
|
|
10
|
+
export declare function hasProp<T extends string>(obj: object, prop: T): obj is {
|
|
11
|
+
[key in T]: unknown;
|
|
12
|
+
};
|
|
13
|
+
export declare function unique<T>(array: T[]): T[];
|
|
14
|
+
export declare function uniqueBy<T, U>(arr: T[], fn: (el: T) => U): T[];
|
|
15
|
+
export declare function sleepSync(ms: number): void;
|
|
16
|
+
export declare function exists(path: string): Promise<boolean>;
|
|
17
|
+
export declare function isMatchByGlob(filePath: string, pattern: string, options: {
|
|
18
|
+
cwd: string;
|
|
19
|
+
}): boolean;
|
|
20
|
+
export declare function getPackageJson(): any;
|
|
21
|
+
export declare function getInstalledPeerDependencies(): string[];
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { constants, readFileSync } from 'fs';
|
|
2
|
+
import { access } from 'fs/promises';
|
|
3
|
+
import { join, dirname, resolve } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { resolve as importMetaResolve } from 'import-meta-resolve';
|
|
6
|
+
import { minimatch } from 'minimatch';
|
|
7
|
+
export function isSystemError(value) {
|
|
8
|
+
return (isObject(value) &&
|
|
9
|
+
hasProp(value, 'constructor') &&
|
|
10
|
+
isObject(value.constructor) &&
|
|
11
|
+
hasProp(value.constructor, 'name') &&
|
|
12
|
+
value.constructor.name === 'Error' &&
|
|
13
|
+
hasProp(value, 'code') &&
|
|
14
|
+
typeof value.code === 'string');
|
|
15
|
+
}
|
|
16
|
+
export function isObject(value) {
|
|
17
|
+
return (typeof value === 'object' || typeof value === 'function') && value !== null;
|
|
18
|
+
}
|
|
19
|
+
export function hasProp(obj, prop) {
|
|
20
|
+
return prop in obj;
|
|
21
|
+
}
|
|
22
|
+
export function unique(array) {
|
|
23
|
+
return [...new Set(array)];
|
|
24
|
+
}
|
|
25
|
+
export function uniqueBy(arr, fn) {
|
|
26
|
+
const result = [];
|
|
27
|
+
const keys = new Set();
|
|
28
|
+
for (const el of arr) {
|
|
29
|
+
const key = fn(el);
|
|
30
|
+
if (!keys.has(key)) {
|
|
31
|
+
keys.add(key);
|
|
32
|
+
result.push(el);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
export function sleepSync(ms) {
|
|
38
|
+
const start = Date.now();
|
|
39
|
+
// eslint-disable-next-line no-empty
|
|
40
|
+
while (Date.now() - start < ms) { }
|
|
41
|
+
}
|
|
42
|
+
export async function exists(path) {
|
|
43
|
+
try {
|
|
44
|
+
await access(path, constants.F_OK);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function isMatchByGlob(filePath, pattern, options) {
|
|
52
|
+
return minimatch(filePath, join(options.cwd, pattern), { windowsPathsNoEscape: true });
|
|
53
|
+
}
|
|
54
|
+
export function getPackageJson() {
|
|
55
|
+
return JSON.parse(readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '../package.json'), 'utf-8'));
|
|
56
|
+
}
|
|
57
|
+
export function getInstalledPeerDependencies() {
|
|
58
|
+
const pkgJson = getPackageJson();
|
|
59
|
+
const result = [];
|
|
60
|
+
for (const deps of Object.keys(pkgJson.peerDependencies)) {
|
|
61
|
+
try {
|
|
62
|
+
importMetaResolve(deps, import.meta.url);
|
|
63
|
+
// If the package is installed, push it to the result array.
|
|
64
|
+
result.push(deps);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// If the package is not installed, do nothing.
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { createFixtures, getFixturePath } from './test-util/util.js';
|
|
3
|
+
import { hasProp, isObject, isSystemError, unique, uniqueBy, isMatchByGlob, exists } from './util.js';
|
|
4
|
+
function fakeSystemError({ code }) {
|
|
5
|
+
const error = new Error();
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
error.code = code;
|
|
8
|
+
return error;
|
|
9
|
+
}
|
|
10
|
+
test('isSystemError', () => {
|
|
11
|
+
expect(isSystemError(fakeSystemError({ code: 'ENOENT' }))).toBe(true);
|
|
12
|
+
expect(isSystemError(fakeSystemError({ code: 'EACCES' }))).toBe(true);
|
|
13
|
+
expect(isSystemError(new Error('ENOENT'))).toBe(false);
|
|
14
|
+
expect(isSystemError({ code: 'ENOENT' })).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
test('isObject', () => {
|
|
17
|
+
expect(isObject({})).toBe(true);
|
|
18
|
+
expect(isObject({ a: '1' })).toBe(true);
|
|
19
|
+
expect(isObject([])).toBe(true);
|
|
20
|
+
expect(isObject(() => {
|
|
21
|
+
/* noop */
|
|
22
|
+
})).toBe(true);
|
|
23
|
+
expect(isObject(null)).toBe(false);
|
|
24
|
+
expect(isObject(undefined)).toBe(false);
|
|
25
|
+
expect(isObject(1)).toBe(false);
|
|
26
|
+
expect(isObject('1')).toBe(false);
|
|
27
|
+
expect(isObject(true)).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
test('hasProp', () => {
|
|
30
|
+
expect(hasProp({ a: '1' }, 'a')).toBe(true);
|
|
31
|
+
expect(hasProp({ a: '1' }, 'b')).toBe(false);
|
|
32
|
+
// it can check prototype
|
|
33
|
+
expect(hasProp({}, 'toString')).toBe(true);
|
|
34
|
+
expect(hasProp([], 'length')).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
test('unique', () => {
|
|
37
|
+
expect(unique([0, 1, 1, 2, 1])).toStrictEqual([0, 1, 2]);
|
|
38
|
+
});
|
|
39
|
+
test('uniqueBy', () => {
|
|
40
|
+
expect(uniqueBy([], () => 0)).toStrictEqual([]);
|
|
41
|
+
expect(uniqueBy([
|
|
42
|
+
{ key: 'a', value: 0 },
|
|
43
|
+
{ key: 'a', value: 1 },
|
|
44
|
+
{ key: 'b', value: 2 },
|
|
45
|
+
{ key: 'b', value: 3 },
|
|
46
|
+
{ key: 'c', value: 4 },
|
|
47
|
+
{ key: 'c', value: 5 },
|
|
48
|
+
], (el) => el.key)).toStrictEqual([
|
|
49
|
+
{ key: 'a', value: 0 },
|
|
50
|
+
{ key: 'b', value: 2 },
|
|
51
|
+
{ key: 'c', value: 4 },
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
test('exists', async () => {
|
|
55
|
+
createFixtures({
|
|
56
|
+
'/test/1.css': `.a {}`,
|
|
57
|
+
});
|
|
58
|
+
expect(await exists(getFixturePath('/test/1.css'))).toBe(true);
|
|
59
|
+
expect(await exists(getFixturePath('/test/2.css'))).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
test('isMatchByGlob', () => {
|
|
62
|
+
const cwd = process.cwd();
|
|
63
|
+
expect(isMatchByGlob(join(cwd, '1.css'), '*.css', { cwd })).toBe(true);
|
|
64
|
+
expect(isMatchByGlob(join(cwd, '1.scss'), '*.css', { cwd })).toBe(false);
|
|
65
|
+
expect(isMatchByGlob(join(cwd, 'dir/1.css'), '**/*.css', { cwd })).toBe(true);
|
|
66
|
+
expect(isMatchByGlob(join(cwd, 'dir/dir/1.css'), '**/*.css', { cwd })).toBe(true);
|
|
67
|
+
expect(isMatchByGlob(join(cwd, '1.css'), '*.{css,scss}', { cwd })).toBe(true);
|
|
68
|
+
expect(isMatchByGlob(join(cwd, '1.scss'), '*.{css,scss}', { cwd })).toBe(true);
|
|
69
|
+
expect(isMatchByGlob(join(cwd, '1.less'), '*.{css,scss}', { cwd })).toBe(false);
|
|
70
|
+
expect(isMatchByGlob(join(cwd, '1.css'), '!(*.css)', { cwd })).toBe(false);
|
|
71
|
+
expect(isMatchByGlob(join(cwd, '1.scss'), '!(*.css)', { cwd })).toBe(true);
|
|
72
|
+
expect(isMatchByGlob(join(cwd, '1.less'), '!(*.css)', { cwd })).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=util.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.test.js","sourceRoot":"","sources":["../src/util.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -78,6 +78,11 @@ export function parseArgv(argv: string[]): RunnerOptions {
|
|
|
78
78
|
default: 'info' as RunnerOptions['logLevel'],
|
|
79
79
|
describe: 'What level of logs to report.',
|
|
80
80
|
})
|
|
81
|
+
.option('outDir', {
|
|
82
|
+
type: 'string',
|
|
83
|
+
alias: 'o',
|
|
84
|
+
describe: 'Output directory for generated files.',
|
|
85
|
+
})
|
|
81
86
|
.alias('h', 'help')
|
|
82
87
|
.alias('v', 'version')
|
|
83
88
|
.version(pkgJson.version)
|
|
@@ -116,5 +121,6 @@ export function parseArgv(argv: string[]): RunnerOptions {
|
|
|
116
121
|
cache: parsedArgv.cache,
|
|
117
122
|
cacheStrategy: parsedArgv.cacheStrategy,
|
|
118
123
|
logLevel: parsedArgv.logLevel,
|
|
124
|
+
outDir: parsedArgv.outDir,
|
|
119
125
|
};
|
|
120
126
|
}
|
package/src/emitter/dts.test.ts
CHANGED
|
@@ -9,10 +9,13 @@ const locator = new Locator();
|
|
|
9
9
|
const isExternalFile = () => false;
|
|
10
10
|
|
|
11
11
|
test('getDtsFilePath', () => {
|
|
12
|
-
expect(getDtsFilePath('/app/src/dir/1.css', false)).toBe('/app/src/dir/1.css.d.ts');
|
|
13
|
-
expect(getDtsFilePath('/app/src/dir/1.scss', false)).toBe('/app/src/dir/1.scss.d.ts');
|
|
14
|
-
expect(getDtsFilePath('/app/src/dir/1.css', true)).toBe('/app/src/dir/1.d.css.ts');
|
|
15
|
-
expect(getDtsFilePath('/app/src/dir/1.scss', true)).toBe('/app/src/dir/1.d.scss.ts');
|
|
12
|
+
expect(getDtsFilePath('/app/src/dir/1.css', false, undefined)).toBe('/app/src/dir/1.css.d.ts');
|
|
13
|
+
expect(getDtsFilePath('/app/src/dir/1.scss', false, undefined)).toBe('/app/src/dir/1.scss.d.ts');
|
|
14
|
+
expect(getDtsFilePath('/app/src/dir/1.css', true, undefined)).toBe('/app/src/dir/1.d.css.ts');
|
|
15
|
+
expect(getDtsFilePath('/app/src/dir/1.scss', true, undefined)).toBe('/app/src/dir/1.d.scss.ts');
|
|
16
|
+
expect(getDtsFilePath('/app/src/dir/1.css', false, { cwd: '/app', outDir: 'dist' })).toBe(
|
|
17
|
+
'/app/dist/src/dir/1.css.d.ts',
|
|
18
|
+
);
|
|
16
19
|
});
|
|
17
20
|
|
|
18
21
|
describe('generateDtsContentWithSourceMap', () => {
|
package/src/emitter/dts.ts
CHANGED
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
import { EOL } from 'os';
|
|
2
|
-
import { basename, parse, join } from 'path';
|
|
2
|
+
import path, { basename, parse, join } from 'path';
|
|
3
3
|
import camelcase from 'camelcase';
|
|
4
|
-
import { SourceNode, type CodeWithSourceMap } from '
|
|
4
|
+
import { SourceNode, type CodeWithSourceMap } from 'source-map';
|
|
5
5
|
import { type Token } from '../locator/index.js';
|
|
6
6
|
import { type LocalsConvention } from '../runner.js';
|
|
7
|
-
import { getRelativePath
|
|
7
|
+
import { getRelativePath } from './index.js';
|
|
8
|
+
import type { OutDirOptions, DtsFormatOptions } from './index.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Get .d.ts file path.
|
|
11
12
|
* @param filePath The path to the source file (i.e. `/dir/foo.css`). It is absolute.
|
|
12
13
|
* @param arbitraryExtensions Generate `.d.css.ts` instead of `.css.d.ts`.
|
|
14
|
+
* @param options Output directory options
|
|
13
15
|
* @returns The path to the .d.ts file. It is absolute.
|
|
14
16
|
*/
|
|
15
|
-
export function getDtsFilePath(
|
|
17
|
+
export function getDtsFilePath(
|
|
18
|
+
filePath: string,
|
|
19
|
+
arbitraryExtensions: boolean,
|
|
20
|
+
options: OutDirOptions | undefined,
|
|
21
|
+
): string {
|
|
22
|
+
let outputFilePath = filePath;
|
|
23
|
+
if (options?.outDir) {
|
|
24
|
+
const relativePath = path.relative(options.cwd, filePath);
|
|
25
|
+
outputFilePath = path.resolve(options.cwd, options.outDir, relativePath);
|
|
26
|
+
}
|
|
27
|
+
|
|
16
28
|
if (arbitraryExtensions) {
|
|
17
|
-
const { dir, name, ext } = parse(
|
|
29
|
+
const { dir, name, ext } = parse(outputFilePath);
|
|
18
30
|
return join(dir, `${name}.d${ext}.ts`);
|
|
19
31
|
} else {
|
|
20
|
-
return `${
|
|
32
|
+
return `${outputFilePath}.d.ts`;
|
|
21
33
|
}
|
|
22
34
|
}
|
|
23
35
|
|
|
@@ -61,9 +73,9 @@ function generateTokenDeclarations(
|
|
|
61
73
|
tokens: Token[],
|
|
62
74
|
dtsFormatOptions: DtsFormatOptions | undefined,
|
|
63
75
|
isExternalFile: (filePath: string) => boolean,
|
|
64
|
-
):
|
|
76
|
+
): SourceNode[] {
|
|
65
77
|
const formattedTokens = formatTokens(tokens, dtsFormatOptions?.localsConvention);
|
|
66
|
-
const result:
|
|
78
|
+
const result: SourceNode[] = [];
|
|
67
79
|
|
|
68
80
|
for (const token of formattedTokens) {
|
|
69
81
|
// Only one original position can be associated with one generated position.
|
|
@@ -140,13 +152,13 @@ export function generateDtsContentWithSourceMap(
|
|
|
140
152
|
isExternalFile,
|
|
141
153
|
);
|
|
142
154
|
|
|
143
|
-
let sourceNode:
|
|
155
|
+
let sourceNode: SourceNode;
|
|
144
156
|
if (!tokenDeclarations || !tokenDeclarations.length) {
|
|
145
157
|
sourceNode = new SourceNode(null, null, null, '');
|
|
146
158
|
} else {
|
|
147
159
|
sourceNode = new SourceNode(1, 0, getRelativePath(sourceMapFilePath, filePath), [
|
|
148
160
|
`declare const styles:${EOL}`,
|
|
149
|
-
...tokenDeclarations.map((tokenDeclaration) => [' ', tokenDeclaration, EOL]),
|
|
161
|
+
...tokenDeclarations.map((tokenDeclaration) => [' ', tokenDeclaration, EOL]).flat(),
|
|
150
162
|
`;${EOL}`,
|
|
151
163
|
`export default styles;${EOL}`,
|
|
152
164
|
]);
|
|
@@ -30,6 +30,7 @@ describe('emitGeneratedFiles', () => {
|
|
|
30
30
|
dtsFormatOptions: undefined,
|
|
31
31
|
cwd: getFixturePath('/test'),
|
|
32
32
|
isExternalFile: () => false,
|
|
33
|
+
outDir: undefined,
|
|
33
34
|
};
|
|
34
35
|
beforeEach(() => {
|
|
35
36
|
createFixtures({
|
|
@@ -75,4 +76,13 @@ describe('emitGeneratedFiles', () => {
|
|
|
75
76
|
expect(mtimeForDts1).not.toEqual(mtimeForDts3); // not skipped
|
|
76
77
|
expect(mtimeForSourceMap1).not.toEqual(mtimeForSourceMap3); // not skipped
|
|
77
78
|
});
|
|
79
|
+
test('changes output directory by outDir', async () => {
|
|
80
|
+
await emitGeneratedFiles({ ...defaultArgs, outDir: 'dist' });
|
|
81
|
+
expect(await exists(getFixturePath('/test/dist/1.css.d.ts'))).toBeTruthy();
|
|
82
|
+
// A link to the source map is not embedded.
|
|
83
|
+
expect(await readFile(getFixturePath('/test/dist/1.css.d.ts'), 'utf8')).toEqual(
|
|
84
|
+
expect.not.stringContaining('//# sourceMappingURL=1.css.d.ts.map'),
|
|
85
|
+
);
|
|
86
|
+
expect(await exists(getFixturePath('/test/dist/1.css.d.ts.map'))).toBeTruthy();
|
|
87
|
+
});
|
|
78
88
|
});
|
package/src/emitter/index.ts
CHANGED
|
@@ -45,6 +45,10 @@ export type EmitterOptions = {
|
|
|
45
45
|
dtsFormatOptions: DtsFormatOptions | undefined;
|
|
46
46
|
/** Whether the file is from an external library or not. */
|
|
47
47
|
isExternalFile: (filePath: string) => boolean;
|
|
48
|
+
/** Output directory for generated files. */
|
|
49
|
+
outDir: string | undefined;
|
|
50
|
+
/** Current working directory. */
|
|
51
|
+
cwd: string;
|
|
48
52
|
};
|
|
49
53
|
|
|
50
54
|
export async function emitGeneratedFiles({
|
|
@@ -53,10 +57,12 @@ export async function emitGeneratedFiles({
|
|
|
53
57
|
emitDeclarationMap,
|
|
54
58
|
dtsFormatOptions,
|
|
55
59
|
isExternalFile,
|
|
60
|
+
outDir,
|
|
61
|
+
cwd,
|
|
56
62
|
}: EmitterOptions): Promise<void> {
|
|
57
63
|
const arbitraryExtensions = dtsFormatOptions?.arbitraryExtensions ?? DEFAULT_ARBITRARY_EXTENSIONS;
|
|
58
|
-
const dtsFilePath = getDtsFilePath(filePath, arbitraryExtensions);
|
|
59
|
-
const sourceMapFilePath = getSourceMapFilePath(filePath, arbitraryExtensions);
|
|
64
|
+
const dtsFilePath = getDtsFilePath(filePath, arbitraryExtensions, { outDir, cwd });
|
|
65
|
+
const sourceMapFilePath = getSourceMapFilePath(filePath, arbitraryExtensions, { outDir, cwd });
|
|
60
66
|
const { dtsContent, sourceMap } = generateDtsContentWithSourceMap(
|
|
61
67
|
filePath,
|
|
62
68
|
dtsFilePath,
|
|
@@ -84,9 +90,11 @@ export async function isGeneratedFilesExist(
|
|
|
84
90
|
filePath: string,
|
|
85
91
|
emitDeclarationMap: boolean | undefined,
|
|
86
92
|
arbitraryExtensions: boolean,
|
|
93
|
+
outDir: string | undefined,
|
|
94
|
+
cwd: string,
|
|
87
95
|
): Promise<boolean> {
|
|
88
|
-
const dtsFilePath = getDtsFilePath(filePath, arbitraryExtensions);
|
|
89
|
-
const sourceMapFilePath = getSourceMapFilePath(filePath, arbitraryExtensions);
|
|
96
|
+
const dtsFilePath = getDtsFilePath(filePath, arbitraryExtensions, { outDir, cwd });
|
|
97
|
+
const sourceMapFilePath = getSourceMapFilePath(filePath, arbitraryExtensions, { outDir, cwd });
|
|
90
98
|
if (emitDeclarationMap && !(await exists(sourceMapFilePath))) {
|
|
91
99
|
return false;
|
|
92
100
|
}
|
|
@@ -95,3 +103,8 @@ export async function isGeneratedFilesExist(
|
|
|
95
103
|
}
|
|
96
104
|
return true;
|
|
97
105
|
}
|
|
106
|
+
|
|
107
|
+
export type OutDirOptions = {
|
|
108
|
+
outDir: string | undefined;
|
|
109
|
+
cwd: string;
|
|
110
|
+
};
|
|
@@ -2,10 +2,10 @@ import { EOL } from 'os';
|
|
|
2
2
|
import { getSourceMapFilePath, generateSourceMappingURLComment } from './source-map.js';
|
|
3
3
|
|
|
4
4
|
test('getSourceMapFilePath', () => {
|
|
5
|
-
expect(getSourceMapFilePath('/app/src/dir/1.css', false)).toBe('/app/src/dir/1.css.d.ts.map');
|
|
6
|
-
expect(getSourceMapFilePath('/app/src/dir/1.scss', false)).toBe('/app/src/dir/1.scss.d.ts.map');
|
|
7
|
-
expect(getSourceMapFilePath('/app/src/dir/1.css', true)).toBe('/app/src/dir/1.d.css.ts.map');
|
|
8
|
-
expect(getSourceMapFilePath('/app/src/dir/1.scss', true)).toBe('/app/src/dir/1.d.scss.ts.map');
|
|
5
|
+
expect(getSourceMapFilePath('/app/src/dir/1.css', false, undefined)).toBe('/app/src/dir/1.css.d.ts.map');
|
|
6
|
+
expect(getSourceMapFilePath('/app/src/dir/1.scss', false, undefined)).toBe('/app/src/dir/1.scss.d.ts.map');
|
|
7
|
+
expect(getSourceMapFilePath('/app/src/dir/1.css', true, undefined)).toBe('/app/src/dir/1.d.css.ts.map');
|
|
8
|
+
expect(getSourceMapFilePath('/app/src/dir/1.scss', true, undefined)).toBe('/app/src/dir/1.d.scss.ts.map');
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
test('generateSourceMappingURLComment', () => {
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { EOL } from 'os';
|
|
2
2
|
import { getDtsFilePath } from './dts.js';
|
|
3
|
+
import type { OutDirOptions } from './index.js';
|
|
3
4
|
import { getRelativePath } from './index.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Get .d.ts.map file path.
|
|
7
8
|
* @param filePath The path to the source file (i.e. `foo.css`). It is absolute.
|
|
8
9
|
* @param arbitraryExtensions Generate `.d.css.ts` instead of `.css.d.ts`.
|
|
10
|
+
* @param outDir Output directory for generated files.
|
|
9
11
|
* @returns The path to the .d.ts.map file. It is absolute.
|
|
10
12
|
*/
|
|
11
|
-
export function getSourceMapFilePath(
|
|
12
|
-
|
|
13
|
+
export function getSourceMapFilePath(
|
|
14
|
+
filePath: string,
|
|
15
|
+
arbitraryExtensions: boolean,
|
|
16
|
+
options: OutDirOptions | undefined,
|
|
17
|
+
): string {
|
|
18
|
+
return `${getDtsFilePath(filePath, arbitraryExtensions, options)}.map`;
|
|
13
19
|
}
|
|
14
20
|
|
|
15
21
|
export function generateSourceMappingURLComment(dtsFilePath: string, sourceMapFilePath: string): string {
|
package/src/runner.test.ts
CHANGED
|
@@ -351,3 +351,26 @@ test('support symlink', async () => {
|
|
|
351
351
|
`"{"version":3,"sources":["./1.css"],"names":["a"],"mappings":"AAAA;AAAA,E,aAAAA,G,WAAA;AAAA;AAAA","file":"1.css.d.ts","sourceRoot":""}"`,
|
|
352
352
|
);
|
|
353
353
|
});
|
|
354
|
+
|
|
355
|
+
test('changes output directory by outDir', async () => {
|
|
356
|
+
createFixtures({
|
|
357
|
+
'/test/1.css': '.a {}',
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
await run({ ...defaultOptions, outDir: getFixturePath('/dist'), cache: false, watch: false });
|
|
361
|
+
|
|
362
|
+
expect(await exists(getFixturePath('/dist/test/1.css.d.ts'))).toBe(true);
|
|
363
|
+
expect(await exists(getFixturePath('/dist/test/1.css.d.ts.map'))).toBe(true);
|
|
364
|
+
|
|
365
|
+
expect(await readFile(getFixturePath('/dist/test/1.css.d.ts'), 'utf8')).toMatchInlineSnapshot(`
|
|
366
|
+
"declare const styles:
|
|
367
|
+
& Readonly<{ "a": string }>
|
|
368
|
+
;
|
|
369
|
+
export default styles;
|
|
370
|
+
//# sourceMappingURL=./1.css.d.ts.map
|
|
371
|
+
"
|
|
372
|
+
`);
|
|
373
|
+
expect(await readFile(getFixturePath('/dist/test/1.css.d.ts.map'), 'utf8')).toMatchInlineSnapshot(
|
|
374
|
+
`"{"version":3,"sources":["../../test/1.css"],"names":["a"],"mappings":"AAAA;AAAA,E,aAAAA,G,WAAA;AAAA;AAAA","file":"1.css.d.ts","sourceRoot":""}"`,
|
|
375
|
+
);
|
|
376
|
+
});
|
package/src/runner.ts
CHANGED
|
@@ -79,6 +79,8 @@ export interface RunnerOptions {
|
|
|
79
79
|
logLevel?: 'debug' | 'info' | 'silent' | undefined;
|
|
80
80
|
/** Working directory path. */
|
|
81
81
|
cwd?: string | undefined;
|
|
82
|
+
/** Output directory for generated files. */
|
|
83
|
+
outDir?: string | undefined;
|
|
82
84
|
}
|
|
83
85
|
|
|
84
86
|
type OverrideProp<T, K extends keyof T, V extends T[K]> = Omit<T, K> & { [P in K]: V };
|
|
@@ -140,6 +142,8 @@ export async function run(options: RunnerOptions): Promise<Watcher | void> {
|
|
|
140
142
|
filePath,
|
|
141
143
|
options.declarationMap,
|
|
142
144
|
options.arbitraryExtensions ?? DEFAULT_ARBITRARY_EXTENSIONS,
|
|
145
|
+
options.outDir,
|
|
146
|
+
cwd,
|
|
143
147
|
);
|
|
144
148
|
const _isChangedFile = await isChangedFile(filePath);
|
|
145
149
|
// Generate .d.ts and .d.ts.map only when the file has been updated.
|
|
@@ -159,6 +163,8 @@ export async function run(options: RunnerOptions): Promise<Watcher | void> {
|
|
|
159
163
|
arbitraryExtensions: options.arbitraryExtensions,
|
|
160
164
|
},
|
|
161
165
|
isExternalFile,
|
|
166
|
+
outDir: options.outDir,
|
|
167
|
+
cwd,
|
|
162
168
|
});
|
|
163
169
|
logger.info(chalk.green(`${relative(cwd, filePath)} (generated)`));
|
|
164
170
|
|
package/src/library/README.md
DELETED