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.
Files changed (114) hide show
  1. package/LICENSE.txt +23 -0
  2. package/README.md +307 -2
  3. package/bin/hcm.js +1 -1
  4. package/dist/cli.d.ts +0 -4
  5. package/dist/cli.js +111 -118
  6. package/dist/cli.js.map +1 -1
  7. package/dist/emitter/dts.js +3 -4
  8. package/dist/emitter/dts.js.map +1 -1
  9. package/dist/emitter/dts.test.js +12 -12
  10. package/dist/emitter/file-system.js +2 -2
  11. package/dist/emitter/file-system.js.map +1 -1
  12. package/dist/emitter/file-system.test.js +1 -1
  13. package/dist/emitter/file-system.test.js.map +1 -1
  14. package/dist/emitter/index.js +1 -1
  15. package/dist/emitter/index.js.map +1 -1
  16. package/dist/emitter/index.test.js +1 -2
  17. package/dist/emitter/index.test.js.map +1 -1
  18. package/dist/emitter/source-map.js +1 -1
  19. package/dist/emitter/source-map.js.map +1 -1
  20. package/dist/emitter/source-map.test.js +1 -1
  21. package/dist/emitter/source-map.test.js.map +1 -1
  22. package/dist/integration-test/go-to-definition.test.js +403 -105
  23. package/dist/integration-test/go-to-definition.test.js.map +1 -1
  24. package/dist/locator/index.js +10 -8
  25. package/dist/locator/index.js.map +1 -1
  26. package/dist/locator/index.test.js +303 -169
  27. package/dist/locator/index.test.js.map +1 -1
  28. package/dist/locator/postcss.js +2 -3
  29. package/dist/locator/postcss.js.map +1 -1
  30. package/dist/locator/postcss.test.js +317 -73
  31. package/dist/locator/postcss.test.js.map +1 -1
  32. package/dist/logger.js +7 -6
  33. package/dist/logger.js.map +1 -1
  34. package/dist/regression-test/issue-168.test.js +2 -3
  35. package/dist/regression-test/issue-168.test.js.map +1 -1
  36. package/dist/resolver/index.d.ts +1 -1
  37. package/dist/resolver/index.js +3 -3
  38. package/dist/resolver/index.js.map +1 -1
  39. package/dist/resolver/node-resolver.js +1 -1
  40. package/dist/resolver/node-resolver.js.map +1 -1
  41. package/dist/resolver/relative-resolver.js +1 -1
  42. package/dist/resolver/relative-resolver.js.map +1 -1
  43. package/dist/resolver/webpack-resolver.d.ts +1 -1
  44. package/dist/resolver/webpack-resolver.js +4 -4
  45. package/dist/resolver/webpack-resolver.js.map +1 -1
  46. package/dist/runner.js +50 -18
  47. package/dist/runner.js.map +1 -1
  48. package/dist/runner.test.js +47 -32
  49. package/dist/runner.test.js.map +1 -1
  50. package/dist/test-util/line-column.d.ts +9 -0
  51. package/dist/test-util/line-column.js +16 -0
  52. package/dist/test-util/line-column.js.map +1 -0
  53. package/dist/test-util/line-column.test.d.ts +1 -0
  54. package/dist/test-util/line-column.test.js +21 -0
  55. package/dist/test-util/line-column.test.js.map +1 -0
  56. package/dist/test-util/tsserver.js +11 -12
  57. package/dist/test-util/tsserver.js.map +1 -1
  58. package/dist/test-util/util.d.ts +6 -0
  59. package/dist/test-util/util.js +22 -5
  60. package/dist/test-util/util.js.map +1 -1
  61. package/dist/transformer/index.js +1 -1
  62. package/dist/transformer/index.js.map +1 -1
  63. package/dist/transformer/index.test.js +17 -17
  64. package/dist/transformer/index.test.js.map +1 -1
  65. package/dist/transformer/less-transformer.js +4 -4
  66. package/dist/transformer/less-transformer.js.map +1 -1
  67. package/dist/transformer/less-transformer.test.js +75 -49
  68. package/dist/transformer/less-transformer.test.js.map +1 -1
  69. package/dist/transformer/postcss-transformer.test.js +56 -50
  70. package/dist/transformer/postcss-transformer.test.js.map +1 -1
  71. package/dist/transformer/scss-transformer.js +0 -1
  72. package/dist/transformer/scss-transformer.js.map +1 -1
  73. package/dist/transformer/scss-transformer.test.js +105 -52
  74. package/dist/transformer/scss-transformer.test.js.map +1 -1
  75. package/dist/util.js +6 -8
  76. package/dist/util.js.map +1 -1
  77. package/dist/util.test.js +2 -2
  78. package/dist/util.test.js.map +1 -1
  79. package/package.json +58 -34
  80. package/src/cli.ts +119 -117
  81. package/src/emitter/dts.test.ts +12 -12
  82. package/src/emitter/dts.ts +25 -26
  83. package/src/emitter/file-system.test.ts +1 -1
  84. package/src/emitter/file-system.ts +2 -2
  85. package/src/emitter/index.test.ts +1 -2
  86. package/src/emitter/index.ts +1 -1
  87. package/src/emitter/source-map.test.ts +1 -1
  88. package/src/emitter/source-map.ts +1 -1
  89. package/src/integration-test/go-to-definition.test.ts +405 -105
  90. package/src/locator/index.test.ts +303 -169
  91. package/src/locator/index.ts +6 -6
  92. package/src/locator/postcss.test.ts +317 -73
  93. package/src/locator/postcss.ts +2 -3
  94. package/src/logger.ts +6 -6
  95. package/src/regression-test/issue-168.test.ts +2 -3
  96. package/src/resolver/index.ts +4 -4
  97. package/src/resolver/node-resolver.ts +1 -1
  98. package/src/resolver/relative-resolver.ts +1 -1
  99. package/src/resolver/webpack-resolver.ts +5 -5
  100. package/src/runner.test.ts +54 -32
  101. package/src/runner.ts +51 -19
  102. package/src/test-util/line-column.test.ts +21 -0
  103. package/src/test-util/line-column.ts +15 -0
  104. package/src/test-util/tsserver.ts +11 -12
  105. package/src/test-util/util.ts +23 -5
  106. package/src/transformer/index.test.ts +17 -17
  107. package/src/transformer/index.ts +1 -1
  108. package/src/transformer/less-transformer.test.ts +73 -45
  109. package/src/transformer/less-transformer.ts +1 -3
  110. package/src/transformer/postcss-transformer.test.ts +56 -50
  111. package/src/transformer/scss-transformer.test.ts +107 -52
  112. package/src/transformer/scss-transformer.ts +0 -1
  113. package/src/util.test.ts +2 -2
  114. package/src/util.ts +6 -8
