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.
Files changed (42) hide show
  1. package/README.md +15 -18
  2. package/dist/cli.js +15 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cli.test.js +10 -0
  5. package/dist/cli.test.js.map +1 -1
  6. package/dist/integration-test/go-to-definition.test.js +9 -8
  7. package/dist/integration-test/go-to-definition.test.js.map +1 -1
  8. package/dist/resolver/index.d.ts +3 -1
  9. package/dist/resolver/index.js +17 -14
  10. package/dist/resolver/index.js.map +1 -1
  11. package/dist/resolver/webpack-resolver.d.ts +13 -1
  12. package/dist/resolver/webpack-resolver.js +73 -59
  13. package/dist/resolver/webpack-resolver.js.map +1 -1
  14. package/dist/resolver/webpack-resolver.test.js +34 -7
  15. package/dist/resolver/webpack-resolver.test.js.map +1 -1
  16. package/dist/runner.d.ts +12 -0
  17. package/dist/runner.js +16 -10
  18. package/dist/runner.js.map +1 -1
  19. package/dist/runner.test.js +33 -9
  20. package/dist/runner.test.js.map +1 -1
  21. package/dist/test/tsserver.d.ts +10 -6
  22. package/dist/test/tsserver.js +94 -85
  23. package/dist/test/tsserver.js.map +1 -1
  24. package/dist/transformer/index.js +11 -9
  25. package/dist/transformer/index.js.map +1 -1
  26. package/dist/transformer/less-transformer.js +1 -2
  27. package/dist/transformer/less-transformer.js.map +1 -1
  28. package/dist/transformer/scss-transformer.js +0 -47
  29. package/dist/transformer/scss-transformer.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/cli.test.ts +14 -0
  32. package/src/cli.ts +15 -4
  33. package/src/integration-test/go-to-definition.test.ts +10 -8
  34. package/src/resolver/index.ts +21 -12
  35. package/src/resolver/webpack-resolver.test.ts +44 -8
  36. package/src/resolver/webpack-resolver.ts +90 -57
  37. package/src/runner.test.ts +35 -9
  38. package/src/runner.ts +29 -10
  39. package/src/test/tsserver.ts +106 -129
  40. package/src/transformer/index.ts +10 -8
  41. package/src/transformer/less-transformer.ts +1 -2
  42. 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 [string]
