happy-css-modules 3.0.1 → 3.1.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 (141) hide show
  1. package/package.json +1 -1
  2. package/src/emitter/dts.test.ts +3 -3
  3. package/src/emitter/dts.ts +59 -37
  4. package/src/emitter/index.test.ts +3 -3
  5. package/src/locator/index.test.ts +143 -48
  6. package/src/locator/index.ts +51 -23
  7. package/src/locator/postcss.test.ts +135 -26
  8. package/src/locator/postcss.ts +120 -36
  9. package/src/test-util/util.ts +23 -18
  10. package/src/transformer/less-transformer.test.ts +25 -15
  11. package/src/transformer/postcss-transformer.test.ts +5 -3
  12. package/src/transformer/scss-transformer.test.ts +38 -19
  13. package/dist/cli.d.ts +0 -6
  14. package/dist/cli.js +0 -121
  15. package/dist/cli.js.map +0 -1
  16. package/dist/cli.test.d.ts +0 -1
  17. package/dist/cli.test.js +0 -66
  18. package/dist/cli.test.js.map +0 -1
  19. package/dist/config.d.ts +0 -1
  20. package/dist/config.js +0 -2
  21. package/dist/config.js.map +0 -1
  22. package/dist/emitter/dts.d.ts +0 -14
  23. package/dist/emitter/dts.js +0 -111
  24. package/dist/emitter/dts.js.map +0 -1
  25. package/dist/emitter/dts.test.d.ts +0 -1
  26. package/dist/emitter/dts.test.js +0 -205
  27. package/dist/emitter/dts.test.js.map +0 -1
  28. package/dist/emitter/file-system.d.ts +0 -6
  29. package/dist/emitter/file-system.js +0 -26
  30. package/dist/emitter/file-system.js.map +0 -1
  31. package/dist/emitter/file-system.test.d.ts +0 -1
  32. package/dist/emitter/file-system.test.js +0 -34
  33. package/dist/emitter/file-system.test.js.map +0 -1
  34. package/dist/emitter/index.d.ts +0 -34
  35. package/dist/emitter/index.js +0 -49
  36. package/dist/emitter/index.js.map +0 -1
  37. package/dist/emitter/index.test.d.ts +0 -1
  38. package/dist/emitter/index.test.js +0 -68
  39. package/dist/emitter/index.test.js.map +0 -1
  40. package/dist/emitter/source-map.d.ts +0 -8
  41. package/dist/emitter/source-map.js +0 -16
  42. package/dist/emitter/source-map.js.map +0 -1
  43. package/dist/emitter/source-map.test.d.ts +0 -1
  44. package/dist/emitter/source-map.test.js +0 -13
  45. package/dist/emitter/source-map.test.js.map +0 -1
  46. package/dist/index.d.ts +0 -5
  47. package/dist/index.js +0 -6
  48. package/dist/index.js.map +0 -1
  49. package/dist/integration-test/go-to-definition.test.d.ts +0 -1
  50. package/dist/integration-test/go-to-definition.test.js +0 -334
  51. package/dist/integration-test/go-to-definition.test.js.map +0 -1
  52. package/dist/library/source-map/index.d.ts +0 -8
  53. package/dist/library/source-map/index.js +0 -5
  54. package/dist/library/source-map/index.js.map +0 -1
  55. package/dist/locator/index.d.ts +0 -44
  56. package/dist/locator/index.js +0 -147
  57. package/dist/locator/index.js.map +0 -1
  58. package/dist/locator/index.test.d.ts +0 -1
  59. package/dist/locator/index.test.js +0 -299
  60. package/dist/locator/index.test.js.map +0 -1
  61. package/dist/locator/postcss.d.ts +0 -53
  62. package/dist/locator/postcss.js +0 -169
  63. package/dist/locator/postcss.js.map +0 -1
  64. package/dist/locator/postcss.test.d.ts +0 -1
  65. package/dist/locator/postcss.test.js +0 -196
  66. package/dist/locator/postcss.test.js.map +0 -1
  67. package/dist/logger.d.ts +0 -9
  68. package/dist/logger.js +0 -28
  69. package/dist/logger.js.map +0 -1
  70. package/dist/regression-test/issue-168.test.d.ts +0 -1
  71. package/dist/regression-test/issue-168.test.js +0 -30
  72. package/dist/regression-test/issue-168.test.js.map +0 -1
  73. package/dist/resolver/index.d.ts +0 -22
  74. package/dist/resolver/index.js +0 -44
  75. package/dist/resolver/index.js.map +0 -1
  76. package/dist/resolver/index.test.d.ts +0 -1
  77. package/dist/resolver/index.test.js +0 -16
  78. package/dist/resolver/index.test.js.map +0 -1
  79. package/dist/resolver/node-resolver.d.ts +0 -2
  80. package/dist/resolver/node-resolver.js +0 -6
  81. package/dist/resolver/node-resolver.js.map +0 -1
  82. package/dist/resolver/node-resolver.test.d.ts +0 -1
  83. package/dist/resolver/node-resolver.test.js +0 -25
  84. package/dist/resolver/node-resolver.test.js.map +0 -1
  85. package/dist/resolver/relative-resolver.d.ts +0 -2
  86. package/dist/resolver/relative-resolver.js +0 -5
  87. package/dist/resolver/relative-resolver.js.map +0 -1
  88. package/dist/resolver/relative-resolver.test.d.ts +0 -1
  89. package/dist/resolver/relative-resolver.test.js +0 -12
  90. package/dist/resolver/relative-resolver.test.js.map +0 -1
  91. package/dist/resolver/webpack-resolver.d.ts +0 -24
  92. package/dist/resolver/webpack-resolver.js +0 -91
  93. package/dist/resolver/webpack-resolver.js.map +0 -1
  94. package/dist/resolver/webpack-resolver.test.d.ts +0 -1
  95. package/dist/resolver/webpack-resolver.test.js +0 -89
  96. package/dist/resolver/webpack-resolver.test.js.map +0 -1
  97. package/dist/runner.d.ts +0 -76
  98. package/dist/runner.js +0 -120
  99. package/dist/runner.js.map +0 -1
  100. package/dist/runner.test.d.ts +0 -1
  101. package/dist/runner.test.js +0 -287
  102. package/dist/runner.test.js.map +0 -1
  103. package/dist/test-util/jest/resolver.cjs +0 -31
  104. package/dist/test-util/jest/resolver.cjs.map +0 -1
  105. package/dist/test-util/jest/resolver.d.cts +0 -16
  106. package/dist/test-util/tsserver.d.ts +0 -31
  107. package/dist/test-util/tsserver.js +0 -112
  108. package/dist/test-util/tsserver.js.map +0 -1
  109. package/dist/test-util/util.d.ts +0 -28
  110. package/dist/test-util/util.js +0 -81
  111. package/dist/test-util/util.js.map +0 -1
  112. package/dist/transformer/index.d.ts +0 -30
  113. package/dist/transformer/index.js +0 -25
  114. package/dist/transformer/index.js.map +0 -1
  115. package/dist/transformer/index.test.d.ts +0 -1
  116. package/dist/transformer/index.test.js +0 -66
  117. package/dist/transformer/index.test.js.map +0 -1
  118. package/dist/transformer/less-transformer.d.ts +0 -2
  119. package/dist/transformer/less-transformer.js +0 -45
  120. package/dist/transformer/less-transformer.js.map +0 -1
  121. package/dist/transformer/less-transformer.test.d.ts +0 -1
  122. package/dist/transformer/less-transformer.test.js +0 -124
  123. package/dist/transformer/less-transformer.test.js.map +0 -1
  124. package/dist/transformer/postcss-transformer.d.ts +0 -12
  125. package/dist/transformer/postcss-transformer.js +0 -32
  126. package/dist/transformer/postcss-transformer.js.map +0 -1
  127. package/dist/transformer/postcss-transformer.test.d.ts +0 -1
  128. package/dist/transformer/postcss-transformer.test.js +0 -176
  129. package/dist/transformer/postcss-transformer.test.js.map +0 -1
  130. package/dist/transformer/scss-transformer.d.ts +0 -2
  131. package/dist/transformer/scss-transformer.js +0 -40
  132. package/dist/transformer/scss-transformer.js.map +0 -1
  133. package/dist/transformer/scss-transformer.test.d.ts +0 -1
  134. package/dist/transformer/scss-transformer.test.js +0 -130
  135. package/dist/transformer/scss-transformer.test.js.map +0 -1
  136. package/dist/util.d.ts +0 -21
  137. package/dist/util.js +0 -72
  138. package/dist/util.js.map +0 -1
  139. package/dist/util.test.d.ts +0 -1
  140. package/dist/util.test.js +0 -74
  141. package/dist/util.test.js.map +0 -1