@@ -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
- // eslint-disable-next-line no-await-in-loop
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
- // eslint-disable-next-line no-await-in-loop
162
+ // oxlint-disable-next-line no-await-in-loop
163
163
  const from = await this.resolver(importedSheetPath, { request: filePath });
164
- // eslint-disable-next-line no-await-in-loop
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
- // eslint-disable-next-line no-await-in-loop
195
+ // oxlint-disable-next-line no-await-in-loop
196
196
  const from = await this.resolver(parsedAtValue.from, { request: filePath });
197
- // eslint-disable-next-line no-await-in-loop
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
- .a {}
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
- .a {}
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
- .b {}
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
- .basic {}
117
+ .basic {}
118
118
  `),
119
119
  );
120
120
  expect(getOriginalLocationOfClassSelector(basic!.rule, basic!.classSelector)).toMatchInlineSnapshot(
121
- `{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 6 } }`,
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
- .cascading {}
129
- .cascading {}
139
+ .cascading {}
140
+ .cascading {}
130
141
  `),
131
142
  );
132
143
  expect(getOriginalLocationOfClassSelector(cascading_1!.rule, cascading_1!.classSelector)).toMatchInlineSnapshot(
133
- `{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 10 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 10 } }`,
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
- .pseudo_class_1 {}
144
- .pseudo_class_2:hover {}
145
- :not(.pseudo_class_3) {}
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
- `{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 15 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 15 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 3, column: 6 }, end: { line: 3, column: 20 } }`,
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
- .multiple_selector_1.multiple_selector_2 {}
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
- `{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 20 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 1, column: 21 }, end: { line: 1, column: 40 } }`,
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
- .combinator_1 + .combinator_2 {}
279
+ .combinator_1 + .combinator_2 {}
188
280
  `),
189
281
  );
190
282
  expect(getOriginalLocationOfClassSelector(combinator_1!.rule, combinator_1!.classSelector)).toMatchInlineSnapshot(
191
- `{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 13 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 1, column: 17 }, end: { line: 1, column: 29 } }`,
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
- @supports (display: flex) {
202
- @media screen and (min-width: 900px) {
203
- .at_rule {}
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
- `{ filePath: "/test/test.css", start: { line: 3, column: 5 }, end: { line: 3, column: 12 } }`,
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
- .selector_list_1, .selector_list_2 {}
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
- `{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 16 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 1, column: 19 }, end: { line: 1, column: 34 } }`,
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
- :local .local_class_name_1 {}
235
- :local {
236
- .local_class_name_2 {}
237
- .local_class_name_3 {}
238
- }
239
- :local(.local_class_name_4) {}
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
- `{ filePath: "/test/test.css", start: { line: 1, column: 8 }, end: { line: 1, column: 26 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 3, column: 3 }, end: { line: 3, column: 21 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 4, column: 3 }, end: { line: 4, column: 21 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 6, column: 8 }, end: { line: 6, column: 26 } }`,
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
- .with_newline_1,
268
- .with_newline_2
269
- + .with_newline_3, {}
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
- `{ filePath: "/test/test.css", start: { line: 1, column: 1 }, end: { line: 1, column: 15 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 2, column: 1 }, end: { line: 2, column: 15 } }`,
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
- `{ filePath: "/test/test.css", start: { line: 3, column: 5 }, end: { line: 3, column: 19 } }`,
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
- @value basic: #000;
534
+ @value basic: #000;
303
535
  `),
