happy-css-modules 3.1.0 → 3.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 (138) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.js +127 -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 +15 -0
  11. package/dist/emitter/dts.js +134 -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 +206 -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 +42 -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 +76 -0
  27. package/dist/emitter/index.test.js.map +1 -0
  28. package/dist/emitter/source-map.d.ts +10 -0
  29. package/dist/emitter/source-map.js +17 -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/locator/index.d.ts +46 -0
  41. package/dist/locator/index.js +173 -0
  42. package/dist/locator/index.js.map +1 -0
  43. package/dist/locator/index.test.d.ts +1 -0
  44. package/dist/locator/index.test.js +393 -0
  45. package/dist/locator/index.test.js.map +1 -0
  46. package/dist/locator/postcss.d.ts +91 -0
  47. package/dist/locator/postcss.js +241 -0
  48. package/dist/locator/postcss.js.map +1 -0
  49. package/dist/locator/postcss.test.d.ts +1 -0
  50. package/dist/locator/postcss.test.js +256 -0
  51. package/dist/locator/postcss.test.js.map +1 -0
  52. package/dist/logger.d.ts +9 -0
  53. package/dist/logger.js +28 -0
  54. package/dist/logger.js.map +1 -0
  55. package/dist/regression-test/issue-168.test.d.ts +1 -0
  56. package/dist/regression-test/issue-168.test.js +30 -0
  57. package/dist/regression-test/issue-168.test.js.map +1 -0
  58. package/dist/resolver/index.d.ts +22 -0
  59. package/dist/resolver/index.js +44 -0
  60. package/dist/resolver/index.js.map +1 -0
  61. package/dist/resolver/index.test.d.ts +1 -0
  62. package/dist/resolver/index.test.js +16 -0
  63. package/dist/resolver/index.test.js.map +1 -0
  64. package/dist/resolver/node-resolver.d.ts +2 -0
  65. package/dist/resolver/node-resolver.js +6 -0
  66. package/dist/resolver/node-resolver.js.map +1 -0
  67. package/dist/resolver/node-resolver.test.d.ts +1 -0
  68. package/dist/resolver/node-resolver.test.js +25 -0
  69. package/dist/resolver/node-resolver.test.js.map +1 -0
  70. package/dist/resolver/relative-resolver.d.ts +2 -0
  71. package/dist/resolver/relative-resolver.js +5 -0
  72. package/dist/resolver/relative-resolver.js.map +1 -0
  73. package/dist/resolver/relative-resolver.test.d.ts +1 -0
  74. package/dist/resolver/relative-resolver.test.js +12 -0
  75. package/dist/resolver/relative-resolver.test.js.map +1 -0
  76. package/dist/resolver/webpack-resolver.d.ts +24 -0
  77. package/dist/resolver/webpack-resolver.js +91 -0
  78. package/dist/resolver/webpack-resolver.js.map +1 -0
  79. package/dist/resolver/webpack-resolver.test.d.ts +1 -0
  80. package/dist/resolver/webpack-resolver.test.js +89 -0
  81. package/dist/resolver/webpack-resolver.test.js.map +1 -0
  82. package/dist/runner.d.ts +78 -0
  83. package/dist/runner.js +122 -0
  84. package/dist/runner.js.map +1 -0
  85. package/dist/runner.test.d.ts +1 -0
  86. package/dist/runner.test.js +304 -0
  87. package/dist/runner.test.js.map +1 -0
  88. package/dist/test-util/jest/resolver.cjs +31 -0
  89. package/dist/test-util/jest/resolver.cjs.map +1 -0
  90. package/dist/test-util/jest/resolver.d.cts +16 -0
  91. package/dist/test-util/tsserver.d.ts +31 -0
  92. package/dist/test-util/tsserver.js +112 -0
  93. package/dist/test-util/tsserver.js.map +1 -0
  94. package/dist/test-util/util.d.ts +29 -0
  95. package/dist/test-util/util.js +85 -0
  96. package/dist/test-util/util.js.map +1 -0
  97. package/dist/transformer/index.d.ts +30 -0
  98. package/dist/transformer/index.js +25 -0
  99. package/dist/transformer/index.js.map +1 -0
  100. package/dist/transformer/index.test.d.ts +1 -0
  101. package/dist/transformer/index.test.js +66 -0
  102. package/dist/transformer/index.test.js.map +1 -0
  103. package/dist/transformer/less-transformer.d.ts +2 -0
  104. package/dist/transformer/less-transformer.js +45 -0
  105. package/dist/transformer/less-transformer.js.map +1 -0
  106. package/dist/transformer/less-transformer.test.d.ts +1 -0
  107. package/dist/transformer/less-transformer.test.js +134 -0
  108. package/dist/transformer/less-transformer.test.js.map +1 -0
  109. package/dist/transformer/postcss-transformer.d.ts +12 -0
  110. package/dist/transformer/postcss-transformer.js +32 -0
  111. package/dist/transformer/postcss-transformer.js.map +1 -0
  112. package/dist/transformer/postcss-transformer.test.d.ts +1 -0
  113. package/dist/transformer/postcss-transformer.test.js +178 -0
  114. package/dist/transformer/postcss-transformer.test.js.map +1 -0
  115. package/dist/transformer/scss-transformer.d.ts +2 -0
  116. package/dist/transformer/scss-transformer.js +40 -0
  117. package/dist/transformer/scss-transformer.js.map +1 -0
  118. package/dist/transformer/scss-transformer.test.d.ts +1 -0
  119. package/dist/transformer/scss-transformer.test.js +149 -0
  120. package/dist/transformer/scss-transformer.test.js.map +1 -0
  121. package/dist/util.d.ts +21 -0
  122. package/dist/util.js +72 -0
  123. package/dist/util.js.map +1 -0
  124. package/dist/util.test.d.ts +1 -0
  125. package/dist/util.test.js +74 -0
  126. package/dist/util.test.js.map +1 -0
  127. package/package.json +1 -1
  128. package/src/cli.ts +6 -0
  129. package/src/emitter/dts.test.ts +7 -4
  130. package/src/emitter/dts.ts +22 -10
  131. package/src/emitter/index.test.ts +10 -0
  132. package/src/emitter/index.ts +17 -4
  133. package/src/emitter/source-map.test.ts +4 -4
  134. package/src/emitter/source-map.ts +8 -2
  135. package/src/runner.test.ts +23 -0
  136. package/src/runner.ts +6 -0
  137. package/src/library/README.md +0 -3
  138. package/src/library/source-map/index.ts +0 -26
