Skip to content

Commit ab5cb1d

Browse files
mizdraclaude
andcommitted
refactor(core, ts-plugin): consolidate checkCSSModule arguments into CheckerArgs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent b86fbe8 commit ab5cb1d

6 files changed

Lines changed: 54 additions & 38 deletions

File tree

.changeset/salty-hornets-add.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@css-modules-kit/core': minor
3+
'@css-modules-kit/ts-plugin': patch
4+
---
5+
6+
refactor: consolidate `checkCSSModule` arguments into `CheckerArgs`

packages/codegen/src/project.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,13 @@ export function createProject(args: ProjectArgs): Project {
191191
for (const cssModule of cssModuleMap.values()) {
192192
let diagnostics = semanticDiagnosticsMap.get(cssModule.fileName);
193193
if (!diagnostics) {
194-
diagnostics = checkCSSModule(cssModule, config, exportBuilder, matchesPattern, resolver, getCSSModule);
194+
diagnostics = checkCSSModule(cssModule, {
195+
config,
196+
getExportRecord: (m) => exportBuilder.build(m),
197+
matchesPattern,
198+
resolver,
199+
getCSSModule,
200+
});
195201
semanticDiagnosticsMap.set(cssModule.fileName, diagnostics);
196202
}
197203
allDiagnostics.push(...diagnostics);

packages/core/src/checker.test.ts

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import dedent from 'dedent';
22
import { describe, expect, test } from 'vitest';
3+
import type { CheckerArgs } from './checker.js';
34
import { checkCSSModule } from './checker.js';
45
import { createExportBuilder } from './export-builder.js';
56
import { createResolver } from './resolver.js';
@@ -14,29 +15,23 @@ const matchesPattern = (path: string) => path.endsWith('.module.css');
1415

1516
type Checker = (cssModule: CSSModule) => ReturnType<typeof checkCSSModule>;
1617

17-
interface PrepareCheckerOptions {
18-
config?: ReturnType<typeof fakeConfig>;
19-
resolver?: typeof resolver;
20-
matchesPattern?: typeof matchesPattern;
21-
}
22-
23-
function prepareChecker(options?: PrepareCheckerOptions): Checker {
24-
const config = options?.config ?? fakeConfig();
25-
const resolverFn = options?.resolver ?? resolver;
26-
const matchesPatternFn = options?.matchesPattern ?? matchesPattern;
18+
function prepareChecker(args?: Partial<CheckerArgs>): Checker {
19+
const config = args?.config ?? fakeConfig();
20+
const resolverFn = args?.resolver ?? resolver;
21+
const matchesPatternFn = args?.matchesPattern ?? matchesPattern;
22+
const exportBuilder = createExportBuilder({
23+
getCSSModule: readAndParseCSSModule,
24+
matchesPattern: matchesPatternFn,
25+
resolver: resolverFn,
26+
});
2727
return (cssModule: CSSModule) => {
28-
return checkCSSModule(
29-
cssModule,
28+
return checkCSSModule(cssModule, {
3029
config,
31-
createExportBuilder({
32-
getCSSModule: readAndParseCSSModule,
33-
matchesPattern: matchesPatternFn,
34-
resolver: resolverFn,
35-
}),
36-
matchesPatternFn,
37-
resolverFn,
38-
readAndParseCSSModule,
39-
);
30+
getExportRecord: (m) => exportBuilder.build(m),
31+
matchesPattern: matchesPatternFn,
32+
resolver: resolverFn,
33+
getCSSModule: readAndParseCSSModule,
34+
});
4035
};
4136
}
4237

packages/core/src/checker.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,25 @@ import type {
44
AtValueTokenImporterValue,
55
CSSModule,
66
Diagnostic,
7-
ExportBuilder,
7+
ExportRecord,
88
Location,
99
MatchesPattern,
1010
Resolver,
1111
TokenImporter,
1212
} from './type.js';
1313
import { isValidAsJSIdentifier } from './util.js';
1414

15-
// eslint-disable-next-line max-params, complexity
16-
export function checkCSSModule(
17-
cssModule: CSSModule,
18-
config: CMKConfig,
19-
exportBuilder: ExportBuilder,
20-
matchesPattern: MatchesPattern,
21-
resolver: Resolver,
22-
getCSSModule: (path: string) => CSSModule | undefined,
23-
): Diagnostic[] {
15+
export interface CheckerArgs {
16+
config: CMKConfig;
17+
getExportRecord: (cssModule: CSSModule) => ExportRecord;
18+
matchesPattern: MatchesPattern;
19+
resolver: Resolver;
20+
getCSSModule: (path: string) => CSSModule | undefined;
21+
}
22+
23+
// eslint-disable-next-line complexity
24+
export function checkCSSModule(cssModule: CSSModule, args: CheckerArgs): Diagnostic[] {
25+
const { config } = args;
2426
const diagnostics: Diagnostic[] = [];
2527

2628
for (const token of cssModule.localTokens) {
@@ -37,16 +39,16 @@ export function checkCSSModule(
3739
}
3840

3941
for (const tokenImporter of cssModule.tokenImporters) {
40-
const from = resolver(tokenImporter.from, { request: cssModule.fileName });
41-
if (!from || !matchesPattern(from)) continue;
42-
const imported = getCSSModule(from);
42+
const from = args.resolver(tokenImporter.from, { request: cssModule.fileName });
43+
if (!from || !args.matchesPattern(from)) continue;
44+
const imported = args.getCSSModule(from);
4345
if (!imported) {
4446
diagnostics.push(createCannotImportModuleDiagnostic(cssModule, tokenImporter));
4547
continue;
4648
}
4749

4850
if (tokenImporter.type === 'value') {
49-
const exportRecord = exportBuilder.build(imported);
51+
const exportRecord = args.getExportRecord(imported);
5052
for (const value of tokenImporter.values) {
5153
if (!exportRecord.allTokens.includes(value.name)) {
5254
diagnostics.push(createModuleHasNoExportedTokenDiagnostic(cssModule, tokenImporter, value));

packages/core/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export {
1515
type Resolver,
1616
type MatchesPattern,
1717
type ExportBuilder,
18+
type ExportRecord,
1819
type DiagnosticSourceFile,
1920
type Diagnostic,
2021
type DiagnosticWithLocation,
@@ -33,7 +34,7 @@ export {
3334
createMatchesPattern,
3435
getFileNamesByPattern,
3536
} from './file.js';
36-
export { checkCSSModule } from './checker.js';
37+
export { checkCSSModule, type CheckerArgs } from './checker.js';
3738
export { createExportBuilder } from './export-builder.js';
3839
export { join, resolve, relative, dirname, basename, parse, isAbsolute } from './path.js';
3940
export { findUsedTokenNames } from './util.js';

packages/ts-plugin/src/language-service/feature/semantic-diagnostic.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ export function getSemanticDiagnostics(
2525
// Clear cache to update export records for all files
2626
exportBuilder.clearCache();
2727

28-
const diagnostics = checkCSSModule(cssModule, config, exportBuilder, matchesPattern, resolver, getCSSModule);
28+
const diagnostics = checkCSSModule(cssModule, {
29+
config,
30+
getExportRecord: (m) => exportBuilder.build(m),
31+
matchesPattern,
32+
resolver,
33+
getCSSModule,
34+
});
2935
const sourceFile = languageService.getProgram()!.getSourceFile(fileName)!;
3036
const tsDiagnostics = diagnostics.map((diagnostic) => convertDiagnostic(diagnostic, () => sourceFile));
3137
prior.push(...tsDiagnostics);

0 commit comments

Comments
 (0)