304
536
  );
305
537
  expect(tryGetOriginalLocationOfAtValue(basic!)).toMatchInlineSnapshot(
306
- `{ filePath: "/test/test.css", start: { line: 1, column: 8 }, end: { line: 1, column: 13 } }`,
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
- @import;
335
- @import "test.css";
336
- @import url("test.css");
337
- @import url(test.css);
338
- @import "test.css" print;
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
- @value basic: #000;
352
- @value withoutColon #000;
353
- @value empty:;
354
- @value comment:/* comment */;
355
- @value complex: (max-width: 599px);
356
- @value import from "test.css";
357
- @value import1, import2 from "test.css";
358
- @value import as alias from "test.css";
359
- /*
360
- * NOTE: happy-css-modules intentionally does not support module specifier as variable.
361
- * e.g. \`@value d, e from moduleName;\`
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' });
@@ -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
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
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
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
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 chalk from 'chalk';
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
- // eslint-disable-next-line no-console
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
- // eslint-disable-next-line no-console
24
- console.log(chalk.blue('[info]'), message);
23
+ // oxlint-disable-next-line no-console
24
+ console.log(styleText('blue', '[info]'), message);
25
25
  }
26
26
  }
27
27
  error(message: unknown) {
28
- // eslint-disable-next-line no-console
29
- console.error(chalk.red('[error]'), message);
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.toBeCalled(); // If an error is output, then failed
31
+ expect(consoleErrorSpy).not.toHaveBeenCalled(); // If an error is output, then failed
33
32
  });