31
- -w, --watch Watch input directory's css files or pattern
32
- [boolean] [default: false]
33
- --localsConvention Style of exported class names.
34
- [choices: "camelCase", "camelCaseOnly", "dashes", "dashesOnly"]
35
- --declarationMap Create sourcemaps for d.ts files
36
- [boolean] [default: true]
37
- --silent Silent output. Do not show "files written" messages
38
- [boolean] [default: false]
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' Generate .d.ts and .d.ts.map.
44
- hcm 'src/**/*.module.{css,scss,less}' Also generate files for sass and les
45
- s.
46
- hcm 'src/**/*.module.css' --watch Watch for changes and generate .d.ts
47
- and .d.ts.map.
48
- hcm 'src/**/*.module.css' --declaration Generate .d.ts only.
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
- .parserConfiguration({
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,mBAAmB,CAAC;QACnB,4DAA4D;QAC5D,2BAA2B,EAAE,KAAK;KACnC,CAAC;SACD,UAAU,CAAC,KAAK,CAAC;SACjB,KAAK,CAAC,iFAAiF,CAAC;SACxF,OAAO,CAAC,0BAA0B,EAAE,+BAA+B,CAAC;SACpE,OAAO,CAAC,sCAAsC,EAAE,wCAAwC,CAAC;SACzF,OAAO,CAAC,kCAAkC,EAAE,qDAAqD,CAAC;SAClG,OAAO,CAAC,iDAAiD,EAAE,sBAAsB,CAAC;SAClF,YAAY,CAAC,KAAK,CAAC;SACnB,MAAM,CAAC,QAAQ,EAAE;QAChB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,kBAAkB;KAC7B,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,8CAA8C;KACzD,CAAC;SACD,MAAM,CAAC,kBAAkB,EAAE;QAC1B,OAAO,EAAE,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,CAAU;QACxE,QAAQ,EAAE,gCAAgC;KAC3C,CAAC;SACD,MAAM,CAAC,gBAAgB,EAAE;QACxB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,kCAAkC;KAC7C,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QAChB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,qDAAqD;KAChE,CAAC;SACD,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC;SAClB,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC;SACrB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACxB,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;QACxB,kCAAkC;QAClC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,SAAS,EAAE,CAAC;IACf,MAAM,QAAQ,GAAa,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAE;QACrB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC"}
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);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEjC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QACnB,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAEjE,kCAAkC;QAClC,0CAA0C;IAC5C,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzF,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QACnB,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CACpG,eAAe,CAChB,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChH,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClH,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5G,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxF,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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 { getModuleDefinitions, getMultipleIdentifierDefinitions } from '../test/tsserver.js';
3
+ import { createTSServer } from '../test/tsserver.js';
5
4
  import { createFixtures, getFixturePath } from '../test/util.js';
6
- // It is heavy test, so increase timeout.
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,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjE,yCAAyC;AACzC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM;AAElC,MAAM,cAAc,GAAG;IACrB,OAAO,EAAE,sBAAsB;IAC/B,MAAM,EAAE,IAAI;IACZ,cAAc,EAAE,IAAI;IACpB,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC;CACzB,CAAC;AAEF,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;IACvB,cAAc,CAAC;QACb,aAAa,EAAE,MAAM,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;KAyBpB;KACF,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,gCAAgC,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE;QACpF,OAAO;QACP,WAAW;QACX,gBAAgB;QAChB,gBAAgB;QAChB,gBAAgB;QAChB,qBAAqB;QACrB,qBAAqB;QACrB,cAAc;QACd,cAAc;QACd,SAAS;QACT,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;QACpB,iBAAiB;QACjB,UAAU;KACX,CAAC,CAAC;IACH,8EAA8E;IAC9E,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6JrC,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACpF,MAAM,CAAC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC;;;;GAI/C,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;IACjC,cAAc,CAAC;QACb,aAAa,EAAE,MAAM,CAAA;;;;;KAKpB;QACD,aAAa,EAAE,MAAM,CAAA;;;KAGpB;QACD,aAAa,EAAE,MAAM,CAAA;;KAEpB;KACF,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,gCAAgC,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5G,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BrC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;IAClC,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;;;;;;;;;;KAYrB;QACD,cAAc,EAAE,MAAM,CAAA;;;KAGrB;QACD,cAAc,EAAE,MAAM,CAAA;;KAErB;QACD,cAAc,EAAE,MAAM,CAAA;;KAErB;KACF,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,gCAAgC,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE;QACrF,OAAO;QACP,SAAS;QACT,WAAW;QACX,WAAW;QACX,KAAK;QACL,KAAK;QACL,GAAG;QACH,GAAG;KACJ,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDrC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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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"}
@@ -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;
@@ -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 = () => async (specifier, options) => {
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
- for (const resolver of resolvers) {
25
- try {
26
- const resolved = await resolver(specifier, options);
27
- if (resolved !== false) {
28
- const isExists = await exists(resolved);
29
- if (isExists)
30
- return resolved;
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
- catch (e) {
34
- // noop
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;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAY9D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAmB,GAAG,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IACtF,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;IAClD,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;IAEhD,0EAA0E;IAC1E,kCAAkC;IAClC,qHAAqH;IACrH,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IACpE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;QAChC,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,QAAQ,KAAK,KAAK,EAAE;gBACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;aAC/B;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO;SACR;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC,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 const createWebpackResolver: () => Resolver;
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 = () => async (specifier, options) => {
47
- // `~` prefix is optional.
48
- // ref: https://github.com/webpack-contrib/less-loader/tree/454e187f58046356c3d383d67fda763db8bfc528#webpack-resolver
49
- if (specifier.startsWith('~'))
50
- specifier = specifier.slice(1);
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
- for (const resolver of resolvers) {
55
- try {
56
- const resolved = resolver(dirname(options.request), specifier);
57
- if (resolved !== false) {
58
- const isExists = await exists(resolved);
59
- if (isExists)
60
- return resolved;
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
- catch (e) {
64
- // noop
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/B,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGpC;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;IACpD,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,CAAC,OAAO,CAAC;IACzB,gDAAgD;IAChD,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;IAC3C,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;IAC3B,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IAC3B,cAAc,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;IACrD,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;IAC5C,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;IACrC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;IACtC,YAAY,EAAE,CAAC,mBAAmB,CAAC;IACnC,cAAc,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;IACrD,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;IAC5C,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;IAC3B,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAmB,GAAG,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;IACtF,0BAA0B;IAC1B,qHAAqH;IACrH,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9D,gHAAgH;IAChH,kHAAkH;IAClH,MAAM,SAAS,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAC9E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;QAChC,IAAI;YACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;YAC/D,IAAI,QAAQ,KAAK,KAAK,EAAE;gBACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;aAC/B;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO;SACR;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
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
- const webpackResolver = createWebpackResolver();
4
- const request = getFixturePath('/test/1.css');
5
- test('resolves specifier with webpack mechanism', async () => {
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
- expect(await webpackResolver('~package-7', { request })).toBe(getFixturePath('/node_modules/package-7/index.scss'));
24
- expect(await webpackResolver('~package-8', { request })).toBe(getFixturePath('/node_modules/package-8/index.less'));
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;AAChD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;AAE9C,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;IAC3D,cAAc,CAAC;QACb,mCAAmC,EAAE,OAAO;QAC5C,mCAAmC,EAAE,OAAO;QAC5C,mCAAmC,EAAE,OAAO;QAC5C,sCAAsC,EAAE,4BAA4B;QACpE,mCAAmC,EAAE,OAAO;QAC5C,2CAA2C,EAAE,OAAO;QACpD,mCAAmC,EAAE,OAAO;QAC5C,oCAAoC,EAAE,mBAAmB;QACzD,oCAAoC,EAAE,mBAAmB;KAC1D,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,eAAe,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CACrE,cAAc,CAAC,mCAAmC,CAAC,CACpD,CAAC;IACF,MAAM,CAAC,MAAM,eAAe,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACnH,MAAM,CAAC,MAAM,eAAe,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACpH,MAAM,CAAC,MAAM,eAAe,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACnH,MAAM,CAAC,MAAM,eAAe,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7E,cAAc,CAAC,2CAA2C,CAAC,CAC5D,CAAC;IACF,MAAM,CAAC,MAAM,eAAe,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CACpE,cAAc,CAAC,mCAAmC,CAAC,CACpD,CAAC;IACF,MAAM,CAAC,MAAM,eAAe,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACpH,MAAM,CAAC,MAAM,eAAe,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,oCAAoC,CAAC,CAAC,CAAC;AACtH,CAAC,CAAC,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 loader = new Loader({ transformer: options.transformer, resolver: options.resolver });
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: process.cwd(),
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: options.cwd ?? process.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: options.silent ?? false,
35
- cwd: options.cwd ?? process.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 (!options.silent)
52
+ if (!silent)
47
53
  console.log('Watch ' + options.pattern + '...');
48
- const watcher = chokidar.watch([options.pattern.replace(/\\/g, '/')], options.cwd ? { cwd: options.cwd } : {});
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(options.cwd ?? process.cwd(), filePath)).catch(() => {
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: options.cwd ?? process.cwd() }))
65
+ const filePaths = (await glob(options.pattern, { dot: true, cwd }))
60
66
  // convert relative path to absolute path
61
- .map((file) => resolve(options.cwd ?? process.cwd(), file));
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) {