diff --git a/.changeset/pseudo-config-schema.md b/.changeset/pseudo-config-schema.md new file mode 100644 index 000000000..bb991b9d8 --- /dev/null +++ b/.changeset/pseudo-config-schema.md @@ -0,0 +1,6 @@ +--- +"@lingo.dev/_spec": patch +"lingo.dev": patch +--- + +fix(cli): add dev.usePseudotranslator to config schema and respect it in CLI setup diff --git a/packages/cli/src/cli/cmd/run/setup.ts b/packages/cli/src/cli/cmd/run/setup.ts index b87f17a8f..0f3480b41 100644 --- a/packages/cli/src/cli/cmd/run/setup.ts +++ b/packages/cli/src/cli/cmd/run/setup.ts @@ -50,7 +50,8 @@ export default async function setup(input: CmdRunContext) { { title: "Selecting localization provider", task: async (ctx, task) => { - const provider = ctx.flags.pseudo ? "pseudo" : ctx.config?.provider; + const isPseudo = ctx.flags.pseudo || ctx.config?.dev?.usePseudotranslator; + const provider = isPseudo ? "pseudo" : ctx.config?.provider; const vNext = ctx.config?.vNext; ctx.localizer = createLocalizer(provider, ctx.flags.apiKey, vNext); if (!ctx.localizer) { @@ -72,7 +73,8 @@ export default async function setup(input: CmdRunContext) { enabled: (ctx) => (ctx.localizer?.id === "Lingo.dev" || ctx.localizer?.id === "Lingo.dev vNext") && - !ctx.flags.pseudo, + !ctx.flags.pseudo && + !ctx.config?.dev?.usePseudotranslator, task: async (ctx, task) => { const authStatus = await ctx.localizer!.checkAuth(); if (!authStatus.authenticated) { diff --git a/packages/spec/src/config.spec.ts b/packages/spec/src/config.spec.ts index 1fdc665fb..82d638325 100644 --- a/packages/spec/src/config.spec.ts +++ b/packages/spec/src/config.spec.ts @@ -115,6 +115,30 @@ describe("I18n Config Parser", () => { expect(result).toEqual(createV1_4Config()); }); + it("should parse config with dev.usePseudotranslator", () => { + const configWithDev = { + ...createV1_4Config(), + version: "1.14", + dev: { + usePseudotranslator: true, + }, + }; + const result = parseI18nConfig(configWithDev); + + expect(result.dev?.usePseudotranslator).toBe(true); + expect(result.version).toBe("1.14"); + }); + + it("should parse config without dev field", () => { + const configWithoutDev = { + ...createV1_4Config(), + version: "1.14", + }; + const result = parseI18nConfig(configWithoutDev); + + expect(result.dev).toBeUndefined(); + }); + it("should throw an error for unsupported locales", () => { const invalidLocaleConfig = createInvalidLocaleConfig(); expect(() => parseI18nConfig(invalidLocaleConfig)).toThrow( diff --git a/packages/spec/src/config.ts b/packages/spec/src/config.ts index c1f273c19..b7ad04152 100644 --- a/packages/spec/src/config.ts +++ b/packages/spec/src/config.ts @@ -574,8 +574,36 @@ export const configV1_13Definition = extendConfigDefinition( }, ); +// v1.13 -> v1.14 +// Changes: Add "dev" field for development-specific settings +const devSettingsSchema = Z.object({ + usePseudotranslator: Z.boolean() + .optional() + .describe( + "Use pseudotranslator instead of real translation provider. Useful for testing i18n without API calls.", + ), +}).describe("Development-specific settings."); + +export const configV1_14Definition = extendConfigDefinition( + configV1_13Definition, + { + createSchema: (baseSchema) => + baseSchema.extend({ + dev: devSettingsSchema.optional(), + }), + createDefaultValue: (baseDefaultValue) => ({ + ...baseDefaultValue, + version: "1.14", + }), + createUpgrader: (oldConfig) => ({ + ...oldConfig, + version: "1.14", + }), + }, +); + // exports -export const LATEST_CONFIG_DEFINITION = configV1_13Definition; +export const LATEST_CONFIG_DEFINITION = configV1_14Definition; export type I18nConfig = Z.infer<(typeof LATEST_CONFIG_DEFINITION)["schema"]>;