@@ -0,0 +1,241 @@
1
+ import postcss from 'postcss';
2
+ import modules from 'postcss-modules';
3
+ import selectorParser from 'postcss-selector-parser';
4
+ import valueParser from 'postcss-value-parser';
5
+ /**
6
+ * Traverses a local token from the AST and returns its name.
7
+ * @param ast The AST to traverse.
8
+ * @returns The name of the local token.
9
+ */
10
+ export async function generateLocalTokenNames(ast) {
11
+ class EmptyLoader {
12
+ async fetch(_file, _relativeTo, _depTrace) {
13
+ // Return an empty object because we do not want to load external tokens in `generateLocalTokenNames`.
14
+ return Promise.resolve({});
15
+ }
16
+ }
17
+ return new Promise((resolve, reject) => {
18
+ postcss
19
+ .default()
20
+ .use(modules({
21
+ // `@import`, `@value`, and `composes` can read tokens from external files.
22
+ // However, we want to collect only local tokens. So we will fake that
23
+ // an empty token is exported from the external file.
24
+ Loader: EmptyLoader,
25
+ getJSON: (_cssFileName, json) => {
26
+ resolve(Object.keys(json));
27
+ },
28
+ }))
29
+ // NOTE: `process` modifies ast, so clone it.
30
+ .process(ast.clone())
31
+ .catch(reject);
32
+ });
33
+ }
34
+ /**
35
+ * Get the original location of the class selector.
36
+ * @param rule The rule node that contains the token.
37
+ * @param classSelector The class selector node that contains the token.
38
+ * @returns The original location of the class selector.
39
+ */
40
+ export function getOriginalLocationOfClassSelector(rule, classSelector) {
41
+ // The node derived from `postcss.parse` always has `source` property. Therefore, this line is unreachable.
42
+ if (rule.source === undefined || classSelector.source === undefined)
43
+ throw new Error('Node#source is undefined');
44
+ // The node derived from `postcss.parse` always has `start` and `end` property. Therefore, this line is unreachable.
45
+ if (rule.source.start === undefined || classSelector.source.start === undefined)
46
+ throw new Error('Node#start is undefined');
47
+ if (rule.source.end === undefined || classSelector.source.end === undefined)
48
+ throw new Error('Node#end is undefined');
49
+ if (rule.source.input.file === undefined)
50
+ throw new Error('Node#input.file is undefined');
51
+ const classSelectorStartPosition = {
52
+ // The line is 1-based.
53
+ line: rule.source.start.line + (classSelector.source.start.line - 1),
54
+ // The column is 1-based.
55
+ column: rule.source.start.column + (classSelector.source.start.column - 1),
56
+ };
57
+ const classSelectorEndPosition = {
58
+ line: classSelectorStartPosition.line,
59
+ // The column is inclusive.
60
+ column: classSelectorStartPosition.column + classSelector.value.length,
61
+ };
62
+ const classSelectorLocation = {
63
+ filePath: rule.source.input.file,
64
+ start: classSelectorStartPosition,
65
+ end: classSelectorEndPosition,
66
+ };
67
+ if (!rule.source.input.map)
68
+ return classSelectorLocation;
69
+ const classSelectorOrigin = rule.source.input.origin(classSelectorLocation.start.line,
70
+ // The column of `Input#origin` is 0-based. This behavior is undocumented and probably a postcss's bug.
71
+ // TODO: Open PR to postcss/postcss
72
+ classSelectorLocation.start.column - 1);
73
+ if (classSelectorOrigin === false || classSelectorOrigin.file === undefined) {
74
+ return { filePath: undefined, start: undefined, end: undefined };
75
+ }
76
+ return {
77
+ filePath: classSelectorOrigin.file,
78
+ start: {
79
+ line: classSelectorOrigin.line,
80
+ column: classSelectorOrigin.column + 1,
81
+ },
82
+ end: {
83
+ line: classSelectorOrigin.line,
84
+ column: classSelectorOrigin.column + classSelector.value.length + 1,
85
+ },
86
+ };
87
+ }
88
+ /**
89
+ * Get the original location of `@value`.
90
+ * @param atValue The `@value` rule.
91
+ * @returns The location of the `@value` rule.
92
+ */
93
+ export function getOriginalLocationOfAtValue(atValue, valueDeclaration) {
94
+ // The node derived from `postcss.parse` always has `source` property. Therefore, this line is unreachable.
95
+ if (atValue.source === undefined)
96
+ throw new Error('Node#source is undefined');
97
+ // The node derived from `postcss.parse` always has `start` and `end` property. Therefore, this line is unreachable.
98
+ if (atValue.source.start === undefined)
99
+ throw new Error('Node#start is undefined');
100
+ if (atValue.source.end === undefined)
101
+ throw new Error('Node#end is undefined');
102
+ if (atValue.source.input.file === undefined)
103
+ throw new Error('Node#input.file is undefined');
104
+ return {
105
+ filePath: atValue.source.input.file,
106
+ start: {
107
+ line: atValue.source.start.line,
108
+ column: atValue.source.start.column + 7, // Add for `@value `
109
+ },
110
+ end: {
111
+ line: atValue.source.start.line,
112
+ column: atValue.source.start.column + 7 + valueDeclaration.tokenName.length, // Add for `@value ` and token name
113
+ },
114
+ };
115
+ }
116
+ function isAtRuleNode(node) {
117
+ return node.type === 'atrule';
118
+ }
119
+ function isAtImportNode(node) {
120
+ return isAtRuleNode(node) && node.name === 'import';
121
+ }
122
+ function isAtValueNode(node) {
123
+ return isAtRuleNode(node) && node.name === 'value';
124
+ }
125
+ function isRuleNode(node) {
126
+ return node.type === 'rule';
127
+ }
128
+ /**
129
+ * Collect nodes from the AST.
130
+ * @param ast The AST.
131
+ */
132
+ export function collectNodes(ast) {
133
+ const atImports = [];
134
+ const atValues = [];
135
+ const classSelectors = [];
136
+ ast.walk((node) => {
137
+ if (isAtImportNode(node)) {
138
+ atImports.push(node);
139
+ }
140
+ else if (isAtValueNode(node)) {
141
+ atValues.push(node);
142
+ }
143
+ else if (isRuleNode(node)) {
144
+ // In `rule.selector` comes the following string:
145
+ // 1. ".foo"
146
+ // 2. ".foo:hover"
147
+ // 3. ".foo, .bar"
148
+ selectorParser((selectors) => {
149
+ selectors.walk((selector) => {
150
+ if (selector.type === 'class') {
151
+ // In `selector.value` comes the following string:
152
+ // 1. "foo"
153
+ // 2. "bar"
154
+ classSelectors.push({ rule: node, classSelector: selector });
155
+ }
156
+ });
157
+ }).processSync(node);
158
+ }
159
+ });
160
+ return { atImports, atValues, classSelectors };
161
+ }
162
+ /**
163
+ * Parse the `@import` rule.
164
+ * @param atImport The `@import` rule to parse.
165
+ * @returns The imported sheet path.
166
+ */
167
+ export function parseAtImport(atImport) {
168
+ const firstNode = valueParser(atImport.params).nodes[0];
169
+ if (firstNode === undefined)
170
+ return undefined;
171
+ if (firstNode.type === 'string')
172
+ return firstNode.value;
173
+ if (firstNode.type === 'function' && firstNode.value === 'url') {
174
+ if (firstNode.nodes[0] === undefined)
175
+ return undefined;
176
+ if (firstNode.nodes[0].type === 'string')
177
+ return firstNode.nodes[0].value;
178
+ if (firstNode.nodes[0].type === 'word')
179
+ return firstNode.nodes[0].value;
180
+ }
181
+ return undefined;
182
+ }
183
+ const matchImports = /^(.+?|\([\s\S]+?\))\s+from\s+("[^"]*"|'[^']*'|[\w-]+)$/u;
184
+ const matchValueDefinition = /(?:\s+|^)([\w-]+):?(.*?)$/u;
185
+ const matchImport = /^([\w-]+)(?:\s+as\s+([\w-]+))?/u;
186
+ /**
187
+ * Parse the `@value` rule.
188
+ * Forked from https://github.com/css-modules/postcss-modules-values/blob/v4.0.0/src/index.js.
189
+ *
190
+ * @license
191
+ * ISC License (ISC)
192
+ * Copyright (c) 2015, Glen Maddern
193
+ *
194
+ * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,
195
+ * provided that the above copyright notice and this permission notice appear in all copies.
196
+ *
197
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING
198
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
199
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
200
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
201
+ * THE USE OR PERFORMANCE OF THIS SOFTWARE.
202
+ */
203
+ export function parseAtValue(atValue) {
204
+ const matchesForImports = atValue.params.match(matchImports);
205
+ if (matchesForImports) {
206
+ const [, aliases, path] = matchesForImports;
207
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
208
+ if (aliases === undefined || path === undefined)
209
+ throw new Error(`unreachable`);
210
+ const imports = aliases
211
+ .replace(/^\(\s*([\s\S]+)\s*\)$/u, '$1')
212
+ .split(/\s*,\s*/u)
213
+ .map((alias) => {
214
+ const tokens = matchImport.exec(alias);
215
+ if (tokens) {
216
+ const [, theirName, myName] = tokens;
217
+ if (theirName === undefined)
218
+ throw new Error(`unreachable`);
219
+ return { importedTokenName: theirName, localTokenName: myName ?? theirName };
220
+ }
221
+ else {
222
+ throw new Error(`@import statement "${alias}" is invalid!`);
223
+ }
224
+ });
225
+ // Remove quotes from the path.
226
+ // NOTE: This is a restriction unique to "happy-css-modules" and not a specification of CSS Modules.
227
+ const normalizedPath = path.replace(/^['"]|['"]$/gu, '');
228
+ return { type: 'valueImportDeclaration', imports, from: normalizedPath };
229
+ }
230
+ const matchesForValueDefinitions = `${atValue.params}${atValue.raws.between}`.match(matchValueDefinition);
231
+ if (matchesForValueDefinitions) {
232
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
233
+ const [, key, value] = matchesForValueDefinitions;
234
+ if (key === undefined)
235
+ throw new Error(`unreachable`);
236
+ return { type: 'valueDeclaration', tokenName: key };
237
+ }
238
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
239
+ throw new Error(`@value statement "${atValue.source}" is invalid!`);
240
+ }
241
+ //# sourceMappingURL=postcss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postcss.js","sourceRoot":"","sources":["../../src/locator/postcss.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,256 @@
1
+ import dedent from 'dedent';
2
+ import { createRoot, createClassSelectors, createAtImports, createFixtures, createAtValues, } from '../test-util/util.js';
3
+ import { generateLocalTokenNames, getOriginalLocationOfClassSelector, parseAtImport, parseAtValue, collectNodes, getOriginalLocationOfAtValue, } from './postcss.js';
4
+ describe('generateLocalTokenNames', () => {
5
+ test('basic', async () => {
6
+ expect(await generateLocalTokenNames(createRoot(`
7
+ .basic {}
8
+ .cascading {}
9
+ .cascading {}
10
+ .pseudo_class_1 {}
11
+ .pseudo_class_2:hover {}
12
+ :not(.pseudo_class_3) {}
13
+ .multiple_selector_1.multiple_selector_2 {}
14
+ .combinator_1 + .combinator_2 {}
15
+ @supports (display: flex) {
16
+ @media screen and (min-width: 900px) {
17
+ .at_rule {}
18
+ }
19
+ }
20
+ .selector_list_1, .selector_list_2 {}
21
+ :local .local_class_name_1 {}
22
+ :local {
23
+ .local_class_name_2 {}
24
+ .local_class_name_3 {}
25
+ }
26
+ :local(.local_class_name_4) {}
27
+ @value value: #BF4040;
28
+ `))).toStrictEqual([
29
+ 'value',
30
+ 'basic',
31
+ 'cascading',
32
+ 'pseudo_class_1',
33
+ 'pseudo_class_2',
34
+ 'pseudo_class_3',
35
+ 'multiple_selector_1',
36
+ 'multiple_selector_2',
37
+ 'combinator_1',
38
+ 'combinator_2',
39
+ 'at_rule',
40
+ 'selector_list_1',
41
+ 'selector_list_2',
42
+ 'local_class_name_1',
43
+ 'local_class_name_2',
44
+ 'local_class_name_3',
45
+ 'local_class_name_4',
46
+ ]);
47
+ });
48
+ test('does not track styles imported by @import in other file because it is not a local token', async () => {
49
+ createFixtures({
50
+ '/test/1.css': dedent `
51
+ .a {}
52
+ `,
53
+ });
54
+ expect(await generateLocalTokenNames(createRoot(`
55
+ @import "/test/1.css";
56
+ `))).toStrictEqual([]);
57
+ });
58
+ test('does not track styles imported by @value in other file because it is not a local token', async () => {
59
+ createFixtures({
60
+ '/test/1.css': dedent `
61
+ .a {}
62
+ `,
63
+ });
64
+ expect(await generateLocalTokenNames(createRoot(`
65
+ @value a from "/test/1.css";
66
+ `))).toStrictEqual(['a']);
67
+ });
68
+ test('does not track styles imported by composes in other file because it is not a local token', async () => {
69
+ createFixtures({
70
+ '/test/1.css': dedent `
71
+ .b {}
72
+ `,
73
+ });
74
+ expect(await generateLocalTokenNames(createRoot(`
75
+ .a {
76
+ composes: b from "/test/1.css";
77
+ }
78
+ `))).toStrictEqual(['a']);
79
+ });
80
+ });
81
+ describe('getOriginalLocationOfClassSelector', () => {
82
+ test('basic', () => {
83
+ const [basic] = createClassSelectors(createRoot(dedent `
84
+ .basic {}
85
+ `));
86
+ expect(getOriginalLocationOfClassSelector(basic.rule, basic.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 6 } }`);
87
+ });
88
+ test('cascading', () => {
89
+ // eslint-disable-next-line @typescript-eslint/naming-convention
90
+ const [cascading_1, cascading_2] = createClassSelectors(createRoot(dedent `
91
+ .cascading {}
92
+ .cascading {}
93
+ `));
94
+ expect(getOriginalLocationOfClassSelector(cascading_1.rule, cascading_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 10 } }`);
95
+ expect(getOriginalLocationOfClassSelector(cascading_2.rule, cascading_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 10 } }`);
96
+ });
97
+ test('pseudo_class', () => {
98
+ // eslint-disable-next-line @typescript-eslint/naming-convention
99
+ const [pseudo_class_1, pseudo_class_2, pseudo_class_3] = createClassSelectors(createRoot(dedent `
100
+ .pseudo_class_1 {}
101
+ .pseudo_class_2:hover {}
102
+ :not(.pseudo_class_3) {}
103
+ `));
104
+ expect(getOriginalLocationOfClassSelector(pseudo_class_1.rule, pseudo_class_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 15 } }`);
105
+ expect(getOriginalLocationOfClassSelector(pseudo_class_2.rule, pseudo_class_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 15 } }`);
106
+ expect(getOriginalLocationOfClassSelector(pseudo_class_3.rule, pseudo_class_3.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 3, column: 6 }, end: { line: 3, column: 20 } }`);
107
+ });
108
+ test('multiple_selector', () => {
109
+ // eslint-disable-next-line @typescript-eslint/naming-convention
110
+ const [multiple_selector_1, multiple_selector_2] = createClassSelectors(createRoot(dedent `
111
+ .multiple_selector_1.multiple_selector_2 {}
112
+ `));
113
+ expect(getOriginalLocationOfClassSelector(multiple_selector_1.rule, multiple_selector_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 20 } }`);
114
+ expect(getOriginalLocationOfClassSelector(multiple_selector_2.rule, multiple_selector_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 21 }, end: { line: 1, column: 40 } }`);
115
+ });
116
+ test('combinator', () => {
117
+ // eslint-disable-next-line @typescript-eslint/naming-convention
118
+ const [combinator_1, combinator_2] = createClassSelectors(createRoot(dedent `
119
+ .combinator_1 + .combinator_2 {}
120
+ `));
121
+ expect(getOriginalLocationOfClassSelector(combinator_1.rule, combinator_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 13 } }`);
122
+ expect(getOriginalLocationOfClassSelector(combinator_2.rule, combinator_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 17 }, end: { line: 1, column: 29 } }`);
123
+ });
124
+ test('at_rule', () => {
125
+ // eslint-disable-next-line @typescript-eslint/naming-convention
126
+ const [at_rule] = createClassSelectors(createRoot(dedent `
127
+ @supports (display: flex) {
128
+ @media screen and (min-width: 900px) {
129
+ .at_rule {}
130
+ }
131
+ }
132
+ `));
133
+ expect(getOriginalLocationOfClassSelector(at_rule.rule, at_rule.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 3, column: 5 }, end: { line: 3, column: 12 } }`);
134
+ });
135
+ test('selector_list', () => {
136
+ // eslint-disable-next-line @typescript-eslint/naming-convention
137
+ const [selector_list_1, selector_list_2] = createClassSelectors(createRoot(dedent `
138
+ .selector_list_1, .selector_list_2 {}
139
+ `));
140
+ expect(getOriginalLocationOfClassSelector(selector_list_1.rule, selector_list_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 16 } }`);
141
+ expect(getOriginalLocationOfClassSelector(selector_list_2.rule, selector_list_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 19 }, end: { line: 1, column: 34 } }`);
142
+ });
143
+ test('local_class_name', () => {
144
+ // eslint-disable-next-line @typescript-eslint/naming-convention
145
+ const [local_class_name_1, local_class_name_2, local_class_name_3, local_class_name_4] = createClassSelectors(createRoot(dedent `
146
+ :local .local_class_name_1 {}
147
+ :local {
148
+ .local_class_name_2 {}
149
+ .local_class_name_3 {}
150
+ }
151
+ :local(.local_class_name_4) {}
152
+ `));
153
+ expect(getOriginalLocationOfClassSelector(local_class_name_1.rule, local_class_name_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 8 }, end: { line: 1, column: 26 } }`);
154
+ expect(getOriginalLocationOfClassSelector(local_class_name_2.rule, local_class_name_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 3, column: 3 }, end: { line: 3, column: 21 } }`);
155
+ expect(getOriginalLocationOfClassSelector(local_class_name_3.rule, local_class_name_3.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 4, column: 3 }, end: { line: 4, column: 21 } }`);
156
+ expect(getOriginalLocationOfClassSelector(local_class_name_4.rule, local_class_name_4.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 6, column: 8 }, end: { line: 6, column: 26 } }`);
157
+ });
158
+ test('with_newline', () => {
159
+ // eslint-disable-next-line @typescript-eslint/naming-convention
160
+ const [with_newline_1, with_newline_2, with_newline_3] = createClassSelectors(createRoot(dedent `
161
+ .with_newline_1,
162
+ .with_newline_2
163
+ + .with_newline_3, {}
164
+ `));
165
+ expect(getOriginalLocationOfClassSelector(with_newline_1.rule, with_newline_1.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 15 } }`);
166
+ expect(getOriginalLocationOfClassSelector(with_newline_2.rule, with_newline_2.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 15 } }`);
167
+ expect(getOriginalLocationOfClassSelector(with_newline_3.rule, with_newline_3.classSelector)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 3, column: 5 }, end: { line: 3, column: 19 } }`);
168
+ });
169
+ });
170
+ test('getOriginalLocationOfAtValue', () => {
171
+ function tryGetOriginalLocationOfAtValue(atValue) {
172
+ const parsed = parseAtValue(atValue);
173
+ if (parsed.type === 'valueDeclaration') {
174
+ return getOriginalLocationOfAtValue(atValue, parsed);
175
+ }
176
+ else {
177
+ throw new Error('Unexpected type');
178
+ }
179
+ }
180
+ const [basic] = createAtValues(createRoot(dedent `
181
+ @value basic: #000;
182
+ `));
183
+ expect(tryGetOriginalLocationOfAtValue(basic)).toMatchInlineSnapshot(`{ filePath: "/test/test.css", start: { line: 1, column: 8 }, end: { line: 1, column: 13 } }`);
184
+ });
185
+ test('collectNodes', () => {
186
+ const ast = createRoot(dedent `
187
+ @import;
188
+ @import "test.css";
189
+ @ignored;
190
+ .a { ignored: "ignored"; }
191
+ .b { ignored: "ignored"; }
192
+ `);
193
+ const { atImports, classSelectors } = collectNodes(ast);
194
+ expect(atImports).toHaveLength(2);
195
+ expect(atImports[0].toString()).toEqual('@import');
196
+ expect(atImports[1].toString()).toEqual('@import "test.css"');
197
+ expect(classSelectors).toHaveLength(2);
198
+ expect(classSelectors[0].rule.toString()).toEqual('.a { ignored: "ignored"; }');
199
+ expect(classSelectors[0].classSelector.toString()).toEqual('.a');
200
+ expect(classSelectors[1].rule.toString()).toEqual('.b { ignored: "ignored"; }');
201
+ expect(classSelectors[1].classSelector.toString()).toEqual('.b');
202
+ });
203
+ test('parseAtImport', () => {
204
+ const atImports = createAtImports(createRoot(dedent `
205
+ @import;
206
+ @import "test.css";
207
+ @import url("test.css");
208
+ @import url(test.css);
209
+ @import "test.css" print;
210
+ `));
211
+ expect(parseAtImport(atImports[0])).toBe(undefined);
212
+ expect(parseAtImport(atImports[1])).toBe('test.css');
213
+ expect(parseAtImport(atImports[2])).toBe('test.css');
214
+ expect(parseAtImport(atImports[3])).toBe('test.css');
215
+ expect(parseAtImport(atImports[4])).toBe('test.css');
216
+ });
217
+ test('parseAtValue', () => {
218
+ const atValues = createAtValues(createRoot(dedent `
219
+ @value basic: #000;
220
+ @value withoutColon #000;
221
+ @value empty:;
222
+ @value comment:/* comment */;
223
+ @value complex: (max-width: 599px);
224
+ @value import from "test.css";
225
+ @value import1, import2 from "test.css";
226
+ @value import as alias from "test.css";
227
+ /*
228
+ * NOTE: happy-css-modules intentionally does not support module specifier as variable.
229
+ * e.g. \`@value d, e from moduleName;\`
230
+ */
231
+ `));
232
+ expect(parseAtValue(atValues[0])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'basic' });
233
+ expect(parseAtValue(atValues[1])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'withoutColon' });
234
+ expect(parseAtValue(atValues[2])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'empty' });
235
+ expect(parseAtValue(atValues[3])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'comment' });
236
+ expect(parseAtValue(atValues[4])).toStrictEqual({ type: 'valueDeclaration', tokenName: 'complex' });
237
+ expect(parseAtValue(atValues[5])).toStrictEqual({
238
+ type: 'valueImportDeclaration',
239
+ imports: [{ importedTokenName: 'import', localTokenName: 'import' }],
240
+ from: 'test.css',
241
+ });
242
+ expect(parseAtValue(atValues[6])).toStrictEqual({
243
+ type: 'valueImportDeclaration',
244
+ imports: [
245
+ { importedTokenName: 'import1', localTokenName: 'import1' },
246
+ { importedTokenName: 'import2', localTokenName: 'import2' },
247
+ ],
248
+ from: 'test.css',
249
+ });
250
+ expect(parseAtValue(atValues[7])).toStrictEqual({
251
+ type: 'valueImportDeclaration',
252
+ imports: [{ importedTokenName: 'import', localTokenName: 'alias' }],
253
+ from: 'test.css',
254
+ });
255
+ });
256
+ //# sourceMappingURL=postcss.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postcss.test.js","sourceRoot":"","sources":["../../src/locator/postcss.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type LogLevelLabel = 'debug' | 'info' | 'silent';
2
+ export declare class Logger {
3
+ private logLevel;
4
+ constructor(logLevelLabel: LogLevelLabel);
5
+ debug(message: unknown): void;
6
+ info(message: unknown): void;
7
+ error(message: unknown): void;
8
+ }
9
+ export {};
package/dist/logger.js ADDED
@@ -0,0 +1,28 @@
1
+ import chalk from 'chalk';
2
+ const LOG_LEVEL = {
3
+ debug: 2,
4
+ info: 1,
5
+ silent: 0,
6
+ };
7
+ export class Logger {
8
+ constructor(logLevelLabel) {
9
+ this.logLevel = LOG_LEVEL[logLevelLabel];
10
+ }
11
+ debug(message) {
12
+ if (this.logLevel >= LOG_LEVEL['debug']) {
13
+ // eslint-disable-next-line no-console
14
+ console.log('[debug]', message);
15
+ }
16
+ }
17
+ info(message) {
18
+ if (this.logLevel >= LOG_LEVEL['info']) {
19
+ // eslint-disable-next-line no-console
20
+ console.log(chalk.blue('[info]'), message);
21
+ }
22
+ }
23
+ error(message) {
24
+ // eslint-disable-next-line no-console
25
+ console.error(chalk.red('[error]'), message);
26
+ }
27
+ }
28
+ //# sourceMappingURL=logger.js.map
@@ -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;