happy-css-modules 4.0.0 → 5.0.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.
- package/LICENSE.txt +23 -0
- package/README.md +307 -2
- package/bin/hcm.js +1 -1
- package/dist/cli.d.ts +0 -4
- package/dist/cli.js +111 -118
- package/dist/cli.js.map +1 -1
- package/dist/emitter/dts.js +3 -4
- package/dist/emitter/dts.js.map +1 -1
- package/dist/emitter/dts.test.js +12 -12
- package/dist/emitter/file-system.js +2 -2
- package/dist/emitter/file-system.js.map +1 -1
- package/dist/emitter/file-system.test.js +1 -1
- package/dist/emitter/file-system.test.js.map +1 -1
- package/dist/emitter/index.js +1 -1
- package/dist/emitter/index.js.map +1 -1
- package/dist/emitter/index.test.js +1 -2
- package/dist/emitter/index.test.js.map +1 -1
- package/dist/emitter/source-map.js +1 -1
- package/dist/emitter/source-map.js.map +1 -1
- package/dist/emitter/source-map.test.js +1 -1
- package/dist/emitter/source-map.test.js.map +1 -1
- package/dist/integration-test/go-to-definition.test.js +403 -105
- package/dist/integration-test/go-to-definition.test.js.map +1 -1
- package/dist/locator/index.js +10 -8
- package/dist/locator/index.js.map +1 -1
- package/dist/locator/index.test.js +303 -169
- package/dist/locator/index.test.js.map +1 -1
- package/dist/locator/postcss.js +2 -3
- package/dist/locator/postcss.js.map +1 -1
- package/dist/locator/postcss.test.js +317 -73
- package/dist/locator/postcss.test.js.map +1 -1
- package/dist/logger.js +7 -6
- package/dist/logger.js.map +1 -1
- package/dist/regression-test/issue-168.test.js +2 -3
- package/dist/regression-test/issue-168.test.js.map +1 -1
- package/dist/resolver/index.d.ts +1 -1
- package/dist/resolver/index.js +3 -3
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/node-resolver.js +1 -1
- package/dist/resolver/node-resolver.js.map +1 -1
- package/dist/resolver/relative-resolver.js +1 -1
- package/dist/resolver/relative-resolver.js.map +1 -1
- package/dist/resolver/webpack-resolver.d.ts +1 -1
- package/dist/resolver/webpack-resolver.js +4 -4
- package/dist/resolver/webpack-resolver.js.map +1 -1
- package/dist/runner.js +50 -18
- package/dist/runner.js.map +1 -1
- package/dist/runner.test.js +47 -32
- package/dist/runner.test.js.map +1 -1
- package/dist/test-util/line-column.d.ts +9 -0
- package/dist/test-util/line-column.js +16 -0
- package/dist/test-util/line-column.js.map +1 -0
- package/dist/test-util/line-column.test.d.ts +1 -0
- package/dist/test-util/line-column.test.js +21 -0
- package/dist/test-util/line-column.test.js.map +1 -0
- package/dist/test-util/tsserver.js +11 -12
- package/dist/test-util/tsserver.js.map +1 -1
- package/dist/test-util/util.d.ts +6 -0
- package/dist/test-util/util.js +22 -5
- package/dist/test-util/util.js.map +1 -1
- package/dist/transformer/index.js +1 -1
- package/dist/transformer/index.js.map +1 -1
- package/dist/transformer/index.test.js +17 -17
- package/dist/transformer/index.test.js.map +1 -1
- package/dist/transformer/less-transformer.js +4 -4
- package/dist/transformer/less-transformer.js.map +1 -1
- package/dist/transformer/less-transformer.test.js +75 -49
- package/dist/transformer/less-transformer.test.js.map +1 -1
- package/dist/transformer/postcss-transformer.test.js +56 -50
- package/dist/transformer/postcss-transformer.test.js.map +1 -1
- package/dist/transformer/scss-transformer.js +0 -1
- package/dist/transformer/scss-transformer.js.map +1 -1
- package/dist/transformer/scss-transformer.test.js +105 -52
- package/dist/transformer/scss-transformer.test.js.map +1 -1
- package/dist/util.js +6 -8
- package/dist/util.js.map +1 -1
- package/dist/util.test.js +2 -2
- package/dist/util.test.js.map +1 -1
- package/package.json +58 -34
- package/src/cli.ts +119 -117
- package/src/emitter/dts.test.ts +12 -12
- package/src/emitter/dts.ts +25 -26
- package/src/emitter/file-system.test.ts +1 -1
- package/src/emitter/file-system.ts +2 -2
- package/src/emitter/index.test.ts +1 -2
- package/src/emitter/index.ts +1 -1
- package/src/emitter/source-map.test.ts +1 -1
- package/src/emitter/source-map.ts +1 -1
- package/src/integration-test/go-to-definition.test.ts +405 -105
- package/src/locator/index.test.ts +303 -169
- package/src/locator/index.ts +6 -6
- package/src/locator/postcss.test.ts +317 -73
- package/src/locator/postcss.ts +2 -3
- package/src/logger.ts +6 -6
- package/src/regression-test/issue-168.test.ts +2 -3
- package/src/resolver/index.ts +4 -4
- package/src/resolver/node-resolver.ts +1 -1
- package/src/resolver/relative-resolver.ts +1 -1
- package/src/resolver/webpack-resolver.ts +5 -5
- package/src/runner.test.ts +54 -32
- package/src/runner.ts +51 -19
- package/src/test-util/line-column.test.ts +21 -0
- package/src/test-util/line-column.ts +15 -0
- package/src/test-util/tsserver.ts +11 -12
- package/src/test-util/util.ts +23 -5
- package/src/transformer/index.test.ts +17 -17
- package/src/transformer/index.ts +1 -1
- package/src/transformer/less-transformer.test.ts +73 -45
- package/src/transformer/less-transformer.ts +1 -3
- package/src/transformer/postcss-transformer.test.ts +56 -50
- package/src/transformer/scss-transformer.test.ts +107 -52
- package/src/transformer/scss-transformer.ts +0 -1
- package/src/util.test.ts +2 -2
- package/src/util.ts +6 -8
package/src/locator/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFile, stat } from 'fs/promises';
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
2
|
import postcss from 'postcss';
|
|
3
3
|
import type { Resolver } from '../resolver/index.js';
|
|
4
4
|
import { createDefaultResolver } from '../resolver/index.js';
|
|
@@ -85,7 +85,7 @@ export class Locator {
|
|
|
85
85
|
for (const dependency of dependencies) {
|
|
86
86
|
const entry = this.cache.get(dependency);
|
|
87
87
|
if (!entry) return true;
|
|
88
|
-
//
|
|
88
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
89
89
|
const mtime = (await stat(dependency)).mtime.getTime();
|
|
90
90
|
if (entry.mtime !== mtime) return true;
|
|
91
91
|
}
|
|
@@ -159,9 +159,9 @@ export class Locator {
|
|
|
159
159
|
const importedSheetPath = parseAtImport(atImport);
|
|
160
160
|
if (!importedSheetPath) continue;
|
|
161
161
|
if (isIgnoredSpecifier(importedSheetPath)) continue;
|
|
162
|
-
//
|
|
162
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
163
163
|
const from = await this.resolver(importedSheetPath, { request: filePath });
|
|
164
|
-
//
|
|
164
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
165
165
|
const result = await this._load(from);
|
|
166
166
|
const externalTokens = result.tokens;
|
|
167
167
|
dependencies.push(from, ...result.dependencies);
|
|
@@ -192,9 +192,9 @@ export class Locator {
|
|
|
192
192
|
});
|
|
193
193
|
} else if (parsedAtValue.type === 'valueImportDeclaration') {
|
|
194
194
|
if (isIgnoredSpecifier(parsedAtValue.from)) continue;
|
|
195
|
-
//
|
|
195
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
196
196
|
const from = await this.resolver(parsedAtValue.from, { request: filePath });
|
|
197
|
-
//
|
|
197
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
198
198
|
const result = await this._load(from);
|
|
199
199
|
dependencies.push(from, ...result.dependencies);
|
|
200
200
|
for (const token of result.tokens) {
|
|
@@ -67,7 +67,7 @@ describe('generateLocalTokenNames', () => {
|
|
|
67
67
|
test('does not track styles imported by @import in other file because it is not a local token', async () => {
|
|
68
68
|
createFixtures({
|
|
69
69
|
'/test/1.css': dedent`
|
|
70
|
-
|
|
70
|
+
.a {}
|
|
71
71
|
`,
|
|
72
72
|
});
|
|
73
73
|
expect(
|
|
@@ -81,7 +81,7 @@ describe('generateLocalTokenNames', () => {
|
|
|
81
81
|
test('does not track styles imported by @value in other file because it is not a local token', async () => {
|
|
82
82
|
createFixtures({
|
|
83
83
|
'/test/1.css': dedent`
|
|
84
|
-
|
|
84
|
+
.a {}
|
|
85
85
|
`,
|
|
86
86
|
});
|
|
87
87
|
expect(
|
|
@@ -95,7 +95,7 @@ describe('generateLocalTokenNames', () => {
|
|
|
95
95
|
test('does not track styles imported by composes in other file because it is not a local token', async () => {
|
|
96
96
|
createFixtures({
|
|
97
97
|
'/test/1.css': dedent`
|
|
98
|
-
|
|
98
|
+
.b {}
|
|
99
99
|
`,
|
|
100
100
|
});
|
|
101
101
|
expect(
|
|
@@ -114,176 +114,408 @@ describe('getOriginalLocationOfClassSelector', () => {
|
|
|
114
114
|
test('basic', () => {
|
|
115
115
|
const [basic] = createClassSelectors(
|
|
116
116
|
createRoot(dedent`
|
|
117
|
-
|
|
117
|
+
.basic {}
|
|
118
118
|
`),
|
|
119
119
|
);
|
|
120
120
|
expect(getOriginalLocationOfClassSelector(basic!.rule, basic!.classSelector)).toMatchInlineSnapshot(
|
|
121
|
-
`
|
|
121
|
+
`
|
|
122
|
+
{
|
|
123
|
+
"end": {
|
|
124
|
+
"column": 6,
|
|
125
|
+
"line": 1,
|
|
126
|
+
},
|
|
127
|
+
"filePath": "/test/test.css",
|
|
128
|
+
"start": {
|
|
129
|
+
"column": 1,
|
|
130
|
+
"line": 1,
|
|
131
|
+
},
|
|
132
|
+
}
|
|
133
|
+
`,
|
|
122
134
|
);
|
|
123
135
|
});
|
|
124
136
|
test('cascading', () => {
|
|
125
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
126
137
|
const [cascading_1, cascading_2] = createClassSelectors(
|
|
127
138
|
createRoot(dedent`
|
|
128
|
-
|
|
129
|
-
|
|
139
|
+
.cascading {}
|
|
140
|
+
.cascading {}
|
|
130
141
|
`),
|
|
131
142
|
);
|
|
132
143
|
expect(getOriginalLocationOfClassSelector(cascading_1!.rule, cascading_1!.classSelector)).toMatchInlineSnapshot(
|
|
133
|
-
`
|
|
144
|
+
`
|
|
145
|
+
{
|
|
146
|
+
"end": {
|
|
147
|
+
"column": 10,
|
|
148
|
+
"line": 1,
|
|
149
|
+
},
|
|
150
|
+
"filePath": "/test/test.css",
|
|
151
|
+
"start": {
|
|
152
|
+
"column": 1,
|
|
153
|
+
"line": 1,
|
|
154
|
+
},
|
|
155
|
+
}
|
|
156
|
+
`,
|
|
134
157
|
);
|
|
135
158
|
expect(getOriginalLocationOfClassSelector(cascading_2!.rule, cascading_2!.classSelector)).toMatchInlineSnapshot(
|
|
136
|
-
`
|
|
159
|
+
`
|
|
160
|
+
{
|
|
161
|
+
"end": {
|
|
162
|
+
"column": 10,
|
|
163
|
+
"line": 2,
|
|
164
|
+
},
|
|
165
|
+
"filePath": "/test/test.css",
|
|
166
|
+
"start": {
|
|
167
|
+
"column": 1,
|
|
168
|
+
"line": 2,
|
|
169
|
+
},
|
|
170
|
+
}
|
|
171
|
+
`,
|
|
137
172
|
);
|
|
138
173
|
});
|
|
139
174
|
test('pseudo_class', () => {
|
|
140
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
141
175
|
const [pseudo_class_1, pseudo_class_2, pseudo_class_3] = createClassSelectors(
|
|
142
176
|
createRoot(dedent`
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
177
|
+
.pseudo_class_1 {}
|
|
178
|
+
.pseudo_class_2:hover {}
|
|
179
|
+
:not(.pseudo_class_3) {}
|
|
146
180
|
`),
|
|
147
181
|
);
|
|
148
182
|
expect(
|
|
149
183
|
getOriginalLocationOfClassSelector(pseudo_class_1!.rule, pseudo_class_1!.classSelector),
|
|
150
184
|
).toMatchInlineSnapshot(
|
|
151
|
-
`
|
|
185
|
+
`
|
|
186
|
+
{
|
|
187
|
+
"end": {
|
|
188
|
+
"column": 15,
|
|
189
|
+
"line": 1,
|
|
190
|
+
},
|
|
191
|
+
"filePath": "/test/test.css",
|
|
192
|
+
"start": {
|
|
193
|
+
"column": 1,
|
|
194
|
+
"line": 1,
|
|
195
|
+
},
|
|
196
|
+
}
|
|
197
|
+
`,
|
|
152
198
|
);
|
|
153
199
|
expect(
|
|
154
200
|
getOriginalLocationOfClassSelector(pseudo_class_2!.rule, pseudo_class_2!.classSelector),
|
|
155
201
|
).toMatchInlineSnapshot(
|
|
156
|
-
`
|
|
202
|
+
`
|
|
203
|
+
{
|
|
204
|
+
"end": {
|
|
205
|
+
"column": 15,
|
|
206
|
+
"line": 2,
|
|
207
|
+
},
|
|
208
|
+
"filePath": "/test/test.css",
|
|
209
|
+
"start": {
|
|
210
|
+
"column": 1,
|
|
211
|
+
"line": 2,
|
|
212
|
+
},
|
|
213
|
+
}
|
|
214
|
+
`,
|
|
157
215
|
);
|
|
158
216
|
expect(
|
|
159
217
|
getOriginalLocationOfClassSelector(pseudo_class_3!.rule, pseudo_class_3!.classSelector),
|
|
160
218
|
).toMatchInlineSnapshot(
|
|
161
|
-
`
|
|
219
|
+
`
|
|
220
|
+
{
|
|
221
|
+
"end": {
|
|
222
|
+
"column": 20,
|
|
223
|
+
"line": 3,
|
|
224
|
+
},
|
|
225
|
+
"filePath": "/test/test.css",
|
|
226
|
+
"start": {
|
|
227
|
+
"column": 6,
|
|
228
|
+
"line": 3,
|
|
229
|
+
},
|
|
230
|
+
}
|
|
231
|
+
`,
|
|
162
232
|
);
|
|
163
233
|
});
|
|
164
234
|
test('multiple_selector', () => {
|
|
165
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
166
235
|
const [multiple_selector_1, multiple_selector_2] = createClassSelectors(
|
|
167
236
|
createRoot(dedent`
|
|
168
|
-
|
|
237
|
+
.multiple_selector_1.multiple_selector_2 {}
|
|
169
238
|
`),
|
|
170
239
|
);
|
|
171
240
|
expect(
|
|
172
241
|
getOriginalLocationOfClassSelector(multiple_selector_1!.rule, multiple_selector_1!.classSelector),
|
|
173
242
|
).toMatchInlineSnapshot(
|
|
174
|
-
`
|
|
243
|
+
`
|
|
244
|
+
{
|
|
245
|
+
"end": {
|
|
246
|
+
"column": 20,
|
|
247
|
+
"line": 1,
|
|
248
|
+
},
|
|
249
|
+
"filePath": "/test/test.css",
|
|
250
|
+
"start": {
|
|
251
|
+
"column": 1,
|
|
252
|
+
"line": 1,
|
|
253
|
+
},
|
|
254
|
+
}
|
|
255
|
+
`,
|
|
175
256
|
);
|
|
176
257
|
expect(
|
|
177
258
|
getOriginalLocationOfClassSelector(multiple_selector_2!.rule, multiple_selector_2!.classSelector),
|
|
178
259
|
).toMatchInlineSnapshot(
|
|
179
|
-
`
|
|
260
|
+
`
|
|
261
|
+
{
|
|
262
|
+
"end": {
|
|
263
|
+
"column": 40,
|
|
264
|
+
"line": 1,
|
|
265
|
+
},
|
|
266
|
+
"filePath": "/test/test.css",
|
|
267
|
+
"start": {
|
|
268
|
+
"column": 21,
|
|
269
|
+
"line": 1,
|
|
270
|
+
},
|
|
271
|
+
}
|
|
272
|
+
`,
|
|
180
273
|
);
|
|
181
274
|
});
|
|
182
275
|
|
|
183
276
|
test('combinator', () => {
|
|
184
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
185
277
|
const [combinator_1, combinator_2] = createClassSelectors(
|
|
186
278
|
createRoot(dedent`
|
|
187
|
-
|
|
279
|
+
.combinator_1 + .combinator_2 {}
|
|
188
280
|
`),
|
|
189
281
|
);
|
|
190
282
|
expect(getOriginalLocationOfClassSelector(combinator_1!.rule, combinator_1!.classSelector)).toMatchInlineSnapshot(
|
|
191
|
-
`
|
|
283
|
+
`
|
|
284
|
+
{
|
|
285
|
+
"end": {
|
|
286
|
+
"column": 13,
|
|
287
|
+
"line": 1,
|
|
288
|
+
},
|
|
289
|
+
"filePath": "/test/test.css",
|
|
290
|
+
"start": {
|
|
291
|
+
"column": 1,
|
|
292
|
+
"line": 1,
|
|
293
|
+
},
|
|
294
|
+
}
|
|
295
|
+
`,
|
|
192
296
|
);
|
|
193
297
|
expect(getOriginalLocationOfClassSelector(combinator_2!.rule, combinator_2!.classSelector)).toMatchInlineSnapshot(
|
|
194
|
-
`
|
|
298
|
+
`
|
|
299
|
+
{
|
|
300
|
+
"end": {
|
|
301
|
+
"column": 29,
|
|
302
|
+
"line": 1,
|
|
303
|
+
},
|
|
304
|
+
"filePath": "/test/test.css",
|
|
305
|
+
"start": {
|
|
306
|
+
"column": 17,
|
|
307
|
+
"line": 1,
|
|
308
|
+
},
|
|
309
|
+
}
|
|
310
|
+
`,
|
|
195
311
|
);
|
|
196
312
|
});
|
|
197
313
|
test('at_rule', () => {
|
|
198
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
199
314
|
const [at_rule] = createClassSelectors(
|
|
200
315
|
createRoot(dedent`
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
316
|
+
@supports (display: flex) {
|
|
317
|
+
@media screen and (min-width: 900px) {
|
|
318
|
+
.at_rule {}
|
|
319
|
+
}
|
|
204
320
|
}
|
|
205
|
-
}
|
|
206
321
|
`),
|
|
207
322
|
);
|
|
208
323
|
expect(getOriginalLocationOfClassSelector(at_rule!.rule, at_rule!.classSelector)).toMatchInlineSnapshot(
|
|
209
|
-
`
|
|
324
|
+
`
|
|
325
|
+
{
|
|
326
|
+
"end": {
|
|
327
|
+
"column": 12,
|
|
328
|
+
"line": 3,
|
|
329
|
+
},
|
|
330
|
+
"filePath": "/test/test.css",
|
|
331
|
+
"start": {
|
|
332
|
+
"column": 5,
|
|
333
|
+
"line": 3,
|
|
334
|
+
},
|
|
335
|
+
}
|
|
336
|
+
`,
|
|
210
337
|
);
|
|
211
338
|
});
|
|
212
339
|
test('selector_list', () => {
|
|
213
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
214
340
|
const [selector_list_1, selector_list_2] = createClassSelectors(
|
|
215
341
|
createRoot(dedent`
|
|
216
|
-
|
|
342
|
+
.selector_list_1, .selector_list_2 {}
|
|
217
343
|
`),
|
|
218
344
|
);
|
|
219
345
|
expect(
|
|
220
346
|
getOriginalLocationOfClassSelector(selector_list_1!.rule, selector_list_1!.classSelector),
|
|
221
347
|
).toMatchInlineSnapshot(
|
|
222
|
-
`
|
|
348
|
+
`
|
|
349
|
+
{
|
|
350
|
+
"end": {
|
|
351
|
+
"column": 16,
|
|
352
|
+
"line": 1,
|
|
353
|
+
},
|
|
354
|
+
"filePath": "/test/test.css",
|
|
355
|
+
"start": {
|
|
356
|
+
"column": 1,
|
|
357
|
+
"line": 1,
|
|
358
|
+
},
|
|
359
|
+
}
|
|
360
|
+
`,
|
|
223
361
|
);
|
|
224
362
|
expect(
|
|
225
363
|
getOriginalLocationOfClassSelector(selector_list_2!.rule, selector_list_2!.classSelector),
|
|
226
364
|
).toMatchInlineSnapshot(
|
|
227
|
-
`
|
|
365
|
+
`
|
|
366
|
+
{
|
|
367
|
+
"end": {
|
|
368
|
+
"column": 34,
|
|
369
|
+
"line": 1,
|
|
370
|
+
},
|
|
371
|
+
"filePath": "/test/test.css",
|
|
372
|
+
"start": {
|
|
373
|
+
"column": 19,
|
|
374
|
+
"line": 1,
|
|
375
|
+
},
|
|
376
|
+
}
|
|
377
|
+
`,
|
|
228
378
|
);
|
|
229
379
|
});
|
|
230
380
|
test('local_class_name', () => {
|
|
231
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
232
381
|
const [local_class_name_1, local_class_name_2, local_class_name_3, local_class_name_4] = createClassSelectors(
|
|
233
382
|
createRoot(dedent`
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
383
|
+
:local .local_class_name_1 {}
|
|
384
|
+
:local {
|
|
385
|
+
.local_class_name_2 {}
|
|
386
|
+
.local_class_name_3 {}
|
|
387
|
+
}
|
|
388
|
+
:local(.local_class_name_4) {}
|
|
240
389
|
`),
|
|
241
390
|
);
|
|
242
391
|
expect(
|
|
243
392
|
getOriginalLocationOfClassSelector(local_class_name_1!.rule, local_class_name_1!.classSelector),
|
|
244
393
|
).toMatchInlineSnapshot(
|
|
245
|
-
`
|
|
394
|
+
`
|
|
395
|
+
{
|
|
396
|
+
"end": {
|
|
397
|
+
"column": 26,
|
|
398
|
+
"line": 1,
|
|
399
|
+
},
|
|
400
|
+
"filePath": "/test/test.css",
|
|
401
|
+
"start": {
|
|
402
|
+
"column": 8,
|
|
403
|
+
"line": 1,
|
|
404
|
+
},
|
|
405
|
+
}
|
|
406
|
+
`,
|
|
246
407
|
);
|
|
247
408
|
expect(
|
|
248
409
|
getOriginalLocationOfClassSelector(local_class_name_2!.rule, local_class_name_2!.classSelector),
|
|
249
410
|
).toMatchInlineSnapshot(
|
|
250
|
-
`
|
|
411
|
+
`
|
|
412
|
+
{
|
|
413
|
+
"end": {
|
|
414
|
+
"column": 21,
|
|
415
|
+
"line": 3,
|
|
416
|
+
},
|
|
417
|
+
"filePath": "/test/test.css",
|
|
418
|
+
"start": {
|
|
419
|
+
"column": 3,
|
|
420
|
+
"line": 3,
|
|
421
|
+
},
|
|
422
|
+
}
|
|
423
|
+
`,
|
|
251
424
|
);
|
|
252
425
|
expect(
|
|
253
426
|
getOriginalLocationOfClassSelector(local_class_name_3!.rule, local_class_name_3!.classSelector),
|
|
254
427
|
).toMatchInlineSnapshot(
|
|
255
|
-
`
|
|
428
|
+
`
|
|
429
|
+
{
|
|
430
|
+
"end": {
|
|
431
|
+
"column": 21,
|
|
432
|
+
"line": 4,
|
|
433
|
+
},
|
|
434
|
+
"filePath": "/test/test.css",
|
|
435
|
+
"start": {
|
|
436
|
+
"column": 3,
|
|
437
|
+
"line": 4,
|
|
438
|
+
},
|
|
439
|
+
}
|
|
440
|
+
`,
|
|
256
441
|
);
|
|
257
442
|
expect(
|
|
258
443
|
getOriginalLocationOfClassSelector(local_class_name_4!.rule, local_class_name_4!.classSelector),
|
|
259
444
|
).toMatchInlineSnapshot(
|
|
260
|
-
`
|
|
445
|
+
`
|
|
446
|
+
{
|
|
447
|
+
"end": {
|
|
448
|
+
"column": 26,
|
|
449
|
+
"line": 6,
|
|
450
|
+
},
|
|
451
|
+
"filePath": "/test/test.css",
|
|
452
|
+
"start": {
|
|
453
|
+
"column": 8,
|
|
454
|
+
"line": 6,
|
|
455
|
+
},
|
|
456
|
+
}
|
|
457
|
+
`,
|
|
261
458
|
);
|
|
262
459
|
});
|
|
263
460
|
test('with_newline', () => {
|
|
264
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
265
461
|
const [with_newline_1, with_newline_2, with_newline_3] = createClassSelectors(
|
|
266
462
|
createRoot(dedent`
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
463
|
+
.with_newline_1,
|
|
464
|
+
.with_newline_2
|
|
465
|
+
+ .with_newline_3, {}
|
|
270
466
|
`),
|
|
271
467
|
);
|
|
272
468
|
expect(
|
|
273
469
|
getOriginalLocationOfClassSelector(with_newline_1!.rule, with_newline_1!.classSelector),
|
|
274
470
|
).toMatchInlineSnapshot(
|
|
275
|
-
`
|
|
471
|
+
`
|
|
472
|
+
{
|
|
473
|
+
"end": {
|
|
474
|
+
"column": 15,
|
|
475
|
+
"line": 1,
|
|
476
|
+
},
|
|
477
|
+
"filePath": "/test/test.css",
|
|
478
|
+
"start": {
|
|
479
|
+
"column": 1,
|
|
480
|
+
"line": 1,
|
|
481
|
+
},
|
|
482
|
+
}
|
|
483
|
+
`,
|
|
276
484
|
);
|
|
277
485
|
expect(
|
|
278
486
|
getOriginalLocationOfClassSelector(with_newline_2!.rule, with_newline_2!.classSelector),
|
|
279
487
|
).toMatchInlineSnapshot(
|
|
280
|
-
`
|
|
488
|
+
`
|
|
489
|
+
{
|
|
490
|
+
"end": {
|
|
491
|
+
"column": 15,
|
|
492
|
+
"line": 2,
|
|
493
|
+
},
|
|
494
|
+
"filePath": "/test/test.css",
|
|
495
|
+
"start": {
|
|
496
|
+
"column": 1,
|
|
497
|
+
"line": 2,
|
|
498
|
+
},
|
|
499
|
+
}
|
|
500
|
+
`,
|
|
281
501
|
);
|
|
282
502
|
|
|
283
503
|
expect(
|
|
284
504
|
getOriginalLocationOfClassSelector(with_newline_3!.rule, with_newline_3!.classSelector),
|
|
285
505
|
).toMatchInlineSnapshot(
|
|
286
|
-
`
|
|
506
|
+
`
|
|
507
|
+
{
|
|
508
|
+
"end": {
|
|
509
|
+
"column": 19,
|
|
510
|
+
"line": 3,
|
|
511
|
+
},
|
|
512
|
+
"filePath": "/test/test.css",
|
|
513
|
+
"start": {
|
|
514
|
+
"column": 5,
|
|
515
|
+
"line": 3,
|
|
516
|
+
},
|
|
517
|
+
}
|
|
518
|
+
`,
|
|
287
519
|
);
|
|
288
520
|
});
|
|
289
521
|
});
|
|
@@ -299,11 +531,23 @@ test('getOriginalLocationOfAtValue', () => {
|
|
|
299
531
|
}
|
|
300
532
|
const [basic] = createAtValues(
|
|
301
533
|
createRoot(dedent`
|
|
302
|
-
|
|
534
|
+
@value basic: #000;
|
|
303
535
|
`),
|
|
304
536
|
);
|
|
305
537
|
expect(tryGetOriginalLocationOfAtValue(basic!)).toMatchInlineSnapshot(
|
|
306
|
-
`
|
|
538
|
+
`
|
|
539
|
+
{
|
|
540
|
+
"end": {
|
|
541
|
+
"column": 13,
|
|
542
|
+
"line": 1,
|
|
543
|
+
},
|
|
544
|
+
"filePath": "/test/test.css",
|
|
545
|
+
"start": {
|
|
546
|
+
"column": 8,
|
|
547
|
+
"line": 1,
|
|
548
|
+
},
|
|
549
|
+
}
|
|
550
|
+
`,
|
|
307
551
|
);
|
|
308
552
|
});
|
|
309
553
|
|
|
@@ -314,7 +558,7 @@ test('collectNodes', () => {
|
|
|
314
558
|
@ignored;
|
|
315
559
|
.a { ignored: "ignored"; }
|
|
316
560
|
.b { ignored: "ignored"; }
|
|
317
|
-
|
|
561
|
+
`);
|
|
318
562
|
|
|
319
563
|
const { atImports, classSelectors } = collectNodes(ast);
|
|
320
564
|
|
|
@@ -331,11 +575,11 @@ test('collectNodes', () => {
|
|
|
331
575
|
test('parseAtImport', () => {
|
|
332
576
|
const atImports = createAtImports(
|
|
333
577
|
createRoot(dedent`
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
578
|
+
@import;
|
|
579
|
+
@import "test.css";
|
|
580
|
+
@import url("test.css");
|
|
581
|
+
@import url(test.css);
|
|
582
|
+
@import "test.css" print;
|
|
339
583
|
`),
|
|
340
584
|
);
|
|
341
585
|
expect(parseAtImport(atImports[0]!)).toBe(undefined);
|
|
@@ -348,18 +592,18 @@ test('parseAtImport', () => {
|
|
|
348
592
|
test('parseAtValue', () => {
|
|
349
593
|
const atValues = createAtValues(
|
|
350
594
|
createRoot(dedent`
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
595
|
+
@value basic: #000;
|
|
596
|
+
@value withoutColon #000;
|
|
597
|
+
@value empty:;
|
|
598
|
+
@value comment:/* comment */;
|
|
599
|
+
@value complex: (max-width: 599px);
|
|
600
|
+
@value import from "test.css";
|
|
601
|
+
@value import1, import2 from "test.css";
|
|
602
|
+
@value import as alias from "test.css";
|
|
603
|
+
/*
|
|
604
|
+
* NOTE: happy-css-modules intentionally does not support module specifier as variable.
|
|
605
|
+
* e.g. \`@value d, e from moduleName;\`
|
|
606
|
+
*/
|
|
363
607
|
`),
|
|
364
608
|
);
|
|
365
609
|
expect(parseAtValue(atValues[0]!)).toStrictEqual({ type: 'valueDeclaration', tokenName: 'basic' });
|
package/src/locator/postcss.ts
CHANGED
|
@@ -251,7 +251,6 @@ export function parseAtValue(atValue: AtRule): ParsedAtValue {
|
|
|
251
251
|
if (matchesForImports) {
|
|
252
252
|
const [, aliases, path] = matchesForImports;
|
|
253
253
|
|
|
254
|
-
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
255
254
|
if (aliases === undefined || path === undefined) throw new Error(`unreachable`);
|
|
256
255
|
|
|
257
256
|
const imports = aliases
|
|
@@ -278,11 +277,11 @@ export function parseAtValue(atValue: AtRule): ParsedAtValue {
|
|
|
278
277
|
|
|
279
278
|
const matchesForValueDefinitions = `${atValue.params}${atValue.raws.between!}`.match(matchValueDefinition);
|
|
280
279
|
if (matchesForValueDefinitions) {
|
|
281
|
-
//
|
|
280
|
+
// oxlint-disable-next-line no-unused-vars
|
|
282
281
|
const [, key, value] = matchesForValueDefinitions;
|
|
283
282
|
if (key === undefined) throw new Error(`unreachable`);
|
|
284
283
|
return { type: 'valueDeclaration', tokenName: key };
|
|
285
284
|
}
|
|
286
|
-
//
|
|
285
|
+
// oxlint-disable-next-line typescript/restrict-template-expressions, typescript/no-base-to-string
|
|
287
286
|
throw new Error(`@value statement "${atValue.source!}" is invalid!`);
|
|
288
287
|
}
|
package/src/logger.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { styleText } from 'node:util';
|
|
2
2
|
type LogLevelLabel = 'debug' | 'info' | 'silent';
|
|
3
3
|
type LogLevel = 2 | 1 | 0;
|
|
4
4
|
const LOG_LEVEL: Record<LogLevelLabel, LogLevel> = {
|
|
@@ -14,18 +14,18 @@ export class Logger {
|
|
|
14
14
|
}
|
|
15
15
|
debug(message: unknown) {
|
|
16
16
|
if (this.logLevel >= LOG_LEVEL['debug']) {
|
|
17
|
-
//
|
|
17
|
+
// oxlint-disable-next-line no-console
|
|
18
18
|
console.log('[debug]', message);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
info(message: unknown) {
|
|
22
22
|
if (this.logLevel >= LOG_LEVEL['info']) {
|
|
23
|
-
//
|
|
24
|
-
console.log(
|
|
23
|
+
// oxlint-disable-next-line no-console
|
|
24
|
+
console.log(styleText('blue', '[info]'), message);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
error(message: unknown) {
|
|
28
|
-
//
|
|
29
|
-
console.error(
|
|
28
|
+
// oxlint-disable-next-line no-console
|
|
29
|
+
console.error(styleText('red', '[error]'), message);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { symlink } from 'fs/promises';
|
|
1
|
+
import { symlink } from 'node:fs/promises';
|
|
2
2
|
import type { RunnerOptions, Watcher } from '../runner.js';
|
|
3
3
|
import { run } from '../runner.js';
|
|
4
4
|
import { createFixtures, getFixturePath, waitForAsyncTask } from '../test-util/util.js';
|
|
@@ -10,7 +10,6 @@ const defaultOptions: RunnerOptions = {
|
|
|
10
10
|
logLevel: 'silent',
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
14
13
|
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
15
14
|
|
|
16
15
|
// Exit the watcher even if the test fails
|
|
@@ -29,5 +28,5 @@ it('issue-168', async () => {
|
|
|
29
28
|
await symlink(getFixturePath('/test/non-css-file.txt'), getFixturePath('/test/symlink.txt'));
|
|
30
29
|
watcher = await run({ ...defaultOptions, watch: true });
|
|
31
30
|
await waitForAsyncTask(300); // Wait for initial code generation to complete
|
|
32
|
-
expect(consoleErrorSpy).not.
|
|
31
|
+
expect(consoleErrorSpy).not.toHaveBeenCalled(); // If an error is output, then failed
|
|
33
32
|
});
|