happy-css-modules 3.1.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.js +121 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/cli.test.d.ts +1 -0
  5. package/dist/cli.test.js +66 -0
  6. package/dist/cli.test.js.map +1 -0
  7. package/dist/config.d.ts +1 -0
  8. package/dist/config.js +2 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/emitter/dts.d.ts +14 -0
  11. package/dist/emitter/dts.js +128 -0
  12. package/dist/emitter/dts.js.map +1 -0
  13. package/dist/emitter/dts.test.d.ts +1 -0
  14. package/dist/emitter/dts.test.js +205 -0
  15. package/dist/emitter/dts.test.js.map +1 -0
  16. package/dist/emitter/file-system.d.ts +6 -0
  17. package/dist/emitter/file-system.js +26 -0
  18. package/dist/emitter/file-system.js.map +1 -0
  19. package/dist/emitter/file-system.test.d.ts +1 -0
  20. package/dist/emitter/file-system.test.js +34 -0
  21. package/dist/emitter/file-system.test.js.map +1 -0
  22. package/dist/emitter/index.d.ts +34 -0
  23. package/dist/emitter/index.js +49 -0
  24. package/dist/emitter/index.js.map +1 -0
  25. package/dist/emitter/index.test.d.ts +1 -0
  26. package/dist/emitter/index.test.js +68 -0
  27. package/dist/emitter/index.test.js.map +1 -0
  28. package/dist/emitter/source-map.d.ts +8 -0
  29. package/dist/emitter/source-map.js +16 -0
  30. package/dist/emitter/source-map.js.map +1 -0
  31. package/dist/emitter/source-map.test.d.ts +1 -0
  32. package/dist/emitter/source-map.test.js +13 -0
  33. package/dist/emitter/source-map.test.js.map +1 -0
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.js +6 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/integration-test/go-to-definition.test.d.ts +1 -0
  38. package/dist/integration-test/go-to-definition.test.js +334 -0
  39. package/dist/integration-test/go-to-definition.test.js.map +1 -0
  40. package/dist/library/source-map/index.d.ts +8 -0
  41. package/dist/library/source-map/index.js +5 -0
  42. package/dist/library/source-map/index.js.map +1 -0
  43. package/dist/locator/index.d.ts +46 -0
  44. package/dist/locator/index.js +173 -0
  45. package/dist/locator/index.js.map +1 -0
  46. package/dist/locator/index.test.d.ts +1 -0
  47. package/dist/locator/index.test.js +393 -0
  48. package/dist/locator/index.test.js.map +1 -0
  49. package/dist/locator/postcss.d.ts +91 -0
  50. package/dist/locator/postcss.js +241 -0
  51. package/dist/locator/postcss.js.map +1 -0
  52. package/dist/locator/postcss.test.d.ts +1 -0
  53. package/dist/locator/postcss.test.js +256 -0
  54. package/dist/locator/postcss.test.js.map +1 -0
  55. package/dist/logger.d.ts +9 -0
  56. package/dist/logger.js +28 -0
  57. package/dist/logger.js.map +1 -0
  58. package/dist/regression-test/issue-168.test.d.ts +1 -0
  59. package/dist/regression-test/issue-168.test.js +30 -0
  60. package/dist/regression-test/issue-168.test.js.map +1 -0
  61. package/dist/resolver/index.d.ts +22 -0
  62. package/dist/resolver/index.js +44 -0
  63. package/dist/resolver/index.js.map +1 -0
  64. package/dist/resolver/index.test.d.ts +1 -0
  65. package/dist/resolver/index.test.js +16 -0
  66. package/dist/resolver/index.test.js.map +1 -0
  67. package/dist/resolver/node-resolver.d.ts +2 -0
  68. package/dist/resolver/node-resolver.js +6 -0
  69. package/dist/resolver/node-resolver.js.map +1 -0
  70. package/dist/resolver/node-resolver.test.d.ts +1 -0
  71. package/dist/resolver/node-resolver.test.js +25 -0
  72. package/dist/resolver/node-resolver.test.js.map +1 -0
  73. package/dist/resolver/relative-resolver.d.ts +2 -0
  74. package/dist/resolver/relative-resolver.js +5 -0
  75. package/dist/resolver/relative-resolver.js.map +1 -0
  76. package/dist/resolver/relative-resolver.test.d.ts +1 -0
  77. package/dist/resolver/relative-resolver.test.js +12 -0
  78. package/dist/resolver/relative-resolver.test.js.map +1 -0
  79. package/dist/resolver/webpack-resolver.d.ts +24 -0
  80. package/dist/resolver/webpack-resolver.js +91 -0
  81. package/dist/resolver/webpack-resolver.js.map +1 -0
  82. package/dist/resolver/webpack-resolver.test.d.ts +1 -0
  83. package/dist/resolver/webpack-resolver.test.js +89 -0
  84. package/dist/resolver/webpack-resolver.test.js.map +1 -0
  85. package/dist/runner.d.ts +76 -0
  86. package/dist/runner.js +120 -0
  87. package/dist/runner.js.map +1 -0
  88. package/dist/runner.test.d.ts +1 -0
  89. package/dist/runner.test.js +287 -0
  90. package/dist/runner.test.js.map +1 -0
  91. package/dist/test-util/jest/resolver.cjs +31 -0
  92. package/dist/test-util/jest/resolver.cjs.map +1 -0
  93. package/dist/test-util/jest/resolver.d.cts +16 -0
  94. package/dist/test-util/tsserver.d.ts +31 -0
  95. package/dist/test-util/tsserver.js +112 -0
  96. package/dist/test-util/tsserver.js.map +1 -0
  97. package/dist/test-util/util.d.ts +29 -0
  98. package/dist/test-util/util.js +85 -0
  99. package/dist/test-util/util.js.map +1 -0
  100. package/dist/transformer/index.d.ts +30 -0
  101. package/dist/transformer/index.js +25 -0
  102. package/dist/transformer/index.js.map +1 -0
  103. package/dist/transformer/index.test.d.ts +1 -0
  104. package/dist/transformer/index.test.js +66 -0
  105. package/dist/transformer/index.test.js.map +1 -0
  106. package/dist/transformer/less-transformer.d.ts +2 -0
  107. package/dist/transformer/less-transformer.js +45 -0
  108. package/dist/transformer/less-transformer.js.map +1 -0
  109. package/dist/transformer/less-transformer.test.d.ts +1 -0
  110. package/dist/transformer/less-transformer.test.js +134 -0
  111. package/dist/transformer/less-transformer.test.js.map +1 -0
  112. package/dist/transformer/postcss-transformer.d.ts +12 -0
  113. package/dist/transformer/postcss-transformer.js +32 -0
  114. package/dist/transformer/postcss-transformer.js.map +1 -0
  115. package/dist/transformer/postcss-transformer.test.d.ts +1 -0
  116. package/dist/transformer/postcss-transformer.test.js +178 -0
  117. package/dist/transformer/postcss-transformer.test.js.map +1 -0
  118. package/dist/transformer/scss-transformer.d.ts +2 -0
  119. package/dist/transformer/scss-transformer.js +40 -0
  120. package/dist/transformer/scss-transformer.js.map +1 -0
  121. package/dist/transformer/scss-transformer.test.d.ts +1 -0
  122. package/dist/transformer/scss-transformer.test.js +149 -0
  123. package/dist/transformer/scss-transformer.test.js.map +1 -0
  124. package/dist/util.d.ts +21 -0
  125. package/dist/util.js +72 -0
  126. package/dist/util.js.map +1 -0
  127. package/dist/util.test.d.ts +1 -0
  128. package/dist/util.test.js +74 -0
  129. package/dist/util.test.js.map +1 -0
  130. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,SAAS,GAAoC;IACjD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,OAAO,MAAM;IAEjB,YAAY,aAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,OAAgB;QACpB,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAgB;QACnB,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAgB;QACpB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ import { symlink } from 'fs/promises';