@@ -1,299 +0,0 @@
1
- import { readFile, writeFile } from 'fs/promises';
2
- import { randomUUID } from 'node:crypto';
3
- import { jest } from '@jest/globals';
4
- import dedent from 'dedent';
5
- import { Locator, createDefaultTransformer } from '../index.js';
6
- import { createFixtures, getFixturePath } from '../test-util/util.js';
7
- import { sleepSync } from '../util.js';
8
- const locator = new Locator();
9
- test('basic', async () => {
10
- createFixtures({
11
- '/test/1.css': dedent `
12
- .a {}
13
- .b {}
14
- `,
15
- });
16
- const result = await locator.load(getFixturePath('/test/1.css'));
17
- expect(result).toMatchInlineSnapshot(`
18
- {
19
- dependencies: [],
20
- tokens: [
21
- {
22
- name: "a",
23
- originalLocations: [
24
- { filePath: "<fixtures>/test/1.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
25
- ],
26
- },
27
- {
28
- name: "b",
29
- originalLocations: [
30
- { filePath: "<fixtures>/test/1.css", start: { line: 2, column: 1 }, end: { line: 2, column: 2 } },
31
- ],
32
- },
33
- ],
34
- }
35
- `);
36
- });
37
- test('tracks other files when `@import` is present', async () => {
38
- createFixtures({
39
- '/test/1.css': dedent `
40
- @import './2.css';
41
- @import '3.css';
42
- @import '${getFixturePath('/test/4.css')}';
43
- @import './5.css';
44
- `,
45
- '/test/2.css': dedent `
46
- .a {}
47
- `,
48
- '/test/3.css': dedent `
49
- .b {}
50
- `,
51
- '/test/4.css': dedent `
52
- .c {}
53
- `,
54
- '/test/5.css': dedent `
55
- @import './5-recursive.css';
56
- `,
57
- '/test/5-recursive.css': dedent `
58
- .d {}
59
- `,
60
- });
61
- const result = await locator.load(getFixturePath('/test/1.css'));
62
- expect(result).toMatchInlineSnapshot(`
63
- {
64
- dependencies: [
65
- "<fixtures>/test/2.css",
66
- "<fixtures>/test/3.css",
67
- "<fixtures>/test/4.css",
68
- "<fixtures>/test/5.css",
69
- "<fixtures>/test/5-recursive.css",
70
- ],
71
- tokens: [
72
- {
73
- name: "a",
74
- originalLocations: [
75
- { filePath: "<fixtures>/test/2.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
76
- ],
77
- },
78
- {
79
- name: "b",
80
- originalLocations: [
81
- { filePath: "<fixtures>/test/3.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
82
- ],
83
- },
84
- {
85
- name: "c",
86
- originalLocations: [
87
- { filePath: "<fixtures>/test/4.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
88
- ],
89
- },
90
- {
91
- name: "d",
92
- originalLocations: [
93
- { filePath: "<fixtures>/test/5-recursive.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
94
- ],
95
- },
96
- ],
97
- }
98
- `);
99
- });
100
- test('does not track other files by `composes`', async () => {
101
- createFixtures({
102
- '/test/1.css': dedent `
103
- .a {
104
- composes: b from './2.css';
105
- composes: c from './3.css'; /* non-existent file */
106
- }
107
- `,
108
- '/test/2.css': dedent `
109
- .b {}
110
- `,
111
- });
112
- const result = await locator.load(getFixturePath('/test/1.css'));
113
- expect(result).toMatchInlineSnapshot(`
114
- {
115
- dependencies: [],
116
- tokens: [
117
- {
118
- name: "a",
119
- originalLocations: [
120
- { filePath: "<fixtures>/test/1.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
121
- ],
122
- },
123
- ],
124
- }
125
- `);
126
- });
127
- test('normalizes tokens', async () => {
128
- createFixtures({
129
- '/test/1.css': dedent `
130
- /* duplicate import */
131
- @import './2.css';
132
- @import '2.css';
133
- .a {}
134
- .a {} /* duplicate class selector */
135
- `,
136
- '/test/2.css': dedent `
137
- .a {} /* class selector that duplicates the import source */
138
- .b {}
139
- `,
140
- '/test/3.css': dedent `
141
- .c {}
142
- `,
143
- });
144
- const result = await locator.load(getFixturePath('/test/1.css'));
145
- expect(result).toMatchInlineSnapshot(`
146
- {
147
- dependencies: ["<fixtures>/test/2.css"],
148
- tokens: [
149
- {
150
- name: "a",
151
- originalLocations: [
152
- { filePath: "<fixtures>/test/2.css", start: { line: 1, column: 1 }, end: { line: 1, column: 2 } },
153
- { filePath: "<fixtures>/test/1.css", start: { line: 4, column: 1 }, end: { line: 4, column: 2 } },
154
- { filePath: "<fixtures>/test/1.css", start: { line: 5, column: 1 }, end: { line: 5, column: 2 } },
155
- ],
156
- },
157
- {
158
- name: "b",
159
- originalLocations: [
160
- { filePath: "<fixtures>/test/2.css", start: { line: 2, column: 1 }, end: { line: 2, column: 2 } },
161
- ],
162
- },
163
- ],
164
- }
165
- `);
166
- });
167
- test('returns the result from the cache when the file has not been modified', async () => {
168
- createFixtures({
169
- '/test/1.css': dedent `
170
- @import './2.css';
171
- @import './3.css';
172
- `,
173
- '/test/2.css': dedent `
174
- .b {}
175
- `,
176
- '/test/3.css': dedent `
177
- .c {}
178
- .d {}
179
- `,
180
- });
181
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
182
- const readCSSSpy = jest.spyOn(locator, 'readCSS');
183
- await locator.load(getFixturePath('/test/1.css'));
184
- expect(readCSSSpy).toHaveBeenCalledTimes(3);
185
- expect(readCSSSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.css'));
186
- expect(readCSSSpy).toHaveBeenNthCalledWith(2, getFixturePath('/test/2.css'));
187
- expect(readCSSSpy).toHaveBeenNthCalledWith(3, getFixturePath('/test/3.css'));
188
- readCSSSpy.mockClear();
189
- // update `/test/2.css`
190
- sleepSync(1); // wait for the file system to update the mtime
191
- await writeFile(getFixturePath('/test/2.css'), await readFile(getFixturePath('/test/2.css'), 'utf-8'));
192
- // `3.css` is not updated, so the cache is used. Therefore, `readFile` is not called.
193
- await locator.load(getFixturePath('/test/3.css'));
194
- expect(readCSSSpy).toHaveBeenCalledTimes(0);
195
- // `1.css` is not updated, but dependencies are updated, so the cache is used. Therefore, `readFile` is called.
196
- await locator.load(getFixturePath('/test/1.css'));
197
- expect(readCSSSpy).toHaveBeenCalledTimes(2);
198
- expect(readCSSSpy).toHaveBeenNthCalledWith(1, getFixturePath('/test/1.css'));
199
- expect(readCSSSpy).toHaveBeenNthCalledWith(2, getFixturePath('/test/2.css'));
200
- // ``2.css` is updated, but the cache is already available because it was updated in the previous step. Therefore, `readFile` is not called.
201
- await locator.load(getFixturePath('/test/2.css'));
202
- expect(readCSSSpy).toHaveBeenCalledTimes(2);
203
- });
204
- describe('supports sourcemap', () => {
205
- test('restores original locations from sourcemap', async () => {
206
- const transformer = createDefaultTransformer();
207
- const locator = new Locator({ transformer });
208
- createFixtures({
209
- '/test/1.scss': dedent `
210
- .nesting {
211
- dummy: '';
212
- .nesting_child {
213
- dummy: '';
214
- }
215
- }
216
- `,
217
- });
218
- const result = await locator.load(getFixturePath('/test/1.scss'));
219
- expect(result).toMatchInlineSnapshot(`
220
- {
221
- dependencies: [],
222
- tokens: [
223
- {
224
- name: "nesting",
225
- originalLocations: [
226
- { filePath: "<fixtures>/test/1.scss", start: { line: 1, column: 1 }, end: { line: 1, column: 8 } },
227
- { filePath: "<fixtures>/test/1.scss", start: { line: 3, column: 3 }, end: { line: 3, column: 10 } },
228
- ],
229
- },
230
- {
231
- name: "nesting_child",
232
- originalLocations: [
233
- { filePath: "<fixtures>/test/1.scss", start: { line: 3, column: 3 }, end: { line: 3, column: 16 } },
234
- ],
235
- },
236
- ],
237
- }
238
- `);
239
- });
240
- test('treats originalLocation as empty if sourcemap is broken', async () => {
241
- const uuid = randomUUID();
242
- createFixtures({
243
- [`/${uuid}/postcss.config.js`]: dedent `
244
- module.exports = {
245
- plugins: [],
246
- };
247
- `,
248
- '/test/1.css': dedent `
249
- .selector_list_a_1, .selector_list_a_2 {}
250
- /* In postcss, including newlines in the selector list breaks the sourcemap. */
251
- .selector_list_b_1,
252
- .selector_list_b_2 {}
253
- `,
254
- });
255
- const transformer = createDefaultTransformer({ postcssConfig: getFixturePath(`/${uuid}/postcss.config.js`) });
256
- const locator = new Locator({ transformer });
257
- const result = await locator.load(getFixturePath('/test/1.css'));
258
- expect(result).toMatchInlineSnapshot(`
259
- {
260
- dependencies: [],
261
- tokens: [
262
- {
263
- name: "selector_list_a_1",
264
- originalLocations: [
265
- { filePath: "<fixtures>/test/1.css", start: { line: 1, column: 1 }, end: { line: 1, column: 18 } },
266
- ],
267
- },
268
- {
269
- name: "selector_list_a_2",
270
- originalLocations: [
271
- { filePath: "<fixtures>/test/1.css", start: { line: 1, column: 1 }, end: { line: 1, column: 18 } },
272
- ],
273
- },
274
- { name: "selector_list_b_1", originalLocations: [{}] },
275
- { name: "selector_list_b_2", originalLocations: [{}] },
276
- ],
277
- }
278
- `);
279
- });
280
- });
281
- test('ignores http(s) protocol file', async () => {
282
- createFixtures({
283
- '/test/1.css': dedent `
284
- @import 'http://example.com/path/http.css';
285
- @import 'https://example.com/path/https.css';
286
- `,
287
- });
288
- const result = await locator.load(getFixturePath('/test/1.css'));
289
- expect(result.dependencies).toStrictEqual([]);
290
- });
291
- test('block concurrent calls to load method', async () => {
292
- createFixtures({
293
- '/test/1.css': `.a {}`,
294
- });
295
- await expect(async () => {
296
- await Promise.all([locator.load(getFixturePath('/test/1.css')), locator.load(getFixturePath('/test/1.css'))]);
297
- }).rejects.toThrowError('Cannot call `Locator#load` concurrently.');
298
- });
299
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/locator/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,53 +0,0 @@
1
- import { type Rule, type AtRule, type Root } from 'postcss';
2
- import { type ClassName } from 'postcss-selector-parser';
3
- /** The pair of line number and column number. */
4
- export type Position = {
5
- /** The line number in the source file. It is 1-based (compatible with postcss). */
6
- line: number;
7
- /** The column number in the source file. It is 1-based (compatible with postcss). */
8
- column: number;
9
- };
10
- /** The original location of class selector. If the original location is not found, all fields are `undefined`. */
11
- export type Location = {
12
- filePath: string;
13
- /** The inclusive starting position of the node's source (compatible with postcss). */
14
- start: Position;
15
- /** The inclusive ending position of the node's source (compatible with postcss). */
16
- end: Position;
17
- } | {
18
- filePath: undefined;
19
- start: undefined;
20
- end: undefined;
21
- };
22
- /**
23
- * Traverses a local token from the AST and returns its name.
24
- * @param ast The AST to traverse.
25
- * @returns The name of the local token.
26
- */
27
- export declare function generateLocalTokenNames(ast: Root): Promise<string[]>;
28
- /**
29
- * Get the token's location on the source file.
30
- * @param rule The rule node that contains the token.
31
- * @param classSelector The class selector node that contains the token.
32
- * @returns The token's location on the source file.
33
- */
34
- export declare function getOriginalLocation(rule: Rule, classSelector: ClassName): Location;
35
- type CollectNodesResult = {
36
- atImports: AtRule[];
37
- classSelectors: {
38
- rule: Rule;
39
- classSelector: ClassName;
40
- }[];
41
- };
42
- /**
43
- * Collect nodes from the AST.
44
- * @param ast The AST.
45
- */
46
- export declare function collectNodes(ast: Root): CollectNodesResult;
47
- /**
48
- * Parse the `@import` rule.
49
- * @param atImport The `@import` rule to parse.
50
- * @returns The imported sheet path.
51
- */
52
- export declare function parseAtImport(atImport: AtRule): string | undefined;
53
- export {};
@@ -1,169 +0,0 @@
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
- function removeDependenciesPlugin() {
6
- return {
7
- postcssPlugin: 'remove-dependencies',
8
- // eslint-disable-next-line @typescript-eslint/naming-convention
9
- AtRule(atRule) {
10
- if (isAtImportNode(atRule) || isAtValueNode(atRule)) {
11
- atRule.remove();
12
- }
13
- },
14
- // eslint-disable-next-line @typescript-eslint/naming-convention
15
- Declaration(declaration) {
16
- if (isComposesDeclaration(declaration)) {
17
- declaration.remove();
18
- }
19
- },
20
- };
21
- }
22
- /**
23
- * Traverses a local token from the AST and returns its name.
24
- * @param ast The AST to traverse.
25
- * @returns The name of the local token.
26
- */
27
- export async function generateLocalTokenNames(ast) {
28
- return new Promise((resolve, reject) => {
29
- postcss
30
- .default()
31
- // postcss-modules collects tokens (i.e., includes external tokens) by following
32
- // the dependencies specified in the @import.
33
- // However, we do not want `generateLocalTokenNames` to return external tokens.
34
- // So we remove the @import beforehand.
35
- .use(removeDependenciesPlugin())
36
- .use(modules({
37
- getJSON: (_cssFileName, json) => {
38
- resolve(Object.keys(json));
39
- },
40
- }))
41
- // NOTE: `process` modifies ast, so clone it.
42
- .process(ast.clone())
43
- .catch(reject);
44
- });
45
- }
46
- /**
47
- * Get the token's location on the source file.
48
- * @param rule The rule node that contains the token.
49
- * @param classSelector The class selector node that contains the token.
50
- * @returns The token's location on the source file.
51
- */
52
- export function getOriginalLocation(rule, classSelector) {
53
- // The node derived from `postcss.parse` always has `source` property. Therefore, this line is unreachable.
54
- if (rule.source === undefined || classSelector.source === undefined)
55
- throw new Error('Node#source is undefined');
56
- // The node derived from `postcss.parse` always has `start` and `end` property. Therefore, this line is unreachable.
57
- if (rule.source.start === undefined || classSelector.source.start === undefined)
58
- throw new Error('Node#start is undefined');
59
- if (rule.source.end === undefined || classSelector.source.end === undefined)
60
- throw new Error('Node#end is undefined');
61
- if (rule.source.input.file === undefined)
62
- throw new Error('Node#input.file is undefined');
63
- const classSelectorStartPosition = {
64
- // The line is 1-based.
65
- line: rule.source.start.line + (classSelector.source.start.line - 1),
66
- // The column is 1-based.
67
- column: rule.source.start.column + (classSelector.source.start.column - 1),
68
- };
69
- const classSelectorEndPosition = {
70
- line: classSelectorStartPosition.line,
71
- // The column is inclusive.
72
- column: classSelectorStartPosition.column + classSelector.value.length,
73
- };
74
- const classSelectorLocation = {
75
- filePath: rule.source.input.file,
76
- start: classSelectorStartPosition,
77
- end: classSelectorEndPosition,
78
- };
79
- if (!rule.source.input.map)
80
- return classSelectorLocation;
81
- const classSelectorOrigin = rule.source.input.origin(classSelectorLocation.start.line,
82
- // The column of `Input#origin` is 0-based. This behavior is undocumented and probably a postcss's bug.
83
- // TODO: Open PR to postcss/postcss
84
- classSelectorLocation.start.column - 1);
85
- if (classSelectorOrigin === false || classSelectorOrigin.file === undefined) {
86
- return { filePath: undefined, start: undefined, end: undefined };
87
- }
88
- return {
89
- filePath: classSelectorOrigin.file,
90
- start: {
91
- line: classSelectorOrigin.line,
92
- column: classSelectorOrigin.column + 1,
93
- },
94
- end: {
95
- line: classSelectorOrigin.line,
96
- column: classSelectorOrigin.column + classSelector.value.length + 1,
97
- },
98
- };
99
- }
100
- function isAtRuleNode(node) {
101
- return node.type === 'atrule';
102
- }
103
- function isAtImportNode(node) {
104
- return isAtRuleNode(node) && node.name === 'import';
105
- }
106
- function isAtValueNode(node) {
107
- return isAtRuleNode(node) && node.name === 'value';
108
- }
109
- function isRuleNode(node) {
110
- return node.type === 'rule';
111
- }
112
- function isDeclaration(node) {
113
- return node.type === 'decl';
114
- }
115
- function isComposesDeclaration(node) {
116
- return isDeclaration(node) && node.prop === 'composes';
117
- }
118
- /**
119
- * Collect nodes from the AST.
120
- * @param ast The AST.
121
- */
122
- export function collectNodes(ast) {
123
- const atImports = [];
124
- const classSelectors = [];
125
- ast.walk((node) => {
126
- if (isAtImportNode(node)) {
127
- atImports.push(node);
128
- }
129
- else if (isRuleNode(node)) {
130
- // In `rule.selector` comes the following string:
131
- // 1. ".foo"
132
- // 2. ".foo:hover"
133
- // 3. ".foo, .bar"
134
- selectorParser((selectors) => {
135
- selectors.walk((selector) => {
136
- if (selector.type === 'class') {
137
- // In `selector.value` comes the following string:
138
- // 1. "foo"
139
- // 2. "bar"
140
- classSelectors.push({ rule: node, classSelector: selector });
141
- }
142
- });
143
- }).processSync(node);
144
- }
145
- });
146
- return { atImports, classSelectors };
147
- }
148
- /**
149
- * Parse the `@import` rule.
150
- * @param atImport The `@import` rule to parse.
151
- * @returns The imported sheet path.
152
- */
153
- export function parseAtImport(atImport) {
154
- const firstNode = valueParser(atImport.params).nodes[0];
155
- if (firstNode === undefined)
156
- return undefined;
157
- if (firstNode.type === 'string')
158
- return firstNode.value;
159
- if (firstNode.type === 'function' && firstNode.value === 'url') {
160
- if (firstNode.nodes[0] === undefined)
161
- return undefined;
162
- if (firstNode.nodes[0].type === 'string')
163
- return firstNode.nodes[0].value;
164
- if (firstNode.nodes[0].type === 'word')
165
- return firstNode.nodes[0].value;
166
- }
167
- return undefined;
168
- }
169
- //# sourceMappingURL=postcss.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postcss.js","sourceRoot":"","sources":["../../src/locator/postcss.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};