happy-css-modules 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/LICENSE.txt +23 -0
  2. package/README.md +124 -0
  3. package/bin/hcm.js +9 -0
  4. package/dist/cli.d.ts +6 -0
  5. package/dist/cli.js +69 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cli.test.d.ts +1 -0
  8. package/dist/cli.test.js +34 -0
  9. package/dist/cli.test.js.map +1 -0
  10. package/dist/emitter/dts.d.ts +14 -0
  11. package/dist/emitter/dts.js +106 -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 +42 -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 +118 -0
  27. package/dist/emitter/index.test.js.map +1 -0
  28. package/dist/emitter/source-map.d.ts +9 -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 +3 -0
  35. package/dist/index.js +3 -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 +367 -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/loader/index.d.ts +42 -0
  44. package/dist/loader/index.js +145 -0
  45. package/dist/loader/index.js.map +1 -0
  46. package/dist/loader/index.test.d.ts +1 -0
  47. package/dist/loader/index.test.js +290 -0
  48. package/dist/loader/index.test.js.map +1 -0
  49. package/dist/loader/postcss.d.ts +60 -0
  50. package/dist/loader/postcss.js +209 -0
  51. package/dist/loader/postcss.js.map +1 -0
  52. package/dist/loader/postcss.test.d.ts +1 -0
  53. package/dist/loader/postcss.test.js +236 -0
  54. package/dist/loader/postcss.test.js.map +1 -0
  55. package/dist/resolver/index.d.ts +20 -0
  56. package/dist/resolver/index.js +39 -0
  57. package/dist/resolver/index.js.map +1 -0
  58. package/dist/resolver/index.test.d.ts +1 -0
  59. package/dist/resolver/index.test.js +16 -0
  60. package/dist/resolver/index.test.js.map +1 -0
  61. package/dist/resolver/node-resolver.d.ts +2 -0
  62. package/dist/resolver/node-resolver.js +6 -0
  63. package/dist/resolver/node-resolver.js.map +1 -0
  64. package/dist/resolver/node-resolver.test.d.ts +1 -0
  65. package/dist/resolver/node-resolver.test.js +25 -0
  66. package/dist/resolver/node-resolver.test.js.map +1 -0
  67. package/dist/resolver/relative-resolver.d.ts +2 -0
  68. package/dist/resolver/relative-resolver.js +5 -0
  69. package/dist/resolver/relative-resolver.js.map +1 -0
  70. package/dist/resolver/relative-resolver.test.d.ts +1 -0
  71. package/dist/resolver/relative-resolver.test.js +12 -0
  72. package/dist/resolver/relative-resolver.test.js.map +1 -0
  73. package/dist/resolver/webpack-resolver.d.ts +2 -0
  74. package/dist/resolver/webpack-resolver.js +69 -0
  75. package/dist/resolver/webpack-resolver.js.map +1 -0
  76. package/dist/resolver/webpack-resolver.test.d.ts +1 -0
  77. package/dist/resolver/webpack-resolver.test.js +26 -0
  78. package/dist/resolver/webpack-resolver.test.js.map +1 -0
  79. package/dist/runner.d.ts +33 -0
  80. package/dist/runner.js +75 -0
  81. package/dist/runner.js.map +1 -0
  82. package/dist/runner.test.d.ts +1 -0
  83. package/dist/runner.test.js +113 -0
  84. package/dist/runner.test.js.map +1 -0
  85. package/dist/test/jest/resolver.cjs +30 -0
  86. package/dist/test/jest/resolver.cjs.map +1 -0
  87. package/dist/test/jest/resolver.d.cts +30 -0
  88. package/dist/test/tsserver.d.ts +27 -0
  89. package/dist/test/tsserver.js +104 -0
  90. package/dist/test/tsserver.js.map +1 -0
  91. package/dist/test/util.d.ts +29 -0
  92. package/dist/test/util.js +78 -0
  93. package/dist/test/util.js.map +1 -0
  94. package/dist/transformer/index.d.ts +23 -0
  95. package/dist/transformer/index.js +19 -0
  96. package/dist/transformer/index.js.map +1 -0
  97. package/dist/transformer/less-transformer.d.ts +2 -0
  98. package/dist/transformer/less-transformer.js +43 -0
  99. package/dist/transformer/less-transformer.js.map +1 -0
  100. package/dist/transformer/less-transformer.test.d.ts +1 -0
  101. package/dist/transformer/less-transformer.test.js +126 -0
  102. package/dist/transformer/less-transformer.test.js.map +1 -0
  103. package/dist/transformer/scss-transformer.d.ts +2 -0
  104. package/dist/transformer/scss-transformer.js +84 -0
  105. package/dist/transformer/scss-transformer.js.map +1 -0
  106. package/dist/transformer/scss-transformer.test.d.ts +1 -0
  107. package/dist/transformer/scss-transformer.test.js +132 -0
  108. package/dist/transformer/scss-transformer.test.js.map +1 -0
  109. package/dist/util.d.ts +19 -0
  110. package/dist/util.js +52 -0
  111. package/dist/util.js.map +1 -0
  112. package/dist/util.test.d.ts +1 -0
  113. package/dist/util.test.js +75 -0
  114. package/dist/util.test.js.map +1 -0
  115. package/package.json +106 -0
  116. package/src/__snapshots__/runner.test.ts.snap +34 -0
  117. package/src/cli.test.ts +38 -0
  118. package/src/cli.ts +70 -0
  119. package/src/emitter/dts.test.ts +266 -0
  120. package/src/emitter/dts.ts +134 -0
  121. package/src/emitter/file-system.test.ts +36 -0
  122. package/src/emitter/file-system.ts +24 -0
  123. package/src/emitter/index.test.ts +130 -0
  124. package/src/emitter/index.ts +92 -0
  125. package/src/emitter/source-map.test.ts +20 -0
  126. package/src/emitter/source-map.ts +17 -0
  127. package/src/index.ts +3 -0
  128. package/src/integration-test/go-to-definition.test.ts +371 -0
  129. package/src/library/README.md +3 -0
  130. package/src/library/source-map/index.ts +26 -0
  131. package/src/loader/index.test.ts +306 -0
  132. package/src/loader/index.ts +199 -0
  133. package/src/loader/postcss.test.ts +336 -0
  134. package/src/loader/postcss.ts +239 -0
  135. package/src/resolver/index.test.ts +17 -0
  136. package/src/resolver/index.ts +48 -0
  137. package/src/resolver/node-resolver.test.ts +26 -0
  138. package/src/resolver/node-resolver.ts +7 -0
  139. package/src/resolver/relative-resolver.test.ts +13 -0
  140. package/src/resolver/relative-resolver.ts +6 -0
  141. package/src/resolver/webpack-resolver.test.ts +33 -0
  142. package/src/resolver/webpack-resolver.ts +71 -0
  143. package/src/runner.test.ts +122 -0
  144. package/src/runner.ts +105 -0
  145. package/src/test/jest/resolver.cjs +30 -0
  146. package/src/test/tsserver.ts +176 -0
  147. package/src/test/util.ts +100 -0
  148. package/src/transformer/index.ts +44 -0
  149. package/src/transformer/less-transformer.test.ts +135 -0
  150. package/src/transformer/less-transformer.ts +55 -0
  151. package/src/transformer/scss-transformer.test.ts +142 -0
  152. package/src/transformer/scss-transformer.ts +94 -0
  153. package/src/util.test.ts +89 -0
  154. package/src/util.ts +67 -0