2
+ import { jest } from '@jest/globals';
3
+ import { run } from '../runner.js';
4
+ import { createFixtures, getFixturePath, waitForAsyncTask } from '../test-util/util.js';
5
+ const defaultOptions = {
6
+ pattern: 'test/**/*.css',
7
+ cwd: getFixturePath('/'),
8
+ cache: false,
9
+ logLevel: 'silent',
10
+ };
11
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
12
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
13
+ // Exit the watcher even if the test fails
14
+ let watcher;
15
+ afterEach(async () => {
16
+ if (watcher) {
17
+ await watcher.close();
18
+ }
19
+ });
20
+ it('issue-168', async () => {
21
+ createFixtures({
22
+ '/test/css-file.css': '.a {}',
23
+ '/test/non-css-file.txt': 'text file',
24
+ });
25
+ await symlink(getFixturePath('/test/non-css-file.txt'), getFixturePath('/test/symlink.txt'));
26
+ watcher = await run({ ...defaultOptions, watch: true });
27
+ await waitForAsyncTask(300); // Wait for initial code generation to complete
28
+ expect(consoleErrorSpy).not.toBeCalled(); // If an error is output, then failed
29
+ });
30
+ //# sourceMappingURL=issue-168.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-168.test.js","sourceRoot":"","sources":["../../src/regression-test/issue-168.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExF,MAAM,cAAc,GAAkB;IACpC,OAAO,EAAE,eAAe;IACxB,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC;IACxB,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,QAAQ;CACnB,CAAC;AAEF,gEAAgE;AAChE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAElF,0CAA0C;AAC1C,IAAI,OAA4B,CAAC;AACjC,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IACzB,cAAc,CAAC;QACb,oBAAoB,EAAE,OAAO;QAC7B,wBAAwB,EAAE,WAAW;KACtC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,cAAc,CAAC,wBAAwB,CAAC,EAAE,cAAc,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7F,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,+CAA+C;IAC5E,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,qCAAqC;AACjF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { WebpackResolverOptions } from './webpack-resolver.js';
2
+ export type ResolverOptions = {
3
+ request: string;
4
+ };
5
+ /**
6
+ * The function to resolve the path of the imported file.
7
+ * @returns The resolved path of the imported file. `false` means to skip resolving.
8
+ */
9
+ export type Resolver = (specifier: string, options: ResolverOptions) => string | false | Promise<string | false>;
10
+ export type DefaultResolverOptions = WebpackResolverOptions;
11
+ /**
12
+ * The Default resolver.
13
+ *
14
+ * This resolver implements a resolve algorithm that is as compatible as possible with the major toolchains,
15
+ * including Node.js, webpack (css-loader, sass-loader, less-loader) and vite. It is difficult to completely
16
+ * mimic the behavior of these toolchains, so the behavior may differ in some cases.
17
+ *
18
+ * @param specifier The specifier to resolve (i.e. './foo.css', '~bootstrap', etc.)
19
+ * @param options The options to resolve
20
+ * @returns The resolved path (absolute). `false` means to skip resolving.
21
+ */
22
+ export declare const createDefaultResolver: (defaultResolverOptions?: DefaultResolverOptions | undefined) => Resolver;
@@ -0,0 +1,44 @@
1
+ import { exists } from '../util.js';
2
+ import { createNodeResolver } from './node-resolver.js';
3
+ import { createRelativeResolver } from './relative-resolver.js';
4
+ import { createWebpackResolver } from './webpack-resolver.js';
5
+ /**
6
+ * The Default resolver.
7
+ *
8
+ * This resolver implements a resolve algorithm that is as compatible as possible with the major toolchains,
9
+ * including Node.js, webpack (css-loader, sass-loader, less-loader) and vite. It is difficult to completely
10
+ * mimic the behavior of these toolchains, so the behavior may differ in some cases.
11
+ *
12
+ * @param specifier The specifier to resolve (i.e. './foo.css', '~bootstrap', etc.)
13
+ * @param options The options to resolve
14
+ * @returns The resolved path (absolute). `false` means to skip resolving.
15
+ */
16
+ export const createDefaultResolver = (defaultResolverOptions) => {
17
+ const relativeResolver = createRelativeResolver();
18
+ const nodeResolver = createNodeResolver();
19
+ const webpackResolver = createWebpackResolver(defaultResolverOptions);
20
+ // In less-loader, `relativeResolver` has priority over `webpackResolver`.
21
+ // happy-css-modules follows suit.
22
+ // ref: https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L588-L596
23
+ // ref: https://github.com/webpack-contrib/less-loader/tree/454e187f58046356c3d383d67fda763db8bfc528#webpack-resolver
24
+ const resolvers = [relativeResolver, nodeResolver, webpackResolver];
25
+ return async (specifier, options) => {
26
+ for (const resolver of resolvers) {
27
+ try {
28
+ // eslint-disable-next-line no-await-in-loop
29
+ const resolved = await resolver(specifier, options);
30
+ if (resolved !== false) {
31
+ // eslint-disable-next-line no-await-in-loop
32
+ const isExists = await exists(resolved);
33
+ if (isExists)
34
+ return resolved;
35
+ }
36
+ }
37
+ catch (e) {
38
+ // noop
39
+ }
40
+ }
41
+ return false;
42
+ };
43
+ };
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;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,CAAC;YACjC,IAAI,CAAC;gBACH,4CAA4C;gBAC5C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACpD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;oBACvB,4CAA4C;oBAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACxC,IAAI,QAAQ;wBAAE,OAAO,QAAQ,CAAC;gBAChC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import { createFixtures, getFixturePath } from '../test-util/util.js';
2
+ import { createDefaultResolver } from './index.js';
3
+ const defaultResolver = createDefaultResolver();
4
+ const request = getFixturePath('/test/1.css');
5
+ test('resolve with webpackResolver when other resolvers fail to resolve', async () => {
6
+ createFixtures({
7
+ '/test/2.css': `.a {}`,
8
+ '/test/3.css': `.a {}`,
9
+ '/node_modules/3.css/index.css': `.a {}`,
10
+ '/node_modules/4.css/index.css': `.a {}`,
11
+ });
12
+ expect(await defaultResolver('2.css', { request })).toBe(getFixturePath('/test/2.css'));
13
+ expect(await defaultResolver('3.css', { request })).toBe(getFixturePath('/test/3.css'));
14
+ expect(await defaultResolver('~4.css', { request })).toBe(getFixturePath('/node_modules/4.css/index.css'));
15
+ });
16
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/resolver/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;AAChD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;AAE9C,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,cAAc,CAAC;QACb,aAAa,EAAE,OAAO;QACtB,aAAa,EAAE,OAAO;QACtB,+BAA+B,EAAE,OAAO;QACxC,+BAA+B,EAAE,OAAO;KACzC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACxF,MAAM,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACxF,MAAM,CAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,+BAA+B,CAAC,CAAC,CAAC;AAC7G,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Resolver } from './index.js';
2
+ export declare const createNodeResolver: () => Resolver;
@@ -0,0 +1,6 @@
1
+ import { fileURLToPath, pathToFileURL } from 'url';
2
+ import { resolve } from 'import-meta-resolve';
3
+ export const createNodeResolver = () => (specifier, options) => {
4
+ return fileURLToPath(resolve(specifier, pathToFileURL(options.request).href));
5
+ };
6
+ //# sourceMappingURL=node-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-resolver.js","sourceRoot":"","sources":["../../src/resolver/node-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C,MAAM,CAAC,MAAM,kBAAkB,GAAmB,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;IAC7E,OAAO,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import { createFixtures, getFixturePath } from '../test-util/util.js';
2
+ import { createNodeResolver } from './node-resolver.js';
3
+ const nodeResolver = createNodeResolver();
4
+ const request = getFixturePath('/test/1.css');
5
+ test('resolves specifier with node mechanism', async () => {
6
+ createFixtures({
7
+ '/test/2.css': `.a {}`,
8
+ '/test/dir/3.css': `.a {}`,
9
+ '/4.css': `.a {}`,
10
+ '/test/5.css': `.a {}`,
11
+ '/node_modules/package-1/6.css': `.a {}`,
12
+ '/package.json': `{ "imports": { "#subpath-1": "./test/7.css", "#subpath-2/*.css": "./test/*.css" } }`,
13
+ '/test/7.css': `.a {}`,
14
+ '/test/8.css': `.a {}`,
15
+ });
16
+ expect(await nodeResolver('./2.css', { request })).toBe(getFixturePath('/test/2.css'));
17
+ expect(await nodeResolver('./dir/3.css', { request })).toBe(getFixturePath('/test/dir/3.css'));
18
+ expect(await nodeResolver('../4.css', { request })).toBe(getFixturePath('/4.css'));
19
+ expect(await nodeResolver(getFixturePath('/test/5.css'), { request })).toBe(getFixturePath('/test/5.css'));
20
+ expect(await nodeResolver('package-1/6.css', { request })).toBe(getFixturePath('/node_modules/package-1/6.css'));
21
+ expect(await nodeResolver('#subpath-1', { request })).toBe(getFixturePath('/test/7.css'));
22
+ // FIXME: For some reason, it does not pass...
23
+ // expect(await nodeResolver('#subpath-2/8.css', { request })).toBe(getFixturePath('/test/8.css'));
24
+ });
25
+ //# sourceMappingURL=node-resolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-resolver.test.js","sourceRoot":"","sources":["../../src/resolver/node-resolver.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;AAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;AAE9C,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;IACxD,cAAc,CAAC;QACb,aAAa,EAAE,OAAO;QACtB,iBAAiB,EAAE,OAAO;QAC1B,QAAQ,EAAE,OAAO;QACjB,aAAa,EAAE,OAAO;QACtB,+BAA+B,EAAE,OAAO;QACxC,eAAe,EAAE,qFAAqF;QACtG,aAAa,EAAE,OAAO;QACtB,aAAa,EAAE,OAAO;KACvB,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,MAAM,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/F,MAAM,CAAC,MAAM,YAAY,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,MAAM,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3G,MAAM,CAAC,MAAM,YAAY,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACjH,MAAM,CAAC,MAAM,YAAY,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1F,8CAA8C;IAC9C,mGAAmG;AACrG,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Resolver } from './index.js';
2
+ export declare const createRelativeResolver: () => Resolver;
@@ -0,0 +1,5 @@
1
+ import { dirname, resolve } from 'path';
2
+ export const createRelativeResolver = () => (specifier, options) => {
3
+ return resolve(dirname(options.request), specifier);
4
+ };
5
+ //# sourceMappingURL=relative-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relative-resolver.js","sourceRoot":"","sources":["../../src/resolver/relative-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGxC,MAAM,CAAC,MAAM,sBAAsB,GAAmB,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;IACjF,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { getFixturePath } from '../test-util/util.js';
2
+ import { createRelativeResolver } from './relative-resolver.js';
3
+ const relativeResolver = createRelativeResolver();
4
+ const request = getFixturePath('/test/1.css');
5
+ test('resolves specifier with relative mechanism', async () => {
6
+ expect(await relativeResolver('2.css', { request })).toBe(getFixturePath('/test/2.css'));
7
+ expect(await relativeResolver('./3.css', { request })).toBe(getFixturePath('/test/3.css'));
8
+ expect(await relativeResolver('dir/4.css', { request })).toBe(getFixturePath('/test/dir/4.css'));
9
+ expect(await relativeResolver('../5.css', { request })).toBe(getFixturePath('/5.css'));
10
+ expect(await relativeResolver(getFixturePath('/test/6.css'), { request })).toBe(getFixturePath('/test/6.css'));
11
+ });
12
+ //# sourceMappingURL=relative-resolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relative-resolver.test.js","sourceRoot":"","sources":["../../src/resolver/relative-resolver.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;AAClD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;AAE9C,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;IAC5D,MAAM,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACzF,MAAM,CAAC,MAAM,gBAAgB,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3F,MAAM,CAAC,MAAM,gBAAgB,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACjG,MAAM,CAAC,MAAM,gBAAgB,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,MAAM,gBAAgB,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;AACjH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Resolver } from './index.js';
2
+ export type WebpackResolverOptions = {
3
+ /** Working directory path. */
4
+ cwd?: string | undefined;
5
+ /**
6
+ * The option compatible with sass's `--load-path`. It is an array of relative or absolute paths.
7
+ * @example ['src/styles']
8
+ * @example ['/home/user/repository/src/styles']
9
+ */
10
+ sassLoadPaths?: string[] | undefined;
11
+ /**
12
+ * The option compatible with less's `--include-path`. It is an array of relative or absolute paths.
13
+ * @example ['src/styles']
14
+ * @example ['/home/user/repository/src/styles']
15
+ */
16
+ lessIncludePaths?: string[] | undefined;
17
+ /**
18
+ * The option compatible with webpack's `resolve.alias`. It is an object consisting of a pair of alias names and relative or absolute paths.
19
+ * @example { style: 'src/styles', '@': 'src' }
20
+ * @example { style: '/home/user/repository/src/styles', '@': '/home/user/repository/src' }
21
+ */
22
+ webpackResolveAlias?: Record<string, string> | undefined;
23
+ };
24
+ export declare const createWebpackResolver: (webpackResolverOptions?: WebpackResolverOptions | undefined) => Resolver;
@@ -0,0 +1,91 @@
1
+ import { basename, dirname, join, resolve } from 'path';
2
+ import enhancedResolve from 'enhanced-resolve';
3
+ import { exists } from '../util.js';
4
+ // TODO: Support `resolve.alias` for Node.js API
5
+ export const createWebpackResolver = (webpackResolverOptions) => {
6
+ const cwd = webpackResolverOptions?.cwd ?? process.cwd();
7
+ const sassLoadPaths = webpackResolverOptions?.sassLoadPaths?.map((path) => resolve(cwd, path));
8
+ const lessIncludePaths = webpackResolverOptions?.lessIncludePaths?.map((path) => resolve(cwd, path));
9
+ const webpackResolveAlias = webpackResolverOptions?.webpackResolveAlias
10
+ ? Object.fromEntries(Object.entries(webpackResolverOptions?.webpackResolveAlias).map(([key, value]) => [key, resolve(cwd, value)]))
11
+ : undefined;
12
+ /**
13
+ * A resolver compatible with css-loader.
14
+ *
15
+ * @see https://github.com/webpack-contrib/css-loader/blob/897e7dd250ccdb0d31e6c66d4cd0d009f2022a85/src/plugins/postcss-import-parser.js#L228-L235
16
+ */
17
+ const cssLoaderResolver = enhancedResolve.create.sync({
18
+ conditionNames: ['style'],
19
+ // We are not sure how "..." affects behavior...
20
+ mainFields: ['css', 'style', 'main', '...'],
21
+ mainFiles: ['index', '...'],
22
+ extensions: ['.css', '...'],
23
+ preferRelative: true,
24
+ alias: webpackResolveAlias ?? {},
25
+ });
26
+ /**
27
+ * A resolver compatible with sass-loader.
28
+ *
29
+ * @see https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L531-L539
30
+ */
31
+ const sassLoaderResolver = enhancedResolve.create.sync({
32
+ conditionNames: ['sass', 'style'],
33
+ mainFields: ['sass', 'style', 'main', '...'],
34
+ mainFiles: ['_index', 'index', '...'],
35
+ extensions: ['.sass', '.scss', '.css'],
36
+ restrictions: [/\.((sa|sc|c)ss)$/iu],
37
+ preferRelative: true,
38
+ alias: webpackResolveAlias ?? {},
39
+ modules: ['node_modules', ...(sassLoadPaths ?? [])],
40
+ });
41
+ /**
42
+ * A resolver compatible with less-loader.
43
+ *
44
+ * @see https://github.com/webpack-contrib/less-loader/blob/d74f740c100c4006b00dfb3e02c6d5aaf8713519/src/utils.js#L35-L42
45
+ */
46
+ const lessLoaderResolver = enhancedResolve.create.sync({
47
+ conditionNames: ['less', 'style'],
48
+ mainFields: ['less', 'style', 'main', '...'],
49
+ mainFiles: ['index', '...'],
50
+ extensions: ['.less', '.css'],
51
+ preferRelative: true,
52
+ alias: webpackResolveAlias ?? {},
53
+ modules: ['node_modules', ...(lessIncludePaths ?? [])],
54
+ });
55
+ // NOTE: In theory, `sassLoaderResolver` should only be used when the resolver is called from `sassTransformer`.
56
+ // However, we do not implement such behavior because it is cumbersome. If someone wants it, we will implement it.
57
+ const resolvers = [cssLoaderResolver, sassLoaderResolver, lessLoaderResolver];
58
+ return async (specifier, options) => {
59
+ // `~` prefix is optional.
60
+ // ref: https://github.com/webpack-contrib/css-loader/blob/5e6cf91fd3f0c8b5fb4b91197b98dc56abdef4bf/src/utils.js#L92-L95
61
+ // ref: https://github.com/webpack-contrib/sass-loader/blob/49a578a218574ddc92a597c7e365b6c21960717e/src/utils.js#L368-L370
62
+ // ref: https://github.com/webpack-contrib/less-loader/blob/d74f740c100c4006b00dfb3e02c6d5aaf8713519/src/utils.js#L72-L75
63
+ // eslint-disable-next-line no-param-reassign
64
+ if (specifier.startsWith('~'))
65
+ specifier = specifier.slice(1);
66
+ for (const resolver of resolvers) {
67
+ const specifierVariants = resolver === sassLoaderResolver
68
+ ? // Support partial import for sass
69
+ // https://sass-lang.com/documentation/at-rules/import#partials
70
+ // https://github.com/webpack-contrib/sass-loader/blob/0e9494074f69a6b6d47efea6c083a02a31a5ae84/test/sass/import-with-underscore.sass
71
+ [join(dirname(specifier), `_${basename(specifier)}`), specifier]
72
+ : [specifier];
73
+ for (const specifierVariant of specifierVariants) {
74
+ try {
75
+ const resolved = resolver(dirname(options.request), specifierVariant);
76
+ if (resolved !== false) {
77
+ // eslint-disable-next-line no-await-in-loop
78
+ const isExists = await exists(resolved);
79
+ if (isExists)
80
+ return resolved;
81
+ }
82
+ }
83
+ catch (e) {
84
+ // noop
85
+ }
86
+ }
87
+ }
88
+ return false;
89
+ };
90
+ };
91
+ //# sourceMappingURL=webpack-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webpack-resolver.js","sourceRoot":"","sources":["../../src/resolver/webpack-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ import { createFixtures, getFixturePath } from '../test-util/util.js';
2
+ import { createWebpackResolver } from './webpack-resolver.js';
3
+ test('resolves specifier with css-loader mechanism', async () => {
4
+ const webpackResolver = createWebpackResolver({
5
+ cwd: getFixturePath('/'),
6
+ webpackResolveAlias: {
7
+ '@relative': 'test/alias-relative',
8
+ '@absolute': getFixturePath('/test/alias-absolute'),
9
+ },
10
+ });
11
+ const request = getFixturePath('/test/1.css');
12
+ createFixtures({
13
+ '/node_modules/package-1/index.css': `.a {}`,
14
+ '/node_modules/package-2/index.css': `.a {}`,
15
+ '/node_modules/package-3/index.css': `.a {}`,
16
+ '/node_modules/package-4/package.json': `{ "style": "./style.css" }`,
17
+ '/node_modules/package-4/style.css': `.a {}`,
18
+ '/node_modules/@scoped/package-5/index.css': `.a {}`,
19
+ '/node_modules/package-6/index.css': `.a {}`,
20
+ '/test/alias-relative/alias.css': `.a {}`,
21
+ '/test/alias-absolute/alias.css': `.a {}`,
22
+ });
23
+ expect(await webpackResolver('~package-1/index.css', { request })).toBe(getFixturePath('/node_modules/package-1/index.css'));
24
+ expect(await webpackResolver('~package-2', { request })).toBe(getFixturePath('/node_modules/package-2/index.css'));
25
+ expect(await webpackResolver('~package-3/', { request })).toBe(getFixturePath('/node_modules/package-3/index.css'));
26
+ expect(await webpackResolver('~package-4', { request })).toBe(getFixturePath('/node_modules/package-4/style.css'));
27
+ expect(await webpackResolver('~@scoped/package-5/index.css', { request })).toBe(getFixturePath('/node_modules/@scoped/package-5/index.css'));
28
+ expect(await webpackResolver('package-6/index.css', { request })).toBe(getFixturePath('/node_modules/package-6/index.css'));
29
+ expect(await webpackResolver('@relative/alias.css', { request })).toBe(getFixturePath('/test/alias-relative/alias.css'));
30
+ expect(await webpackResolver('@absolute/alias.css', { request })).toBe(getFixturePath('/test/alias-absolute/alias.css'));
31
+ });
32
+ test('resolves specifier with sass-loader mechanism', async () => {
33
+ const webpackResolver = createWebpackResolver({
34
+ cwd: getFixturePath('/'),
35
+ sassLoadPaths: ['test/load-paths-relative', getFixturePath('/test/load-paths-absolute')],
36
+ webpackResolveAlias: {
37
+ '@relative': 'test/alias-relative',
38
+ '@absolute': getFixturePath('/test/alias-absolute'),
39
+ },
40
+ });
41
+ const request = getFixturePath('/test/1.scss');
42
+ createFixtures({
43
+ '/node_modules/package-1/index.scss': `.a {}`,
44
+ '/test/load-paths-relative/load-paths-relative.scss': `.a {}`,
45
+ '/test/load-paths-absolute/load-paths-absolute.scss': `.a {}`,
46
+ '/test/_partial-import.scss': `.a {}`,
47
+ '/test/alias-relative/alias.scss': `.a {}`,
48
+ '/test/alias-absolute/alias.scss': `.a {}`,
49
+ });
50
+ expect(await webpackResolver('~package-1/index.scss', { request })).toBe(getFixturePath('/node_modules/package-1/index.scss'));
51
+ expect(await webpackResolver('~package-1', { request })).toBe(getFixturePath('/node_modules/package-1/index.scss'));
52
+ // ref: https://github.com/webpack-contrib/sass-loader/blob/bed9fb5799a90020d43f705ea405f85b368621d7/test/scss/import-include-paths.scss#L1
53
+ expect(await webpackResolver('load-paths-relative', { request })).toBe(getFixturePath('/test/load-paths-relative/load-paths-relative.scss'));
54
+ expect(await webpackResolver('load-paths-absolute', { request })).toBe(getFixturePath('/test/load-paths-absolute/load-paths-absolute.scss'));
55
+ // https://sass-lang.com/documentation/at-rules/import#partials
56
+ // https://github.com/webpack-contrib/sass-loader/blob/0e9494074f69a6b6d47efea6c083a02a31a5ae84/test/sass/import-with-underscore.sass
57
+ expect(await webpackResolver('partial-import', { request: getFixturePath('/test/1.scss') })).toBe(getFixturePath('/test/_partial-import.scss'));
58
+ expect(await webpackResolver('test/partial-import', { request: getFixturePath('/test') })).toBe(getFixturePath('/test/_partial-import.scss'));
59
+ expect(await webpackResolver('@relative/alias.scss', { request })).toBe(getFixturePath('/test/alias-relative/alias.scss'));
60
+ expect(await webpackResolver('@absolute/alias.scss', { request })).toBe(getFixturePath('/test/alias-absolute/alias.scss'));
61
+ });
62
+ test('resolves specifier with less-loader mechanism', async () => {
63
+ const webpackResolver = createWebpackResolver({
64
+ cwd: getFixturePath('/'),
65
+ lessIncludePaths: ['test/include-paths-relative', getFixturePath('/test/include-paths-absolute')],
66
+ webpackResolveAlias: {
67
+ '@relative': 'test/alias-relative',
68
+ '@absolute': getFixturePath('/test/alias-absolute'),
69
+ },
70
+ });
71
+ const request = getFixturePath('/test/1.less');
72
+ createFixtures({
73
+ '/node_modules/package-1/index.less': `.a {}`,
74
+ '/test/include-paths-relative/include-paths-relative.less': `.a {}`,
75
+ '/test/include-paths-absolute/include-paths-absolute.less': `.a {}`,
76
+ '/test/alias-relative/alias.less': `.a {}`,
77
+ '/test/alias-absolute/alias.less': `.a {}`,
78
+ });
79
+ expect(await webpackResolver('~package-1/index.less', { request })).toBe(getFixturePath('/node_modules/package-1/index.less'));
80
+ expect(await webpackResolver('~package-1', { request })).toBe(getFixturePath('/node_modules/package-1/index.less'));
81
+ // ref: https://github.com/webpack-contrib/less-loader/blob/81a0d27eb6d18e5dc550a60fc1007fdc77305b78/test/loader.test.js#L248-L253
82
+ // ref: https://github.com/webpack-contrib/less-loader/blob/393147064672ace986ec84aca21f69f0ab819a9c/test/fixtures/import-paths.less#L1
83
+ // ref: https://github.com/webpack-contrib/less-loader/blob/99d80bd290dae50375db6e17c5f56ec33754e258/test/helpers/getCodeFromLess.js#L47-L54
84
+ expect(await webpackResolver('include-paths-relative', { request })).toBe(getFixturePath('/test/include-paths-relative/include-paths-relative.less'));
85
+ expect(await webpackResolver('include-paths-absolute', { request })).toBe(getFixturePath('/test/include-paths-absolute/include-paths-absolute.less'));
86
+ expect(await webpackResolver('@relative/alias.less', { request })).toBe(getFixturePath('/test/alias-relative/alias.less'));
87
+ expect(await webpackResolver('@absolute/alias.less', { request })).toBe(getFixturePath('/test/alias-absolute/alias.less'));
88
+ });
89
+ //# sourceMappingURL=webpack-resolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webpack-resolver.test.js","sourceRoot":"","sources":["../../src/resolver/webpack-resolver.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { Resolver } from './resolver/index.js';
2
+ import { type Transformer } from './transformer/index.js';
3
+ export type Watcher = {
4
+ close: () => Promise<void>;
5
+ };
6
+ export type LocalsConvention = 'camelCase' | 'camelCaseOnly' | 'dashes' | 'dashesOnly' | undefined;
7
+ export interface RunnerOptions {
8
+ pattern: string;
9
+ watch?: boolean | undefined;
10
+ /**
11
+ * Style of exported class names.
12
+ * @default undefined
13
+ */
14
+ localsConvention?: LocalsConvention | undefined;
15
+ declarationMap?: boolean | undefined;
16
+ transformer?: Transformer | undefined;
17
+ resolver?: Resolver | undefined;
18
+ /**
19
+ * The option compatible with sass's `--load-path`. It is an array of relative or absolute paths.
20
+ * @example ['src/styles']
21
+ * @example ['/home/user/repository/src/styles']
22
+ */
23
+ sassLoadPaths?: string[] | undefined;
24
+ /**
25
+ * The option compatible with less's `--include-path`. It is an array of relative or absolute paths.
26
+ * @example ['src/styles']
27
+ * @example ['/home/user/repository/src/styles']
28
+ */
29
+ lessIncludePaths?: string[] | undefined;
30
+ /**
31
+ * The option compatible with webpack's `resolve.alias`. It is an object consisting of a pair of alias names and relative or absolute paths.
32
+ * @example { style: 'src/styles', '@': 'src' }
33
+ * @example { style: '/home/user/repository/src/styles', '@': '/home/user/repository/src' }
34
+ */
35
+ webpackResolveAlias?: Record<string, string> | undefined;
36
+ /**
37
+ * The option compatible with postcss's `--config`. It is a relative or absolute path.
38
+ * @example '.'
39
+ * @example 'postcss.config.js'
40
+ * @example '/home/user/repository/src'
41
+ */
42
+ postcssConfig?: string | undefined;
43
+ /**
44
+ * Generate `.d.css.ts` instead of `.css.d.ts`.
45
+ * @default false
46
+ */
47
+ arbitraryExtensions?: boolean | undefined;
48
+ /**
49
+ * Only generate .d.ts and .d.ts.map for changed files.
50
+ * @default true
51
+ */
52
+ cache?: boolean | undefined;
53
+ /**
54
+ * Strategy for the cache to use for detecting changed files.
55
+ * @default 'content'
56
+ */
57
+ cacheStrategy?: 'content' | 'metadata' | undefined;
58
+ /**
59
+ * What level of logs to report.
60
+ * @default 'info'
61
+ */
62
+ logLevel?: 'debug' | 'info' | 'silent' | undefined;
63
+ /** Working directory path. */
64
+ cwd?: string | undefined;
65
+ }
66
+ type OverrideProp<T, K extends keyof T, V extends T[K]> = Omit<T, K> & {
67
+ [P in K]: V;
68
+ };
69
+ /**
70
+ * Run typed-css-module.
71
+ * @param options Runner options.
72
+ * @returns Returns `Promise<Watcher>` if `options.watch` is `true`, `Promise<void>` if `false`.
73
+ */
74
+ export declare function run(options: OverrideProp<RunnerOptions, 'watch', true>): Promise<Watcher>;
75
+ export declare function run(options: RunnerOptions): Promise<void>;
76
+ export {};