happy-css-modules 0.4.0 → 0.6.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 (102) hide show
  1. package/README.md +172 -53
  2. package/dist/cli.js +45 -11
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cli.test.js +20 -4
  5. package/dist/cli.test.js.map +1 -1
  6. package/dist/emitter/dts.d.ts +3 -4
  7. package/dist/emitter/dts.js +13 -15
  8. package/dist/emitter/dts.js.map +1 -1
  9. package/dist/emitter/dts.test.js +7 -10
  10. package/dist/emitter/dts.test.js.map +1 -1
  11. package/dist/emitter/index.d.ts +6 -15
  12. package/dist/emitter/index.js +18 -13
  13. package/dist/emitter/index.js.map +1 -1
  14. package/dist/emitter/index.test.js +0 -50
  15. package/dist/emitter/index.test.js.map +1 -1
  16. package/dist/emitter/source-map.d.ts +1 -3
  17. package/dist/emitter/source-map.js +2 -3
  18. package/dist/emitter/source-map.js.map +1 -1
  19. package/dist/emitter/source-map.test.js +1 -4
  20. package/dist/emitter/source-map.test.js.map +1 -1
  21. package/dist/index.d.ts +4 -2
  22. package/dist/index.js +3 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/integration-test/go-to-definition.test.js +1 -0
  25. package/dist/integration-test/go-to-definition.test.js.map +1 -1
  26. package/dist/{loader → locator}/index.d.ts +6 -4
  27. package/dist/{loader → locator}/index.js +13 -5
  28. package/dist/locator/index.js.map +1 -0
  29. package/dist/{loader → locator}/index.test.d.ts +0 -0
  30. package/dist/{loader → locator}/index.test.js +100 -14
  31. package/dist/locator/index.test.js.map +1 -0
  32. package/dist/{loader → locator}/postcss.d.ts +5 -1
  33. package/dist/{loader → locator}/postcss.js +26 -30
  34. package/dist/{loader → locator}/postcss.js.map +1 -1
  35. package/dist/{loader → locator}/postcss.test.d.ts +0 -0
  36. package/dist/{loader → locator}/postcss.test.js +0 -0
  37. package/dist/locator/postcss.test.js.map +1 -0
  38. package/dist/resolver/webpack-resolver.d.ts +12 -2
  39. package/dist/resolver/webpack-resolver.js +12 -3
  40. package/dist/resolver/webpack-resolver.js.map +1 -1
  41. package/dist/resolver/webpack-resolver.test.js +43 -7
  42. package/dist/resolver/webpack-resolver.test.js.map +1 -1
  43. package/dist/runner.d.ts +23 -1
  44. package/dist/runner.js +62 -23
  45. package/dist/runner.js.map +1 -1
  46. package/dist/runner.test.js +90 -11
  47. package/dist/runner.test.js.map +1 -1
  48. package/dist/test/util.d.ts +2 -2
  49. package/dist/test/util.js +16 -9
  50. package/dist/test/util.js.map +1 -1
  51. package/dist/transformer/index.d.ts +4 -2
  52. package/dist/transformer/index.js +7 -3
  53. package/dist/transformer/index.js.map +1 -1
  54. package/dist/transformer/index.test.d.ts +1 -0
  55. package/dist/transformer/index.test.js +66 -0
  56. package/dist/transformer/index.test.js.map +1 -0
  57. package/dist/transformer/less-transformer.test.js +14 -14
  58. package/dist/transformer/less-transformer.test.js.map +1 -1
  59. package/dist/transformer/postcss-transformer.d.ts +12 -0
  60. package/dist/transformer/postcss-transformer.js +32 -0
  61. package/dist/transformer/postcss-transformer.js.map +1 -0
  62. package/dist/transformer/postcss-transformer.test.d.ts +1 -0
  63. package/dist/transformer/postcss-transformer.test.js +176 -0
  64. package/dist/transformer/postcss-transformer.test.js.map +1 -0
  65. package/dist/transformer/scss-transformer.js +19 -17
  66. package/dist/transformer/scss-transformer.js.map +1 -1
  67. package/dist/transformer/scss-transformer.test.js +16 -16
  68. package/dist/transformer/scss-transformer.test.js.map +1 -1
  69. package/dist/util.d.ts +2 -0
  70. package/dist/util.js +19 -2
  71. package/dist/util.js.map +1 -1
  72. package/package.json +10 -9
  73. package/src/cli.test.ts +24 -4
  74. package/src/cli.ts +44 -12
  75. package/src/emitter/dts.test.ts +7 -12
  76. package/src/emitter/dts.ts +15 -15
  77. package/src/emitter/index.test.ts +0 -52
  78. package/src/emitter/index.ts +22 -29
  79. package/src/emitter/source-map.test.ts +1 -6
  80. package/src/emitter/source-map.ts +3 -4
  81. package/src/index.ts +9 -2
  82. package/src/integration-test/go-to-definition.test.ts +1 -0
  83. package/src/{loader → locator}/index.test.ts +101 -14
  84. package/src/{loader → locator}/index.ts +16 -8
  85. package/src/{loader → locator}/postcss.test.ts +0 -0
  86. package/src/{loader → locator}/postcss.ts +42 -40
  87. package/src/resolver/webpack-resolver.test.ts +63 -7
  88. package/src/resolver/webpack-resolver.ts +26 -5
  89. package/src/runner.test.ts +103 -11
  90. package/src/runner.ts +83 -25
  91. package/src/test/util.ts +16 -10
  92. package/src/transformer/index.test.ts +71 -0
  93. package/src/transformer/index.ts +12 -4
  94. package/src/transformer/less-transformer.test.ts +14 -14
  95. package/src/transformer/postcss-transformer.test.ts +188 -0
  96. package/src/transformer/postcss-transformer.ts +57 -0
  97. package/src/transformer/scss-transformer.test.ts +16 -16
  98. package/src/transformer/scss-transformer.ts +25 -27
  99. package/src/util.ts +21 -2
  100. package/dist/loader/index.js.map +0 -1
  101. package/dist/loader/index.test.js.map +0 -1
  102. package/dist/loader/postcss.test.js.map +0 -1
