diff --git a/.changeset/loud-cougars-sparkle.md b/.changeset/loud-cougars-sparkle.md new file mode 100644 index 000000000..36766e120 --- /dev/null +++ b/.changeset/loud-cougars-sparkle.md @@ -0,0 +1,5 @@ +--- +"lingo.dev": patch +--- + +fix vue json files diff --git a/packages/cli/src/cli/loaders/index.spec.ts b/packages/cli/src/cli/loaders/index.spec.ts index 4dcdac4b6..d755fdde1 100644 --- a/packages/cli/src/cli/loaders/index.spec.ts +++ b/packages/cli/src/cli/loaders/index.spec.ts @@ -1924,6 +1924,29 @@ ${script}`; } +${script}`; + + mockFileOperations(input); + + const vueLoader = createBucketLoader("vue-json", "i18n/App.vue", { isCacheRestore: false, defaultLocale: "en" }); + vueLoader.setDefaultLocale("en"); + await vueLoader.pull("en"); + + await vueLoader.push("es", { + hello: "hola mundo!", + }); + + expect(fs.writeFile).toHaveBeenCalledWith("i18n/App.vue", expectedOutput, { encoding: "utf-8", flag: "w" }); + }); + + it("should ignore vue file without i18n tag", async () => { + setupFileMocks(); + + const input = `${template} + +${script}`; + const expectedOutput = `${template} + ${script}`; mockFileOperations(input); diff --git a/packages/cli/src/cli/loaders/vue-json.ts b/packages/cli/src/cli/loaders/vue-json.ts index 3ea101816..a43328e66 100644 --- a/packages/cli/src/cli/loaders/vue-json.ts +++ b/packages/cli/src/cli/loaders/vue-json.ts @@ -5,20 +5,29 @@ import { createLoader } from "./_utils"; export default function createVueJsonLoader(): ILoader> { return createLoader({ pull: async (locale, input, ctx) => { - const { i18n } = parseVueFile(input); - return i18n[locale] ?? {}; + const parsed = parseVueFile(input); + return parsed?.i18n?.[locale] ?? {}; }, push: async (locale, data, originalInput) => { - const { before, i18n, after } = parseVueFile(originalInput ?? ""); - i18n[locale] = data; - return `${before}\n${JSON.stringify(i18n, null, 2)}\n${after}`; + const parsed = parseVueFile(originalInput ?? ""); + if (!parsed) { + return originalInput ?? ""; + } + + parsed.i18n[locale] = data; + return `${parsed.before}\n${JSON.stringify(parsed.i18n, null, 2)}\n${parsed.after}`; }, }); } function parseVueFile(input: string) { - const [, before, jsonString = "{}", after] = input.match(/^([\s\S]*)([\s\S]*)<\/i18n>([\s\S]*)$/) || []; + const match = input.match(/^([\s\S]*)([\s\S]*)<\/i18n>([\s\S]*)$/); + + if (!match) { + return null; + } + const [, before, jsonString = "{}", after] = match; let i18n: Record; try { i18n = JSON.parse(jsonString);