diff --git a/.changeset/salty-hornets-add.md b/.changeset/salty-hornets-add.md new file mode 100644 index 00000000..7ca905f4 --- /dev/null +++ b/.changeset/salty-hornets-add.md @@ -0,0 +1,6 @@ +--- +'@css-modules-kit/core': minor +'@css-modules-kit/ts-plugin': patch +--- + +refactor: consolidate `checkCSSModule` arguments into `CheckerArgs` diff --git a/packages/codegen/src/project.ts b/packages/codegen/src/project.ts index 8810ea57..8be10b0f 100644 --- a/packages/codegen/src/project.ts +++ b/packages/codegen/src/project.ts @@ -191,7 +191,13 @@ export function createProject(args: ProjectArgs): Project { for (const cssModule of cssModuleMap.values()) { let diagnostics = semanticDiagnosticsMap.get(cssModule.fileName); if (!diagnostics) { - diagnostics = checkCSSModule(cssModule, config, exportBuilder, matchesPattern, resolver, getCSSModule); + diagnostics = checkCSSModule(cssModule, { + config, + getExportRecord: (m) => exportBuilder.build(m), + matchesPattern, + resolver, + getCSSModule, + }); semanticDiagnosticsMap.set(cssModule.fileName, diagnostics); } allDiagnostics.push(...diagnostics); diff --git a/packages/core/src/checker.test.ts b/packages/core/src/checker.test.ts index 5c5877ae..e7d8d289 100644 --- a/packages/core/src/checker.test.ts +++ b/packages/core/src/checker.test.ts @@ -1,5 +1,6 @@ import dedent from 'dedent'; import { describe, expect, test } from 'vitest'; +import type { CheckerArgs } from './checker.js'; import { checkCSSModule } from './checker.js'; import { createExportBuilder } from './export-builder.js'; import { createResolver } from './resolver.js'; @@ -14,29 +15,23 @@ const matchesPattern = (path: string) => path.endsWith('.module.css'); type Checker = (cssModule: CSSModule) => ReturnType; -interface PrepareCheckerOptions { - config?: ReturnType; - resolver?: typeof resolver; - matchesPattern?: typeof matchesPattern; -} - -function prepareChecker(options?: PrepareCheckerOptions): Checker { - const config = options?.config ?? fakeConfig(); - const resolverFn = options?.resolver ?? resolver; - const matchesPatternFn = options?.matchesPattern ?? matchesPattern; +function prepareChecker(args?: Partial): Checker { + const config = args?.config ?? fakeConfig(); + const resolverFn = args?.resolver ?? resolver; + const matchesPatternFn = args?.matchesPattern ?? matchesPattern; + const exportBuilder = createExportBuilder({ + getCSSModule: readAndParseCSSModule, + matchesPattern: matchesPatternFn, + resolver: resolverFn, + }); return (cssModule: CSSModule) => { - return checkCSSModule( - cssModule, + return checkCSSModule(cssModule, { config, - createExportBuilder({ - getCSSModule: readAndParseCSSModule, - matchesPattern: matchesPatternFn, - resolver: resolverFn, - }), - matchesPatternFn, - resolverFn, - readAndParseCSSModule, - ); + getExportRecord: (m) => exportBuilder.build(m), + matchesPattern: matchesPatternFn, + resolver: resolverFn, + getCSSModule: readAndParseCSSModule, + }); }; } diff --git a/packages/core/src/checker.ts b/packages/core/src/checker.ts index d23cd89e..7c545246 100644 --- a/packages/core/src/checker.ts +++ b/packages/core/src/checker.ts @@ -4,7 +4,7 @@ import type { AtValueTokenImporterValue, CSSModule, Diagnostic, - ExportBuilder, + ExportRecord, Location, MatchesPattern, Resolver, @@ -12,15 +12,17 @@ import type { } from './type.js'; import { isValidAsJSIdentifier } from './util.js'; -// eslint-disable-next-line max-params, complexity -export function checkCSSModule( - cssModule: CSSModule, - config: CMKConfig, - exportBuilder: ExportBuilder, - matchesPattern: MatchesPattern, - resolver: Resolver, - getCSSModule: (path: string) => CSSModule | undefined, -): Diagnostic[] { +export interface CheckerArgs { + config: CMKConfig; + getExportRecord: (cssModule: CSSModule) => ExportRecord; + matchesPattern: MatchesPattern; + resolver: Resolver; + getCSSModule: (path: string) => CSSModule | undefined; +} + +// eslint-disable-next-line complexity +export function checkCSSModule(cssModule: CSSModule, args: CheckerArgs): Diagnostic[] { + const { config } = args; const diagnostics: Diagnostic[] = []; for (const token of cssModule.localTokens) { @@ -37,16 +39,16 @@ export function checkCSSModule( } for (const tokenImporter of cssModule.tokenImporters) { - const from = resolver(tokenImporter.from, { request: cssModule.fileName }); - if (!from || !matchesPattern(from)) continue; - const imported = getCSSModule(from); + const from = args.resolver(tokenImporter.from, { request: cssModule.fileName }); + if (!from || !args.matchesPattern(from)) continue; + const imported = args.getCSSModule(from); if (!imported) { diagnostics.push(createCannotImportModuleDiagnostic(cssModule, tokenImporter)); continue; } if (tokenImporter.type === 'value') { - const exportRecord = exportBuilder.build(imported); + const exportRecord = args.getExportRecord(imported); for (const value of tokenImporter.values) { if (!exportRecord.allTokens.includes(value.name)) { diagnostics.push(createModuleHasNoExportedTokenDiagnostic(cssModule, tokenImporter, value)); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c7e0c119..cd93577d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -15,6 +15,7 @@ export { type Resolver, type MatchesPattern, type ExportBuilder, + type ExportRecord, type DiagnosticSourceFile, type Diagnostic, type DiagnosticWithLocation, @@ -33,7 +34,7 @@ export { createMatchesPattern, getFileNamesByPattern, } from './file.js'; -export { checkCSSModule } from './checker.js'; +export { checkCSSModule, type CheckerArgs } from './checker.js'; export { createExportBuilder } from './export-builder.js'; export { join, resolve, relative, dirname, basename, parse, isAbsolute } from './path.js'; export { findUsedTokenNames } from './util.js'; diff --git a/packages/ts-plugin/src/language-service/feature/semantic-diagnostic.ts b/packages/ts-plugin/src/language-service/feature/semantic-diagnostic.ts index 520f917a..1cb8cc87 100644 --- a/packages/ts-plugin/src/language-service/feature/semantic-diagnostic.ts +++ b/packages/ts-plugin/src/language-service/feature/semantic-diagnostic.ts @@ -25,7 +25,13 @@ export function getSemanticDiagnostics( // Clear cache to update export records for all files exportBuilder.clearCache(); - const diagnostics = checkCSSModule(cssModule, config, exportBuilder, matchesPattern, resolver, getCSSModule); + const diagnostics = checkCSSModule(cssModule, { + config, + getExportRecord: (m) => exportBuilder.build(m), + matchesPattern, + resolver, + getCSSModule, + }); const sourceFile = languageService.getProgram()!.getSourceFile(fileName)!; const tsDiagnostics = diagnostics.map((diagnostic) => convertDiagnostic(diagnostic, () => sourceFile)); prior.push(...tsDiagnostics);