happy-css-modules 0.3.0 → 0.4.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/README.md +15 -18
- package/dist/cli.js +15 -4
- package/dist/cli.js.map +1 -1
- package/dist/cli.test.js +10 -0
- package/dist/cli.test.js.map +1 -1
- package/dist/integration-test/go-to-definition.test.js +9 -8
- package/dist/integration-test/go-to-definition.test.js.map +1 -1
- package/dist/resolver/index.d.ts +3 -1
- package/dist/resolver/index.js +17 -14
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/webpack-resolver.d.ts +13 -1
- package/dist/resolver/webpack-resolver.js +73 -59
- package/dist/resolver/webpack-resolver.js.map +1 -1
- package/dist/resolver/webpack-resolver.test.js +34 -7
- package/dist/resolver/webpack-resolver.test.js.map +1 -1
- package/dist/runner.d.ts +12 -0
- package/dist/runner.js +16 -10
- package/dist/runner.js.map +1 -1
- package/dist/runner.test.js +33 -9
- package/dist/runner.test.js.map +1 -1
- package/dist/test/tsserver.d.ts +10 -6
- package/dist/test/tsserver.js +94 -85
- package/dist/test/tsserver.js.map +1 -1
- package/dist/transformer/index.js +11 -9
- package/dist/transformer/index.js.map +1 -1
- package/dist/transformer/less-transformer.js +1 -2
- package/dist/transformer/less-transformer.js.map +1 -1
- package/dist/transformer/scss-transformer.js +0 -47
- package/dist/transformer/scss-transformer.js.map +1 -1
- package/package.json +1 -1
- package/src/cli.test.ts +14 -0
- package/src/cli.ts +15 -4
- package/src/integration-test/go-to-definition.test.ts +10 -8
- package/src/resolver/index.ts +21 -12
- package/src/resolver/webpack-resolver.test.ts +44 -8
- package/src/resolver/webpack-resolver.ts +90 -57
- package/src/runner.test.ts +35 -9
- package/src/runner.ts +29 -10
- package/src/test/tsserver.ts +106 -129
- package/src/transformer/index.ts +10 -8
- package/src/transformer/less-transformer.ts +1 -2
- package/src/transformer/scss-transformer.ts +0 -51
package/README.md
CHANGED
|
@@ -27,26 +27,23 @@ Create .d.ts and .d.ts.map from CSS modules *.css files.
|
|
|
27
27
|
hcm [options] <glob>
|
|
28
28
|
|
|
29
29
|
Options:
|
|
30
|
-
--outDir Output directory
|
|
31
|
-
-w, --watch Watch input directory's css files or pattern
|
|
32
|
-
|
|
33
|
-
--
|
|
34
|
-
|
|
35
|
-
--
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-h, --help Show help [boolean]
|
|
40
|
-
-v, --version Show version number [boolean]
|
|
30
|
+
--outDir Output directory [string]
|
|
31
|
+
-w, --watch Watch input directory's css files or pattern [boolean] [default: false]
|
|
32
|
+
--localsConvention Style of exported class names. [choices: "camelCase", "camelCaseOnly", "dashes", "dashesOnly"]
|
|
33
|
+
--declarationMap Create sourcemaps for d.ts files [boolean] [default: true]
|
|
34
|
+
--sassLoadPaths The option compatible with sass's `--load-path`. [array]
|
|
35
|
+
--lessIncludePaths The option compatible with less's `--include-path`. [array]
|
|
36
|
+
--silent Silent output. Do not show "files written" messages [boolean] [default: false]
|
|
37
|
+
-h, --help Show help [boolean]
|
|
38
|
+
-v, --version Show version number [boolean]
|
|
41
39
|
|
|
42
40
|
Examples:
|
|
43
|
-
hcm 'src/**/*.module.css'
|
|
44
|
-
hcm 'src/**/*.module.{css,scss,less}'
|
|
45
|
-
|
|
46
|
-
hcm 'src/**/*.module.css' --
|
|
47
|
-
|
|
48
|
-
hcm 'src/**/*.module.css' --
|
|
49
|
-
Map=false
|
|
41
|
+
hcm 'src/**/*.module.css' Generate .d.ts and .d.ts.map.
|
|
42
|
+
hcm 'src/**/*.module.{css,scss,less}' Also generate files for sass and less.
|
|
43
|
+
hcm 'src/**/*.module.css' --watch Watch for changes and generate .d.ts and .d.ts.map.
|
|
44
|
+
hcm 'src/**/*.module.css' --declarationMap=false Generate .d.ts only.
|
|
45
|
+
hcm 'src/**/*.module.css' --sassLoadPaths=src/style Run with sass's `--load-path`.
|
|
46
|
+
hcm 'src/**/*.module.css' --lessIncludePaths=src/style Run with less's `--include-path`.
|
|
50
47
|
```
|
|
51
48
|
|
|
52
49
|
## Node.js API (Experimental)
|
package/dist/cli.js
CHANGED
|
@@ -10,16 +10,15 @@ const pkgJson = JSON.parse(readFileSync(resolve(dirname(fileURLToPath(import.met
|
|
|
10
10
|
*/
|
|
11
11
|
export function parseArgv(argv) {
|
|
12
12
|
const parsedArgv = yargs(hideBin(argv))
|
|
13
|
-
.
|
|
14
|
-
// workaround for https://github.com/yargs/yargs/issues/1318
|
|
15
|
-
'duplicate-arguments-array': false,
|
|
16
|
-
})
|
|
13
|
+
.wrap(Math.min(120, process.stdout.columns))
|
|
17
14
|
.scriptName('hcm')
|
|
18
15
|
.usage('Create .d.ts and .d.ts.map from CSS modules *.css files.\n\n$0 [options] <glob>')
|
|
19
16
|
.example("$0 'src/**/*.module.css'", 'Generate .d.ts and .d.ts.map.')
|
|
20
17
|
.example("$0 'src/**/*.module.{css,scss,less}'", 'Also generate files for sass and less.')
|
|
21
18
|
.example("$0 'src/**/*.module.css' --watch", 'Watch for changes and generate .d.ts and .d.ts.map.')
|
|
22
19
|
.example("$0 'src/**/*.module.css' --declarationMap=false", 'Generate .d.ts only.')
|
|
20
|
+
.example("$0 'src/**/*.module.css' --sassLoadPaths=src/style", "Run with sass's `--load-path`.")
|
|
21
|
+
.example("$0 'src/**/*.module.css' --lessIncludePaths=src/style", "Run with less's `--include-path`.")
|
|
23
22
|
.detectLocale(false)
|
|
24
23
|
.option('outDir', {
|
|
25
24
|
type: 'string',
|
|
@@ -39,6 +38,16 @@ export function parseArgv(argv) {
|
|
|
39
38
|
type: 'boolean',
|
|
40
39
|
default: true,
|
|
41
40
|
describe: 'Create sourcemaps for d.ts files',
|
|
41
|
+
})
|
|
42
|
+
.option('sassLoadPaths', {
|
|
43
|
+
array: true,
|
|
44
|
+
nargs: 1,
|
|
45
|
+
describe: "The option compatible with sass's `--load-path`.",
|
|
46
|
+
})
|
|
47
|
+
.option('lessIncludePaths', {
|
|
48
|
+
array: true,
|
|
49
|
+
nargs: 1,
|
|
50
|
+
describe: "The option compatible with less's `--include-path`.",
|
|
42
51
|
})
|
|
43
52
|
.option('silent', {
|
|
44
53
|
type: 'boolean',
|
|
@@ -63,6 +72,8 @@ export function parseArgv(argv) {
|
|
|
63
72
|
watch: parsedArgv.watch,
|
|
64
73
|
localsConvention: parsedArgv.localsConvention,
|
|
65
74
|
declarationMap: parsedArgv.declarationMap,
|
|
75
|
+
sassLoadPaths: parsedArgv.sassLoadPaths?.map((item) => item.toString()),
|
|
76
|
+
lessIncludePaths: parsedArgv.lessIncludePaths?.map((item) => item.toString()),
|
|
66
77
|
silent: parsedArgv.silent,
|
|
67
78
|
};
|
|
68
79
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACpC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.test.js
CHANGED
|
@@ -26,6 +26,16 @@ describe('parseArgv', () => {
|
|
|
26
26
|
expect(parseArgv([...baseArgs, '1.css', '--declarationMap']).declarationMap).toBe(true);
|
|
27
27
|
expect(parseArgv([...baseArgs, '1.css', '--no-declarationMap']).declarationMap).toBe(false);
|
|
28
28
|
});
|
|
29
|
+
test('--sassLoadPaths', () => {
|
|
30
|
+
expect(parseArgv([...baseArgs, '1.css', '--sassLoadPaths', 'dir1', '--sassLoadPaths', 'dir2']).sassLoadPaths).toStrictEqual(['dir1', 'dir2']);
|
|
31
|
+
// Passing a number is treated as a string
|
|
32
|
+
expect(parseArgv([...baseArgs, '1.css', '--sassLoadPaths', '1']).sassLoadPaths).toStrictEqual(['1']);
|
|
33
|
+
});
|
|
34
|
+
test('--lessIncludePaths', () => {
|
|
35
|
+
expect(parseArgv([...baseArgs, '1.css', '--lessIncludePaths', 'dir1', '--lessIncludePaths', 'dir2']).lessIncludePaths).toStrictEqual(['dir1', 'dir2']);
|
|
36
|
+
// Passing a number is treated as a string
|
|
37
|
+
expect(parseArgv([...baseArgs, '1.css', '--lessIncludePaths', '1']).lessIncludePaths).toStrictEqual(['1']);
|
|
38
|
+
});
|
|
29
39
|
test('--silent', () => {
|
|
30
40
|
expect(parseArgv([...baseArgs, '1.css', '--silent']).silent).toBe(true);
|
|
31
41
|
expect(parseArgv([...baseArgs, '1.css', '--no-silent']).silent).toBe(false);
|
package/dist/cli.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { jest } from '@jest/globals';
|
|
2
1
|
import dedent from 'dedent';
|
|
3
2
|
import { run } from '../runner.js';
|
|
4
|
-
import {
|
|
3
|
+
import { createTSServer } from '../test/tsserver.js';
|
|
5
4
|
import { createFixtures, getFixturePath } from '../test/util.js';
|
|
6
|
-
|
|
7
|
-
jest.setTimeout(60 * 1000); // 60s
|
|
5
|
+
const server = await createTSServer();
|
|
8
6
|
const defaultOptions = {
|
|
9
7
|
pattern: 'test/**/*.{css,scss}',
|
|
10
8
|
silent: true,
|
|
11
9
|
declarationMap: true,
|
|
12
10
|
cwd: getFixturePath('/'),
|
|
13
11
|
};
|
|
12
|
+
afterAll(async () => {
|
|
13
|
+
await server.exit();
|
|
14
|
+
});
|
|
14
15
|
test('basic', async () => {
|
|
15
16
|
createFixtures({
|
|
16
17
|
'/test/1.css': dedent `
|
|
@@ -41,7 +42,7 @@ test('basic', async () => {
|
|
|
41
42
|
`,
|
|
42
43
|
});
|
|
43
44
|
await run({ ...defaultOptions });
|
|
44
|
-
const results = await getMultipleIdentifierDefinitions(getFixturePath(`/test/1.css`), [
|
|
45
|
+
const results = await server.getMultipleIdentifierDefinitions(getFixturePath(`/test/1.css`), [
|
|
45
46
|
'basic',
|
|
46
47
|
'cascading',
|
|
47
48
|
'pseudo_class_1',
|
|
@@ -220,7 +221,7 @@ test('basic', async () => {
|
|
|
220
221
|
},
|
|
221
222
|
]
|
|
222
223
|
`);
|
|
223
|
-
const moduleDefinitions = await getModuleDefinitions(getFixturePath('/test/1.css'));
|
|
224
|
+
const moduleDefinitions = await server.getModuleDefinitions(getFixturePath('/test/1.css'));
|
|
224
225
|
expect(moduleDefinitions).toMatchInlineSnapshot(`
|
|
225
226
|
[
|
|
226
227
|
{ file: "<fixtures>/test/1.css", text: "", start: { line: 1, offset: 1 }, end: { line: 1, offset: 1 } },
|
|
@@ -244,7 +245,7 @@ test('imported tokens', async () => {
|
|
|
244
245
|
`,
|
|
245
246
|
});
|
|
246
247
|
await run({ ...defaultOptions });
|
|
247
|
-
const results = await getMultipleIdentifierDefinitions(getFixturePath(`/test/1.css`), ['a', 'b', 'c', 'd']);
|
|
248
|
+
const results = await server.getMultipleIdentifierDefinitions(getFixturePath(`/test/1.css`), ['a', 'b', 'c', 'd']);
|
|
248
249
|
expect(results).toMatchInlineSnapshot(`
|
|
249
250
|
[
|
|
250
251
|
{
|
|
@@ -302,7 +303,7 @@ test('with transformer', async () => {
|
|
|
302
303
|
`,
|
|
303
304
|
});
|
|
304
305
|
await run({ ...defaultOptions });
|
|
305
|
-
const results = await getMultipleIdentifierDefinitions(getFixturePath(`/test/1.scss`), [
|
|
306
|
+
const results = await server.getMultipleIdentifierDefinitions(getFixturePath(`/test/1.scss`), [
|
|
306
307
|
'basic',
|
|
307
308
|
'nesting',
|
|
308
309
|
'nesting_1',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go-to-definition.test.js","sourceRoot":"","sources":["../../src/integration-test/go-to-definition.test.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"go-to-definition.test.js","sourceRoot":"","sources":["../../src/integration-test/go-to-definition.test.ts"],"names":[],"mappings":"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"}
|
package/dist/resolver/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { WebpackResolverOptions } from './webpack-resolver.js';
|
|
1
2
|
export declare type ResolverOptions = {
|
|
2
3
|
request: string;
|
|
3
4
|
};
|
|
@@ -6,6 +7,7 @@ export declare type ResolverOptions = {
|
|
|
6
7
|
* @returns The resolved path of the imported file. `false` means to skip resolving.
|
|
7
8
|
* */
|
|
8
9
|
export declare type Resolver = (specifier: string, options: ResolverOptions) => string | false | Promise<string | false>;
|
|
10
|
+
export declare type DefaultResolverOptions = WebpackResolverOptions;
|
|
9
11
|
/**
|
|
10
12
|
* The Default resolver.
|
|
11
13
|
*
|
|
@@ -17,4 +19,4 @@ export declare type Resolver = (specifier: string, options: ResolverOptions) =>
|
|
|
17
19
|
* @param options The options to resolve
|
|
18
20
|
* @returns The resolved path (absolute). `false` means to skip resolving.
|
|
19
21
|
*/
|
|
20
|
-
export declare const createDefaultResolver: () => Resolver;
|
|
22
|
+
export declare const createDefaultResolver: (defaultResolverOptions?: DefaultResolverOptions | undefined) => Resolver;
|
package/dist/resolver/index.js
CHANGED
|
@@ -13,27 +13,30 @@ import { createWebpackResolver } from './webpack-resolver.js';
|
|
|
13
13
|
* @param options The options to resolve
|
|
14
14
|
* @returns The resolved path (absolute). `false` means to skip resolving.
|
|
15
15
|
*/
|
|
16
|
-
export const createDefaultResolver = () =>
|
|
16
|
+
export const createDefaultResolver = (defaultResolverOptions) => {
|
|
17
17
|
const relativeResolver = createRelativeResolver();
|
|
18
18
|
const nodeResolver = createNodeResolver();
|
|
19
|
-
const webpackResolver = createWebpackResolver();
|
|
19
|
+
const webpackResolver = createWebpackResolver(defaultResolverOptions);
|
|
20
20
|
// In less-loader, `relativeResolver` has priority over `webpackResolver`.
|
|
21
21
|
// happy-css-modules follows suit.
|
|
22
|
+
// ref: https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L588-L596
|
|
22
23
|
// ref: https://github.com/webpack-contrib/less-loader/tree/454e187f58046356c3d383d67fda763db8bfc528#webpack-resolver
|
|
23
24
|
const resolvers = [relativeResolver, nodeResolver, webpackResolver];
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
return async (specifier, options) => {
|
|
26
|
+
for (const resolver of resolvers) {
|
|
27
|
+
try {
|
|
28
|
+
const resolved = await resolver(specifier, options);
|
|
29
|
+
if (resolved !== false) {
|
|
30
|
+
const isExists = await exists(resolved);
|
|
31
|
+
if (isExists)
|
|
32
|
+
return resolved;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
// noop
|
|
31
37
|
}
|
|
32
38
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return false;
|
|
39
|
+
return false;
|
|
40
|
+
};
|
|
38
41
|
};
|
|
39
42
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAc9D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA8E,CAC9G,sBAAsB,EACtB,EAAE;IACF,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;IAClD,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,MAAM,eAAe,GAAG,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;IAEtE,0EAA0E;IAC1E,kCAAkC;IAClC,2HAA2H;IAC3H,qHAAqH;IACrH,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QAClC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAChC,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACpD,IAAI,QAAQ,KAAK,KAAK,EAAE;oBACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACxC,IAAI,QAAQ;wBAAE,OAAO,QAAQ,CAAC;iBAC/B;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO;aACR;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,2 +1,14 @@
|
|
|
1
1
|
import type { Resolver } from './index.js';
|
|
2
|
-
export declare
|
|
2
|
+
export declare type WebpackResolverOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* The option compatible with sass's `--load-path`. It is an array of absolute paths.
|
|
5
|
+
* @example ['/home/user/repository/src/styles']
|
|
6
|
+
*/
|
|
7
|
+
sassLoadPaths?: string[] | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* The option compatible with less's `--include-path`. It is an array of absolute paths.
|
|
10
|
+
* @example ['/home/user/repository/src/styles']
|
|
11
|
+
*/
|
|
12
|
+
lessIncludePaths?: string[] | undefined;
|
|
13
|
+
};
|
|
14
|
+
export declare const createWebpackResolver: (webpackResolverOptions?: WebpackResolverOptions | undefined) => Resolver;
|
|
@@ -1,69 +1,83 @@
|
|
|
1
|
-
import { dirname } from 'path';
|
|
1
|
+
import { basename, dirname, join } from 'path';
|
|
2
2
|
import enhancedResolve from 'enhanced-resolve';
|
|
3
3
|
import { exists } from '../util.js';
|
|
4
|
-
/**
|
|
5
|
-
* A resolver compatible with css-loader.
|
|
6
|
-
*
|
|
7
|
-
* @see https://github.com/webpack-contrib/css-loader/blob/897e7dd250ccdb0d31e6c66d4cd0d009f2022a85/src/plugins/postcss-import-parser.js#L228-L235
|
|
8
|
-
*/
|
|
9
|
-
const cssLoaderResolver = enhancedResolve.create.sync({
|
|
10
|
-
dependencyType: 'css',
|
|
11
|
-
conditionNames: ['style'],
|
|
12
|
-
// We are not sure how "..." affects behavior...
|
|
13
|
-
mainFields: ['css', 'style', 'main', '...'],
|
|
14
|
-
mainFiles: ['index', '...'],
|
|
15
|
-
extensions: ['.css', '...'],
|
|
16
|
-
preferRelative: true,
|
|
17
|
-
});
|
|
18
|
-
/**
|
|
19
|
-
* A resolver compatible with sass-loader.
|
|
20
|
-
*
|
|
21
|
-
* @see https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L531-L539
|
|
22
|
-
*/
|
|
23
|
-
const sassLoaderResolver = enhancedResolve.create.sync({
|
|
24
|
-
dependencyType: 'sass',
|
|
25
|
-
conditionNames: ['sass', 'style'],
|
|
26
|
-
mainFields: ['sass', 'style', 'main', '...'],
|
|
27
|
-
mainFiles: ['_index', 'index', '...'],
|
|
28
|
-
extensions: ['.sass', '.scss', '.css'],
|
|
29
|
-
restrictions: [/\.((sa|sc|c)ss)$/i],
|
|
30
|
-
preferRelative: true,
|
|
31
|
-
});
|
|
32
|
-
/**
|
|
33
|
-
* A resolver compatible with less-loader.
|
|
34
|
-
*
|
|
35
|
-
* @see https://github.com/webpack-contrib/less-loader/blob/d74f740c100c4006b00dfb3e02c6d5aaf8713519/src/utils.js#L35-L42
|
|
36
|
-
*/
|
|
37
|
-
const lessLoaderResolver = enhancedResolve.create.sync({
|
|
38
|
-
dependencyType: 'less',
|
|
39
|
-
conditionNames: ['less', 'style'],
|
|
40
|
-
mainFields: ['less', 'style', 'main', '...'],
|
|
41
|
-
mainFiles: ['index', '...'],
|
|
42
|
-
extensions: ['.less', '.css'],
|
|
43
|
-
preferRelative: true,
|
|
44
|
-
});
|
|
45
4
|
// TODO: Support `resolve.alias` for Node.js API
|
|
46
|
-
export const createWebpackResolver = () =>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
5
|
+
export const createWebpackResolver = (webpackResolverOptions) => {
|
|
6
|
+
/**
|
|
7
|
+
* A resolver compatible with css-loader.
|
|
8
|
+
*
|
|
9
|
+
* @see https://github.com/webpack-contrib/css-loader/blob/897e7dd250ccdb0d31e6c66d4cd0d009f2022a85/src/plugins/postcss-import-parser.js#L228-L235
|
|
10
|
+
*/
|
|
11
|
+
const cssLoaderResolver = enhancedResolve.create.sync({
|
|
12
|
+
dependencyType: 'css',
|
|
13
|
+
conditionNames: ['style'],
|
|
14
|
+
// We are not sure how "..." affects behavior...
|
|
15
|
+
mainFields: ['css', 'style', 'main', '...'],
|
|
16
|
+
mainFiles: ['index', '...'],
|
|
17
|
+
extensions: ['.css', '...'],
|
|
18
|
+
preferRelative: true,
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* A resolver compatible with sass-loader.
|
|
22
|
+
*
|
|
23
|
+
* @see https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L531-L539
|
|
24
|
+
*/
|
|
25
|
+
const sassLoaderResolver = enhancedResolve.create.sync({
|
|
26
|
+
dependencyType: 'sass',
|
|
27
|
+
conditionNames: ['sass', 'style'],
|
|
28
|
+
mainFields: ['sass', 'style', 'main', '...'],
|
|
29
|
+
mainFiles: ['_index', 'index', '...'],
|
|
30
|
+
extensions: ['.sass', '.scss', '.css'],
|
|
31
|
+
restrictions: [/\.((sa|sc|c)ss)$/i],
|
|
32
|
+
preferRelative: true,
|
|
33
|
+
modules: ['node_modules', ...(webpackResolverOptions?.sassLoadPaths ?? [])],
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* A resolver compatible with less-loader.
|
|
37
|
+
*
|
|
38
|
+
* @see https://github.com/webpack-contrib/less-loader/blob/d74f740c100c4006b00dfb3e02c6d5aaf8713519/src/utils.js#L35-L42
|
|
39
|
+
*/
|
|
40
|
+
const lessLoaderResolver = enhancedResolve.create.sync({
|
|
41
|
+
dependencyType: 'less',
|
|
42
|
+
conditionNames: ['less', 'style'],
|
|
43
|
+
mainFields: ['less', 'style', 'main', '...'],
|
|
44
|
+
mainFiles: ['index', '...'],
|
|
45
|
+
extensions: ['.less', '.css'],
|
|
46
|
+
preferRelative: true,
|
|
47
|
+
modules: ['node_modules', ...(webpackResolverOptions?.lessIncludePaths ?? [])],
|
|
48
|
+
});
|
|
51
49
|
// NOTE: In theory, `sassLoaderResolver` should only be used when the resolver is called from `sassTransformer`.
|
|
52
50
|
// However, we do not implement such behavior because it is cumbersome. If someone wants it, we will implement it.
|
|
53
51
|
const resolvers = [cssLoaderResolver, sassLoaderResolver, lessLoaderResolver];
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
52
|
+
return async (specifier, options) => {
|
|
53
|
+
// `~` prefix is optional.
|
|
54
|
+
// ref: https://github.com/webpack-contrib/css-loader/blob/5e6cf91fd3f0c8b5fb4b91197b98dc56abdef4bf/src/utils.js#L92-L95
|
|
55
|
+
// ref: https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L368-L370
|
|
56
|
+
// ref: https://github.com/webpack-contrib/less-loader/blob/d74f740c100c4006b00dfb3e02c6d5aaf8713519/src/utils.js#L72-L75
|
|
57
|
+
if (specifier.startsWith('~'))
|
|
58
|
+
specifier = specifier.slice(1);
|
|
59
|
+
for (const resolver of resolvers) {
|
|
60
|
+
const specifierVariants = resolver === sassLoaderResolver
|
|
61
|
+
? // Support partial import for sass
|
|
62
|
+
// https://sass-lang.com/documentation/at-rules/import#partials
|
|
63
|
+
// https://github.com/webpack-contrib/sass-loader/blob/0e9494074f69a6b6d47efea6c083a02a31a5ae84/test/sass/import-with-underscore.sass
|
|
64
|
+
[join(dirname(specifier), '_' + basename(specifier)), specifier]
|
|
65
|
+
: [specifier];
|
|
66
|
+
for (const specifierVariant of specifierVariants) {
|
|
67
|
+
try {
|
|
68
|
+
const resolved = resolver(dirname(options.request), specifierVariant);
|
|
69
|
+
if (resolved !== false) {
|
|
70
|
+
const isExists = await exists(resolved);
|
|
71
|
+
if (isExists)
|
|
72
|
+
return resolved;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
// noop
|
|
77
|
+
}
|
|
61
78
|
}
|
|
62
79
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return false;
|
|
80
|
+
return false;
|
|
81
|
+
};
|
|
68
82
|
};
|
|
69
83
|
//# sourceMappingURL=webpack-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webpack-resolver.js","sourceRoot":"","sources":["../../src/resolver/webpack-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/
|
|
1
|
+
{"version":3,"file":"webpack-resolver.js","sourceRoot":"","sources":["../../src/resolver/webpack-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createFixtures, getFixturePath } from '../test/util.js';
|
|
2
2
|
import { createWebpackResolver } from './webpack-resolver.js';
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
3
|
+
test('resolves specifier with css-loader mechanism', async () => {
|
|
4
|
+
const webpackResolver = createWebpackResolver();
|
|
5
|
+
const request = getFixturePath('/test/1.css');
|
|
6
6
|
createFixtures({
|
|
7
7
|
'/node_modules/package-1/index.css': `.a {}`,
|
|
8
8
|
'/node_modules/package-2/index.css': `.a {}`,
|
|
@@ -11,8 +11,6 @@ test('resolves specifier with webpack mechanism', async () => {
|
|
|
11
11
|
'/node_modules/package-4/style.css': `.a {}`,
|
|
12
12
|
'/node_modules/@scoped/package-5/index.css': `.a {}`,
|
|
13
13
|
'/node_modules/package-6/index.css': `.a {}`,
|
|
14
|
-
'/node_modules/package-7/index.scss': `.a { dummy: ''; }`,
|
|
15
|
-
'/node_modules/package-8/index.less': `.a { dummy: ''; }`,
|
|
16
14
|
});
|
|
17
15
|
expect(await webpackResolver('~package-1/index.css', { request })).toBe(getFixturePath('/node_modules/package-1/index.css'));
|
|
18
16
|
expect(await webpackResolver('~package-2', { request })).toBe(getFixturePath('/node_modules/package-2/index.css'));
|
|
@@ -20,7 +18,36 @@ test('resolves specifier with webpack mechanism', async () => {
|
|
|
20
18
|
expect(await webpackResolver('~package-4', { request })).toBe(getFixturePath('/node_modules/package-4/style.css'));
|
|
21
19
|
expect(await webpackResolver('~@scoped/package-5/index.css', { request })).toBe(getFixturePath('/node_modules/@scoped/package-5/index.css'));
|
|
22
20
|
expect(await webpackResolver('package-6/index.css', { request })).toBe(getFixturePath('/node_modules/package-6/index.css'));
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
});
|
|
22
|
+
test('resolves specifier with sass-loader mechanism', async () => {
|
|
23
|
+
const webpackResolver = createWebpackResolver({ sassLoadPaths: [getFixturePath('/test/styles')] });
|
|
24
|
+
const request = getFixturePath('/test/1.scss');
|
|
25
|
+
createFixtures({
|
|
26
|
+
'/node_modules/package-1/index.scss': `.a {}`,
|
|
27
|
+
'/test/styles/load-paths.scss': `.a {}`,
|
|
28
|
+
'/test/_partial-import.scss': `.a {}`,
|
|
29
|
+
});
|
|
30
|
+
expect(await webpackResolver('~package-1/index.scss', { request })).toBe(getFixturePath('/node_modules/package-1/index.scss'));
|
|
31
|
+
expect(await webpackResolver('~package-1', { request })).toBe(getFixturePath('/node_modules/package-1/index.scss'));
|
|
32
|
+
// ref: https://github.com/webpack-contrib/sass-loader/blob/bed9fb5799a90020d43f705ea405f85b368621d7/test/scss/import-include-paths.scss#L1
|
|
33
|
+
expect(await webpackResolver('load-paths', { request })).toBe(getFixturePath('/test/styles/load-paths.scss'));
|
|
34
|
+
// https://sass-lang.com/documentation/at-rules/import#partials
|
|
35
|
+
// https://github.com/webpack-contrib/sass-loader/blob/0e9494074f69a6b6d47efea6c083a02a31a5ae84/test/sass/import-with-underscore.sass
|
|
36
|
+
expect(await webpackResolver('partial-import', { request: getFixturePath('/test/1.scss') })).toBe(getFixturePath('/test/_partial-import.scss'));
|
|
37
|
+
expect(await webpackResolver('test/partial-import', { request: getFixturePath('/test') })).toBe(getFixturePath('/test/_partial-import.scss'));
|
|
38
|
+
});
|
|
39
|
+
test('resolves specifier with less-loader mechanism', async () => {
|
|
40
|
+
const webpackResolver = createWebpackResolver({ lessIncludePaths: [getFixturePath('/test/styles')] });
|
|
41
|
+
const request = getFixturePath('/test/1.less');
|
|
42
|
+
createFixtures({
|
|
43
|
+
'/node_modules/package-1/index.less': `.a {}`,
|
|
44
|
+
'/test/styles/include-paths.less': `.a {}`,
|
|
45
|
+
});
|
|
46
|
+
expect(await webpackResolver('~package-1/index.less', { request })).toBe(getFixturePath('/node_modules/package-1/index.less'));
|
|
47
|
+
expect(await webpackResolver('~package-1', { request })).toBe(getFixturePath('/node_modules/package-1/index.less'));
|
|
48
|
+
// ref: https://github.com/webpack-contrib/less-loader/blob/81a0d27eb6d18e5dc550a60fc1007fdc77305b78/test/loader.test.js#L248-L253
|
|
49
|
+
// ref: https://github.com/webpack-contrib/less-loader/blob/393147064672ace986ec84aca21f69f0ab819a9c/test/fixtures/import-paths.less#L1
|
|
50
|
+
// ref: https://github.com/webpack-contrib/less-loader/blob/99d80bd290dae50375db6e17c5f56ec33754e258/test/helpers/getCodeFromLess.js#L47-L54
|
|
51
|
+
expect(await webpackResolver('include-paths', { request })).toBe(getFixturePath('/test/styles/include-paths.less'));
|
|
25
52
|
});
|
|
26
53
|
//# sourceMappingURL=webpack-resolver.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webpack-resolver.test.js","sourceRoot":"","sources":["../../src/resolver/webpack-resolver.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"webpack-resolver.test.js","sourceRoot":"","sources":["../../src/resolver/webpack-resolver.test.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -12,6 +12,18 @@ export interface RunnerOptions {
|
|
|
12
12
|
declarationMap?: boolean | undefined;
|
|
13
13
|
transformer?: Transformer | undefined;
|
|
14
14
|
resolver?: Resolver | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* The option compatible with sass's `--load-path`. It is an array of relative or absolute paths.
|
|
17
|
+
* @example ['src/styles']
|
|
18
|
+
* @example ['/home/user/repository/src/styles']
|
|
19
|
+
*/
|
|
20
|
+
sassLoadPaths?: string[] | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* The option compatible with less's `--include-path`. It is an array of relative or absolute paths.
|
|
23
|
+
* @example ['src/styles']
|
|
24
|
+
* @example ['/home/user/repository/src/styles']
|
|
25
|
+
*/
|
|
26
|
+
lessIncludePaths?: string[] | undefined;
|
|
15
27
|
/**
|
|
16
28
|
* Silent output. Do not show "files written" messages.
|
|
17
29
|
* @default false
|
package/dist/runner.js
CHANGED
|
@@ -7,18 +7,24 @@ import AggregateError from 'es-aggregate-error';
|
|
|
7
7
|
import _glob from 'glob';
|
|
8
8
|
import { emitGeneratedFiles } from './emitter/index.js';
|
|
9
9
|
import { Loader } from './loader/index.js';
|
|
10
|
+
import { createDefaultResolver } from './resolver/index.js';
|
|
10
11
|
import { isMatchByGlob } from './util.js';
|
|
11
12
|
const glob = util.promisify(_glob);
|
|
12
13
|
export async function run(options) {
|
|
13
|
-
const
|
|
14
|
+
const cwd = options.cwd ?? process.cwd();
|
|
15
|
+
const silent = options.silent ?? false;
|
|
16
|
+
const sassLoadPaths = options.sassLoadPaths?.map((path) => resolve(cwd, path));
|
|
17
|
+
const lessIncludePaths = options.lessIncludePaths?.map((path) => resolve(cwd, path));
|
|
18
|
+
const resolver = options.resolver ?? createDefaultResolver({ sassLoadPaths, lessIncludePaths });
|
|
14
19
|
const distOptions = options.outDir
|
|
15
20
|
? {
|
|
16
|
-
rootDir:
|
|
21
|
+
rootDir: cwd,
|
|
17
22
|
outDir: options.outDir,
|
|
18
23
|
}
|
|
19
24
|
: undefined;
|
|
25
|
+
const loader = new Loader({ transformer: options.transformer, resolver });
|
|
20
26
|
const isExternalFile = (filePath) => {
|
|
21
|
-
return !isMatchByGlob(filePath, options.pattern, { cwd
|
|
27
|
+
return !isMatchByGlob(filePath, options.pattern, { cwd });
|
|
22
28
|
};
|
|
23
29
|
async function processFile(filePath) {
|
|
24
30
|
try {
|
|
@@ -31,8 +37,8 @@ export async function run(options) {
|
|
|
31
37
|
dtsFormatOptions: {
|
|
32
38
|
localsConvention: options.localsConvention,
|
|
33
39
|
},
|
|
34
|
-
silent
|
|
35
|
-
cwd
|
|
40
|
+
silent,
|
|
41
|
+
cwd,
|
|
36
42
|
isExternalFile,
|
|
37
43
|
});
|
|
38
44
|
}
|
|
@@ -43,12 +49,12 @@ export async function run(options) {
|
|
|
43
49
|
}
|
|
44
50
|
}
|
|
45
51
|
if (options.watch) {
|
|
46
|
-
if (!
|
|
52
|
+
if (!silent)
|
|
47
53
|
console.log('Watch ' + options.pattern + '...');
|
|
48
|
-
const watcher = chokidar.watch([options.pattern.replace(/\\/g, '/')],
|
|
54
|
+
const watcher = chokidar.watch([options.pattern.replace(/\\/g, '/')], { cwd });
|
|
49
55
|
watcher.on('all', (eventName, filePath) => {
|
|
50
56
|
if (eventName === 'add' || eventName === 'change') {
|
|
51
|
-
processFile(resolve(
|
|
57
|
+
processFile(resolve(cwd, filePath)).catch(() => {
|
|
52
58
|
// TODO: Emit a error by `Watcher#onerror`
|
|
53
59
|
});
|
|
54
60
|
}
|
|
@@ -56,9 +62,9 @@ export async function run(options) {
|
|
|
56
62
|
return { close: async () => watcher.close() };
|
|
57
63
|
}
|
|
58
64
|
else {
|
|
59
|
-
const filePaths = (await glob(options.pattern, { dot: true, cwd
|
|
65
|
+
const filePaths = (await glob(options.pattern, { dot: true, cwd }))
|
|
60
66
|
// convert relative path to absolute path
|
|
61
|
-
.map((file) => resolve(
|
|
67
|
+
.map((file) => resolve(cwd, file));
|
|
62
68
|
// TODO: Use `@file-cache/core` to process only files that have changed
|
|
63
69
|
const errors = [];
|
|
64
70
|
for (const filePath of filePaths) {
|