@@ -0,0 +1,126 @@
1
+ import { jest } from '@jest/globals';
2
+ import dedent from 'dedent';
3
+ import { Loader } from '../loader/index.js';
4
+ import { createFixtures, getFixturePath } from '../test/util.js';
5
+ import { createLessTransformer } from './less-transformer.js';
6
+ const loader = new Loader({ transformer: createLessTransformer() });
7
+ const loadSpy = jest.spyOn(loader, 'load');
8
+ afterEach(() => {
9
+ loadSpy.mockClear();
10
+ });
11
+ test('handles less features', async () => {
12
+ createFixtures({
13
+ '/test/1.less': dedent `
14
+ @import './2.less'; // less feature test (@use)
15
+ .a_1 { dummy: ''; }
16
+ .a_2 {
17
+ dummy: '';
18
+ // less feature test (nesting)
19
+ .a_2_1 { dummy: ''; }
20
+ &_2 { dummy: ''; }
21
+ .b_1();
22
+ .b_2();
23
+ composes: a_1; // css module feature test (composes)
24
+ composes: c from './3.less'; // css module feature test (composes from other file)
25
+ }
26
+ `,
27
+ '/test/2.less': dedent `
28
+ .b_1 { dummy: ''; }
29
+ .b_2() { dummy: ''; }
30
+ `,
31
+ '/test/3.less': dedent `
32
+ .c { dummy: ''; }
33
+ `,
34
+ });
35
+ const result = await loader.load(getFixturePath('/test/1.less'));
36
+ // FIXME: The end position of 'a_2_2' is incorrect.
37
+ expect(result).toMatchInlineSnapshot(`
38
+ {
39
+ dependencies: ["<fixtures>/test/2.less", "<fixtures>/test/3.less"],
40
+ tokens: [
41
+ {
42
+ name: "b_1",
43
+ originalLocations: [
44
+ { filePath: "<fixtures>/test/2.less", start: { line: 1, column: 1 }, end: { line: 1, column: 3 } },
45
+ ],
46
+ },
47
+ {
48
+ name: "a_1",
49
+ originalLocations: [
50
+ { filePath: "<fixtures>/test/1.less", start: { line: 2, column: 1 }, end: { line: 2, column: 3 } },
51
+ ],
52
+ },
53
+ {
54
+ name: "a_2",
55
+ originalLocations: [
56
+ { filePath: "<fixtures>/test/1.less", start: { line: 3, column: 1 }, end: { line: 3, column: 3 } },
57
+ ],
58
+ },
59
+ {
60
+ name: "a_2_1",
61
+ originalLocations: [
62
+ { filePath: "<fixtures>/test/1.less", start: { line: 6, column: 3 }, end: { line: 6, column: 7 } },
63
+ ],
64
+ },
65
+ {
66
+ name: "a_2_2",
67
+ originalLocations: [
68
+ { filePath: "<fixtures>/test/1.less", start: { line: 7, column: 3 }, end: { line: 7, column: 7 } },
69
+ ],
70
+ },
71
+ {
72
+ name: "c",
73
+ originalLocations: [
74
+ { filePath: "<fixtures>/test/3.less", start: { line: 1, column: 1 }, end: { line: 1, column: 1 } },
75
+ ],
76
+ },
77
+ ],
78
+ }
79
+ `);
80
+ });
81
+ test('tracks dependencies that have been pre-bundled by less compiler', async () => {
82
+ createFixtures({
83
+ '/test/1.less': dedent `
84
+ @import './2.less';
85
+ @import './3.less';
86
+ `,
87
+ '/test/2.less': dedent `
88
+ `,
89
+ '/test/3.less': dedent `
90
+ @import './4.less';
91
+ `,
92
+ '/test/4.less': dedent `
93
+ `,
94
+ });
95
+ const result = await loader.load(getFixturePath('/test/1.less'));
96
+ // The files imported using @import are pre-bundled by the compiler.
97
+ // Therefore, `Loader#load` is not called to process other files.
98
+ expect(loadSpy).toBeCalledTimes(1);
99
+ expect(loadSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.less'));
100
+ // The files pre-bundled by the compiler are also included in `result.dependencies`
101
+ // eslint-disable-next-line @typescript-eslint/require-array-sort-compare
102
+ expect(result.dependencies.sort()).toStrictEqual(
103
+ // eslint-disable-next-line @typescript-eslint/require-array-sort-compare
104
+ ['/test/2.less', '/test/3.less', '/test/4.less'].map(getFixturePath).sort());
105
+ });
106
+ test('resolves specifier using resolver', async () => {
107
+ createFixtures({
108
+ '/test/1.less': dedent `
109
+ @import 'package-1';
110
+ @import 'package-2';
111
+ // NOTE: less does not resolve files that are http(s) protocol.
112
+ // Therefore, the resolver will not be called for those files,
113
+ // and they will not be included in result.dependencies.
114
+ @import 'http://example.com/path/1.css';
115
+ @import 'https://example.com/path/1.css';
116
+ `,
117
+ '/node_modules/package-1/index.css': `.a {}`,
118
+ '/node_modules/package-2/index.less': `.a {}`,
119
+ });
120
+ const result = await loader.load(getFixturePath('/test/1.less'));
121
+ // eslint-disable-next-line @typescript-eslint/require-array-sort-compare
122
+ expect(result.dependencies.sort()).toStrictEqual(
123
+ // eslint-disable-next-line @typescript-eslint/require-array-sort-compare
124
+ ['/node_modules/package-1/index.css', '/node_modules/package-2/index.less'].map(getFixturePath).sort());
125
+ });
126
+ //# sourceMappingURL=less-transformer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"less-transformer.test.js","sourceRoot":"","sources":["../../src/transformer/less-transformer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;AACpE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3C,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,SAAS,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;IACvC,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;;;;;;;;;;;OAanB;QACH,cAAc,EAAE,MAAM,CAAA;;;OAGnB;QACH,cAAc,EAAE,MAAM,CAAA;;OAEnB;KACJ,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAEjE,mDAAmD;IACnD,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IACjF,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;KAGrB;QACD,cAAc,EAAE,MAAM,CAAA;KACrB;QACD,cAAc,EAAE,MAAM,CAAA;;KAErB;QACD,cAAc,EAAE,MAAM,CAAA;KACrB;KACF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAEjE,oEAAoE;IACpE,iEAAiE;IACjE,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAE3E,mFAAmF;IACnF,yEAAyE;IACzE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa;IAC9C,yEAAyE;IACzE,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAC5E,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;IACnD,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;;;;;;KAQrB;QACD,mCAAmC,EAAE,OAAO;QAC5C,oCAAoC,EAAE,OAAO;KAC9C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,yEAAyE;IACzE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa;IAC9C,yEAAyE;IACzE,CAAC,mCAAmC,EAAE,oCAAoC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CACvG,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Transformer } from './index.js';
2
+ export declare const createScssTransformer: () => Transformer;
@@ -0,0 +1,84 @@
1
+ // NOTE: The workaround for using sass's modern API. happy-css-modules used to use this API.
2
+ // However, due to the implementation of custom resolvers, we have switched to the legacy API.
3
+ // Therefore, the workaround is now disabled. See
4
+ // https://github.com/mizdra/happy-css-modules/issues/65#issuecomment-1229471950 for more information.
5
+ import { handleImportError } from './index.js';
6
+ // const IS_JEST_ENVIRONMENT = process.env.JEST_WORKER_ID !== undefined;
7
+ // function verifyJestEnvironment() {
8
+ // if (
9
+ // !(
10
+ // 'window' in global &&
11
+ // 'location' in global &&
12
+ // // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ // 'href' in (global as any).location &&
14
+ // // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ // typeof (global as any).location.href === 'string' &&
16
+ // // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ // (global as any).location.href.startsWith('http://')
18
+ // )
19
+ // ) {
20
+ // throw new Error(
21
+ // 'To use dart-sass with jest, dummy `global.window` and `global.location.href` must be set. See https://github.com/sass/dart-sass/issues/1692#issuecomment-1229219993 .',
22
+ // );
23
+ // }
24
+ // }
25
+ // const createImporterForJest: (from: string) => Importer<'async'> = (from) => ({
26
+ // canonicalize(url) {
27
+ // // NOTE: The format of `url` changes depending on the import source.
28
+ // //
29
+ // // - When `from === '/test/1.scss'` and `@import './2.scss'` in `/test/1.scss` is resolved, `url === '2.scss'`.
30
+ // // - When `from === '/test/1.scss'` and `@import './3.scss'` in `/test/2.scss` is resolved, `url === 'file:///test/3.scss'`.
31
+ // //
32
+ // // That is, the paths of @import statements written to the `from` file is passed through unresolved,
33
+ // // but paths written to other files is passed through resolved to absolute paths.
34
+ // return new URL(url, pathToFileURL(from));
35
+ // },
36
+ // async load(canonicalUrl) {
37
+ // return {
38
+ // contents: await readFile(fileURLToPath(canonicalUrl.href), 'utf8'),
39
+ // syntax: 'scss',
40
+ // sourceMapUrl: canonicalUrl,
41
+ // };
42
+ // },
43
+ // });
44
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
45
+ async function renderSass(sass, source, options) {
46
+ return new Promise((resolve, reject) => {
47
+ sass.render({
48
+ data: source,
49
+ file: options.from,
50
+ outFile: 'DUMMY',
51
+ sourceMap: true,
52
+ importer: (url, prev, done) => {
53
+ options
54
+ .resolver(url, { request: prev })
55
+ .then((resolved) => done({ file: resolved }))
56
+ .catch((e) => done(e));
57
+ },
58
+ }, (exception, result) => {
59
+ if (exception) {
60
+ reject(exception);
61
+ }
62
+ else {
63
+ resolve(result);
64
+ }
65
+ });
66
+ });
67
+ }
68
+ export const createScssTransformer = () => {
69
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
70
+ let sass;
71
+ return async (source, options) => {
72
+ sass !== null && sass !== void 0 ? sass : (sass = (await import('sass').catch(handleImportError('sass'))).default);
73
+ const result = await renderSass(sass, source, options);
74
+ return { css: result.css.toString(), map: result.map.toString(), dependencies: result.stats.includedFiles };
75
+ // if (IS_JEST_ENVIRONMENT) verifyJestEnvironment();
76
+ // const result = await sass.default.compileStringAsync(source, {
77
+ // url: pathToFileURL(from),
78
+ // sourceMap: true,
79
+ // importers: IS_JEST_ENVIRONMENT ? [createImporterForJest(from)] : [],
80
+ // });
81
+ // return { css: result.css, map: result.sourceMap!, dependencies: result.loadedUrls };
82
+ };
83
+ };
84
+ //# sourceMappingURL=scss-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scss-transformer.js","sourceRoot":"","sources":["../../src/transformer/scss-transformer.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,8FAA8F;AAC9F,iDAAiD;AACjD,sGAAsG;AAItG,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,wEAAwE;AAExE,qCAAqC;AACrC,SAAS;AACT,SAAS;AACT,8BAA8B;AAC9B,gCAAgC;AAChC,uEAAuE;AACvE,8CAA8C;AAC9C,uEAAuE;AACvE,6DAA6D;AAC7D,uEAAuE;AACvE,4DAA4D;AAC5D,QAAQ;AACR,QAAQ;AACR,uBAAuB;AACvB,iLAAiL;AACjL,SAAS;AACT,MAAM;AACN,IAAI;AAEJ,kFAAkF;AAClF,wBAAwB;AACxB,2EAA2E;AAC3E,SAAS;AACT,sHAAsH;AACtH,mIAAmI;AACnI,SAAS;AACT,2GAA2G;AAC3G,wFAAwF;AACxF,gDAAgD;AAChD,OAAO;AACP,+BAA+B;AAC/B,eAAe;AACf,4EAA4E;AAC5E,wBAAwB;AACxB,oCAAoC;AACpC,SAAS;AACT,OAAO;AACP,MAAM;AAEN,sEAAsE;AACtE,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,MAAc,EAAE,OAA2B;IAChG,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,IAAI,CAAC,MAAM,CACT;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;gBAC5B,OAAO;qBACJ,QAAQ,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;qBAChC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;qBAC5C,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;SACF,EACD,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;YACpB,IAAI,SAAS,EAAE;gBACb,MAAM,CAAC,SAAS,CAAC,CAAC;aACnB;iBAAM;gBACL,OAAO,CAAC,MAAO,CAAC,CAAC;aAClB;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAsB,GAAG,EAAE;IAC3D,sEAAsE;IACtE,IAAI,IAA2B,CAAC;IAChC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,aAAJ,IAAI,cAAJ,IAAI,IAAJ,IAAI,GAAK,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAC;QACzE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAI,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAE7G,oDAAoD;QACpD,iEAAiE;QACjE,8BAA8B;QAC9B,qBAAqB;QACrB,yEAAyE;QACzE,MAAM;QACN,uFAAuF;IACzF,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,132 @@
1
+ import { jest } from '@jest/globals';
2
+ import dedent from 'dedent';
3
+ import { Loader } from '../loader/index.js';
4
+ import { createFixtures, getFixturePath } from '../test/util.js';
5
+ import { createScssTransformer } from './scss-transformer.js';
6
+ const loader = new Loader({ transformer: createScssTransformer() });
7
+ const loadSpy = jest.spyOn(loader, 'load');
8
+ afterEach(() => {
9
+ loadSpy.mockClear();
10
+ });
11
+ test('handles sass features', async () => {
12
+ createFixtures({
13
+ '/test/1.scss': dedent `
14
+ @use './2.scss' as two; // sass feature test (@use)
15
+ @import './3.scss'; // css feature test (@import)
16
+ .a_1 { dummy: ''; }
17
+ .a_2 {
18
+ dummy: '';
19
+ // sass feature test (nesting)
20
+ .a_2_1 { dummy: ''; }
21
+ &_2 { dummy: ''; }
22
+ composes: a_1; // css module feature test (composes)
23
+ composes: d from './4.scss'; // css module feature test (composes from other file)
24
+ }
25
+ `,
26
+ '/test/2.scss': dedent `
27
+ .b_1 { dummy: ''; }
28
+ @mixin b_2 { dummy: ''; }
29
+ `,
30
+ '/test/3.scss': dedent `
31
+ .c { dummy: ''; }
32
+ `,
33
+ '/test/4.scss': dedent `
34
+ .d { dummy: ''; }
35
+ `,
36
+ });
37
+ const result = await loader.load(getFixturePath('/test/1.scss'));
38
+ // NOTE: There should be only one originalLocations for 'a_2', but there are multiple.
39
+ // This is probably due to an incorrect sourcemap output by the sass compiler.
40
+ // FIXME: The sass compiler or Loader implementation needs to be fixed.
41
+ // FIXME: The end position of 'a_2_2' is incorrect.
42
+ expect(result).toMatchInlineSnapshot(`
43
+ {
44
+ dependencies: ["<fixtures>/test/2.scss", "<fixtures>/test/3.scss", "<fixtures>/test/4.scss"],
45
+ tokens: [
46
+ {
47
+ name: "b_1",
48
+ originalLocations: [
49
+ { filePath: "<fixtures>/test/2.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 3 } },
50
+ ],
51
+ },
52
+ {
53
+ name: "c",
54
+ originalLocations: [
55
+ { filePath: "<fixtures>/test/3.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 1 } },
56
+ ],
57
+ },
58
+ {
59
+ name: "a_1",
60
+ originalLocations: [
61
+ { filePath: "<fixtures>/test/1.scss", start: { line: 3, column: 1 }, end: { line: 3, column: 3 } },
62
+ ],
63
+ },
64
+ {
65
+ name: "a_2",
66
+ originalLocations: [
67
+ { filePath: "<fixtures>/test/1.scss", start: { line: 4, column: 1 }, end: { line: 4, column: 3 } },
68
+ { filePath: "<fixtures>/test/1.scss", start: { line: 7, column: 3 }, end: { line: 7, column: 5 } },
69
+ ],
70
+ },
71
+ {
72
+ name: "a_2_1",
73
+ originalLocations: [
74
+ { filePath: "<fixtures>/test/1.scss", start: { line: 7, column: 3 }, end: { line: 7, column: 7 } },
75
+ ],
76
+ },
77
+ {
78
+ name: "a_2_2",
79
+ originalLocations: [
80
+ { filePath: "<fixtures>/test/1.scss", start: { line: 8, column: 3 }, end: { line: 8, column: 7 } },
81
+ ],
82
+ },
83
+ {
84
+ name: "d",
85
+ originalLocations: [
86
+ { filePath: "<fixtures>/test/4.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 1 } },
87
+ ],
88
+ },
89
+ ],
90
+ }
91
+ `);
92
+ });
93
+ test('tracks dependencies that have been pre-bundled by sass compiler', async () => {
94
+ createFixtures({
95
+ '/test/1.scss': dedent `
96
+ @import './2.scss';
97
+ @import './3.scss';
98
+ `,
99
+ '/test/2.scss': dedent `
100
+ `,
101
+ '/test/3.scss': dedent `
102
+ @import './4.scss';
103
+ `,
104
+ '/test/4.scss': dedent `
105
+ `,
106
+ });
107
+ const result = await loader.load(getFixturePath('/test/1.scss'));
108
+ // The files imported using @import are pre-bundled by the compiler.
109
+ // Therefore, `Loader#load` is not called to process other files.
110
+ expect(loadSpy).toBeCalledTimes(1);
111
+ expect(loadSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.scss'));
112
+ // The files pre-bundled by the compiler are also included in `result.dependencies`
113
+ expect(result.dependencies).toStrictEqual(['/test/2.scss', '/test/3.scss', '/test/4.scss'].map(getFixturePath));
114
+ });
115
+ test('resolves specifier using resolver', async () => {
116
+ createFixtures({
117
+ '/test/1.scss': dedent `
118
+ @import 'package-1';
119
+ @import 'package-2';
120
+ // NOTE: sass does not resolve files that are http(s) protocol.
121
+ // Therefore, the resolver will not be called for those files,
122
+ // and they will not be included in result.dependencies.
123
+ @import 'http://example.com/path/1.css';
124
+ @import 'https://example.com/path/1.css';
125
+ `,
126
+ '/node_modules/package-1/index.css': `.a {}`,
127
+ '/node_modules/package-2/index.scss': `.a {}`,
128
+ });
129
+ const result = await loader.load(getFixturePath('/test/1.scss'));
130
+ expect(result.dependencies).toStrictEqual(['/node_modules/package-1/index.css', '/node_modules/package-2/index.scss'].map(getFixturePath));
131
+ });
132
+ //# sourceMappingURL=scss-transformer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scss-transformer.test.js","sourceRoot":"","sources":["../../src/transformer/scss-transformer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;AACpE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3C,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,SAAS,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;IACvC,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;;;;;;;;;;OAYnB;QACH,cAAc,EAAE,MAAM,CAAA;;;OAGnB;QACH,cAAc,EAAE,MAAM,CAAA;;OAEnB;QACH,cAAc,EAAE,MAAM,CAAA;;OAEnB;KACJ,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAEjE,sFAAsF;IACtF,8EAA8E;IAC9E,uEAAuE;IAEvE,mDAAmD;IACnD,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;IACjF,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;KAGrB;QACD,cAAc,EAAE,MAAM,CAAA;KACrB;QACD,cAAc,EAAE,MAAM,CAAA;;KAErB;QACD,cAAc,EAAE,MAAM,CAAA;KACrB;KACF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAEjE,oEAAoE;IACpE,iEAAiE;IACjE,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAE3E,mFAAmF;IACnF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AAClH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;IACnD,cAAc,CAAC;QACb,cAAc,EAAE,MAAM,CAAA;;;;;;;;KAQrB;QACD,mCAAmC,EAAE,OAAO;QAC5C,oCAAoC,EAAE,OAAO;KAC9C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CACvC,CAAC,mCAAmC,EAAE,oCAAoC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAChG,CAAC;AACJ,CAAC,CAAC,CAAC"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The SystemError type of Node.js.
3
+ * @see https://nodejs.org/api/errors.html#class-systemerror
4
+ */
5
+ export interface SystemError {
6
+ code: string;
7
+ }
8
+ export declare function isSystemError(value: unknown): value is SystemError;
9
+ export declare function isObject(value: unknown): value is object;
10
+ export declare function hasProp<T extends string>(obj: object, prop: T): obj is {
11
+ [key in T]: unknown;
12
+ };
13
+ export declare function unique<T>(array: T[]): T[];
14
+ export declare function uniqueBy<T, U>(arr: T[], fn: (el: T) => U): T[];
15
+ export declare function sleepSync(ms: number): void;
16
+ export declare function exists(path: string): Promise<boolean>;
17
+ export declare function isMatchByGlob(filePath: string, pattern: string, options: {
18
+ cwd: string;
19
+ }): boolean;
package/dist/util.js ADDED
@@ -0,0 +1,52 @@
1
+ import { constants } from 'fs';
2
+ import { access } from 'fs/promises';
3
+ import { join } from 'path';
4
+ import minimatch from 'minimatch';
5
+ export function isSystemError(value) {
6
+ return (isObject(value) &&
7
+ hasProp(value, 'constructor') &&
8
+ isObject(value.constructor) &&
9
+ hasProp(value.constructor, 'name') &&
10
+ value.constructor.name === 'Error' &&
11
+ hasProp(value, 'code') &&
12
+ typeof value.code === 'string');
13
+ }
14
+ export function isObject(value) {
15
+ return (typeof value === 'object' || typeof value === 'function') && value !== null;
16
+ }
17
+ export function hasProp(obj, prop) {
18
+ return prop in obj;
19
+ }
20
+ export function unique(array) {
21
+ return [...new Set(array)];
22
+ }
23
+ export function uniqueBy(arr, fn) {
24
+ const result = [];
25
+ const keys = new Set();
26
+ for (const el of arr) {
27
+ const key = fn(el);
28
+ if (!keys.has(key)) {
29
+ keys.add(key);
30
+ result.push(el);
31
+ }
32
+ }
33
+ return result;
34
+ }
35
+ export function sleepSync(ms) {
36
+ const start = Date.now();
37
+ // eslint-disable-next-line no-empty
38
+ while (Date.now() - start < ms) { }
39
+ }
40
+ export async function exists(path) {
41
+ try {
42
+ await access(path, constants.F_OK);
43
+ return true;
44
+ }
45
+ catch (e) {
46
+ return false;
47
+ }
48
+ }
49
+ export function isMatchByGlob(filePath, pattern, options) {
50
+ return minimatch(filePath, join(options.cwd, pattern));
51
+ }
52
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,SAAS,MAAM,WAAW,CAAC;AASlC,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC;QAC7B,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC;QAClC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO;QAClC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;QACtB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,OAAO,CAAmB,GAAW,EAAE,IAAO;IAC5D,OAAO,IAAI,IAAI,GAAG,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,MAAM,CAAI,KAAU;IAClC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAO,GAAQ,EAAE,EAAgB;IACvD,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAK,CAAC;IAC1B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAClB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACjB;KACF;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,oCAAoC;IACpC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE,GAAE;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY;IACvC,IAAI;QACF,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAe,EAAE,OAAwB;IACvF,OAAO,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ import { join } from 'path';
2
+ import { hasProp, isObject, isSystemError, unique, uniqueBy } from '../src/util.js';
3
+ import { createFixtures, getFixturePath } from './test/util.js';
4
+ import { isMatchByGlob, exists } from './util.js';
5
+ function fakeSystemError({ code }) {
6
+ const error = new Error();
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ error.code = code;
9
+ return error;
10
+ }
11
+ test('isSystemError', () => {
12
+ expect(isSystemError(fakeSystemError({ code: 'ENOENT' }))).toBe(true);
13
+ expect(isSystemError(fakeSystemError({ code: 'EACCES' }))).toBe(true);
14
+ expect(isSystemError(new Error('ENOENT'))).toBe(false);
15
+ expect(isSystemError({ code: 'ENOENT' })).toBe(false);
16
+ });
17
+ test('isObject', () => {
18
+ expect(isObject({})).toBe(true);
19
+ expect(isObject({ a: '1' })).toBe(true);
20
+ expect(isObject([])).toBe(true);
21
+ expect(isObject(() => {
22
+ /* noop */
23
+ })).toBe(true);
24
+ expect(isObject(null)).toBe(false);
25
+ expect(isObject(undefined)).toBe(false);
26
+ expect(isObject(1)).toBe(false);
27
+ expect(isObject('1')).toBe(false);
28
+ expect(isObject(true)).toBe(false);
29
+ });
30
+ test('hasProp', () => {
31
+ expect(hasProp({ a: '1' }, 'a')).toBe(true);
32
+ expect(hasProp({ a: '1' }, 'b')).toBe(false);
33
+ // it can check prototype
34
+ expect(hasProp({}, 'toString')).toBe(true);
35
+ expect(hasProp([], 'length')).toBe(true);
36
+ });
37
+ test('unique', () => {
38
+ expect(unique([0, 1, 1, 2, 1])).toStrictEqual([0, 1, 2]);
39
+ });
40
+ test('uniqueBy', () => {
41
+ expect(uniqueBy([], () => 0)).toStrictEqual([]);
42
+ expect(uniqueBy([
43
+ { key: 'a', value: 0 },
44
+ { key: 'a', value: 1 },
45
+ { key: 'b', value: 2 },
46
+ { key: 'b', value: 3 },
47
+ { key: 'c', value: 4 },
48
+ { key: 'c', value: 5 },
49
+ ], (el) => el.key)).toStrictEqual([
50
+ { key: 'a', value: 0 },
51
+ { key: 'b', value: 2 },
52
+ { key: 'c', value: 4 },
53
+ ]);
54
+ });
55
+ test('exists', async () => {
56
+ createFixtures({
57
+ '/test/1.css': `.a {}`,
58
+ });
59
+ expect(await exists(getFixturePath('/test/1.css'))).toBe(true);
60
+ expect(await exists(getFixturePath('/test/2.css'))).toBe(false);
61
+ });
62
+ test('isMatchByGlob', () => {
63
+ const cwd = process.cwd();
64
+ expect(isMatchByGlob(join(cwd, '1.css'), '*.css', { cwd })).toBe(true);
65
+ expect(isMatchByGlob(join(cwd, '1.scss'), '*.css', { cwd })).toBe(false);
66
+ expect(isMatchByGlob(join(cwd, 'dir/1.css'), '**/*.css', { cwd })).toBe(true);
67
+ expect(isMatchByGlob(join(cwd, 'dir/dir/1.css'), '**/*.css', { cwd })).toBe(true);
68
+ expect(isMatchByGlob(join(cwd, '1.css'), '*.{css,scss}', { cwd })).toBe(true);
69
+ expect(isMatchByGlob(join(cwd, '1.scss'), '*.{css,scss}', { cwd })).toBe(true);
70
+ expect(isMatchByGlob(join(cwd, '1.less'), '*.{css,scss}', { cwd })).toBe(false);
71
+ expect(isMatchByGlob(join(cwd, '1.css'), '!(*.css)', { cwd })).toBe(false);
72
+ expect(isMatchByGlob(join(cwd, '1.scss'), '!(*.css)', { cwd })).toBe(true);
73
+ expect(isMatchByGlob(join(cwd, '1.less'), '!(*.css)', { cwd })).toBe(true);
74
+ });
75
+ //# sourceMappingURL=util.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.test.js","sourceRoot":"","sources":["../src/util.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,106 @@
1
+ {
2
+ "name": "happy-css-modules",
3
+ "version": "0.2.0",
4
+ "description": "Creates .d.ts files from CSS Modules .css files",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "hcm": "bin/hcm.js"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/mizdra/happy-css-modules.git"
14
+ },
15
+ "keywords": [
16
+ "css-modules",
17
+ "typescript"
18
+ ],
19
+ "files": [
20
+ "bin",
21
+ "src",
22
+ "dist"
23
+ ],
24
+ "author": "mizdra",
25
+ "license": "MIT",
26
+ "engines": {
27
+ "node": "^14.13.1 || >=16.0.0"
28
+ },
29
+ "dependencies": {
30
+ "camelcase": "^7.0.0",
31
+ "chalk": "^5.0.1",
32
+ "chokidar": "^3.5.3",
33
+ "enhanced-resolve": "^5.10.0",
34
+ "es-aggregate-error": "^1.0.8",
35
+ "glob": "^8.0.3",
36
+ "import-meta-resolve": "^2.1.0",
37
+ "minimatch": "^5.1.0",
38
+ "postcss": "^8.4.14",
39
+ "postcss-modules": "^4.3.1",
40
+ "postcss-selector-parser": "^6.0.10",
41
+ "postcss-value-parser": "^4.2.0",
42
+ "source-map": "^0.7.4",
43
+ "yargs": "^17.5.1"
44
+ },
45
+ "devDependencies": {
46
+ "@babel/core": "^7.18.13",
47
+ "@babel/preset-typescript": "^7.18.6",
48
+ "@jest/globals": "^29.0.3",
49
+ "@jest/types": "^29.0.3",
50
+ "@mizdra/eslint-config-mizdra": "^1.2.0",
51
+ "@mizdra/prettier-config-mizdra": "^1.0.0",
52
+ "@types/babel__core": "^7.1.19",
53
+ "@types/dedent": "^0.7.0",
54
+ "@types/es-aggregate-error": "^1.0.2",
55
+ "@types/glob": "^7.2.0",
56
+ "@types/jest": "^29.0.0",
57
+ "@types/less": "^3.0.3",
58
+ "@types/line-column": "^1.0.0",
59
+ "@types/minimatch": "^5.1.2",
60
+ "@types/node": "^18.0.6",
61
+ "@types/yargs": "^17.0.12",
62
+ "@typescript-eslint/eslint-plugin": "^5.31.0",
63
+ "@typescript-eslint/parser": "^5.31.0",
64
+ "@typescript/server-harness": "^0.2.0",
65
+ "babel-jest": "^29.0.3",
66
+ "dedent": "^0.7.0",
67
+ "eslint": "^8.20.0",
68
+ "eslint-config-prettier": "^8.5.0",
69
+ "eslint-plugin-import": "^2.26.0",
70
+ "jest": "^29.0.3",
71
+ "less": "^4.1.3",
72
+ "line-column": "^1.0.2",
73
+ "npm-run-all": "^4.1.5",
74
+ "prettier": "~2.7.1",
75
+ "sass": "^1.54.3",
76
+ "tsc-watch": "^5.0.3",
77
+ "typescript": "^4.7.4"
78
+ },
79
+ "peerDependencies": {
80
+ "less": "^4.0.0",
81
+ "postcss": "^8.0.0",
82
+ "sass": "^1.0.0"
83
+ },
84
+ "peerDependenciesMeta": {
85
+ "sass": {
86
+ "optional": true
87
+ },
88
+ "less": {
89
+ "optional": true
90
+ }
91
+ },
92
+ "packageManager": "pnpm@7.9.5",
93
+ "prettier": "@mizdra/prettier-config-mizdra",
94
+ "scripts": {
95
+ "build": "tsc -p tsconfig.src.json",
96
+ "dev": "tsc-watch -p tsconfig.src.json --noClear --onSuccess 'pnpm run --dir example hcm'",
97
+ "lint": "run-s -c lint:*",
98
+ "lint:prettier": "prettier --check .",
99
+ "lint:eslint": "eslint .",
100
+ "lint:tsc": "run-s -c lint:tsc:*",
101
+ "lint:tsc:src": "tsc -p tsconfig.src.json --noEmit",
102
+ "lint:tsc:config": "tsc -p tsconfig.config.json --noEmit",
103
+ "lint:tsc:example": "tsc -p tsconfig.example.json --noEmit",
104
+ "test": "NODE_OPTIONS=\"--experimental-vm-modules $NODE_OPTIONS\" jest"
105
+ }
106
+ }