From c1a514ab476a734dbb5c7160ac2139de6debc2d6 Mon Sep 17 00:00:00 2001 From: mizdra Date: Mon, 4 Aug 2025 23:48:36 +0900 Subject: [PATCH 1/4] change `fakeToken` interface --- packages/core/src/export-builder.test.ts | 34 ++++++++++++------------ packages/core/src/test/token.ts | 4 +-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/core/src/export-builder.test.ts b/packages/core/src/export-builder.test.ts index 672d2adc..320b921e 100644 --- a/packages/core/src/export-builder.test.ts +++ b/packages/core/src/export-builder.test.ts @@ -16,7 +16,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.css'), - localTokens: [fakeToken('a_1')], + localTokens: [fakeToken({ name: 'a_1' })], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` { @@ -32,12 +32,12 @@ describe('ExportBuilder', () => { if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), - localTokens: [fakeToken('b_1')], + localTokens: [fakeToken({ name: 'b_1' })], }); } else if (path === resolve('/c.module.css')) { return fakeCSSModule({ fileName: resolve('/c.module.css'), - localTokens: [fakeToken('c_1'), fakeToken('c_2')], + localTokens: [fakeToken({ name: 'c_1' }), fakeToken({ name: 'c_2' })], }); } else { return undefined; @@ -52,7 +52,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], + localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [ fakeAtImportTokenImporter('./b.module.css'), fakeAtValueTokenImporter('./c.module.css', ['c_1']), @@ -74,13 +74,13 @@ describe('ExportBuilder', () => { if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), - localTokens: [fakeToken('b_1')], + localTokens: [fakeToken({ name: 'b_1' })], tokenImporters: [fakeAtImportTokenImporter('./c.module.css')], }); } else if (path === resolve('/c.module.css')) { return fakeCSSModule({ fileName: resolve('/c.module.css'), - localTokens: [fakeToken('c_1')], + localTokens: [fakeToken({ name: 'c_1' })], }); } else { return undefined; @@ -95,7 +95,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], + localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` @@ -165,7 +165,7 @@ describe('ExportBuilder', () => { if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), - localTokens: [fakeToken('b_1')], + localTokens: [fakeToken({ name: 'b_1' })], }); } return undefined; @@ -175,7 +175,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], + localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], }); @@ -212,7 +212,7 @@ describe('ExportBuilder', () => { if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), - localTokens: [fakeToken('b_1')], + localTokens: [fakeToken({ name: 'b_1' })], }); } return undefined; @@ -222,7 +222,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], + localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], }); @@ -246,7 +246,7 @@ describe('ExportBuilder', () => { if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), - localTokens: [fakeToken('b_1')], + localTokens: [fakeToken({ name: 'b_1' })], }); } return undefined; @@ -256,12 +256,12 @@ describe('ExportBuilder', () => { }); const moduleA = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], + localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], }); const moduleC = fakeCSSModule({ fileName: resolve('/c.module.css'), - localTokens: [fakeToken('c_1')], + localTokens: [fakeToken({ name: 'c_1' })], tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], }); @@ -284,13 +284,13 @@ describe('ExportBuilder', () => { if (path === resolve('/a.module.css')) { return fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], + localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], }); } else if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), - localTokens: [fakeToken('b_1')], + localTokens: [fakeToken({ name: 'b_1' })], tokenImporters: [fakeAtImportTokenImporter('./a.module.css')], }); } @@ -301,7 +301,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], + localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], }); diff --git a/packages/core/src/test/token.ts b/packages/core/src/test/token.ts index 6d3e4c65..0a857d72 100644 --- a/packages/core/src/test/token.ts +++ b/packages/core/src/test/token.ts @@ -2,8 +2,8 @@ import type { AtImportTokenImporter, AtValueTokenImporter, Token } from '../type const fakeLoc = { start: { line: 1, column: 1, offset: 0 }, end: { line: 1, column: 1, offset: 0 } }; -export function fakeToken(name: string): Token { - return { name, loc: fakeLoc }; +export function fakeToken(args?: Partial): Token { + return { name: 'name', loc: fakeLoc, ...args }; } export function fakeAtImportTokenImporter(from: string): AtImportTokenImporter { From f9c9a5255374ba76da15e839757e7b60e03ccb37 Mon Sep 17 00:00:00 2001 From: mizdra Date: Mon, 4 Aug 2025 23:57:58 +0900 Subject: [PATCH 2/4] update eslint ignore file list --- eslint.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint.config.js b/eslint.config.js index 74630930..74c58e1f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,7 +2,7 @@ import mizdra from '@mizdra/eslint-config-mizdra'; /** @type {import('eslint').Linter.Config[]} */ export default [ - { ignores: ['**/dist', 'examples'] }, + { ignores: ['**/dist', 'examples', 'crates', 'target', '.vscode-test'] }, ...mizdra.baseConfigs, ...mizdra.typescriptConfigs, ...mizdra.nodeConfigs, From 42534c80857a7dc4103929a04deee8477d8cd437 Mon Sep 17 00:00:00 2001 From: mizdra Date: Tue, 5 Aug 2025 00:00:45 +0900 Subject: [PATCH 3/4] change `fakeAtImportTokenImporter` interface --- packages/core/src/checker.test.ts | 6 +++--- packages/core/src/export-builder.test.ts | 26 ++++++++++++------------ packages/core/src/test/token.ts | 5 +++-- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/core/src/checker.test.ts b/packages/core/src/checker.test.ts index 44ca57f3..f3bab0fa 100644 --- a/packages/core/src/checker.test.ts +++ b/packages/core/src/checker.test.ts @@ -12,7 +12,7 @@ describe('checkCSSModule', () => { const cssModule = fakeCSSModule({ fileName: '/a.module.css', tokenImporters: [ - fakeAtImportTokenImporter('./b.module.css'), + fakeAtImportTokenImporter({ from: './b.module.css' }), fakeAtValueTokenImporter('./c.module.css', ['c_1']), ], }); @@ -87,7 +87,7 @@ describe('checkCSSModule', () => { test('ignore token importers for unresolvable modules', () => { const cssModule = fakeCSSModule({ fileName: '/a.module.css', - tokenImporters: [fakeAtImportTokenImporter('./unresolvable.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './unresolvable.module.css' })], }); const exportBuilder: ExportBuilder = { build: () => ({ allTokens: [] }), @@ -103,7 +103,7 @@ describe('checkCSSModule', () => { const cssModule = fakeCSSModule({ fileName: '/a.module.css', tokenImporters: [ - fakeAtImportTokenImporter('./b.module.css'), + fakeAtImportTokenImporter({ from: './b.module.css' }), fakeAtValueTokenImporter('./c.module.css', ['c_1']), ], }); diff --git a/packages/core/src/export-builder.test.ts b/packages/core/src/export-builder.test.ts index 320b921e..777f8d4f 100644 --- a/packages/core/src/export-builder.test.ts +++ b/packages/core/src/export-builder.test.ts @@ -54,7 +54,7 @@ describe('ExportBuilder', () => { fileName: resolve('/a.module.css'), localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [ - fakeAtImportTokenImporter('./b.module.css'), + fakeAtImportTokenImporter({ from: './b.module.css' }), fakeAtValueTokenImporter('./c.module.css', ['c_1']), ], }); @@ -75,7 +75,7 @@ describe('ExportBuilder', () => { return fakeCSSModule({ fileName: resolve('/b.module.css'), localTokens: [fakeToken({ name: 'b_1' })], - tokenImporters: [fakeAtImportTokenImporter('./c.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './c.module.css' })], }); } else if (path === resolve('/c.module.css')) { return fakeCSSModule({ @@ -96,7 +96,7 @@ describe('ExportBuilder', () => { const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), localTokens: [fakeToken({ name: 'a_1' })], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` { @@ -116,7 +116,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - tokenImporters: [fakeAtImportTokenImporter('./unresolvable.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './unresolvable.module.css' })], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` { @@ -132,7 +132,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` { @@ -148,7 +148,7 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - tokenImporters: [fakeAtImportTokenImporter('./non-existing.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './non-existing.module.css' })], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` { @@ -176,7 +176,7 @@ describe('ExportBuilder', () => { const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), localTokens: [fakeToken({ name: 'a_1' })], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); // First build should call getCSSModule @@ -223,7 +223,7 @@ describe('ExportBuilder', () => { const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), localTokens: [fakeToken({ name: 'a_1' })], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); // First build @@ -257,12 +257,12 @@ describe('ExportBuilder', () => { const moduleA = fakeCSSModule({ fileName: resolve('/a.module.css'), localTokens: [fakeToken({ name: 'a_1' })], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); const moduleC = fakeCSSModule({ fileName: resolve('/c.module.css'), localTokens: [fakeToken({ name: 'c_1' })], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); // Build moduleA @@ -285,13 +285,13 @@ describe('ExportBuilder', () => { return fakeCSSModule({ fileName: resolve('/a.module.css'), localTokens: [fakeToken({ name: 'a_1' })], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); } else if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), localTokens: [fakeToken({ name: 'b_1' })], - tokenImporters: [fakeAtImportTokenImporter('./a.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './a.module.css' })], }); } return undefined; @@ -302,7 +302,7 @@ describe('ExportBuilder', () => { const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), localTokens: [fakeToken({ name: 'a_1' })], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); // Should not cause infinite recursion diff --git a/packages/core/src/test/token.ts b/packages/core/src/test/token.ts index 0a857d72..d2ab1c86 100644 --- a/packages/core/src/test/token.ts +++ b/packages/core/src/test/token.ts @@ -6,11 +6,12 @@ export function fakeToken(args?: Partial): Token { return { name: 'name', loc: fakeLoc, ...args }; } -export function fakeAtImportTokenImporter(from: string): AtImportTokenImporter { +export function fakeAtImportTokenImporter(args?: Omit, 'type'>): AtImportTokenImporter { return { type: 'import', - from, + from: '/test.module.css', fromLoc: fakeLoc, + ...args, }; } From 254accc61bf2ba56a406e9ea5088544031a5fd40 Mon Sep 17 00:00:00 2001 From: mizdra Date: Tue, 5 Aug 2025 00:07:04 +0900 Subject: [PATCH 4/4] change `fakeAtValueTokenImporter` interface --- packages/core/src/checker.test.ts | 13 +++++++++---- packages/core/src/export-builder.test.ts | 9 +++++++-- packages/core/src/test/token.ts | 17 +++++++++++++---- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/packages/core/src/checker.test.ts b/packages/core/src/checker.test.ts index f3bab0fa..de1bbbc5 100644 --- a/packages/core/src/checker.test.ts +++ b/packages/core/src/checker.test.ts @@ -2,7 +2,7 @@ import { describe, expect, test } from 'vitest'; import { checkCSSModule } from './checker.js'; import { createResolver } from './resolver.js'; import { fakeCSSModule } from './test/css-module.js'; -import { fakeAtImportTokenImporter, fakeAtValueTokenImporter } from './test/token.js'; +import { fakeAtImportTokenImporter, fakeAtValueTokenImporter, fakeAtValueTokenImporterValue } from './test/token.js'; import type { ExportBuilder } from './type.js'; const resolver = createResolver({}, undefined); @@ -13,7 +13,7 @@ describe('checkCSSModule', () => { fileName: '/a.module.css', tokenImporters: [ fakeAtImportTokenImporter({ from: './b.module.css' }), - fakeAtValueTokenImporter('./c.module.css', ['c_1']), + fakeAtValueTokenImporter({ from: './c.module.css', values: [fakeAtValueTokenImporterValue({ name: 'c_1' })] }), ], }); const exportBuilder: ExportBuilder = { @@ -57,7 +57,12 @@ describe('checkCSSModule', () => { test('report diagnostics for non-exported token', () => { const cssModule = fakeCSSModule({ fileName: '/a.module.css', - tokenImporters: [fakeAtValueTokenImporter('./b.module.css', ['b_1', 'b_2'])], + tokenImporters: [ + fakeAtValueTokenImporter({ + from: './b.module.css', + values: [fakeAtValueTokenImporterValue({ name: 'b_1' }), fakeAtValueTokenImporterValue({ name: 'b_2' })], + }), + ], }); const exportBuilder: ExportBuilder = { build: () => ({ allTokens: ['b_1'] }), @@ -104,7 +109,7 @@ describe('checkCSSModule', () => { fileName: '/a.module.css', tokenImporters: [ fakeAtImportTokenImporter({ from: './b.module.css' }), - fakeAtValueTokenImporter('./c.module.css', ['c_1']), + fakeAtValueTokenImporter({ from: './c.module.css', values: [fakeAtValueTokenImporterValue({ name: 'c_1' })] }), ], }); const exportBuilder: ExportBuilder = { diff --git a/packages/core/src/export-builder.test.ts b/packages/core/src/export-builder.test.ts index 777f8d4f..7b6e67c3 100644 --- a/packages/core/src/export-builder.test.ts +++ b/packages/core/src/export-builder.test.ts @@ -3,7 +3,12 @@ import { createExportBuilder } from './export-builder.js'; import { resolve } from './path.js'; import { createResolver } from './resolver.js'; import { fakeCSSModule } from './test/css-module.js'; -import { fakeAtImportTokenImporter, fakeAtValueTokenImporter, fakeToken } from './test/token.js'; +import { + fakeAtImportTokenImporter, + fakeAtValueTokenImporter, + fakeAtValueTokenImporterValue, + fakeToken, +} from './test/token.js'; const resolver = createResolver({}, undefined); @@ -55,7 +60,7 @@ describe('ExportBuilder', () => { localTokens: [fakeToken({ name: 'a_1' })], tokenImporters: [ fakeAtImportTokenImporter({ from: './b.module.css' }), - fakeAtValueTokenImporter('./c.module.css', ['c_1']), + fakeAtValueTokenImporter({ from: './c.module.css', values: [fakeAtValueTokenImporterValue({ name: 'c_1' })] }), ], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` diff --git a/packages/core/src/test/token.ts b/packages/core/src/test/token.ts index d2ab1c86..2a8b0c78 100644 --- a/packages/core/src/test/token.ts +++ b/packages/core/src/test/token.ts @@ -1,4 +1,4 @@ -import type { AtImportTokenImporter, AtValueTokenImporter, Token } from '../type.js'; +import type { AtImportTokenImporter, AtValueTokenImporter, AtValueTokenImporterValue, Token } from '../type.js'; const fakeLoc = { start: { line: 1, column: 1, offset: 0 }, end: { line: 1, column: 1, offset: 0 } }; @@ -15,11 +15,20 @@ export function fakeAtImportTokenImporter(args?: Omit, 'type'>): AtValueTokenImporter { return { type: 'value', - from, - values: valueNames.map((name) => ({ name, loc: fakeLoc })), + from: '/test.module.css', + values: [], fromLoc: fakeLoc, + ...args, + }; +} + +export function fakeAtValueTokenImporterValue(args?: Partial): AtValueTokenImporterValue { + return { + name: 'name', + loc: fakeLoc, + ...args, }; }