diff --git a/packages/cli/src/cli.mts b/packages/cli/src/cli.mts index 3c06b9cb..807dcb8e 100644 --- a/packages/cli/src/cli.mts +++ b/packages/cli/src/cli.mts @@ -1,4 +1,4 @@ -import { Command } from 'commander' +import { Command, Option } from 'commander' import { checkAndUpdateSchemaVersion } from '../../config/src/update-schema-version.mjs' import { startGenerator } from '../../generator/src/generator.mjs' import { logger } from '../../generator/src/utils/logger.mjs' @@ -13,6 +13,9 @@ program.description('CLI to read the base translation file and generate types') program.option('--no-watch', 'run the generator only once (CI)') program.option('--setup', 'step-by-step setup') program.option('--setup-auto', 'auto-guess setup') +program.addOption( + new Option('-p, --project ', 'path to the config file').default('.typesafe-i18n.json').makeOptionMandatory(), +) program.version(version) @@ -22,12 +25,12 @@ const run = async () => { logger.info(`version ${version}`) - await checkAndUpdateSchemaVersion() + await checkAndUpdateSchemaVersion(options.project) if (options.setup || options.setupAuto) { await setup(options.setupAuto) } else { - startGenerator(undefined, options['watch']) + startGenerator(options.project, options['watch']) } } diff --git a/packages/cli/src/setup/setup.mts b/packages/cli/src/setup/setup.mts index f03dd2b6..904526dd 100644 --- a/packages/cli/src/setup/setup.mts +++ b/packages/cli/src/setup/setup.mts @@ -81,7 +81,7 @@ export const setup = async (autoSetup: boolean) => { const config = await getConfigDiff(options) - await writeConfigToFile(config) + await writeConfigToFile(config, '.typesafe-i18n.json') logger.info(`generated config file: '.typesafe-i18n.json'`) const installed = await installDependencies() diff --git a/packages/config/src/config.mts b/packages/config/src/config.mts index 1ca6039f..072f5403 100644 --- a/packages/config/src/config.mts +++ b/packages/config/src/config.mts @@ -5,16 +5,19 @@ import { applyDefaultValues } from './core.mjs' import type { GeneratorConfig, GeneratorConfigWithDefaultValues } from './types.mjs' import { validateConfig } from './validation.mjs' -export const writeConfigToFile = async (config: GeneratorConfig) => - writeConfigFile({ ...config, $schema: `https://unpkg.com/typesafe-i18n@${version}/schema/typesafe-i18n.json` }) +export const writeConfigToFile = async (config: GeneratorConfig, configPath: string) => + writeConfigFile( + { ...config, $schema: `https://unpkg.com/typesafe-i18n@${version}/schema/typesafe-i18n.json` }, + configPath, + ) export const doesConfigFileExist = async () => doesPathExist(resolve('.typesafe-i18n.json')) -export const readRawConfig = async () => - (await importFile(resolve('.typesafe-i18n.json'), false)) || {} +export const readRawConfig = async (configPath: string) => + (await importFile(resolve(configPath), false)) || {} -export const readConfig = async (): Promise => { - const generatorConfig = await readRawConfig() +export const readConfig = async (configPath = '.typesafe-i18n.json'): Promise => { + const generatorConfig = await readRawConfig(configPath) // remove "$schema" property const configWithoutSchemaAttribute = Object.fromEntries( diff --git a/packages/config/src/core.mts b/packages/config/src/core.mts index 282dfb13..ab935875 100644 --- a/packages/config/src/core.mts +++ b/packages/config/src/core.mts @@ -23,22 +23,22 @@ export const applyDefaultValues = async ( ...(config as unknown as any), }) -const readConfigFromDisk = async (fs: FileSystemUtil) => { - const content = await fs.readFile('.typesafe-i18n.json').catch(() => '{}') +const readConfigFromDisk = async (fs: FileSystemUtil, configPath: string) => { + const content = await fs.readFile(configPath).catch(() => '{}') return JSON.parse(content.toString()) as GeneratorConfig & { $schema?: string } } -export const getConfig = async (fs: FileSystemUtil) => { - const config = await readConfigFromDisk(fs) +export const getConfig = async (fs: FileSystemUtil, configPath = '.typesafe-i18n.json') => { + const config = await readConfigFromDisk(fs, configPath) return applyDefaultValues(config) } // -------------------------------------------------------------------------------------------------------------------- -export const getLocaleInformation = async (fs: FileSystemUtil) => { - const config = await getConfig(fs) +export const getLocaleInformation = async (fs: FileSystemUtil, configPath = '.typesafe-i18n.json') => { + const config = await getConfig(fs, configPath) return { base: config.baseLocale, diff --git a/packages/config/src/update-schema-version.mts b/packages/config/src/update-schema-version.mts index f021ad07..07a113b1 100644 --- a/packages/config/src/update-schema-version.mts +++ b/packages/config/src/update-schema-version.mts @@ -2,14 +2,14 @@ import { logger } from '../../generator/src/utils/logger.mjs' import { version } from '../../version' import { readRawConfig, writeConfigToFile } from './config.mjs' -export const checkAndUpdateSchemaVersion = async () => { - const config = await readRawConfig() +export const checkAndUpdateSchemaVersion = async (configPath = '.typesafe-i18n.json') => { + const config = await readRawConfig(configPath) if (!config.$schema) return if (config.$schema.includes(version)) return - await writeConfigToFile(config) + await writeConfigToFile(config, configPath) - logger.info(`updated '$schema' version of '.typesafe-i18n.json' to '${version}'`) + logger.info(`updated '$schema' version of '${configPath}' to '${version}'`) } diff --git a/packages/generator/src/generator.mts b/packages/generator/src/generator.mts index 9552dc57..955035a6 100644 --- a/packages/generator/src/generator.mts +++ b/packages/generator/src/generator.mts @@ -99,12 +99,11 @@ const debounce = (callback: () => void) => ++debounceCounter, ) -export const startGenerator = async (config?: GeneratorConfig, watchFiles = true): Promise => { +export const startGenerator = async (configPath: string, watchFiles = true): Promise => { logger = createLogger(console, !watchFiles) const parsedConfig = { - ...(await readConfig()), - ...config, + ...(await readConfig(configPath)), } as GeneratorConfig const configWithDefaultValues = await getConfigWithDefaultValues(parsedConfig) diff --git a/packages/generator/src/utils/file.utils.mts b/packages/generator/src/utils/file.utils.mts index 0884ec5f..39113839 100644 --- a/packages/generator/src/utils/file.utils.mts +++ b/packages/generator/src/utils/file.utils.mts @@ -56,8 +56,8 @@ export const deleteFolderRecursive = async (path: string): Promise => { export const writeFile = (filePath: string, content: string) => write(filePath, content, { encoding: 'utf-8' }) -export const writeConfigFile = async (content: JsonObject) => - writeFile(resolve('./', '.typesafe-i18n.json'), JSON.stringify(content, undefined, 3)) +export const writeConfigFile = async (content: JsonObject, configPath: string) => + writeFile(resolve('./', configPath), JSON.stringify(content, undefined, 3)) const getFileName = (path: string, file: string) => { const ext = file.endsWith(fileEnding) || file.endsWith(`${fileEnding}x`) || file.endsWith('.d.ts') ? '' : fileEnding