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, diff --git a/packages/core/src/checker.test.ts b/packages/core/src/checker.test.ts index 44ca57f3..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); @@ -12,8 +12,8 @@ describe('checkCSSModule', () => { const cssModule = fakeCSSModule({ fileName: '/a.module.css', tokenImporters: [ - fakeAtImportTokenImporter('./b.module.css'), - fakeAtValueTokenImporter('./c.module.css', ['c_1']), + fakeAtImportTokenImporter({ from: './b.module.css' }), + 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'] }), @@ -87,7 +92,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,8 +108,8 @@ describe('checkCSSModule', () => { const cssModule = fakeCSSModule({ fileName: '/a.module.css', tokenImporters: [ - fakeAtImportTokenImporter('./b.module.css'), - fakeAtValueTokenImporter('./c.module.css', ['c_1']), + fakeAtImportTokenImporter({ from: './b.module.css' }), + 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 672d2adc..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); @@ -16,7 +21,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 +37,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,10 +57,10 @@ 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']), + fakeAtImportTokenImporter({ from: './b.module.css' }), + fakeAtValueTokenImporter({ from: './c.module.css', values: [fakeAtValueTokenImporterValue({ name: 'c_1' })] }), ], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` @@ -74,13 +79,13 @@ describe('ExportBuilder', () => { if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), - localTokens: [fakeToken('b_1')], - tokenImporters: [fakeAtImportTokenImporter('./c.module.css')], + localTokens: [fakeToken({ name: 'b_1' })], + tokenImporters: [fakeAtImportTokenImporter({ from: './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,8 +100,8 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + localTokens: [fakeToken({ name: 'a_1' })], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); expect(exportBuilder.build(cssModule)).toMatchInlineSnapshot(` { @@ -116,7 +121,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 +137,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 +153,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(` { @@ -165,7 +170,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,8 +180,8 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + localTokens: [fakeToken({ name: 'a_1' })], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); // First build should call getCSSModule @@ -212,7 +217,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,8 +227,8 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + localTokens: [fakeToken({ name: 'a_1' })], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); // First build @@ -246,7 +251,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,13 +261,13 @@ describe('ExportBuilder', () => { }); const moduleA = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + localTokens: [fakeToken({ name: 'a_1' })], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); const moduleC = fakeCSSModule({ fileName: resolve('/c.module.css'), - localTokens: [fakeToken('c_1')], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + localTokens: [fakeToken({ name: 'c_1' })], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); // Build moduleA @@ -284,14 +289,14 @@ describe('ExportBuilder', () => { if (path === resolve('/a.module.css')) { return fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + localTokens: [fakeToken({ name: 'a_1' })], + tokenImporters: [fakeAtImportTokenImporter({ from: './b.module.css' })], }); } else if (path === resolve('/b.module.css')) { return fakeCSSModule({ fileName: resolve('/b.module.css'), - localTokens: [fakeToken('b_1')], - tokenImporters: [fakeAtImportTokenImporter('./a.module.css')], + localTokens: [fakeToken({ name: 'b_1' })], + tokenImporters: [fakeAtImportTokenImporter({ from: './a.module.css' })], }); } return undefined; @@ -301,8 +306,8 @@ describe('ExportBuilder', () => { }); const cssModule = fakeCSSModule({ fileName: resolve('/a.module.css'), - localTokens: [fakeToken('a_1')], - tokenImporters: [fakeAtImportTokenImporter('./b.module.css')], + localTokens: [fakeToken({ name: 'a_1' })], + 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 6d3e4c65..2a8b0c78 100644 --- a/packages/core/src/test/token.ts +++ b/packages/core/src/test/token.ts @@ -1,24 +1,34 @@ -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 } }; -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 { +export function fakeAtImportTokenImporter(args?: Omit, 'type'>): AtImportTokenImporter { return { type: 'import', - from, + from: '/test.module.css', fromLoc: fakeLoc, + ...args, }; } -export function fakeAtValueTokenImporter(from: string, valueNames: string[]): AtValueTokenImporter { +export function fakeAtValueTokenImporter(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, }; }