@@ -0,0 +1,176 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createRequire } from 'node:module';
3
+ import { jest } from '@jest/globals';
4
+ import dedent from 'dedent';
5
+ import { Locator } from '../locator/index.js';
6
+ import { createFixtures, getFixturePath } from '../test/util.js';
7
+ import { createPostcssTransformer } from './postcss-transformer.js';
8
+ const cwd = getFixturePath('/');
9
+ const require = createRequire(import.meta.url);
10
+ // NOTE: postcss-load-config caches the configuration file using the path as a key.
11
+ // Therefore, change the path for each test case so that a new configuration file is always used.
12
+ test('handles postcss features', async () => {
13
+ const uuid = randomUUID();
14
+ const locator = new Locator({
15
+ transformer: createPostcssTransformer({
16
+ cwd,
17
+ postcssConfig: `${uuid}/postcss.config.js`,
18
+ }),
19
+ });
20
+ createFixtures({
21
+ [`/${uuid}/postcss.config.js`]: dedent `
22
+ module.exports = {
23
+ plugins: [
24
+ require('${require.resolve('postcss-simple-vars')}'),
25
+ ],
26
+ };
27
+ `,
28
+ '/test/1.css': dedent `
29
+ $prefix: foo;
30
+ .$(prefix)_bar {}
31
+ `,
32
+ });
33
+ const result = await locator.load(getFixturePath('/test/1.css'));
34
+ expect(result).toMatchInlineSnapshot(`
35
+ {
36
+ dependencies: [],
37
+ tokens: [
38
+ {
39
+ name: "foo_bar",
40
+ originalLocations: [
41
+ { filePath: "<fixtures>/test/1.css", start: { line: 2, column: 1 }, end: { line: 2, column: 8 } },
42
+ ],
43
+ },
44
+ ],
45
+ }
46
+ `);
47
+ });
48
+ test('tracks dependencies that have been pre-bundled by postcss compiler', async () => {
49
+ const uuid = randomUUID();
50
+ const locator = new Locator({
51
+ transformer: createPostcssTransformer({
52
+ cwd,
53
+ postcssConfig: `${uuid}/postcss.config.js`,
54
+ }),
55
+ });
56
+ const loadSpy = jest.spyOn(locator, 'load');
57
+ createFixtures({
58
+ [`/${uuid}/postcss.config.js`]: dedent `
59
+ module.exports = {
60
+ plugins: [
61
+ require('${require.resolve('postcss-import')}'),
62
+ ],
63
+ };
64
+ `,
65
+ '/test/1.css': dedent `
66
+ @import './2.css';
67
+ @import './3.css';
68
+ `,
69
+ '/test/2.css': ``,
70
+ '/test/3.css': `@import './4.css'`,
71
+ '/test/4.css': ``,
72
+ });
73
+ const result = await locator.load(getFixturePath('/test/1.css'));
74
+ // The files imported using @import are pre-bundled by the compiler.
75
+ // Therefore, `Locator#load` is not called to process other files.
76
+ expect(loadSpy).toBeCalledTimes(1);
77
+ expect(loadSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.css'));
78
+ // The files pre-bundled by the compiler are also included in `result.dependencies`
79
+ expect(result.dependencies).toStrictEqual(['/test/2.css', '/test/3.css', '/test/4.css'].map(getFixturePath));
80
+ });
81
+ test('resolves specifier using resolver', async () => {
82
+ const uuid = randomUUID();
83
+ const locator = new Locator({
84
+ transformer: createPostcssTransformer({
85
+ cwd,
86
+ postcssConfig: `${uuid}/postcss.config.js`,
87
+ }),
88
+ });
89
+ createFixtures({
90
+ [`/${uuid}/postcss.config.js`]: dedent `
91
+ module.exports = {
92
+ plugins: [
93
+ // When using postcss-import, the resolver of happy-css-modules is ignored.
94
+ // Therefore, we test here without postcss-import.
95
+ // require('${require.resolve('postcss-import')}'),
96
+ ],
97
+ };
98
+ `,
99
+ '/test/1.css': dedent `
100
+ @import 'package';
101
+ `,
102
+ '/node_modules/package/index.css': `.a {}`,
103
+ });
104
+ const result = await locator.load(getFixturePath('/test/1.css'));
105
+ expect(result.dependencies).toStrictEqual(['/node_modules/package/index.css'].map(getFixturePath));
106
+ });
107
+ test('ignores http(s) protocol file', async () => {
108
+ const uuid = randomUUID();
109
+ const locator = new Locator({
110
+ transformer: createPostcssTransformer({
111
+ cwd,
112
+ postcssConfig: `${uuid}/postcss.config.js`,
113
+ }),
114
+ });
115
+ createFixtures({
116
+ [`/${uuid}/postcss.config.js`]: dedent `
117
+ module.exports = {
118
+ plugins: [
119
+ // When using postcss-import, the resolver of happy-css-modules is ignored.
120
+ // Therefore, we test here without postcss-import.
121
+ // require('${require.resolve('postcss-import')}'),
122
+ ],
123
+ };
124
+ `,
125
+ '/test/1.css': dedent `
126
+ @import 'http://example.com/path/http.css';
127
+ @import 'https://example.com/path/https.css';
128
+ `,
129
+ });
130
+ const result = await locator.load(getFixturePath('/test/1.css'));
131
+ expect(result.dependencies).toStrictEqual([]);
132
+ });
133
+ test('returns false if postcssrc is not found', async () => {
134
+ const uuid = randomUUID();
135
+ const transformer = createPostcssTransformer({
136
+ cwd,
137
+ postcssConfig: `${uuid}/postcss.config.js`,
138
+ });
139
+ createFixtures({
140
+ '/test/1.css': dedent `
141
+ @import 'http://example.com/path/http.css';
142
+ @import 'https://example.com/path/https.css';
143
+ `,
144
+ });
145
+ expect(await transformer('', {
146
+ from: getFixturePath('/test/1.css'),
147
+ isIgnoredSpecifier: () => false,
148
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
149
+ resolver: jest.fn(),
150
+ })).toBe(false);
151
+ });
152
+ test('searches config from cwd if postcssConfig option is missing', async () => {
153
+ const uuid = randomUUID();
154
+ const cwd = `/${uuid}`;
155
+ const locator = new Locator({
156
+ transformer: createPostcssTransformer({
157
+ cwd: getFixturePath(cwd),
158
+ }),
159
+ });
160
+ createFixtures({
161
+ [`/${uuid}/postcss.config.js`]: dedent `
162
+ module.exports = {
163
+ plugins: [
164
+ require('${require.resolve('postcss-simple-vars')}'),
165
+ ],
166
+ };
167
+ `,
168
+ '/test/1.css': dedent `
169
+ $prefix: foo;
170
+ .$(prefix)_bar {}
171
+ `,
172
+ });
173
+ const result = await locator.load(getFixturePath('/test/1.css'));
174
+ expect(result.tokens.map((token) => token.name)).toStrictEqual(['foo_bar']);
175
+ });
176
+ //# sourceMappingURL=postcss-transformer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postcss-transformer.test.js","sourceRoot":"","sources":["../../src/transformer/postcss-transformer.test.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,25 @@
3
3
  // Therefore, the workaround is now disabled. See
4
4
  // https://github.com/mizdra/happy-css-modules/issues/65#issuecomment-1229471950 for more information.
5
5
  import { handleImportError } from './index.js';
6
- async function renderSass(sass, source, options) {
7
- return new Promise((resolve, reject) => {
8
- sass.render({
6
+ // For some reason, `util.promisify` does not work. Therefore, use the original promisify.
7
+ function promisifySassRender(sass) {
8
+ return async (options) => {
9
+ return new Promise((resolve, reject) => {
10
+ sass.render(options, (exception, result) => {
11
+ if (exception)
12
+ reject(exception);
13
+ else
14
+ resolve(result);
15
+ });
16
+ });
17
+ };
18
+ }
19
+ export const createScssTransformer = () => {
20
+ let sass;
21
+ return async (source, options) => {
22
+ sass ??= (await import('sass').catch(handleImportError('sass'))).default;
23
+ const render = promisifySassRender(sass);
24
+ const result = await render({
9
25
  data: source,
10
26
  file: options.from,
11
27
  outFile: 'DUMMY',
@@ -16,21 +32,7 @@ async function renderSass(sass, source, options) {
16
32
  .then((resolved) => done({ file: resolved }))
17
33
  .catch((e) => done(e));
18
34
  },
19
- }, (exception, result) => {
20
- if (exception) {
21
- reject(exception);
22
- }
23
- else {
24
- resolve(result);
25
- }
26
35
  });
27
- });
28
- }
29
- export const createScssTransformer = () => {
30
- let sass;
31
- return async (source, options) => {
32
- sass ??= (await import('sass').catch(handleImportError('sass'))).default;
33
- const result = await renderSass(sass, source, options);
34
36
  return { css: result.css.toString(), map: result.map.toString(), dependencies: result.stats.includedFiles };
35
37
  };
36
38
  };
@@ -1 +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,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,IAAI,IAA2B,CAAC;IAChC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,KAAK,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;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;IAC/G,CAAC,CAAC;AACJ,CAAC,CAAC"}
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,0FAA0F;AAC1F,SAAS,mBAAmB,CAAC,IAA2B;IACtD,OAAO,KAAK,EAAE,OAA+B,EAAE,EAAE;QAC/C,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;gBACzC,IAAI,SAAS;oBAAE,MAAM,CAAC,SAAS,CAAC,CAAC;;oBAC5B,OAAO,CAAC,MAAO,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAsB,GAAG,EAAE;IAC3D,IAAI,IAA2B,CAAC;IAChC,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,KAAK,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACzE,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,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,CAAC,CAAC;QACH,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;IAC/G,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import { jest } from '@jest/globals';
2
2
  import dedent from 'dedent';
3
- import { Loader } from '../loader/index.js';
3
+ import { Locator } from '../locator/index.js';
4
4
  import { createFixtures, getFixturePath } from '../test/util.js';
5
5
  import { createScssTransformer } from './scss-transformer.js';
6
- const loader = new Loader({ transformer: createScssTransformer() });
7
- const loadSpy = jest.spyOn(loader, 'load');
6
+ const locator = new Locator({ transformer: createScssTransformer() });
7
+ const loadSpy = jest.spyOn(locator, 'load');
8
8
  afterEach(() => {
9
9
  loadSpy.mockClear();
10
10
  });
@@ -34,7 +34,7 @@ test('handles sass features', async () => {
34
34
  .d { dummy: ''; }
35
35
  `,
36
36
  });
37
- const result = await loader.load(getFixturePath('/test/1.scss'));
37
+ const result = await locator.load(getFixturePath('/test/1.scss'));
38
38
  // NOTE: There should be only one originalLocations for 'a_2', but there are multiple.
39
39
  // This is probably due to an incorrect sourcemap output by the sass compiler.
40
40
  // FIXME: The sass compiler or Loader implementation needs to be fixed.
@@ -46,44 +46,44 @@ test('handles sass features', async () => {
46
46
  {
47
47
  name: "b_1",
48
48
  originalLocations: [
49
- { filePath: "<fixtures>/test/2.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 3 } },
49
+ { filePath: "<fixtures>/test/2.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 4 } },
50
50
  ],
51
51
  },
52
52
  {
53
53
  name: "c",
54
54
  originalLocations: [
55
- { filePath: "<fixtures>/test/3.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 1 } },
55
+ { filePath: "<fixtures>/test/3.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
56
56
  ],
57
57
  },
58
58
  {
59
59
  name: "a_1",
60
60
  originalLocations: [
61
- { filePath: "<fixtures>/test/1.scss", start: { line: 3, column: 1 }, end: { line: 3, column: 3 } },
61
+ { filePath: "<fixtures>/test/1.scss", start: { line: 3, column: 1 }, end: { line: 3, column: 4 } },
62
62
  ],
63
63
  },
64
64
  {
65
65
  name: "a_2",
66
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 } },
67
+ { filePath: "<fixtures>/test/1.scss", start: { line: 4, column: 1 }, end: { line: 4, column: 4 } },
68
+ { filePath: "<fixtures>/test/1.scss", start: { line: 7, column: 3 }, end: { line: 7, column: 6 } },
69
69
  ],
70
70
  },
71
71
  {
72
72
  name: "a_2_1",
73
73
  originalLocations: [
74
- { filePath: "<fixtures>/test/1.scss", start: { line: 7, column: 3 }, end: { line: 7, column: 7 } },
74
+ { filePath: "<fixtures>/test/1.scss", start: { line: 7, column: 3 }, end: { line: 7, column: 8 } },
75
75
  ],
76
76
  },
77
77
  {
78
78
  name: "a_2_2",
79
79
  originalLocations: [
80
- { filePath: "<fixtures>/test/1.scss", start: { line: 8, column: 3 }, end: { line: 8, column: 7 } },
80
+ { filePath: "<fixtures>/test/1.scss", start: { line: 8, column: 3 }, end: { line: 8, column: 8 } },
81
81
  ],
82
82
  },
83
83
  {
84
84
  name: "d",
85
85
  originalLocations: [
86
- { filePath: "<fixtures>/test/4.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 1 } },
86
+ { filePath: "<fixtures>/test/4.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
87
87
  ],
88
88
  },
89
89
  ],
@@ -104,9 +104,9 @@ test('tracks dependencies that have been pre-bundled by sass compiler', async ()
104
104
  '/test/4.scss': dedent `
105
105
  `,
106
106
  });
107
- const result = await loader.load(getFixturePath('/test/1.scss'));
107
+ const result = await locator.load(getFixturePath('/test/1.scss'));
108
108
  // The files imported using @import are pre-bundled by the compiler.
109
- // Therefore, `Loader#load` is not called to process other files.
109
+ // Therefore, `Locator#load` is not called to process other files.
110
110
  expect(loadSpy).toBeCalledTimes(1);
111
111
  expect(loadSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.scss'));
112
112
  // The files pre-bundled by the compiler are also included in `result.dependencies`
@@ -121,7 +121,7 @@ test('resolves specifier using resolver', async () => {
121
121
  '/node_modules/package-1/index.css': `.a {}`,
122
122
  '/node_modules/package-2/index.scss': `.a {}`,
123
123
  });
124
- const result = await loader.load(getFixturePath('/test/1.scss'));
124
+ const result = await locator.load(getFixturePath('/test/1.scss'));
125
125
  expect(result.dependencies).toStrictEqual(['/node_modules/package-1/index.css', '/node_modules/package-2/index.scss'].map(getFixturePath));
126
126
  });
127
127
  test('ignores http(s) protocol file', async () => {
@@ -132,7 +132,7 @@ test('ignores http(s) protocol file', async () => {
132
132
  @import 'https://example.com/path/scss.scss';
133
133
  `,
134
134
  });
135
- const result = await loader.load(getFixturePath('/test/1.scss'));
135
+ const result = await locator.load(getFixturePath('/test/1.scss'));
136
136
  expect(result.dependencies).toStrictEqual([]);
137
137
  });
138
138
  //# sourceMappingURL=scss-transformer.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scss-transformer.test.js","sourceRoot":"","sources":["../../src/transformer/scss-transformer.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scss-transformer.test.js","sourceRoot":"","sources":["../../src/transformer/scss-transformer.test.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts CHANGED
@@ -17,3 +17,5 @@ export declare function exists(path: string): Promise<boolean>;
17
17
  export declare function isMatchByGlob(filePath: string, pattern: string, options: {
18
18
  cwd: string;
19
19
  }): boolean;
20
+ export declare function getPackageJson(): any;
21
+ export declare function getInstalledPeerDependencies(): Promise<string[]>;
package/dist/util.js CHANGED
@@ -1,6 +1,8 @@
1
- import { constants } from 'fs';
1
+ import { constants, readFileSync } from 'fs';
2
2
  import { access } from 'fs/promises';
3
- import { join } from 'path';
3
+ import { join, dirname, resolve } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { resolve as importMetaResolve } from 'import-meta-resolve';
4
6
  import minimatch from 'minimatch';
5
7
  export function isSystemError(value) {
6
8
  return (isObject(value) &&
@@ -49,4 +51,19 @@ export async function exists(path) {
49
51
  export function isMatchByGlob(filePath, pattern, options) {
50
52
  return minimatch(filePath, join(options.cwd, pattern));
51
53
  }
54
+ export function getPackageJson() {
55
+ return JSON.parse(readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '../package.json'), 'utf-8'));
56
+ }
57
+ export async function getInstalledPeerDependencies() {
58
+ const pkgJson = getPackageJson();
59
+ const result = [];
60
+ for (const deps of Object.keys(pkgJson.peerDependencies)) {
61
+ const isInstalled = await importMetaResolve(deps, import.meta.url)
62
+ .then(() => true)
63
+ .catch(() => false);
64
+ if (isInstalled)
65
+ result.push(deps);
66
+ }
67
+ return result;
68
+ }
52
69
  //# sourceMappingURL=util.js.map
package/dist/util.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-css-modules",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Creates .d.ts files from CSS Modules .css files",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -27,15 +27,17 @@
27
27
  "node": ">=16.0.0"
28
28
  },
29
29
  "dependencies": {
30
+ "@file-cache/core": "^1.1.3",
31
+ "@file-cache/npm": "^1.1.3",
30
32
  "camelcase": "^7.0.0",
31
33
  "chalk": "^5.0.1",
32
34
  "chokidar": "^3.5.3",
33
35
  "enhanced-resolve": "^5.10.0",
34
- "es-aggregate-error": "^1.0.8",
35
36
  "glob": "^8.0.3",
36
37
  "import-meta-resolve": "^2.1.0",
37
38
  "minimatch": "^5.1.0",
38
- "postcss": "^8.4.14",
39
+ "postcss": "^8.4.17",
40
+ "postcss-load-config": "^4.0.1",
39
41
  "postcss-modules": "^4.3.1",
40
42
  "postcss-selector-parser": "^6.0.10",
41
43
  "postcss-value-parser": "^4.2.0",
@@ -43,26 +45,23 @@
43
45
  "yargs": "^17.5.1"
44
46
  },
45
47
  "devDependencies": {
46
- "@babel/core": "^7.18.13",
47
- "@babel/preset-typescript": "^7.18.6",
48
48
  "@jest/globals": "^29.0.3",
49
49
  "@jest/types": "^29.0.3",
50
50
  "@mizdra/eslint-config-mizdra": "^1.2.0",
51
51
  "@mizdra/prettier-config-mizdra": "^1.0.0",
52
- "@types/babel__core": "^7.1.19",
52
+ "@swc/core": "^1.3.8",
53
+ "@swc/jest": "^0.2.23",
53
54
  "@types/dedent": "^0.7.0",
54
- "@types/es-aggregate-error": "^1.0.2",
55
55
  "@types/glob": "^7.2.0",
56
56
  "@types/jest": "^29.0.0",
57
57
  "@types/less": "^3.0.3",
58
58
  "@types/line-column": "^1.0.0",
59
59
  "@types/minimatch": "^5.1.2",
60
60
  "@types/node": "^18.0.6",
61
- "@types/yargs": "^17.0.12",
61
+ "@types/yargs": "^17.0.13",
62
62
  "@typescript-eslint/eslint-plugin": "^5.31.0",
63
63
  "@typescript-eslint/parser": "^5.31.0",
64
64
  "@typescript/server-harness": "^0.2.0",
65
- "babel-jest": "^29.0.3",
66
65
  "dedent": "^0.7.0",
67
66
  "eslint": "^8.20.0",
68
67
  "eslint-config-prettier": "^8.5.0",
@@ -71,6 +70,8 @@
71
70
  "less": "^4.1.3",
72
71
  "line-column": "^1.0.2",
73
72
  "npm-run-all": "^4.1.5",
73
+ "postcss-import": "^15.0.0",
74
+ "postcss-simple-vars": "^7.0.0",
74
75
  "prettier": "~2.7.1",
75
76
  "sass": "^1.54.3",
76
77
  "tsc-watch": "^5.0.3",
package/src/cli.test.ts CHANGED
@@ -10,10 +10,6 @@ describe('parseArgv', () => {
10
10
  // TODO: Support multiple patterns
11
11
  // parseArgv([...baseArgs, 'foo', 'bar']);
12
12
  });
13
- test('--outDir', () => {
14
- expect(parseArgv([...baseArgs, '1.css', '--outDir', 'foo']).outDir).toStrictEqual('foo');
15
- expect(parseArgv([...baseArgs, '1.css', '--outDir', '1']).outDir).toStrictEqual('1');
16
- });
17
13
  test('--watch', () => {
18
14
  expect(parseArgv([...baseArgs, '1.css', '--watch']).watch).toBe(true);
19
15
  expect(parseArgv([...baseArgs, '1.css', '--no-watch']).watch).toBe(false);
@@ -45,6 +41,30 @@ describe('parseArgv', () => {
45
41
  // Passing a number is treated as a string
46
42
  expect(parseArgv([...baseArgs, '1.css', '--lessIncludePaths', '1']).lessIncludePaths).toStrictEqual(['1']);
47
43
  });
44
+ test('--webpackResolveAlias', () => {
45
+ expect(
46
+ parseArgv([...baseArgs, '1.css', '--webpackResolveAlias', '{ "key1": "value1", "key2": "value2" }'])
47
+ .webpackResolveAlias,
48
+ ).toStrictEqual({
49
+ key1: 'value1',
50
+ key2: 'value2',
51
+ });
52
+ });
53
+ test('--postcssConfig', () => {
54
+ expect(parseArgv([...baseArgs, '1.css', '--postcssConfig', '.']).postcssConfig).toBe('.');
55
+ expect(parseArgv([...baseArgs, '1.css', '--postcssConfig', 'postcss.config.js']).postcssConfig).toBe(
56
+ 'postcss.config.js',
57
+ );
58
+ });
59
+ test('--cache', () => {
60
+ expect(parseArgv([...baseArgs, '1.css']).cache).toBe(true);
61
+ expect(parseArgv([...baseArgs, '1.css', '--cache']).cache).toBe(true);
62
+ expect(parseArgv([...baseArgs, '1.css', '--no-cache']).cache).toBe(false);
63
+ });
64
+ test('--cacheStrategy', () => {
65
+ expect(parseArgv([...baseArgs, '1.css']).cacheStrategy).toBe('content');
66
+ expect(parseArgv([...baseArgs, '1.css', '--cacheStrategy', 'metadata']).cacheStrategy).toBe('metadata');
67
+ });
48
68
  test('--silent', () => {
49
69
  expect(parseArgv([...baseArgs, '1.css', '--silent']).silent).toBe(true);
50
70
  expect(parseArgv([...baseArgs, '1.css', '--no-silent']).silent).toBe(false);
package/src/cli.ts CHANGED
@@ -1,32 +1,27 @@
1
- import { readFileSync } from 'fs';
2
- import { dirname, resolve } from 'path';
3
- import { fileURLToPath } from 'url';
4
1
  import yargs from 'yargs';
5
2
  import { hideBin } from 'yargs/helpers';
6
3
  import { type RunnerOptions } from './runner.js';
7
-
8
- const pkgJson = JSON.parse(readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '../package.json'), 'utf-8'));
4
+ import { getPackageJson } from './util.js';
9
5
 
10
6
  /**
11
7
  * Parse command line arguments.
12
8
  * @returns Runner options.
13
9
  */
14
10
  export function parseArgv(argv: string[]): RunnerOptions {
11
+ const pkgJson = getPackageJson();
15
12
  const parsedArgv = yargs(hideBin(argv))
16
- .wrap(Math.min(120, process.stdout.columns))
13
+ .wrap(Math.min(140, process.stdout.columns))
17
14
  .scriptName('hcm')
18
- .usage('Create .d.ts and .d.ts.map from CSS modules *.css files.\n\n$0 [options] <glob>')
15
+ .usage('Generate .d.ts and .d.ts.map for CSS modules.\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.')
23
20
  .example("$0 'src/**/*.module.css' --sassLoadPaths=src/style", "Run with sass's `--load-path`.")
24
21
  .example("$0 'src/**/*.module.css' --lessIncludePaths=src/style", "Run with less's `--include-path`.")
22
+ .example('$0 \'src/**/*.module.css\' --webpackResolveAlias=\'{"@": "src"}\'', "Run with webpack's `resolve.alias`.")
23
+ .example("$0 'src/**/*.module.css' --cache=false", 'Disable cache.')
25
24
  .detectLocale(false)
26
- .option('outDir', {
27
- type: 'string',
28
- describe: 'Output directory',
29
- })
30
25
  .option('watch', {
31
26
  type: 'boolean',
32
27
  alias: 'w',
@@ -52,6 +47,26 @@ export function parseArgv(argv: string[]): RunnerOptions {
52
47
  nargs: 1,
53
48
  describe: "The option compatible with less's `--include-path`.",
54
49
  })
50
+ .option('webpackResolveAlias', {
51
+ string: true,
52
+ describe: "The option compatible with webpack's `resolve.alias`.",
53
+ })
54
+ // TODO: Support --noPostcssConfig option.
55
+ .option('postcssConfig', {
56
+ string: true,
57
+ describe: "The option compatible with postcss's `--config`.",
58
+ })
59
+ .option('cache', {
60
+ type: 'boolean',
61
+ default: true,
62
+ describe: 'Only generate .d.ts and .d.ts.map for changed files.',
63
+ })
64
+ .option('cacheStrategy', {
65
+ choices: ['content', 'metadata'] as const,
66
+ // NOTE: This is a workaround for `parsedArgv.cacheStrategy` type breaks.
67
+ default: 'content' as RunnerOptions['cacheStrategy'],
68
+ describe: 'Strategy for the cache to use for detecting changed files.',
69
+ })
55
70
  .option('silent', {
56
71
  type: 'boolean',
57
72
  default: false,
@@ -64,18 +79,35 @@ export function parseArgv(argv: string[]): RunnerOptions {
64
79
  const patterns = argv._;
65
80
  // TODO: support multiple patterns
66
81
  if (patterns.length !== 1) throw new Error('Only one pattern is allowed.');
82
+ if (argv.webpackResolveAlias) {
83
+ let parsedWebpackResolveAlias: unknown;
84
+ try {
85
+ parsedWebpackResolveAlias = JSON.parse(argv.webpackResolveAlias);
86
+ } catch (e) {
87
+ throw new Error('--webpackResolveAlias must be a valid JSON string.');
88
+ }
89
+ if (typeof parsedWebpackResolveAlias !== 'object' || parsedWebpackResolveAlias === null)
90
+ throw new Error('--webpackResolveAlias must be an object');
91
+ if (!Object.keys(parsedWebpackResolveAlias).every((key) => typeof key === 'string'))
92
+ throw new Error('--webpackResolveAlias must be an object of string keys');
93
+ if (!Object.values(parsedWebpackResolveAlias).every((value) => typeof value === 'string'))
94
+ throw new Error('--webpackResolveAlias must be an object of string values');
95
+ }
67
96
  return true;
68
97
  })
69
98
  .parseSync();
70
99
  const patterns: string[] = parsedArgv._.map((pattern) => pattern.toString());
71
100
  return {
72
101
  pattern: patterns[0]!,
73
- outDir: parsedArgv.outDir,
74
102
  watch: parsedArgv.watch,
75
103
  localsConvention: parsedArgv.localsConvention,
76
104
  declarationMap: parsedArgv.declarationMap,
77
105
  sassLoadPaths: parsedArgv.sassLoadPaths?.map((item) => item.toString()),
78
106
  lessIncludePaths: parsedArgv.lessIncludePaths?.map((item) => item.toString()),
107
+ webpackResolveAlias: parsedArgv.webpackResolveAlias ? JSON.parse(parsedArgv.webpackResolveAlias) : undefined,
108
+ postcssConfig: parsedArgv.postcssConfig,
109
+ cache: parsedArgv.cache,
110
+ cacheStrategy: parsedArgv.cacheStrategy,
79
111
  silent: parsedArgv.silent,
80
112
  };
81
113
  }