diff --git a/packages/codegen/bin/cmk.mjs b/packages/codegen/bin/cmk.mjs index 80e24f37..e2816a63 100755 --- a/packages/codegen/bin/cmk.mjs +++ b/packages/codegen/bin/cmk.mjs @@ -19,7 +19,7 @@ try { process.exit(0); } - await runCMK(args.project, args.clean, logger); + await runCMK(args, logger); } catch (e) { if (e instanceof SystemError) { logger.logSystemError(e); diff --git a/packages/codegen/src/runner.test.ts b/packages/codegen/src/runner.test.ts index 093eea46..04a35b57 100644 --- a/packages/codegen/src/runner.test.ts +++ b/packages/codegen/src/runner.test.ts @@ -4,12 +4,11 @@ import dedent from 'dedent'; import { describe, expect, test } from 'vitest'; import { ReadCSSModuleFileError } from './error.js'; import { runCMK } from './runner.js'; +import { fakeParsedArgs } from './test/faker.js'; import { createIFF } from './test/fixture.js'; import { createLoggerSpy } from './test/logger.js'; import { mockProcessExit, ProcessExitError } from './test/process.js'; -const clean = false; - function formatDiagnostic(diagnostic: Diagnostic, rootDir: string) { return { text: diagnostic.text.replace(rootDir, ''), @@ -40,7 +39,7 @@ describe('runCMK', () => { 'src/a.module.css': '.a1 { color: red; }', 'src/b.module.css': '.b1 { color: blue; }', }); - await runCMK(iff.rootDir, clean, createLoggerSpy()); + await runCMK(fakeParsedArgs({ project: iff.rootDir }), createLoggerSpy()); expect(await iff.readFile('generated/src/a.module.css.d.ts')).toMatchInlineSnapshot(` "// @ts-nocheck declare const styles = { @@ -68,7 +67,7 @@ describe('runCMK', () => { 'src/a.module.css': '.a1 { color: red; }', 'src/b.css': '.b1 { color: red; }', }); - await runCMK(iff.rootDir, clean, createLoggerSpy()); + await runCMK(fakeParsedArgs({ project: iff.rootDir }), createLoggerSpy()); await expect(access(iff.join('generated/src/a.module.css.d.ts'))).resolves.not.toThrow(); await expect(access(iff.join('generated/src/b.css.d.ts'))).rejects.toThrow(); }); @@ -83,7 +82,7 @@ describe('runCMK', () => { 'src/b.module.css': '.b1 { color: blue; }', 'src/c.css': '.c1 { color: red; }', }); - await runCMK(iff.rootDir, clean, createLoggerSpy()); + await runCMK(fakeParsedArgs({ project: iff.rootDir }), createLoggerSpy()); expect(await iff.readFile('generated/src/a.module.css.d.ts')).toMatchInlineSnapshot(` "// @ts-nocheck declare const styles = { @@ -102,7 +101,7 @@ describe('runCMK', () => { `, }); const loggerSpy = createLoggerSpy(); - await runCMK(iff.rootDir, clean, loggerSpy); + await runCMK(fakeParsedArgs({ project: iff.rootDir }), loggerSpy); expect(loggerSpy.logDiagnostics).toHaveBeenCalledTimes(1); expect(formatDiagnostics(loggerSpy.logDiagnostics.mock.calls[0]![0], iff.rootDir)).toMatchInlineSnapshot(` [ @@ -123,7 +122,9 @@ describe('runCMK', () => { 'src/a.module.css': '.a1 { color: red; }', }); await chmod(iff.paths['src/a.module.css'], 0o200); // Remove read permission - await expect(runCMK(iff.rootDir, clean, createLoggerSpy())).rejects.toThrow(ReadCSSModuleFileError); + await expect(runCMK(fakeParsedArgs({ project: iff.rootDir }), createLoggerSpy())).rejects.toThrow( + ReadCSSModuleFileError, + ); }); test('support ./ in `pattern`', async () => { const iff = await createIFF({ @@ -135,7 +136,7 @@ describe('runCMK', () => { 'src/a.module.css': `@import './b.css'; .a1 { color: red; }`, 'src/b.css': '.b1 { color: red; }', }); - await runCMK(iff.rootDir, clean, createLoggerSpy()); + await runCMK(fakeParsedArgs({ project: iff.rootDir }), createLoggerSpy()); expect(await iff.readFile('generated/src/a.module.css.d.ts')).toMatchInlineSnapshot(` "// @ts-nocheck declare const styles = { @@ -155,7 +156,7 @@ describe('runCMK', () => { `, }); const loggerSpy = createLoggerSpy(); - await expect(runCMK(iff.rootDir, clean, loggerSpy)).rejects.toThrow(ProcessExitError); + await expect(runCMK(fakeParsedArgs({ project: iff.rootDir }), loggerSpy)).rejects.toThrow(ProcessExitError); expect(loggerSpy.logDiagnostics).toHaveBeenCalledTimes(1); expect(formatDiagnostics(loggerSpy.logDiagnostics.mock.calls[0]![0], iff.rootDir)).toMatchInlineSnapshot(` [ @@ -177,7 +178,7 @@ describe('runCMK', () => { 'src/b.module.css': '@value;', }); const loggerSpy = createLoggerSpy(); - await expect(runCMK(iff.rootDir, clean, loggerSpy)).rejects.toThrow(ProcessExitError); + await expect(runCMK(fakeParsedArgs({ project: iff.rootDir }), loggerSpy)).rejects.toThrow(ProcessExitError); expect(loggerSpy.logDiagnostics).toHaveBeenCalledTimes(1); expect(formatDiagnostics(loggerSpy.logDiagnostics.mock.calls[0]![0], iff.rootDir)).toMatchInlineSnapshot(` [ @@ -220,7 +221,7 @@ describe('runCMK', () => { `, }); const loggerSpy = createLoggerSpy(); - await expect(runCMK(iff.rootDir, clean, loggerSpy)).rejects.toThrow(ProcessExitError); + await expect(runCMK(fakeParsedArgs({ project: iff.rootDir }), loggerSpy)).rejects.toThrow(ProcessExitError); expect(loggerSpy.logDiagnostics).toHaveBeenCalledTimes(1); expect(formatDiagnostics(loggerSpy.logDiagnostics.mock.calls[0]![0], iff.rootDir)).toMatchInlineSnapshot(` [ @@ -259,7 +260,7 @@ test('removes output directory before generating files when `clean` is true', as 'src/a.module.css': '.a1 { color: red; }', 'generated/src/old.module.css.d.ts': '', }); - await runCMK(iff.rootDir, true, createLoggerSpy()); + await runCMK(fakeParsedArgs({ project: iff.rootDir, clean: true }), createLoggerSpy()); await expect(access(iff.join('generated/src/a.module.css.d.ts'))).resolves.not.toThrow(); await expect(access(iff.join('generated/src/old.module.css.d.ts'))).rejects.toThrow(); }); diff --git a/packages/codegen/src/runner.ts b/packages/codegen/src/runner.ts index ca2424ad..b524d647 100644 --- a/packages/codegen/src/runner.ts +++ b/packages/codegen/src/runner.ts @@ -19,6 +19,7 @@ import { readConfigFile, } from '@css-modules-kit/core'; import ts from 'typescript'; +import type { ParsedArgs } from './cli.js'; import { writeDtsFile } from './dts-writer.js'; import { ReadCSSModuleFileError } from './error.js'; import type { Logger } from './logger/logger.js'; @@ -63,8 +64,8 @@ async function writeDtsByCSSModule( * @throws {ReadCSSModuleFileError} When failed to read CSS Module file. * @throws {WriteDtsFileError} */ -export async function runCMK(project: string, clean: boolean, logger: Logger): Promise { - const config = readConfigFile(project); +export async function runCMK(args: ParsedArgs, logger: Logger): Promise { + const config = readConfigFile(args.project); if (config.diagnostics.length > 0) { logger.logDiagnostics(config.diagnostics); // eslint-disable-next-line n/no-process-exit @@ -120,7 +121,7 @@ export async function runCMK(project: string, clean: boolean, logger: Logger): P process.exit(1); } - if (clean) { + if (args.clean) { await rm(config.dtsOutDir, { recursive: true, force: true }); } await Promise.all( diff --git a/packages/codegen/src/test/faker.ts b/packages/codegen/src/test/faker.ts new file mode 100644 index 00000000..908cacf7 --- /dev/null +++ b/packages/codegen/src/test/faker.ts @@ -0,0 +1,12 @@ +import type { ParsedArgs } from '../cli.js'; + +export function fakeParsedArgs(args?: Partial): ParsedArgs { + return { + help: false, + version: false, + project: '.', + pretty: undefined, + clean: false, + ...args, + }; +}