better-translation 0.4.4 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ai.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { c as TranslateFn } from "./types-DHBiF-i2.mjs";
1
+ import { c as TranslateFn } from "./types-Bi-RLzHq.mjs";
2
2
  import { generateText } from "ai";
3
3
 
4
4
  //#region src/ai.d.ts
@@ -10,8 +10,6 @@ interface CreateAiTranslateOptions {
10
10
  prompt?: string;
11
11
  /** Optional temperature forwarded to the selected model provider. */
12
12
  temperature?: number;
13
- /** Maximum number of per-message translation requests to run at once. */
14
- concurrency?: number;
15
13
  }
16
14
  declare function createAiTranslate(options?: CreateAiTranslateOptions): TranslateFn;
17
15
  //#endregion
package/dist/ai.d.mts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.mts","names":[],"sources":["../src/ai.ts"],"mappings":";;;;KAMK,OAAA,GAAU,UAAU,QAAQ,YAAA;AAAA,UAEhB,wBAAA;EAFZ;EAIH,KAAA,GAAQ,OAAO;;EAEf,MAAA;EAN2C;EAQ3C,WAAA;EANuC;EAQvC,WAAA;AAAA;AAAA,iBAGc,iBAAA,CAAkB,OAAA,GAAS,wBAAA,GAAgC,WAAW"}
1
+ {"version":3,"file":"ai.d.mts","names":[],"sources":["../src/ai.ts"],"mappings":";;;;KAKK,OAAA,GAAU,UAAU,QAAQ,YAAA;AAAA,UAEhB,wBAAA;EAFZ;EAIH,KAAA,GAAQ,OAAO;;EAEf,MAAA;EAN2C;EAQ3C,WAAA;AAAA;AAAA,iBAGc,iBAAA,CAAkB,OAAA,GAAS,wBAAA,GAAgC,WAAW"}
package/dist/ai.mjs CHANGED
@@ -1,23 +1,11 @@
1
1
  //#region src/ai.ts
2
2
  const DEFAULT_GATEWAY_MODEL = "openai/gpt-5.5";
3
- const DEFAULT_CONCURRENCY = 10;
4
3
  function createAiTranslate(options = {}) {
5
4
  return async (messages, locale) => {
6
- const result = {};
7
- const concurrency = normalizeConcurrency(options.concurrency);
8
- await Promise.all(Array.from({ length: Math.min(concurrency, messages.length) }, async (_, workerIndex) => {
9
- for (let index = workerIndex; index < messages.length; index += concurrency) {
10
- const message = messages[index];
11
- result[message.id] = await translateMessage(message, locale, options);
12
- }
13
- }));
14
- return result;
5
+ const entries = await Promise.all(messages.map(async (message) => [message.id, await translateMessage(message, locale, options)]));
6
+ return Object.fromEntries(entries);
15
7
  };
16
8
  }
17
- function normalizeConcurrency(concurrency = DEFAULT_CONCURRENCY) {
18
- if (!Number.isFinite(concurrency)) return DEFAULT_CONCURRENCY;
19
- return Math.max(1, Math.floor(concurrency));
20
- }
21
9
  async function translateMessage(message, locale, options) {
22
10
  return (await translateWithAi(message, locale, options)).trim() || message.text;
23
11
  }
package/dist/ai.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.mjs","names":[],"sources":["../src/ai.ts"],"sourcesContent":["import type { generateText } from \"ai\"\n\nimport type { TranslateFn, TranslateMessage } from \"./types.js\"\n\nconst DEFAULT_GATEWAY_MODEL = \"openai/gpt-5.5\"\nconst DEFAULT_CONCURRENCY = 10\ntype AiModel = Parameters<typeof generateText>[0][\"model\"]\n\nexport interface CreateAiTranslateOptions {\n /** AI SDK model value. Defaults to a Vercel AI Gateway model string. */\n model?: AiModel\n /** Primary translation brief for product, tone, glossary, or domain instructions. */\n prompt?: string\n /** Optional temperature forwarded to the selected model provider. */\n temperature?: number\n /** Maximum number of per-message translation requests to run at once. */\n concurrency?: number\n}\n\nexport function createAiTranslate(options: CreateAiTranslateOptions = {}): TranslateFn {\n return async (messages, locale) => {\n const result: Record<string, string> = {}\n const concurrency = normalizeConcurrency(options.concurrency)\n\n await Promise.all(\n Array.from({ length: Math.min(concurrency, messages.length) }, async (_, workerIndex) => {\n for (let index = workerIndex; index < messages.length; index += concurrency) {\n const message = messages[index]!\n result[message.id] = await translateMessage(message, locale, options)\n }\n }),\n )\n\n return result\n }\n}\n\nfunction normalizeConcurrency(concurrency = DEFAULT_CONCURRENCY) {\n if (!Number.isFinite(concurrency)) return DEFAULT_CONCURRENCY\n return Math.max(1, Math.floor(concurrency))\n}\n\nasync function translateMessage(message: TranslateMessage, locale: string, options: CreateAiTranslateOptions) {\n const translated = (await translateWithAi(message, locale, options)).trim()\n\n return translated || message.text\n}\n\nasync function translateWithAi(message: TranslateMessage, locale: string, options: CreateAiTranslateOptions) {\n const { generateText } = await import(\"ai\")\n const { text } = await generateText({\n model: options.model ?? DEFAULT_GATEWAY_MODEL,\n system: createSystemPrompt(locale, options.prompt),\n prompt: createUserPrompt(message, locale),\n ...(options.temperature === undefined ? {} : { temperature: options.temperature }),\n })\n\n return text\n}\n\nfunction createSystemPrompt(locale: string, prompt?: string) {\n const translationBrief = prompt?.trim() || \"Translate the provided UI messages as concise, natural application UI copy.\"\n\n return [\n `## Translation Brief\n${translationBrief}\n\n## Target Locale\n${locale}\n\n## Output Contract\nReturn only the translated text for the provided source message.\nDo not include the lookup id, labels, explanations, markdown, code fences, or surrounding quotes.\nUse the message context when provided.`,\n ].join(\"\\n\\n\")\n}\n\nfunction createUserPrompt(message: TranslateMessage, locale: string) {\n return JSON.stringify({\n targetLocale: locale,\n message: {\n id: message.id,\n text: message.text,\n context: message.meta.context,\n },\n })\n}\n"],"mappings":";AAIA,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;AAc5B,SAAgB,kBAAkB,UAAoC,CAAC,GAAgB;CACrF,OAAO,OAAO,UAAU,WAAW;EACjC,MAAM,SAAiC,CAAC;EACxC,MAAM,cAAc,qBAAqB,QAAQ,WAAW;EAE5D,MAAM,QAAQ,IACZ,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,aAAa,SAAS,MAAM,EAAE,GAAG,OAAO,GAAG,gBAAgB;GACvF,KAAK,IAAI,QAAQ,aAAa,QAAQ,SAAS,QAAQ,SAAS,aAAa;IAC3E,MAAM,UAAU,SAAS;IACzB,OAAO,QAAQ,MAAM,MAAM,iBAAiB,SAAS,QAAQ,OAAO;GACtE;EACF,CAAC,CACH;EAEA,OAAO;CACT;AACF;AAEA,SAAS,qBAAqB,cAAc,qBAAqB;CAC/D,IAAI,CAAC,OAAO,SAAS,WAAW,GAAG,OAAO;CAC1C,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC;AAC5C;AAEA,eAAe,iBAAiB,SAA2B,QAAgB,SAAmC;CAG5G,QAFoB,MAAM,gBAAgB,SAAS,QAAQ,OAAO,GAAG,KAErD,KAAK,QAAQ;AAC/B;AAEA,eAAe,gBAAgB,SAA2B,QAAgB,SAAmC;CAC3G,MAAM,EAAE,iBAAiB,MAAM,OAAO;CACtC,MAAM,EAAE,SAAS,MAAM,aAAa;EAClC,OAAO,QAAQ,SAAS;EACxB,QAAQ,mBAAmB,QAAQ,QAAQ,MAAM;EACjD,QAAQ,iBAAiB,SAAS,MAAM;EACxC,GAAI,QAAQ,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;CAClF,CAAC;CAED,OAAO;AACT;AAEA,SAAS,mBAAmB,QAAgB,QAAiB;CAG3D,OAAO,CACL;EAHuB,QAAQ,KAAK,KAAK,8EAI1B;;;EAGjB,OAAO;;;;;uCAMP,EAAE,KAAK,MAAM;AACf;AAEA,SAAS,iBAAiB,SAA2B,QAAgB;CACnE,OAAO,KAAK,UAAU;EACpB,cAAc;EACd,SAAS;GACP,IAAI,QAAQ;GACZ,MAAM,QAAQ;GACd,SAAS,QAAQ,KAAK;EACxB;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"ai.mjs","names":[],"sources":["../src/ai.ts"],"sourcesContent":["import type { generateText } from \"ai\"\n\nimport type { TranslateFn, TranslateMessage } from \"./types.js\"\n\nconst DEFAULT_GATEWAY_MODEL = \"openai/gpt-5.5\"\ntype AiModel = Parameters<typeof generateText>[0][\"model\"]\n\nexport interface CreateAiTranslateOptions {\n /** AI SDK model value. Defaults to a Vercel AI Gateway model string. */\n model?: AiModel\n /** Primary translation brief for product, tone, glossary, or domain instructions. */\n prompt?: string\n /** Optional temperature forwarded to the selected model provider. */\n temperature?: number\n}\n\nexport function createAiTranslate(options: CreateAiTranslateOptions = {}): TranslateFn {\n return async (messages, locale) => {\n const entries = await Promise.all(\n messages.map(async (message) => [message.id, await translateMessage(message, locale, options)] as const),\n )\n\n return Object.fromEntries(entries)\n }\n}\n\nasync function translateMessage(message: TranslateMessage, locale: string, options: CreateAiTranslateOptions) {\n const translated = (await translateWithAi(message, locale, options)).trim()\n\n return translated || message.text\n}\n\nasync function translateWithAi(message: TranslateMessage, locale: string, options: CreateAiTranslateOptions) {\n const { generateText } = await import(\"ai\")\n const { text } = await generateText({\n model: options.model ?? DEFAULT_GATEWAY_MODEL,\n system: createSystemPrompt(locale, options.prompt),\n prompt: createUserPrompt(message, locale),\n ...(options.temperature === undefined ? {} : { temperature: options.temperature }),\n })\n\n return text\n}\n\nfunction createSystemPrompt(locale: string, prompt?: string) {\n const translationBrief = prompt?.trim() || \"Translate the provided UI messages as concise, natural application UI copy.\"\n\n return [\n `## Translation Brief\n${translationBrief}\n\n## Target Locale\n${locale}\n\n## Output Contract\nReturn only the translated text for the provided source message.\nDo not include the lookup id, labels, explanations, markdown, code fences, or surrounding quotes.\nUse the message context when provided.`,\n ].join(\"\\n\\n\")\n}\n\nfunction createUserPrompt(message: TranslateMessage, locale: string) {\n return JSON.stringify({\n targetLocale: locale,\n message: {\n id: message.id,\n text: message.text,\n context: message.meta.context,\n },\n })\n}\n"],"mappings":";AAIA,MAAM,wBAAwB;AAY9B,SAAgB,kBAAkB,UAAoC,CAAC,GAAgB;CACrF,OAAO,OAAO,UAAU,WAAW;EACjC,MAAM,UAAU,MAAM,QAAQ,IAC5B,SAAS,IAAI,OAAO,YAAY,CAAC,QAAQ,IAAI,MAAM,iBAAiB,SAAS,QAAQ,OAAO,CAAC,CAAU,CACzG;EAEA,OAAO,OAAO,YAAY,OAAO;CACnC;AACF;AAEA,eAAe,iBAAiB,SAA2B,QAAgB,SAAmC;CAG5G,QAFoB,MAAM,gBAAgB,SAAS,QAAQ,OAAO,GAAG,KAErD,KAAK,QAAQ;AAC/B;AAEA,eAAe,gBAAgB,SAA2B,QAAgB,SAAmC;CAC3G,MAAM,EAAE,iBAAiB,MAAM,OAAO;CACtC,MAAM,EAAE,SAAS,MAAM,aAAa;EAClC,OAAO,QAAQ,SAAS;EACxB,QAAQ,mBAAmB,QAAQ,QAAQ,MAAM;EACjD,QAAQ,iBAAiB,SAAS,MAAM;EACxC,GAAI,QAAQ,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;CAClF,CAAC;CAED,OAAO;AACT;AAEA,SAAS,mBAAmB,QAAgB,QAAiB;CAG3D,OAAO,CACL;EAHuB,QAAQ,KAAK,KAAK,8EAI1B;;;EAGjB,OAAO;;;;;uCAMP,EAAE,KAAK,MAAM;AACf;AAEA,SAAS,iBAAiB,SAA2B,QAAgB;CACnE,OAAO,KAAK,UAAU;EACpB,cAAc;EACd,SAAS;GACP,IAAI,QAAQ;GACZ,MAAM,QAAQ;GACd,SAAS,QAAQ,KAAK;EACxB;CACF,CAAC;AACH"}
@@ -1,4 +1,4 @@
1
- import { s as RuntimeMessages } from "./types-DHBiF-i2.mjs";
1
+ import { s as RuntimeMessages } from "./types-Bi-RLzHq.mjs";
2
2
 
3
3
  //#region src/messages.d.ts
4
4
  declare const locales: readonly string[];
package/dist/react.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { u as TranslateOptions } from "./types-DHBiF-i2.mjs";
1
+ import { u as TranslateOptions } from "./types-Bi-RLzHq.mjs";
2
2
  import { ReactNode } from "react";
3
3
 
4
4
  //#region src/react.d.ts
@@ -1,4 +1,4 @@
1
- import { u as TranslateOptions } from "./types-DHBiF-i2.mjs";
1
+ import { u as TranslateOptions } from "./types-Bi-RLzHq.mjs";
2
2
 
3
3
  //#region src/runtime.d.ts
4
4
  type MessageValues = Record<string, unknown>;
@@ -10,4 +10,4 @@ declare function isTranslateOptions(value?: MessageValues | TranslateOptions): v
10
10
  declare function normalizeValues(values?: MessageValues): any;
11
11
  //#endregion
12
12
  export { normalizeValues as a, isTranslateOptions as i, createT as n, interpolateString as r, Translator as t };
13
- //# sourceMappingURL=runtime-aK6QwV3S.d.mts.map
13
+ //# sourceMappingURL=runtime-Dmlq4H1h.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-aK6QwV3S.d.mts","names":[],"sources":["../src/runtime.ts"],"mappings":";;;KAIK,aAAA,GAAgB,MAAM;AAAA,KACf,UAAA,IACV,OAAA,UACA,eAAA,GAAkB,aAAA,GAAgB,gBAAA,EAClC,OAAA,GAAU,gBAAA;AARsC;AAAA,iBAYlC,OAAA,CAAQ,QAAA,EAAU,MAAA,mBAAyB,UAAU;AAAA,iBAYrD,iBAAA,CAAkB,QAAA,UAAkB,MAAA,GAAS,MAAM;AAAA,iBAKnD,kBAAA,CAAmB,KAAA,GAAQ,aAAA,GAAgB,gBAAA,GAAmB,KAAA,IAAS,gBAAA;AAAA,iBAKvE,eAAA,CAAgB,MAAsB,GAAb,aAAa"}
1
+ {"version":3,"file":"runtime-Dmlq4H1h.d.mts","names":[],"sources":["../src/runtime.ts"],"mappings":";;;KAIK,aAAA,GAAgB,MAAM;AAAA,KACf,UAAA,IACV,OAAA,UACA,eAAA,GAAkB,aAAA,GAAgB,gBAAA,EAClC,OAAA,GAAU,gBAAA;AARsC;AAAA,iBAYlC,OAAA,CAAQ,QAAA,EAAU,MAAA,mBAAyB,UAAU;AAAA,iBAYrD,iBAAA,CAAkB,QAAA,UAAkB,MAAA,GAAS,MAAM;AAAA,iBAKnD,kBAAA,CAAmB,KAAA,GAAQ,aAAA,GAAgB,gBAAA,GAAmB,KAAA,IAAS,gBAAA;AAAA,iBAKvE,eAAA,CAAgB,MAAsB,GAAb,aAAa"}
@@ -1,2 +1,2 @@
1
- import { a as normalizeValues, i as isTranslateOptions, n as createT, r as interpolateString, t as Translator } from "./runtime-aK6QwV3S.mjs";
1
+ import { a as normalizeValues, i as isTranslateOptions, n as createT, r as interpolateString, t as Translator } from "./runtime-Dmlq4H1h.mjs";
2
2
  export { Translator, createT, interpolateString, isTranslateOptions, normalizeValues };
@@ -1,5 +1,5 @@
1
- import { u as TranslateOptions } from "./types-DHBiF-i2.mjs";
2
- import { t as Translator } from "./runtime-aK6QwV3S.mjs";
1
+ import { u as TranslateOptions } from "./types-Bi-RLzHq.mjs";
2
+ import { t as Translator } from "./runtime-Dmlq4H1h.mjs";
3
3
  import { Snippet } from "svelte";
4
4
 
5
5
  //#region src/svelte-runtime.d.ts
@@ -56,8 +56,7 @@ interface BetterTranslateLocalEditorOptions {
56
56
  /** Open the editor URL when the dev server starts. */
57
57
  open?: boolean;
58
58
  }
59
- /** Writes locale files into the app and loads them through Vite. */
60
- interface BetterTranslateLocalRuntimeOptions {
59
+ interface BetterTranslateLocalRuntimeBaseOptions {
61
60
  /** Selects local runtime artifacts. */
62
61
  type: "local";
63
62
  /** Chooses whether locale files are imported as modules or fetched from Vite public assets. */
@@ -66,11 +65,17 @@ interface BetterTranslateLocalRuntimeOptions {
66
65
  output?: string;
67
66
  /** Public URL prefix used by the generated loader for `target: "public"`. */
68
67
  basePath?: string;
69
- /** Custom translation function used for messages missing from non-default locales. */
70
- translate?: TranslateFn;
71
68
  /** Dev-only UI for editing local Locale values. */
72
69
  editor?: boolean | BetterTranslateLocalEditorOptions;
73
70
  }
71
+ /** Writes locale files into the app and loads them through Vite. */
72
+ type BetterTranslateLocalRuntimeOptions = (BetterTranslateLocalRuntimeBaseOptions & {
73
+ /** Custom translation function used for messages missing from non-default locales. */translate: TranslateFn; /** Number of missing messages sent to `translate` before cache and locale files are persisted. Defaults to 25. */
74
+ translationBatchSize?: number;
75
+ }) | (BetterTranslateLocalRuntimeBaseOptions & {
76
+ /** Omit `translate` to keep non-default locale values as source fallbacks during dev. */translate?: undefined; /** Only available when `translate` is provided. */
77
+ translationBatchSize?: never;
78
+ });
74
79
  /** Loads locale files from an external translation service. */
75
80
  interface BetterTranslateRemoteRuntimeOptions {
76
81
  /** Selects remote runtime loading. */
@@ -107,4 +112,4 @@ interface BetterTranslatePluginOptions {
107
112
  }
108
113
  //#endregion
109
114
  export { BetterTranslateRuntimeOptions as a, TranslateFn as c, BetterTranslateRemoteRuntimeOptions as i, TranslateMessage as l, BetterTranslateLocalRuntimeOptions as n, MessageManifestFile as o, BetterTranslatePluginOptions as r, RuntimeMessages as s, BetterTranslateLocalEditorOptions as t, TranslateOptions as u };
110
- //# sourceMappingURL=types-DHBiF-i2.d.mts.map
115
+ //# sourceMappingURL=types-Bi-RLzHq.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-Bi-RLzHq.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;UAeiB,aAAA;EAcf;EAZA,IAAA;EAcA;EAZA,IAAA;EAcS;EAZT,MAAA;AAAA;AAgBF;AAAA,UAZiB,aAAA;;EAEf,cAAA;EAUwD;EARxD,IAAA,EAAM,gBAAA;EAWuB;EAT7B,YAAA;EAS+C;EAP/C,OAAA,EAAS,aAAa;AAAA;;KAIZ,eAAA,GAAkB,MAAM,SAAS,aAAA;;KAGjC,mBAAA,GAAsB,eAAe;AAoDjD;AAAA,KAjDY,eAAA,GAAkB,MAAM;AAiFnC;AAAA,UAhCgB,gBAAA;;EAEf,EAAA;EAkCA;EAhCA,OAAO;AAAA;;UAIQ,gBAAA;EAoCI;EAlCnB,EAAA;EAkCoD;EAhCpD,IAAA;EAoC4C;EAlC5C,IAAA,EAAM,gBAAA;EAmCH;EAjCH,YAAA;EAuCG;EArCH,OAAA,EAAS,aAAa;AAAA;;KAIZ,WAAA,IAAe,QAAA,EAAU,gBAAA,IAAoB,MAAA,aAAmB,OAAA,CAAQ,MAAA;;UAGnE,iCAAA;EA8BZ;EA5BH,OAAA;EAgCI;EA9BJ,IAAA;EA8BwB;EA5BxB,IAAA;AAAA;AAAA,UAGQ,sCAAA;EA6B0C;EA3BlD,IAAA;EA+BA;EA7BA,MAAA;EAiCA;EA/BA,MAAA;EAmCA;EAjCA,QAAA;EAmCS;EAjCT,MAAA,aAAmB,iCAAiC;AAAA;;KAI1C,kCAAA,IACP,sCAAA;EAiCuC,sFA/BtC,SAAA,EAAW,WAAA,EAkCA;EAhCX,oBAAA;AAAA,MAED,sCAAA;EA0CoC,yFAxCnC,SAAA,cAgCJ;EA9BI,oBAAA;AAAA;;UAIW,mCAAA;EAkCL;EAhCV,IAAA;EAgCuC;EA9BvC,QAAA;;EAEA,SAAA;;EAEA,MAAA;;EAEA,MAAA;;EAEA,GAAA;oEAEE,OAAA;EAAA;AAAA;;KAKQ,6BAAA,GAAgC,kCAAA,GAAqC,mCAAmC;;UAGnG,4BAAA;;EAEf,OAAA;;EAEA,aAAA;;EAEA,OAAA;;EAEA,SAAA;;EAEA,OAAA;;EAEA,OAAA,GAAU,6BAA6B;AAAA"}
package/dist/vite.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as BetterTranslateRuntimeOptions, c as TranslateFn, i as BetterTranslateRemoteRuntimeOptions, l as TranslateMessage, n as BetterTranslateLocalRuntimeOptions, o as MessageManifestFile, r as BetterTranslatePluginOptions, s as RuntimeMessages, t as BetterTranslateLocalEditorOptions, u as TranslateOptions } from "./types-DHBiF-i2.mjs";
1
+ import { a as BetterTranslateRuntimeOptions, c as TranslateFn, i as BetterTranslateRemoteRuntimeOptions, l as TranslateMessage, n as BetterTranslateLocalRuntimeOptions, o as MessageManifestFile, r as BetterTranslatePluginOptions, s as RuntimeMessages, t as BetterTranslateLocalEditorOptions, u as TranslateOptions } from "./types-Bi-RLzHq.mjs";
2
2
  import { Plugin } from "vite";
3
3
 
4
4
  //#region src/plugin.d.ts
package/dist/vite.mjs CHANGED
@@ -876,7 +876,7 @@ const RESOLVED_VIRTUAL_MESSAGES_MODULE_ID = `\0${VIRTUAL_MESSAGES_MODULE_ID}`;
876
876
  const CALL_MARKERS = ["t", "useT"];
877
877
  const COMPONENT_MARKERS = ["T"];
878
878
  const LOCALES_SUBDIR = "locales";
879
- const TRANSLATION_BATCH_SIZE = 25;
879
+ const DEFAULT_TRANSLATION_BATCH_SIZE = 25;
880
880
  function formatLocale(locale) {
881
881
  return locale.toUpperCase();
882
882
  }
@@ -1071,24 +1071,27 @@ function betterTranslation(options) {
1071
1071
  const missLocales = [...missingByLocale.keys()];
1072
1072
  log(`${PREFIX} ${BOLD}Translating${RESET} ${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? "Message" : "Messages"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`);
1073
1073
  let translatedCount = 0;
1074
- for (const [locale, misses] of missingByLocale) for (const batch of chunk(misses, TRANSLATION_BATCH_SIZE)) {
1075
- const result = await resolvedTranslate(batch, locale);
1076
- for (const miss of batch) {
1077
- const translated = result[miss.id]?.trim();
1078
- if (!translated) continue;
1079
- cache.entries[getCacheKey(miss.id, locale)] = {
1080
- sourceText: miss.text,
1081
- meta: miss.meta,
1082
- locale,
1083
- translation: translated,
1084
- timestamp: Date.now()
1085
- };
1086
- translatedCount += 1;
1074
+ for (const [locale, misses] of missingByLocale) {
1075
+ const batchSize = getTranslationBatchSize(resolvedRuntime);
1076
+ for (const batch of chunk(misses, batchSize)) {
1077
+ const result = await resolvedTranslate(batch, locale);
1078
+ for (const miss of batch) {
1079
+ const translated = result[miss.id]?.trim();
1080
+ if (!translated) continue;
1081
+ cache.entries[getCacheKey(miss.id, locale)] = {
1082
+ sourceText: miss.text,
1083
+ meta: miss.meta,
1084
+ locale,
1085
+ translation: translated,
1086
+ timestamp: Date.now()
1087
+ };
1088
+ translatedCount += 1;
1089
+ }
1090
+ saveCache(resolve(root, cacheFile), cache);
1091
+ writeLocaleFilesToDisk();
1092
+ writePrivateManifest();
1093
+ log(`${PREFIX} ${BOLD}Translated${RESET} ${CYAN}${translatedCount}${RESET}/${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? "Message" : "Messages"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`);
1087
1094
  }
1088
- saveCache(resolve(root, cacheFile), cache);
1089
- writeLocaleFilesToDisk();
1090
- writePrivateManifest();
1091
- log(`${PREFIX} ${BOLD}Translated${RESET} ${CYAN}${translatedCount}${RESET}/${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? "Message" : "Messages"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`);
1092
1095
  }
1093
1096
  log(`${PREFIX} ${BOLD}Translated${RESET} ${CYAN}${translatedCount}${RESET}/${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? "Message" : "Messages"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`);
1094
1097
  return true;
@@ -1328,10 +1331,18 @@ function getRuntimeOutputDir(runtime, isDev) {
1328
1331
  return DEFAULT_LOCAL_OUTPUT_DIR;
1329
1332
  }
1330
1333
  function normalizeRuntimeOptions(runtime) {
1331
- if (runtime) return runtime.type === "local" ? {
1332
- ...runtime,
1333
- target: runtime.target ?? "module"
1334
- } : runtime;
1334
+ if (runtime) {
1335
+ if (runtime.type !== "local") return runtime;
1336
+ if (!runtime.translate) return {
1337
+ ...runtime,
1338
+ target: runtime.target ?? "module"
1339
+ };
1340
+ return {
1341
+ ...runtime,
1342
+ target: runtime.target ?? "module",
1343
+ translationBatchSize: normalizeTranslationBatchSize(runtime.translationBatchSize)
1344
+ };
1345
+ }
1335
1346
  return {
1336
1347
  type: "local",
1337
1348
  target: "module"
@@ -1519,6 +1530,14 @@ function chunk(items, size) {
1519
1530
  for (let index = 0; index < items.length; index += size) chunks.push(items.slice(index, index + size));
1520
1531
  return chunks;
1521
1532
  }
1533
+ function normalizeTranslationBatchSize(size) {
1534
+ if (typeof size !== "number" || !Number.isFinite(size)) return DEFAULT_TRANSLATION_BATCH_SIZE;
1535
+ return Math.max(1, Math.floor(size));
1536
+ }
1537
+ function getTranslationBatchSize(runtime) {
1538
+ if (runtime.type !== "local") return DEFAULT_TRANSLATION_BATCH_SIZE;
1539
+ return normalizeTranslationBatchSize(runtime.translate ? runtime.translationBatchSize : void 0);
1540
+ }
1522
1541
  function applyEdits(code, edits) {
1523
1542
  let transformed = code;
1524
1543
  for (const edit of [...edits].sort((a, b) => b.start - a.start)) transformed = `${transformed.slice(0, edit.start)}${edit.replacement}${transformed.slice(edit.end)}`;
package/dist/vite.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.mjs","names":["isStringLiteral","getCallMetaArgument","createCallOptionsEdit","getVarEntry","getMetaArgument","isTranslateOptionsArgument","hasObjectProperty","CYAN","PREFIX","RESET","compareManifestEntryIds"],"sources":["../src/cache.ts","../src/extractors/types.ts","../src/extractors/svelte.ts","../src/extractors/typescript.ts","../src/extractor.ts","../src/local-editor/server.ts","../src/plugin.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { dirname } from \"node:path\"\n\nimport type { TranslationCache } from \"./types.js\"\n\nconst CURRENT_VERSION = 1\n\nexport function createEmptyCache(): TranslationCache {\n return { version: CURRENT_VERSION, entries: {} }\n}\n\n/** Loads the translation cache from disk, resetting it when the schema version changes. */\nexport function loadCache(path: string): TranslationCache {\n if (!existsSync(path)) return createEmptyCache()\n try {\n const data = JSON.parse(readFileSync(path, \"utf-8\")) as TranslationCache\n if (data.version !== CURRENT_VERSION) return createEmptyCache()\n return data\n } catch {\n return createEmptyCache()\n }\n}\n\n/** Persists the translation cache so future runs can reuse existing translations. */\nexport function saveCache(path: string, cache: TranslationCache) {\n const dir = dirname(path)\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n const next = JSON.stringify(cache, null, 2)\n if (existsSync(path) && readFileSync(path, \"utf-8\") === next) return\n writeFileSync(path, next)\n}\n\n/** Builds the cache key used to distinguish translations by stable lookup id and locale. */\nexport function getCacheKey(lookupId: string, locale: string) {\n return `${lookupId}\\0${locale}`\n}\n","import type { ExtractedMessage, MessageSource } from \"../types.js\"\n\nexport interface SourceMarkers {\n call: string[]\n component: string[]\n logging: boolean\n}\n\nexport interface SourceEdit {\n start: number\n end: number\n replacement: string\n}\n\nexport interface SourceAnalysis {\n parsed: boolean\n messages: ExtractedMessage[]\n edits: SourceEdit[]\n}\n\nexport function extractPlaceholdersFromMessage(message: string) {\n const names = new Set<string>()\n for (const match of message.matchAll(/\\{(\\w+)\\}/g)) {\n if (match[1]) names.add(match[1])\n }\n return [...names]\n}\n\nexport function createSource({\n filename,\n marker,\n kind,\n}: {\n filename: string\n marker: string\n kind: MessageSource[\"kind\"]\n}): MessageSource {\n return {\n file: filename,\n kind,\n marker,\n }\n}\n","import { createRequire } from \"node:module\"\n\nimport type { ExtractedMessage, TranslateOptions } from \"../types.js\"\n\nimport { getCallMessageId, getMessageId } from \"../message-id.js\"\nimport {\n createSource,\n extractPlaceholdersFromMessage,\n type SourceAnalysis,\n type SourceEdit,\n type SourceMarkers,\n} from \"./types.js\"\n\ntype SvelteNode = {\n type?: string\n start?: number\n end?: number\n name?: string\n attributes?: SvelteNode[]\n fragment?: {\n nodes?: SvelteNode[]\n }\n value?: unknown\n raw?: string\n data?: string\n expression?: SvelteNode\n [key: string]: unknown\n}\n\ntype SvelteAttribute = SvelteNode & {\n name?: string\n value?: SvelteNode | SvelteNode[] | true\n}\n\ntype SvelteCallExpression = SvelteNode & {\n callee?: SvelteNode\n arguments?: SvelteNode[]\n}\n\nconst require = createRequire(import.meta.url)\n\n/** Extracts messages from Svelte component markup and embedded expressions. */\nexport function analyzeSvelteSourceFile(code: string, filename: string, markers: SourceMarkers): SourceAnalysis {\n const messages: ExtractedMessage[] = []\n const edits: SourceEdit[] = []\n let ast: SvelteNode\n\n try {\n ast = loadSvelteCompiler().parse(code, { modern: true }) as unknown as SvelteNode\n } catch {\n return { parsed: false, messages, edits }\n }\n\n walkSvelte(ast, (node) => {\n if (node.type === \"Component\" && typeof node.name === \"string\" && markers.component.includes(node.name)) {\n analyzeTComponent(code, filename, markers, node, messages, edits)\n return\n }\n\n if (node.type === \"CallExpression\") {\n analyzeCallExpression(code, filename, markers, node as SvelteCallExpression, messages, edits)\n }\n })\n\n return { parsed: true, messages, edits }\n}\n\nfunction loadSvelteCompiler(): { parse: (code: string, options: { modern: true }) => unknown } {\n return require(\"svelte/compiler\") as { parse: (code: string, options: { modern: true }) => unknown }\n}\n\nfunction analyzeCallExpression(\n code: string,\n filename: string,\n markers: SourceMarkers,\n node: SvelteCallExpression,\n messages: ExtractedMessage[],\n edits: SourceEdit[],\n) {\n if (node.callee?.type !== \"Identifier\") return\n if (typeof node.callee.name !== \"string\" || !markers.call.includes(node.callee.name)) return\n const [messageArg] = node.arguments ?? []\n if (!isStringLiteral(messageArg)) return\n\n const value = String(messageArg.value)\n const meta = getCallMetaArgument(node.arguments ?? [])\n const id = getCallMessageId(value, meta)\n messages.push({\n id,\n defaultMessage: value,\n meta: meta ?? {},\n placeholders: extractPlaceholdersFromMessage(value),\n source: createSource({\n filename,\n marker: node.callee.name,\n kind: \"call\",\n }),\n })\n\n const edit = createCallOptionsEdit(code, node.arguments ?? [], id)\n if (edit) edits.push(edit)\n}\n\nfunction analyzeTComponent(\n code: string,\n filename: string,\n markers: SourceMarkers,\n node: SvelteNode,\n messages: ExtractedMessage[],\n edits: SourceEdit[],\n) {\n const extraction = extractSvelteChildren(code, node.fragment?.nodes ?? [])\n if (!extraction.valid) {\n if (markers.logging) console.warn(`[better-translation] Non-static <${node.name}> in ${filename}, skipping`)\n return\n }\n\n const context = getStringAttribute(node.attributes, \"context\")\n const meta = context ? { context } : undefined\n const id = getStringAttribute(node.attributes, \"id\") ?? getMessageId(extraction.message, meta)\n messages.push({\n id,\n defaultMessage: extraction.message,\n meta: meta ?? {},\n placeholders: extraction.placeholders,\n source: createSource({\n filename,\n marker: String(node.name),\n kind: \"component\",\n }),\n })\n\n const insertAt = getSvelteOpeningTagNameEnd(code, node)\n if (!hasAttribute(node.attributes, \"id\") && insertAt !== undefined) {\n edits.push({\n start: insertAt,\n end: insertAt,\n replacement: ` id=${JSON.stringify(id)}`,\n })\n }\n\n if (!hasAttribute(node.attributes, \"message\") && insertAt !== undefined) {\n edits.push({\n start: insertAt,\n end: insertAt,\n replacement: ` message=${JSON.stringify(extraction.message)}`,\n })\n }\n\n if (!hasAttribute(node.attributes, \"values\") && extraction.values.length > 0 && insertAt !== undefined) {\n edits.push({\n start: insertAt,\n end: insertAt,\n replacement: ` values={{ ${extraction.values.map((entry) => `${entry.name}: ${entry.value}`).join(\", \")} }}`,\n })\n }\n}\n\nfunction extractSvelteChildren(code: string, children: SvelteNode[]) {\n const parts: string[] = []\n const placeholders: string[] = []\n const values: Array<{ name: string; value: string }> = []\n\n for (const child of children) {\n if (child.type === \"Text\") {\n parts.push(String(child.data ?? child.raw ?? \"\"))\n continue\n }\n\n if (child.type === \"Component\" && child.name === \"Var\") {\n const entry = getVarEntry(code, child)\n if (!entry) return { message: \"\", placeholders: [], values: [], valid: false }\n placeholders.push(entry.name)\n values.push(entry)\n parts.push(`{${entry.name}}`)\n continue\n }\n\n if (child.type === \"Comment\") continue\n return { message: \"\", placeholders: [], values: [], valid: false }\n }\n\n const message = parts.join(\"\").replace(/\\s+/g, \" \").trim()\n return { message, placeholders, values, valid: message.length > 0 }\n}\n\nfunction getVarEntry(code: string, node: SvelteNode) {\n const explicitName = getStringAttribute(node.attributes, \"name\")\n const explicitValue = getExpressionAttributeSource(code, node.attributes, \"value\")\n if (explicitName && explicitValue) return { name: explicitName, value: explicitValue }\n if (explicitName) return { name: explicitName, value: JSON.stringify(explicitName) }\n\n const shorthandAttribute = getSingleExpressionAttribute(node.attributes)\n if (!shorthandAttribute) return undefined\n return {\n name: shorthandAttribute.name,\n value: code.slice(shorthandAttribute.expression.start!, shorthandAttribute.expression.end!),\n }\n}\n\nfunction getSingleExpressionAttribute(attributes?: SvelteNode[]) {\n const expressionAttributes = (attributes ?? []).flatMap((attribute) => {\n if (attribute.type !== \"Attribute\" || typeof attribute.name !== \"string\") return []\n const value = (attribute as SvelteAttribute).value\n return isExpressionAttributeValue(value) ? [{ name: attribute.name, expression: value.expression }] : []\n })\n\n return expressionAttributes.length === 1 ? expressionAttributes[0] : undefined\n}\n\nfunction getStringAttribute(attributes: SvelteNode[] | undefined, name: string) {\n const attribute = attributes?.find((entry) => entry.type === \"Attribute\" && entry.name === name) as SvelteAttribute | undefined\n if (!attribute) return undefined\n if (typeof attribute.value === \"string\") return attribute.value\n\n const value = Array.isArray(attribute.value) ? attribute.value[0] : attribute.value\n if (!value || value === true) return undefined\n if (value?.type === \"Text\") return String(value.data ?? value.raw ?? \"\")\n}\n\nfunction getExpressionAttributeSource(code: string, attributes: SvelteNode[] | undefined, name: string) {\n const attribute = attributes?.find((entry) => entry.type === \"Attribute\" && entry.name === name) as SvelteAttribute | undefined\n const value = attribute?.value\n if (!isExpressionAttributeValue(value)) return undefined\n return code.slice(value.expression.start!, value.expression.end!)\n}\n\nfunction hasAttribute(attributes: SvelteNode[] | undefined, name: string) {\n return attributes?.some((entry) => entry.type === \"Attribute\" && entry.name === name) ?? false\n}\n\nfunction getSvelteOpeningTagNameEnd(code: string, node: SvelteNode) {\n if (node.start === undefined || typeof node.name !== \"string\") return undefined\n const tagStart = code.indexOf(`<${node.name}`, node.start)\n if (tagStart < 0) return undefined\n return tagStart + node.name.length + 1\n}\n\nfunction isExpressionAttributeValue(value: SvelteAttribute[\"value\"]): value is SvelteNode & { expression: SvelteNode } {\n if (Array.isArray(value) || value === true || !value) return false\n return value.type === \"ExpressionTag\" && value.expression !== undefined\n}\n\nfunction isStringLiteral(node?: SvelteNode): node is SvelteNode & { value: string } {\n return node?.type === \"Literal\" && typeof node.value === \"string\"\n}\n\nfunction getCallMetaArgument(args: SvelteNode[]) {\n return getMetaArgument(isTranslateOptionsArgument(args[1]) ? args[1] : args[2])\n}\n\nfunction getMetaArgument(node?: SvelteNode) {\n if (!node) return undefined\n if (isStringLiteral(node)) return { context: node.value }\n if (node.type !== \"ObjectExpression\") return undefined\n\n const meta: TranslateOptions = {}\n for (const property of (node.properties as SvelteNode[] | undefined) ?? []) {\n const key = getPropertyKey(property)\n const value = property.value as SvelteNode | undefined\n if ((key === \"context\" || key === \"id\") && isStringLiteral(value)) meta[key] = value.value\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined\n}\n\nfunction createCallOptionsEdit(code: string, args: SvelteNode[], id: string): SourceEdit | undefined {\n const valuesArg = args[1]\n const optionsArg = isTranslateOptionsArgument(valuesArg) ? valuesArg : args[2]\n\n if (!optionsArg) {\n return {\n start: (valuesArg ?? args[0])!.end!,\n end: (valuesArg ?? args[0])!.end!,\n replacement: `, { id: ${JSON.stringify(id)} }`,\n }\n }\n\n if (isStringLiteral(optionsArg)) {\n const contextValue = code.slice(optionsArg.start, optionsArg.end)\n return {\n start: optionsArg.start!,\n end: optionsArg.end!,\n replacement: `{ id: ${JSON.stringify(id)}, context: ${contextValue} }`,\n }\n }\n\n if (optionsArg.type !== \"ObjectExpression\") return undefined\n if (hasObjectProperty(optionsArg, \"id\")) return undefined\n\n const objectSource = code.slice(optionsArg.start, optionsArg.end)\n const innerSource = objectSource.slice(1, -1)\n const replacement =\n innerSource.trim().length > 0 ? `{ id: ${JSON.stringify(id)},${innerSource} }` : `{ id: ${JSON.stringify(id)} }`\n\n return {\n start: optionsArg.start!,\n end: optionsArg.end!,\n replacement,\n }\n}\n\nfunction isTranslateOptionsArgument(node?: SvelteNode) {\n if (!node) return false\n if (isStringLiteral(node)) return true\n if (node.type !== \"ObjectExpression\") return false\n\n return ((node.properties as SvelteNode[] | undefined) ?? []).every((property) => {\n const key = getPropertyKey(property)\n return key === \"context\" || key === \"id\"\n })\n}\n\nfunction getPropertyKey(property: SvelteNode) {\n const key = property.key as SvelteNode | undefined\n if (key?.type === \"Identifier\" && typeof key.name === \"string\") return key.name\n if (key?.type === \"Literal\" && typeof key.value === \"string\") return key.value\n}\n\nfunction hasObjectProperty(node: SvelteNode, name: string) {\n return ((node.properties as SvelteNode[] | undefined) ?? []).some((property) => getPropertyKey(property) === name)\n}\n\nfunction walkSvelte(node: unknown, visit: (node: SvelteNode) => void, seen = new Set<unknown>()) {\n if (!node || typeof node !== \"object\" || seen.has(node)) return\n seen.add(node)\n\n const current = node as SvelteNode\n visit(current)\n\n for (const value of Object.values(current)) {\n if (!value || typeof value !== \"object\") continue\n if (Array.isArray(value)) {\n for (const item of value) walkSvelte(item, visit, seen)\n continue\n }\n walkSvelte(value, visit, seen)\n }\n}\n","import type { Argument, JSXChild, StringLiteral } from \"oxc-parser\"\nimport { parseSync, Visitor } from \"oxc-parser\"\n\nimport type { ExtractedMessage, TranslateOptions } from \"../types.js\"\n\nimport { getCallMessageId, getMessageId } from \"../message-id.js\"\nimport {\n createSource,\n extractPlaceholdersFromMessage,\n type SourceAnalysis,\n type SourceEdit,\n type SourceMarkers,\n} from \"./types.js\"\n\n/** Extracts messages and source edits from a TypeScript, JavaScript, or JSX file in one coordinated parse pass. */\nexport function analyzeTypeScriptSourceFile(code: string, filename: string, markers: SourceMarkers): SourceAnalysis {\n const messages: ExtractedMessage[] = []\n const edits: SourceEdit[] = []\n const result = parseSync(filename, code)\n if (result.errors.length > 0) return { parsed: false, messages, edits }\n\n const visitor = new Visitor({\n CallExpression(node) {\n if (\n node.callee.type === \"Identifier\" &&\n markers.call.includes(node.callee.name) &&\n node.arguments.length >= 1 &&\n isStringLiteral(node.arguments[0]!)\n ) {\n const value = (node.arguments[0] as StringLiteral).value\n const meta = getCallMetaArgument(node.arguments)\n const id = getCallMessageId(value, meta)\n messages.push({\n id,\n defaultMessage: value,\n meta: meta ?? {},\n placeholders: extractPlaceholdersFromMessage(value),\n source: createSource({\n filename,\n marker: node.callee.name,\n kind: \"call\",\n }),\n })\n\n const callOptionsEdit = createCallOptionsEdit(code, node.arguments, id)\n if (callOptionsEdit) edits.push(callOptionsEdit)\n }\n },\n\n JSXElement(node) {\n const opening = node.openingElement\n if (\n opening.name.type === \"JSXIdentifier\" &&\n opening.name.name === \"Var\" &&\n (opening.attributes as Array<unknown>).length === 0\n ) {\n const identifier = getVarChildIdentifier(node.children)\n if (identifier) {\n edits.push({\n start: node.start,\n end: node.end,\n replacement: `<Var ${identifier}={${identifier}} />`,\n })\n }\n }\n\n if (opening.name.type !== \"JSXIdentifier\") return\n if (!markers.component.includes(opening.name.name)) return\n\n const extraction = extractJSXChildren(code, node.children)\n if (!extraction.valid) {\n if (markers.logging) {\n console.warn(`[better-translation] Non-static <${opening.name.name}> in ${filename}, skipping`)\n }\n return\n }\n\n const context = getJSXStringAttribute(opening.attributes, \"context\")\n const meta = context ? { context } : undefined\n const id = getJSXStringAttribute(opening.attributes, \"id\") ?? getMessageId(extraction.message, meta)\n messages.push({\n id,\n defaultMessage: extraction.message,\n meta: meta ?? {},\n placeholders: extraction.placeholders,\n source: createSource({\n filename,\n marker: opening.name.name,\n kind: \"component\",\n }),\n })\n\n if (!hasJSXAttribute(opening.attributes as Array<unknown>, \"id\")) {\n edits.push({\n start: opening.name.end,\n end: opening.name.end,\n replacement: ` id=\"${id}\"`,\n })\n }\n\n if (!hasJSXAttribute(opening.attributes as Array<unknown>, \"message\")) {\n edits.push({\n start: opening.name.end,\n end: opening.name.end,\n replacement: ` message={${JSON.stringify(extraction.message)}}`,\n })\n }\n\n if (!hasJSXAttribute(opening.attributes as Array<unknown>, \"values\") && extraction.values.length > 0) {\n edits.push({\n start: opening.name.end,\n end: opening.name.end,\n replacement: ` values={{ ${extraction.values.map((entry) => `${entry.name}: ${entry.value}`).join(\", \")} }}`,\n })\n }\n },\n })\n\n visitor.visit(result.program)\n return { parsed: true, messages, edits }\n}\n\nfunction isStringLiteral(node: Argument): node is StringLiteral {\n return node.type === \"Literal\" && typeof (node as StringLiteral).value === \"string\"\n}\n\nfunction getMetaArgument(node?: Argument) {\n if (!node) return undefined\n if (isStringLiteral(node)) return { context: node.value }\n\n if (node.type !== \"ObjectExpression\") return undefined\n\n const meta: TranslateOptions = {}\n\n for (const property of node.properties as Array<{\n type: string\n key?: { type: string; name?: string; value?: unknown }\n value?: Argument\n }>) {\n if (\n (property.type === \"ObjectProperty\" || property.type === \"Property\") &&\n ((property.key?.type === \"Identifier\" && (property.key.name === \"context\" || property.key.name === \"id\")) ||\n (property.key?.type === \"Literal\" && (property.key.value === \"context\" || property.key.value === \"id\"))) &&\n property.value &&\n isStringLiteral(property.value)\n ) {\n const key = property.key?.type === \"Identifier\" ? property.key.name : property.key?.value\n if (key === \"context\" || key === \"id\") meta[key] = property.value.value\n }\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined\n}\n\nfunction getCallMetaArgument(args: Argument[]) {\n return getMetaArgument(isTranslateOptionsArgument(args[1]) ? args[1] : args[2])\n}\n\nfunction createCallOptionsEdit(code: string, args: Argument[], id: string) {\n const valuesArg = args[1]\n const optionsArg = isTranslateOptionsArgument(valuesArg) ? valuesArg : args[2]\n\n if (!optionsArg) {\n return {\n start: (valuesArg ?? args[0]!).end,\n end: (valuesArg ?? args[0]!).end,\n replacement: `, { id: ${JSON.stringify(id)} }`,\n }\n }\n\n if (isStringLiteral(optionsArg)) {\n const contextValue = code.slice(optionsArg.start, optionsArg.end)\n return {\n start: optionsArg.start,\n end: optionsArg.end,\n replacement: `{ id: ${JSON.stringify(id)}, context: ${contextValue} }`,\n }\n }\n\n if (optionsArg.type !== \"ObjectExpression\") return undefined\n if (hasObjectProperty(optionsArg, \"id\")) return undefined\n\n const objectSource = code.slice(optionsArg.start, optionsArg.end)\n const innerSource = objectSource.slice(1, -1)\n const replacement =\n innerSource.trim().length > 0 ? `{ id: ${JSON.stringify(id)},${innerSource} }` : `{ id: ${JSON.stringify(id)} }`\n\n return {\n start: optionsArg.start,\n end: optionsArg.end,\n replacement,\n }\n}\n\nfunction isTranslateOptionsArgument(node?: Argument) {\n if (!node) return false\n if (isStringLiteral(node)) return true\n if (node.type !== \"ObjectExpression\") return false\n\n return (node.properties as Array<unknown>).every((entry) => {\n const property = entry as\n | {\n type?: string\n key?: { type?: string; name?: string; value?: unknown }\n }\n | undefined\n\n if (property?.type !== \"ObjectProperty\" && property?.type !== \"Property\") return false\n\n return (\n (property.key?.type === \"Identifier\" && (property.key.name === \"context\" || property.key.name === \"id\")) ||\n (property.key?.type === \"Literal\" && (property.key.value === \"context\" || property.key.value === \"id\"))\n )\n })\n}\n\nfunction getJSXStringAttribute(attributes: Array<unknown>, name: string) {\n for (const attr of attributes as Array<{\n type: string\n name?: { type: string; name?: string }\n value?: { type: string; value?: unknown } | null\n }>) {\n if (\n attr.type === \"JSXAttribute\" &&\n attr.name?.type === \"JSXIdentifier\" &&\n attr.name.name === name &&\n attr.value?.type === \"Literal\" &&\n typeof attr.value.value === \"string\"\n ) {\n return attr.value.value as string\n }\n }\n}\n\nfunction hasJSXAttribute(attributes: Array<unknown>, name: string) {\n return attributes.some((attr) => {\n const attribute = attr as\n | {\n type?: string\n name?: { type?: string; name?: string }\n }\n | undefined\n\n return attribute?.type === \"JSXAttribute\" && attribute.name?.type === \"JSXIdentifier\" && attribute.name.name === name\n })\n}\n\nfunction hasObjectProperty(node: { properties: Array<unknown> }, name: string) {\n return node.properties.some((entry) => {\n const property = entry as\n | {\n type?: string\n key?: { type?: string; name?: string; value?: unknown }\n }\n | undefined\n\n if (property?.type !== \"ObjectProperty\" && property?.type !== \"Property\") return false\n return (\n (property.key?.type === \"Identifier\" && property.key.name === name) ||\n (property.key?.type === \"Literal\" && property.key.value === name)\n )\n })\n}\n\ninterface ExtractionResult {\n message: string\n placeholders: string[]\n values: Array<{ name: string; value: string }>\n valid: boolean\n}\n\nfunction extractJSXChildren(code: string, children: Array<JSXChild>): ExtractionResult {\n const parts: string[] = []\n const placeholders: string[] = []\n const values: Array<{ name: string; value: string }> = []\n\n for (const child of children) {\n switch (child.type) {\n case \"JSXText\":\n parts.push(child.value)\n break\n\n case \"JSXElement\": {\n const name = child.openingElement.name\n if (name.type !== \"JSXIdentifier\" || name.name !== \"Var\") {\n return { message: \"\", placeholders: [], values: [], valid: false }\n }\n\n const entry = getVarEntry(code, child)\n if (!entry) return { message: \"\", placeholders: [], values: [], valid: false }\n\n placeholders.push(entry.name)\n values.push(entry)\n parts.push(`{${entry.name}}`)\n break\n }\n\n case \"JSXExpressionContainer\":\n if (child.expression.type !== \"JSXEmptyExpression\") {\n return { message: \"\", placeholders: [], values: [], valid: false }\n }\n break\n\n default:\n break\n }\n }\n\n const message = parts.join(\"\").replace(/\\s+/g, \" \").trim()\n return { message, placeholders, values, valid: message.length > 0 }\n}\n\nfunction getVarEntry(\n code: string,\n node: { openingElement: { attributes: Array<unknown> }; children: Array<JSXChild> },\n): { name: string; value: string } | undefined {\n const explicitName = getJSXStringAttribute(node.openingElement.attributes as Array<unknown>, \"name\")\n const explicitValue = getJSXExpressionAttributeSource(code, node.openingElement.attributes as Array<unknown>, \"value\")\n const childValue = getVarChildrenSource(code, node.children)\n if (explicitName && explicitValue) return { name: explicitName, value: explicitValue }\n if (explicitName && childValue) return { name: explicitName, value: childValue }\n if (explicitName) return { name: explicitName, value: JSON.stringify(explicitName) }\n\n const customProp = getSingleJSXAttributeEntry(code, node.openingElement.attributes as Array<unknown>)\n if (customProp) return customProp\n\n const childIdentifier = getVarChildIdentifier(node.children)\n return childIdentifier ? { name: childIdentifier, value: childIdentifier } : undefined\n}\n\nfunction getSingleJSXAttributeEntry(code: string, attributes: Array<unknown>): { name: string; value: string } | undefined {\n const keys = attributes.flatMap((attr) => {\n const attribute = attr as\n | {\n type?: string\n name?: { type?: string; name?: string }\n value?: { type?: string; value?: unknown; expression?: { start: number; end: number } } | null\n }\n | undefined\n\n if (attribute?.type !== \"JSXAttribute\" || attribute.name?.type !== \"JSXIdentifier\" || !attribute.name.name) return []\n const value = getJSXAttributeValueSource(code, attribute.value)\n return value ? [{ name: attribute.name.name, value }] : []\n })\n\n return keys.length === 1 ? keys[0] : undefined\n}\n\nfunction getJSXExpressionAttributeSource(code: string, attributes: Array<unknown>, name: string) {\n for (const attr of attributes as Array<{\n type: string\n name?: { type: string; name?: string }\n value?: { type?: string; expression?: { start: number; end: number } } | null\n }>) {\n if (attr.type !== \"JSXAttribute\" || attr.name?.type !== \"JSXIdentifier\" || attr.name.name !== name) continue\n if (attr.value?.type !== \"JSXExpressionContainer\" || !attr.value.expression) return undefined\n return code.slice(attr.value.expression.start, attr.value.expression.end)\n }\n}\n\nfunction getJSXAttributeValueSource(\n code: string,\n value?: { type?: string; value?: unknown; expression?: { start: number; end: number } } | null,\n) {\n if (!value) return undefined\n if (value.type === \"JSXExpressionContainer\" && value.expression) {\n return code.slice(value.expression.start, value.expression.end)\n }\n if (value.type === \"Literal\" && typeof value.value === \"string\") {\n return JSON.stringify(value.value)\n }\n}\n\nfunction getVarChildIdentifier(children: Array<JSXChild>) {\n const meaningfulChildren = children.filter((child) => !(child.type === \"JSXText\" && child.value.trim().length === 0))\n if (meaningfulChildren.length !== 1) return undefined\n\n const [child] = meaningfulChildren\n if (!child || child.type !== \"JSXExpressionContainer\" || child.expression.type !== \"Identifier\") return undefined\n return child.expression.name\n}\n\nfunction getVarChildrenSource(code: string, children: Array<JSXChild>) {\n const meaningfulChildren = children.filter((child) => !(child.type === \"JSXText\" && child.value.trim().length === 0))\n if (meaningfulChildren.length === 0) return undefined\n\n if (meaningfulChildren.length === 1) {\n const [child] = meaningfulChildren\n if (!child) return undefined\n if (child.type === \"JSXExpressionContainer\" && child.expression.type !== \"JSXEmptyExpression\") {\n return code.slice(child.expression.start, child.expression.end)\n }\n }\n\n const [first] = meaningfulChildren\n const last = meaningfulChildren.at(-1)\n if (!first || !last) return undefined\n return `<>${code.slice(first.start, last.end)}</>`\n}\n","import { extname } from \"node:path\"\n\nimport type { SourceAnalysis, SourceMarkers } from \"./extractors/types.js\"\n\nimport { analyzeSvelteSourceFile } from \"./extractors/svelte.js\"\nimport { analyzeTypeScriptSourceFile } from \"./extractors/typescript.js\"\n\nexport type { SourceAnalysis, SourceEdit } from \"./extractors/types.js\"\n\n/** Extracts messages and source edits from a framework source file. */\nexport function analyzeSourceFile(code: string, filename: string, markers: SourceMarkers): SourceAnalysis {\n if (extname(filename) === \".svelte\") return analyzeSvelteSourceFile(code, filename, markers)\n return analyzeTypeScriptSourceFile(code, filename, markers)\n}\n","import { execFileSync } from \"node:child_process\"\nimport { readFileSync } from \"node:fs\"\nimport type { IncomingMessage, ServerResponse } from \"node:http\"\nimport type { ViteDevServer } from \"vite\"\n\nimport type { BetterTranslateRuntimeOptions, ManifestEntry, MessageManifest, RuntimeMessages } from \"../types.js\"\n\nexport const DEFAULT_LOCAL_EDITOR_PATH = \"/__better-translation\"\n\nconst CYAN = \"\\x1b[36m\"\nconst PREFIX = \"\\x1b[36m[better-translation]\\x1b[0m\"\nconst RESET = \"\\x1b[0m\"\n\ntype LocalEditorOptions = {\n open: boolean\n path: string\n}\n\nexport type LocalEditorRuntimeContext = {\n defaultLocale: string\n isUntranslatedLocaleValue: (value: string, entry: Pick<ManifestEntry, \"defaultMessage\">) => boolean\n locales: string[]\n log: (message: string) => void\n manifest: MessageManifest\n readLocaleMessages: (locale: string) => RuntimeMessages\n writeLocaleMessages: (locale: string, localeMessages: RuntimeMessages) => void\n}\n\nexport function getLocalEditorOptions({\n isDev,\n runtime,\n}: {\n isDev: boolean\n runtime: BetterTranslateRuntimeOptions\n}): LocalEditorOptions | null {\n if (!isDev || runtime.type !== \"local\") return null\n const editor = runtime.editor\n if (!editor) return null\n if (editor === true) return { path: DEFAULT_LOCAL_EDITOR_PATH, open: false }\n if (editor.enabled === false) return null\n return {\n path: normalizeLocalEditorPath(editor.path ?? DEFAULT_LOCAL_EDITOR_PATH),\n open: editor.open ?? false,\n }\n}\n\nexport function configureLocalEditor(server: ViteDevServer, context: LocalEditorRuntimeContext, options: LocalEditorOptions) {\n const editorPath = options.path\n server.middlewares.use(async (request, response, next) => {\n const requestUrl = new URL(request.url ?? \"/\", \"http://better-translation.local\")\n const pathname = stripTrailingSlash(requestUrl.pathname)\n if (pathname !== editorPath && !pathname.startsWith(`${editorPath}/`)) {\n next()\n return\n }\n\n try {\n if (pathname === editorPath || pathname === `${editorPath}/index.html`) {\n sendHtml(response, createLocalEditorHtml(editorPath))\n return\n }\n\n if (pathname === `${editorPath}/client.js`) {\n sendJavaScript(response, readLocalEditorAsset(\"local-editor.js\"))\n return\n }\n\n if (pathname === `${editorPath}/style.css`) {\n sendCss(response, readLocalEditorAsset(\"style.css\"))\n return\n }\n\n if (pathname.startsWith(`${editorPath}/local-editor-assets/`)) {\n const assetName = pathname.slice(`${editorPath}/local-editor-assets/`.length)\n sendAsset(response, assetName)\n return\n }\n\n if (pathname === `${editorPath}/api/messages` && request.method === \"GET\") {\n sendJson(\n response,\n getLocalEditorMessages(context, {\n q: requestUrl.searchParams.get(\"q\") ?? undefined,\n view: parseLocalEditorView(requestUrl.searchParams.get(\"view\")),\n }),\n )\n return\n }\n\n const detailMatch = pathname.match(new RegExp(`^${escapeRegExp(editorPath)}/api/messages/([^/]+)$`))\n if (detailMatch?.[1] && request.method === \"GET\") {\n sendJson(response, getLocalEditorMessageDetail(context, decodeURIComponent(detailMatch[1])))\n return\n }\n\n const updateMatch = pathname.match(new RegExp(`^${escapeRegExp(editorPath)}/api/messages/([^/]+)/locales/([^/]+)$`))\n if (updateMatch?.[1] && updateMatch[2] && request.method === \"PATCH\") {\n const body = await readJsonRequest(request)\n const value =\n typeof body === \"object\" && body !== null && \"value\" in body && typeof body.value === \"string\" ? body.value.trim() : \"\"\n if (!value) {\n sendJson(response, { error: \"Locale value is required.\" }, 400)\n return\n }\n updateLocalEditorLocaleValue(context, {\n locale: decodeURIComponent(updateMatch[2]),\n lookupId: decodeURIComponent(updateMatch[1]),\n value,\n })\n sendJson(response, getLocalEditorMessageDetail(context, decodeURIComponent(updateMatch[1])))\n return\n }\n\n sendJson(response, { error: \"Not found.\" }, 404)\n } catch (error) {\n sendJson(response, { error: error instanceof Error ? error.message : \"Local editor request failed.\" }, 500)\n }\n })\n\n server.httpServer?.once(\"listening\", () => {\n const localUrl = server.resolvedUrls?.local[0]\n const editorUrl = localUrl ? new URL(editorPath, localUrl).toString() : editorPath\n context.log(`${PREFIX} Local editor: ${CYAN}${editorUrl}${RESET}`)\n if (options.open) openLocalEditor(editorUrl)\n })\n}\n\nfunction getLocalEditorMessages(\n context: LocalEditorRuntimeContext,\n { q, view }: { q?: string; view: \"all\" | \"needs-value\" | \"manual\" | \"ai\" },\n) {\n const query = q?.trim().toLowerCase()\n const localeMessagesByLocale = readEditableLocaleMessages(context)\n const summaries = Object.entries(context.manifest)\n .sort(compareManifestEntryIds)\n .map(([id, entry]) => getLocalEditorMessageSummary(context, localeMessagesByLocale, id, entry))\n const filteredMessages = summaries.filter((message) => {\n if (query) {\n const searchableValues = [\n message.defaultMessage,\n ...Object.values(localeMessagesByLocale).map((localeMessages) => localeMessages[message.id] ?? \"\"),\n ]\n if (!searchableValues.some((value) => value.toLowerCase().includes(query))) return false\n }\n if (view === \"all\") return true\n if (view === \"needs-value\") return message.done < message.total\n if (view === \"ai\") return false\n return Object.values(localeMessagesByLocale).some((localeMessages) => localeMessages[message.id] !== undefined)\n })\n\n return {\n config: {\n appLocale: context.defaultLocale,\n defaultLocale: context.defaultLocale,\n locales: context.locales,\n },\n incompleteCount: summaries.filter((message) => message.done < message.total).length,\n messages: filteredMessages.map(({ defaultMessage, done, id, lookupId, placeholders, total }) => ({\n defaultMessage,\n done,\n id,\n lookupId,\n placeholders,\n total,\n })),\n }\n}\n\nfunction readEditableLocaleMessages(context: LocalEditorRuntimeContext) {\n return Object.fromEntries(\n context.locales\n .filter((locale) => locale !== context.defaultLocale)\n .map((locale) => [locale, context.readLocaleMessages(locale)]),\n )\n}\n\nfunction getLocalEditorMessageSummary(\n context: LocalEditorRuntimeContext,\n localeMessagesByLocale: Record<string, RuntimeMessages>,\n id: string,\n entry: ManifestEntry,\n) {\n const editableLocales = context.locales.filter((locale) => locale !== context.defaultLocale)\n\n return {\n defaultMessage: entry.defaultMessage,\n done: editableLocales.filter((locale) => localeMessagesByLocale[locale]?.[id] !== undefined).length,\n id,\n lookupId: id,\n placeholders: entry.placeholders,\n total: editableLocales.length,\n }\n}\n\nfunction getLocalEditorMessageDetail(context: LocalEditorRuntimeContext, id: string) {\n const entry = context.manifest[id]\n if (!entry) throw new Error(\"Unknown Message.\")\n const localeValues = Object.fromEntries(\n context.locales.map((locale) => {\n if (locale === context.defaultLocale) {\n return [locale, { value: entry.defaultMessage, source: \"default\", hasValue: true }]\n }\n\n const localeMessages = context.readLocaleMessages(locale)\n const value = localeMessages[id]\n const hasValue = value !== undefined\n return [locale, { value: value ?? entry.defaultMessage, source: hasValue ? \"manual\" : \"default\", hasValue }]\n }),\n )\n const editableValues = Object.entries(localeValues).filter(([locale]) => locale !== context.defaultLocale)\n\n return {\n context: typeof entry.meta.context === \"string\" ? entry.meta.context : null,\n defaultMessage: entry.defaultMessage,\n done: editableValues.filter(([, value]) => value.hasValue).length,\n id,\n localeValues,\n lookupId: id,\n placeholders: entry.placeholders,\n sources: entry.sources,\n total: editableValues.length,\n }\n}\n\nfunction updateLocalEditorLocaleValue(\n context: LocalEditorRuntimeContext,\n { locale, lookupId, value }: { locale: string; lookupId: string; value: string },\n) {\n if (locale === context.defaultLocale) throw new Error(\"Default locale Messages come from source code.\")\n if (!context.locales.includes(locale)) throw new Error(\"Unknown Locale.\")\n if (!context.manifest[lookupId]) throw new Error(\"Unknown Message.\")\n\n const localeMessages = context.readLocaleMessages(locale)\n localeMessages[lookupId] = value\n context.writeLocaleMessages(locale, localeMessages)\n}\n\nfunction createLocalEditorHtml(editorPath: string) {\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\" />',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n \"<title>Better Translation Local Editor</title>\",\n \"</head>\",\n \"<body>\",\n '<div id=\"root\"></div>',\n `<link rel=\"stylesheet\" href=\"${editorPath}/style.css\" />`,\n `<script defer src=\"${editorPath}/client.js\"></script>`,\n \"</body>\",\n \"</html>\",\n ].join(\"\\n\")\n}\n\nfunction sendHtml(response: ServerResponse, html: string) {\n response.statusCode = 200\n response.setHeader(\"content-type\", \"text/html; charset=utf-8\")\n response.end(html)\n}\n\nfunction sendJavaScript(response: ServerResponse, code: string) {\n response.statusCode = 200\n response.setHeader(\"content-type\", \"application/javascript; charset=utf-8\")\n response.end(code)\n}\n\nfunction sendCss(response: ServerResponse, css: string) {\n response.statusCode = 200\n response.setHeader(\"content-type\", \"text/css; charset=utf-8\")\n response.end(css)\n}\n\nfunction sendAsset(response: ServerResponse, assetName: string) {\n if (!/^[\\w.-]+$/.test(assetName)) {\n sendJson(response, { error: \"Not found.\" }, 404)\n return\n }\n\n response.statusCode = 200\n response.setHeader(\"content-type\", getAssetContentType(assetName))\n response.end(readFileSync(new URL(`./local-editor-assets/${assetName}`, import.meta.url)))\n}\n\nfunction sendJson(response: ServerResponse, payload: unknown, statusCode = 200) {\n response.statusCode = statusCode\n response.setHeader(\"content-type\", \"application/json; charset=utf-8\")\n response.end(JSON.stringify(payload))\n}\n\nasync function readJsonRequest(request: IncomingMessage) {\n const chunks: Buffer[] = []\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n if (chunks.length === 0) return null\n return JSON.parse(Buffer.concat(chunks).toString(\"utf-8\")) as unknown\n}\n\nfunction parseLocalEditorView(value: string | null): \"all\" | \"needs-value\" | \"manual\" | \"ai\" {\n if (value === \"needs-value\" || value === \"manual\" || value === \"ai\") return value\n return \"all\"\n}\n\nfunction normalizeLocalEditorPath(path: string) {\n const withLeadingSlash = path.startsWith(\"/\") ? path : `/${path}`\n return stripTrailingSlash(withLeadingSlash)\n}\n\nfunction stripTrailingSlash(path: string) {\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n\nfunction openLocalEditor(url: string) {\n try {\n if (process.platform === \"darwin\") execFileSync(\"open\", [url], { stdio: \"ignore\" })\n else if (process.platform === \"win32\") execFileSync(\"cmd\", [\"/c\", \"start\", \"\", url], { stdio: \"ignore\" })\n else execFileSync(\"xdg-open\", [url], { stdio: \"ignore\" })\n } catch {\n // Opening the browser is a convenience only.\n }\n}\n\nfunction readLocalEditorAsset(fileName: \"local-editor.js\" | \"style.css\") {\n return readFileSync(new URL(`./${fileName}`, import.meta.url), \"utf-8\")\n}\n\nfunction getAssetContentType(assetName: string) {\n if (assetName.endsWith(\".woff2\")) return \"font/woff2\"\n if (assetName.endsWith(\".woff\")) return \"font/woff\"\n if (assetName.endsWith(\".css\")) return \"text/css; charset=utf-8\"\n if (assetName.endsWith(\".js\")) return \"application/javascript; charset=utf-8\"\n if (assetName.endsWith(\".svg\")) return \"image/svg+xml\"\n return \"application/octet-stream\"\n}\n\nfunction compareManifestEntryIds([left]: [string, ManifestEntry], [right]: [string, ManifestEntry]) {\n return left.localeCompare(right)\n}\n","import { execFileSync } from \"node:child_process\"\nimport { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"node:fs\"\nimport { dirname, relative, resolve } from \"node:path\"\nimport { normalizePath, type Plugin, type ResolvedConfig } from \"vite\"\n\nimport type {\n BetterTranslatePluginOptions,\n BetterTranslateRuntimeOptions,\n ExtractedMessage,\n ManifestEntry,\n MessageManifest,\n MessageManifestFile,\n MessageSource,\n RuntimeMessages,\n TranslateFn,\n TranslateMessage,\n TranslationCache,\n} from \"./types.js\"\n\nimport { createEmptyCache, getCacheKey, loadCache, saveCache } from \"./cache.js\"\nimport { analyzeSourceFile } from \"./extractor.js\"\nimport { configureLocalEditor, getLocalEditorOptions } from \"./local-editor/server.js\"\nimport { serializeMeta } from \"./message-id.js\"\n\nconst PREFIX = \"\\x1b[36m[better-translation]\\x1b[0m\"\nconst DIM = \"\\x1b[2m\"\nconst RESET = \"\\x1b[0m\"\nconst BOLD = \"\\x1b[1m\"\nconst CYAN = \"\\x1b[36m\"\nconst REMOTE_API_BASE_URL = \"https://better-translation.vercel.app\"\nconst DEFAULT_REMOTE_API_KEY_ENV = \"BETTER_TRANSLATION_API_KEY\"\nconst DEFAULT_REMOTE_BRANCH = \"main\"\nconst DEFAULT_CACHE_DIR = \".cache/better-translation\"\nconst DEFAULT_TRANSLATION_CACHE_FILE = `${DEFAULT_CACHE_DIR}/cache.json`\nconst DEFAULT_PRIVATE_MANIFEST_FILE = `${DEFAULT_CACHE_DIR}/manifest.json`\nconst DEFAULT_REMOTE_OFFLINE_OUTPUT_DIR = `${DEFAULT_CACHE_DIR}/runtime`\nconst DEFAULT_LOCAL_OUTPUT_DIR = \"src/lib/bt\"\nconst DEFAULT_PUBLIC_OUTPUT_SUBDIR = \"bt\"\nconst DEFAULT_PUBLIC_BASE_PATH = \"/bt\"\nconst DEFAULT_ROOT_DIR = \"src\"\nconst DEFAULT_SCAN_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\", \".svelte\"]\nconst VIRTUAL_MESSAGES_MODULE_ID = \"better-translation/messages\"\nconst RESOLVED_VIRTUAL_MESSAGES_MODULE_ID = `\\0${VIRTUAL_MESSAGES_MODULE_ID}`\nconst CALL_MARKERS = [\"t\", \"useT\"]\nconst COMPONENT_MARKERS = [\"T\"]\nconst LOCALES_SUBDIR = \"locales\"\nconst TRANSLATION_BATCH_SIZE = 25\n\ninterface SyncResult {\n manifestChanged: boolean\n localeMessagesChanged: boolean\n}\n\nfunction formatLocale(locale: string) {\n return locale.toUpperCase()\n}\n\nfunction formatLocales(locales: string[]) {\n return locales.map(formatLocale).join(\", \")\n}\n\n/** Scans source files for translatable messages and keeps locale JSON files in sync. */\nexport function betterTranslation(options: BetterTranslatePluginOptions): Plugin {\n const {\n locales,\n defaultLocale = locales[0] ?? \"en\",\n rootDir = DEFAULT_ROOT_DIR,\n cacheFile = DEFAULT_TRANSLATION_CACHE_FILE,\n logging = true,\n runtime,\n } = options\n const configuredRuntime = normalizeRuntimeOptions(runtime)\n const manifest: MessageManifest = {}\n const fileMessages = new Map<string, ExtractedMessage[]>()\n let cache: TranslationCache = createEmptyCache()\n let resolvedRuntime = configuredRuntime\n let usesLocalStorage = shouldUseLocalStorage(configuredRuntime, false)\n let resolvedTranslate: TranslateFn | undefined = configuredRuntime.type === \"local\" ? configuredRuntime.translate : undefined\n let localesDir =\n configuredRuntime.type === \"local\" ? (configuredRuntime.output ?? DEFAULT_LOCAL_OUTPUT_DIR) : DEFAULT_LOCAL_OUTPUT_DIR\n let publicBasePath =\n configuredRuntime.type === \"local\" && configuredRuntime.target === \"public\"\n ? (configuredRuntime.basePath ?? DEFAULT_PUBLIC_BASE_PATH)\n : DEFAULT_PUBLIC_BASE_PATH\n let remoteUrl = configuredRuntime.type === \"remote\" ? (configuredRuntime.endpoint ?? REMOTE_API_BASE_URL) : REMOTE_API_BASE_URL\n let root = \"\"\n let isDev = false\n let translateTimer: ReturnType<typeof setTimeout> | null = null\n let remoteSyncTimer: ReturnType<typeof setTimeout> | null = null\n let lastSyncedRemoteManifestSignature: string | null = null\n let sourceRoots: string[] = []\n\n function log(message: string) {\n if (logging) console.log(message)\n }\n\n async function syncRemote() {\n if (resolvedRuntime.type !== \"remote\") return\n\n const payload = {\n defaultLocale,\n locales,\n messages: buildMessageManifest(),\n }\n const signature = JSON.stringify(payload)\n if (lastSyncedRemoteManifestSignature === signature) return\n\n const apiKey = resolveRemoteSyncApiKey()\n const target = formatRemoteManifestTarget(resolvedRuntime, remoteUrl)\n if (!apiKey) {\n throw new Error(\n [\n `${PREFIX} remote Manifest sync requires a Project API key`,\n `set ${DEFAULT_REMOTE_API_KEY_ENV} or pass runtime.apiKey in the Vite plugin config`,\n `target: ${target}`,\n ].join(\"\\n\"),\n )\n }\n\n let response: Response\n try {\n response = await fetch(target, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n })\n } catch (error) {\n throw new Error(formatRemoteSyncNetworkError(target, error))\n }\n\n const body = await response.text()\n\n if (!response.ok) {\n throw new Error(formatRemoteSyncError(response, target, body))\n }\n\n const result = parseRemoteSyncResult(body)\n if (result?.changed) log(`${PREFIX} ${BOLD}Synced${RESET} Messages -> ${CYAN}${formatRuntime(resolvedRuntime)}${RESET}`)\n lastSyncedRemoteManifestSignature = signature\n }\n\n function resolveRemoteSyncApiKey() {\n const explicitApiKey = resolvedRuntime.type === \"remote\" ? resolvedRuntime.apiKey?.trim() : null\n if (explicitApiKey) return explicitApiKey\n\n const envApiKey = process.env[DEFAULT_REMOTE_API_KEY_ENV]?.trim()\n return envApiKey || null\n }\n\n function buildMessageManifest(): MessageManifestFile {\n return Object.fromEntries(\n Object.entries(manifest)\n .sort(compareManifestEntryIds)\n .map(([id, entry]) => [\n id,\n {\n defaultMessage: entry.defaultMessage,\n meta: entry.meta,\n placeholders: entry.placeholders,\n sources: entry.sources.length > 1 ? [...entry.sources].sort(compareMessageSources) : entry.sources,\n },\n ]),\n )\n }\n\n function shouldScanFile(id: string) {\n const cleanId = id.split(\"?\", 1)[0] ?? id\n if (cleanId.includes(\"node_modules\")) return false\n const extension = DEFAULT_SCAN_EXTENSIONS.find((ext) => cleanId.endsWith(ext))\n if (!extension) return false\n return sourceRoots.some(\n (sourceRoot) => cleanId === sourceRoot || cleanId.startsWith(`${sourceRoot}/`) || cleanId.startsWith(`${sourceRoot}\\\\`),\n )\n }\n\n function getPrivateManifestPath() {\n return resolve(root, DEFAULT_PRIVATE_MANIFEST_FILE)\n }\n\n function getLocalesDirPath() {\n return resolve(root, localesDir, LOCALES_SUBDIR)\n }\n\n function getLocalePath(locale: string) {\n return resolve(getLocalesDirPath(), `${locale}.json`)\n }\n\n function readLocaleMessages(locale: string): RuntimeMessages {\n const path = getLocalePath(locale)\n if (!existsSync(path)) return {}\n\n try {\n const input = JSON.parse(readFileSync(path, \"utf-8\")) as unknown\n return normalizeLocaleMessages(input)\n } catch {\n return {}\n }\n }\n\n function writePrivateManifest() {\n if (!usesLocalStorage) return\n const path = getPrivateManifestPath()\n const dir = dirname(path)\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n writeFileIfChanged(path, JSON.stringify(buildMessageManifest(), null, 2) + \"\\n\")\n }\n\n function buildLocalLocaleMessages(locale: string, manifestEntries: Array<[string, ManifestEntry]>): RuntimeMessages {\n const existingMessages = readLocaleMessages(locale)\n const messages: RuntimeMessages = {}\n\n if (locale === defaultLocale) {\n for (const [id, entry] of manifestEntries) {\n messages[id] = entry.defaultMessage\n }\n return messages\n }\n\n for (const [id, entry] of manifestEntries) {\n if (Object.hasOwn(messages, id)) continue\n const existingMessage = existingMessages[id]\n const cachedMessage = getFreshCachedMessage(id, locale)\n\n if (existingMessage !== undefined && !isUntranslatedLocaleValue(existingMessage, entry)) {\n messages[id] = existingMessage\n continue\n }\n\n if (cachedMessage !== undefined) messages[id] = cachedMessage\n else if (shouldWriteDefaultLocaleFallback()) messages[id] = entry.defaultMessage\n }\n return messages\n }\n\n function writeLocaleFilesToDisk() {\n if (!usesLocalStorage) return\n const dir = getLocalesDirPath()\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n const manifestEntries = Object.entries(manifest).sort(compareManifestEntryIds)\n for (const locale of locales) {\n writeFileIfChanged(\n resolve(dir, `${locale}.json`),\n JSON.stringify(buildLocalLocaleMessages(locale, manifestEntries), null, 2) + \"\\n\",\n )\n }\n }\n\n function getMissingMessagesByLocale() {\n const missingByLocale = new Map<string, TranslateMessage[]>()\n const manifestEntries = Object.entries(manifest).sort(compareManifestEntryIds)\n\n for (const locale of locales) {\n if (locale === defaultLocale) continue\n const existingMessages = readLocaleMessages(locale)\n for (const [id, entry] of manifestEntries) {\n const existingMessage = existingMessages[id]\n const hasExistingMessage = existingMessage !== undefined && !isUntranslatedLocaleValue(existingMessage, entry)\n if (!hasExistingMessage && getFreshCachedMessage(id, locale) === undefined) {\n const misses = missingByLocale.get(locale) ?? []\n misses.push({\n id,\n text: entry.defaultMessage,\n meta: entry.meta,\n placeholders: entry.placeholders,\n sources: entry.sources,\n })\n missingByLocale.set(locale, misses)\n }\n }\n }\n\n return missingByLocale\n }\n\n function assertLocalBuildTranslationsComplete() {\n const expectedIds = new Set(Object.keys(manifest))\n const issues: string[] = []\n\n for (const locale of locales) {\n const localePath = getLocalePath(locale)\n if (!existsSync(localePath)) {\n issues.push(`- ${locale}: missing file at ${relative(root, localePath)}`)\n continue\n }\n\n const localeMessages = readLocaleMessages(locale)\n const missingIds = [...expectedIds].filter((id) => !Object.hasOwn(localeMessages, id))\n const orphanIds = Object.keys(localeMessages).filter((id) => !expectedIds.has(id))\n\n if (locale === defaultLocale) {\n const staleIds = [...expectedIds].filter((id) => localeMessages[id] !== manifest[id]!.defaultMessage)\n if (missingIds.length > 0) issues.push(formatLocaleIssue(locale, \"missing\", missingIds))\n if (orphanIds.length > 0) issues.push(formatLocaleIssue(locale, \"orphaned\", orphanIds))\n if (staleIds.length > 0) issues.push(formatLocaleIssue(locale, \"outdated default messages\", staleIds))\n continue\n }\n\n if (missingIds.length > 0) issues.push(formatLocaleIssue(locale, \"missing\", missingIds))\n if (orphanIds.length > 0) issues.push(formatLocaleIssue(locale, \"orphaned\", orphanIds))\n }\n\n if (issues.length === 0) return\n\n throw new Error(\n [\n `${PREFIX} committed locale artifacts are out of sync for local production build`,\n `local production builds are check-only and never regenerate locale files`,\n `run the dev workflow to regenerate locale artifacts and commit the result`,\n ...issues,\n ].join(\"\\n\"),\n )\n }\n\n async function translateMissingMessages() {\n if (!resolvedTranslate) return false\n const missingByLocale = getMissingMessagesByLocale()\n\n const totalMisses = [...missingByLocale.values()].reduce((count, misses) => count + misses.length, 0)\n if (totalMisses === 0) return false\n\n const missLocales = [...missingByLocale.keys()]\n log(\n `${PREFIX} ${BOLD}Translating${RESET} ${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? \"Message\" : \"Messages\"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`,\n )\n\n let translatedCount = 0\n for (const [locale, misses] of missingByLocale) {\n for (const batch of chunk(misses, TRANSLATION_BATCH_SIZE)) {\n const result = await resolvedTranslate(batch, locale)\n\n for (const miss of batch) {\n const translated = result[miss.id]?.trim()\n if (!translated) continue\n cache.entries[getCacheKey(miss.id, locale)] = {\n sourceText: miss.text,\n meta: miss.meta,\n locale,\n translation: translated,\n timestamp: Date.now(),\n }\n translatedCount += 1\n }\n\n saveCache(resolve(root, cacheFile), cache)\n writeLocaleFilesToDisk()\n writePrivateManifest()\n log(\n `${PREFIX} ${BOLD}Translated${RESET} ${CYAN}${translatedCount}${RESET}/${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? \"Message\" : \"Messages\"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`,\n )\n }\n }\n\n log(\n `${PREFIX} ${BOLD}Translated${RESET} ${CYAN}${translatedCount}${RESET}/${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? \"Message\" : \"Messages\"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`,\n )\n\n return true\n }\n\n function getFreshCachedMessage(id: string, locale: string) {\n const entry = manifest[id]\n const cachedMessage = cache.entries[getCacheKey(id, locale)]\n if (!entry || !cachedMessage) return undefined\n if (cachedMessage.sourceText !== entry.defaultMessage) return undefined\n if (serializeMeta(cachedMessage.meta) !== serializeMeta(entry.meta)) return undefined\n return cachedMessage.translation\n }\n\n function isUntranslatedLocaleValue(value: string, entry: Pick<ManifestEntry, \"defaultMessage\">) {\n return resolvedTranslate !== undefined && value.trim() === entry.defaultMessage.trim()\n }\n\n function shouldWriteDefaultLocaleFallback() {\n return resolvedTranslate !== undefined || isRemoteOfflineDev(resolvedRuntime, isDev)\n }\n\n function scheduleDevTranslation() {\n if (!resolvedTranslate) return\n if (!isDev) return\n if (translateTimer) clearTimeout(translateTimer)\n translateTimer = setTimeout(async () => {\n const translated = await translateMissingMessages()\n if (translated) saveCache(resolve(root, cacheFile), cache)\n writeLocaleFilesToDisk()\n writePrivateManifest()\n }, 1000)\n }\n\n function scheduleDevRemoteSync() {\n if (usesLocalStorage || !isDev) return\n if (remoteSyncTimer) clearTimeout(remoteSyncTimer)\n remoteSyncTimer = setTimeout(() => {\n void syncRemote().catch((error) => console.error(error instanceof Error ? error.message : error))\n }, 1000)\n }\n\n function writeLocaleMessages(locale: string, localeMessages: RuntimeMessages) {\n const dir = getLocalesDirPath()\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n\n const messages: RuntimeMessages = {}\n for (const [id, entry] of Object.entries(manifest).sort(compareManifestEntryIds)) {\n if (locale === defaultLocale) {\n messages[id] = entry.defaultMessage\n continue\n }\n\n const existingMessage = localeMessages[id]\n const cachedMessage = getFreshCachedMessage(id, locale)\n if (existingMessage !== undefined) messages[id] = existingMessage\n else if (cachedMessage !== undefined) messages[id] = cachedMessage\n else if (shouldWriteDefaultLocaleFallback()) messages[id] = entry.defaultMessage\n }\n\n writeFileIfChanged(getLocalePath(locale), JSON.stringify(messages, null, 2) + \"\\n\")\n }\n\n function removeFileMessages(file: string) {\n const previous = fileMessages.get(file)\n if (!previous) return false\n\n for (const message of previous) {\n const entry = manifest[message.id]\n if (!entry) continue\n entry.sources = entry.sources.filter((source) => !isSameSource(source, message.source))\n if (entry.sources.length === 0) delete manifest[message.id]\n }\n\n fileMessages.delete(file)\n return true\n }\n\n function syncFileMessages(file: string, messages: ExtractedMessage[]): SyncResult {\n const previousMessages = fileMessages.get(file) ?? []\n const nextEntries = groupMessagesById(messages)\n for (const [id, entry] of Object.entries(nextEntries)) {\n const existing = manifest[id]\n if (existing && !hasSameMessageShape(existing, entry)) {\n throw new Error(formatCollisionError(id, existing, entry))\n }\n }\n\n removeFileMessages(file)\n for (const [id, entry] of Object.entries(nextEntries)) {\n if (!manifest[id]) {\n manifest[id] = entry\n continue\n }\n for (const source of entry.sources) {\n if (!manifest[id]!.sources.some((existingSource) => isSameSource(existingSource, source))) {\n manifest[id]!.sources.push(source)\n }\n }\n }\n\n if (messages.length > 0) fileMessages.set(file, messages)\n return {\n manifestChanged:\n previousMessages.length !== messages.length ||\n previousMessages.some((message, index) => !isSameExtractedMessage(message, messages[index])),\n localeMessagesChanged:\n previousMessages.length !== messages.length ||\n previousMessages.some((message, index) => !hasSameMessageShape(message, messages[index]!)),\n }\n }\n\n function syncSourceCode(file: string, code: string) {\n const analysis = analyzeSourceFile(code, file, {\n call: CALL_MARKERS,\n component: COMPONENT_MARKERS,\n logging,\n })\n if (!analysis.parsed) return null\n return syncFileMessages(\n file,\n analysis.messages.map((message) => ({\n ...message,\n source: {\n ...message.source,\n file: toRootRelativePath(message.source.file),\n },\n })),\n )\n }\n\n function removeTrackedFile(file: string): SyncResult {\n const hadPreviousMessages = removeFileMessages(file)\n return {\n manifestChanged: hadPreviousMessages,\n localeMessagesChanged: hadPreviousMessages,\n }\n }\n\n function applySyncResult(syncResult: SyncResult | null, options: { scheduleTranslation: boolean }) {\n if (!syncResult) return\n if (syncResult.localeMessagesChanged) {\n writeLocaleFilesToDisk()\n writePrivateManifest()\n if (options.scheduleTranslation) scheduleDevTranslation()\n return\n }\n if (syncResult.manifestChanged) writePrivateManifest()\n }\n\n function scanAllSourceFiles() {\n for (const id of Object.keys(manifest)) delete manifest[id]\n fileMessages.clear()\n\n for (const sourceRoot of sourceRoots) {\n if (!existsSync(sourceRoot)) continue\n for (const file of collectScanFiles(sourceRoot).sort()) {\n const code = readFileSync(file, \"utf-8\")\n syncSourceCode(file, code)\n }\n }\n }\n\n function toRootRelativePath(file: string) {\n return relative(root, file).replaceAll(\"\\\\\", \"/\")\n }\n\n function createVirtualMessagesModule() {\n if (isRemoteOfflineDev(resolvedRuntime, isDev)) {\n return createModuleMessagesModule(locales, (locale) => `/${normalizePath(toRootRelativePath(getLocalePath(locale)))}`)\n }\n if (resolvedRuntime.type === \"remote\") return createRemoteMessagesModule(resolvedRuntime, locales, remoteUrl)\n if (resolvedRuntime.target === \"public\") return createPublicMessagesModule(locales, publicBasePath)\n return createModuleMessagesModule(locales, (locale) => `/${normalizePath(toRootRelativePath(getLocalePath(locale)))}`)\n }\n\n return {\n name: \"better-translation-extract\",\n enforce: \"pre\",\n\n config() {\n return {\n ssr: {\n noExternal: [\"better-translation\"],\n },\n }\n },\n\n configResolved(config) {\n root = config.root\n isDev = config.command === \"serve\"\n resolvedRuntime = resolveRuntimeOptions(configuredRuntime, config)\n usesLocalStorage = shouldUseLocalStorage(resolvedRuntime, isDev)\n resolvedTranslate = resolvedRuntime.type === \"local\" ? resolvedRuntime.translate : undefined\n localesDir = getRuntimeOutputDir(resolvedRuntime, isDev)\n publicBasePath =\n resolvedRuntime.type === \"local\" && resolvedRuntime.target === \"public\"\n ? (resolvedRuntime.basePath ?? DEFAULT_PUBLIC_BASE_PATH)\n : DEFAULT_PUBLIC_BASE_PATH\n remoteUrl = resolvedRuntime.type === \"remote\" ? (resolvedRuntime.endpoint ?? REMOTE_API_BASE_URL) : REMOTE_API_BASE_URL\n sourceRoots = (Array.isArray(rootDir) ? rootDir : [rootDir]).map((dir) => resolve(root, dir))\n log(\n `${PREFIX} Locales: ${CYAN}${formatLocales(locales)}${RESET} | Default: ${CYAN}${formatLocale(defaultLocale)}${RESET} | Runtime: ${CYAN}${formatRuntime(resolvedRuntime)}${RESET} | Out Dir: ${DIM}${usesLocalStorage ? localesDir : \"n/a\"}${RESET} | Roots: ${DIM}${(Array.isArray(rootDir) ? rootDir : [rootDir]).join(\", \")}${RESET}`,\n )\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MESSAGES_MODULE_ID) return RESOLVED_VIRTUAL_MESSAGES_MODULE_ID\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_MESSAGES_MODULE_ID) return createVirtualMessagesModule()\n },\n\n async buildStart() {\n cache = loadCache(resolve(root, cacheFile))\n scanAllSourceFiles()\n if (usesLocalStorage && !isDev) {\n assertLocalBuildTranslationsComplete()\n return\n }\n writeLocaleFilesToDisk()\n writePrivateManifest()\n\n if (isDev) scheduleDevTranslation()\n },\n\n configureServer(server) {\n const localEditorOptions = getLocalEditorOptions({ isDev, runtime: resolvedRuntime })\n if (localEditorOptions) {\n configureLocalEditor(\n server,\n { defaultLocale, isUntranslatedLocaleValue, locales, log, manifest, readLocaleMessages, writeLocaleMessages },\n localEditorOptions,\n )\n }\n server.watcher.add(sourceRoots)\n server.httpServer?.once(\"listening\", () => scheduleDevRemoteSync())\n\n const syncFileFromDisk = (file: string) => {\n if (!shouldScanFile(file) || !existsSync(file)) return\n applySyncResult(syncSourceCode(file, readFileSync(file, \"utf-8\")), { scheduleTranslation: true })\n scheduleDevRemoteSync()\n }\n\n const removeFileFromManifest = (file: string) => {\n if (!shouldScanFile(file)) return\n applySyncResult(removeTrackedFile(file), { scheduleTranslation: true })\n scheduleDevRemoteSync()\n }\n\n server.watcher.on(\"add\", syncFileFromDisk)\n server.watcher.on(\"change\", syncFileFromDisk)\n server.watcher.on(\"unlink\", removeFileFromManifest)\n },\n\n transform(code, id) {\n const cleanId = id.split(\"?\", 1)[0] ?? id\n if (!shouldScanFile(cleanId)) return\n\n const analysis = analyzeSourceFile(code, cleanId, {\n call: CALL_MARKERS,\n component: COMPONENT_MARKERS,\n logging,\n })\n\n if (analysis.edits.length === 0) return\n return {\n code: applyEdits(code, analysis.edits),\n map: null,\n }\n },\n\n async generateBundle() {\n if (usesLocalStorage) {\n assertLocalBuildTranslationsComplete()\n } else if (isDev) {\n await translateMissingMessages()\n }\n\n if (!usesLocalStorage) {\n await syncRemote()\n }\n },\n\n closeBundle() {\n if (usesLocalStorage && !isDev) return\n saveCache(resolve(root, cacheFile), cache)\n },\n }\n}\n\nfunction formatLocaleIssue(locale: string, label: string, ids: string[]) {\n const preview = ids\n .slice(0, 5)\n .map((id) => JSON.stringify(id))\n .join(\", \")\n const suffix = ids.length > 5 ? `, ... ${ids.length - 5} more` : \"\"\n return `- ${locale}: ${label} (${preview}${suffix})`\n}\n\nfunction shouldUseLocalStorage(runtime: BetterTranslateRuntimeOptions, isDev: boolean) {\n return runtime.type === \"local\" || isRemoteOfflineDev(runtime, isDev)\n}\n\nfunction isRemoteOfflineDev(runtime: BetterTranslateRuntimeOptions, isDev: boolean) {\n return runtime.type === \"remote\" && isDev && runtime.dev?.offline === true\n}\n\nfunction getRuntimeOutputDir(runtime: BetterTranslateRuntimeOptions, isDev: boolean) {\n if (runtime.type === \"local\") return runtime.output!\n if (isRemoteOfflineDev(runtime, isDev)) return DEFAULT_REMOTE_OFFLINE_OUTPUT_DIR\n return DEFAULT_LOCAL_OUTPUT_DIR\n}\n\nfunction normalizeRuntimeOptions(runtime: BetterTranslateRuntimeOptions | undefined): BetterTranslateRuntimeOptions {\n if (runtime) return runtime.type === \"local\" ? { ...runtime, target: runtime.target ?? \"module\" } : runtime\n return { type: \"local\", target: \"module\" }\n}\n\nfunction resolveRuntimeOptions(runtime: BetterTranslateRuntimeOptions, config: ResolvedConfig): BetterTranslateRuntimeOptions {\n if (runtime.type === \"remote\") {\n const projectId = typeof runtime.projectId === \"string\" ? runtime.projectId.trim() : \"\"\n if (!projectId) {\n throw new Error(`${PREFIX} remote runtime requires a projectId`)\n }\n return {\n ...runtime,\n projectId,\n endpoint: runtime.endpoint ?? REMOTE_API_BASE_URL,\n branch: resolveBranch(runtime, config.root),\n dev: {\n offline: runtime.dev?.offline ?? false,\n },\n }\n }\n\n const target = runtime.target ?? \"module\"\n if (target === \"module\") {\n return {\n ...runtime,\n target,\n output: runtime.output ?? DEFAULT_LOCAL_OUTPUT_DIR,\n }\n }\n\n if (!config.publicDir) {\n throw new Error(`${PREFIX} runtime target \"public\" requires Vite publicDir to be enabled`)\n }\n\n const output = runtime.output ?? normalizePath(relative(config.root, resolve(config.publicDir, DEFAULT_PUBLIC_OUTPUT_SUBDIR)))\n const outputPath = resolve(config.root, output)\n const publicBasePath = runtime.basePath ?? inferPublicBasePath(outputPath, config.publicDir)\n\n return {\n ...runtime,\n target,\n output,\n basePath: publicBasePath,\n }\n}\n\nfunction inferPublicBasePath(outputPath: string, publicDir: string) {\n const relativeToPublic = normalizePath(relative(publicDir, outputPath))\n if (relativeToPublic.startsWith(\"..\")) {\n throw new Error(`${PREFIX} runtime target \"public\" output must be inside Vite publicDir unless basePath is provided`)\n }\n return `/${relativeToPublic}`.replace(/\\/$/, \"\")\n}\n\nfunction formatRuntime(runtime: BetterTranslateRuntimeOptions) {\n return runtime.type === \"local\" ? `Local/${runtime.target ?? \"module\"}` : `Remote/${runtime.branch ?? \"auto\"}`\n}\n\nfunction resolveBranch(runtime: Pick<Extract<BetterTranslateRuntimeOptions, { type: \"remote\" }>, \"branch\">, root: string) {\n if (runtime.branch && runtime.branch !== \"auto\") return runtime.branch\n\n const envBranch = process.env.BETTER_TRANSLATION_BRANCH?.trim()\n if (envBranch) return envBranch\n\n const providerBranch = process.env.VERCEL_GIT_COMMIT_REF?.trim()\n if (providerBranch) return providerBranch\n\n const gitBranch = readCurrentGitBranch(root)\n return gitBranch ?? DEFAULT_REMOTE_BRANCH\n}\n\nfunction readCurrentGitBranch(root: string) {\n try {\n const branch = execFileSync(\"git\", [\"branch\", \"--show-current\"], {\n cwd: root,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim()\n return branch || null\n } catch {\n return null\n }\n}\n\nfunction formatRemoteManifestTarget(runtime: Extract<BetterTranslateRuntimeOptions, { type: \"remote\" }>, endpoint: string) {\n return `${endpoint.replace(/\\/$/, \"\")}/api/projects/${encodeURIComponent(runtime.projectId)}/branches/${encodeURIComponent(runtime.branch ?? DEFAULT_REMOTE_BRANCH)}/manifest`\n}\n\nfunction parseRemoteSyncResult(body: string) {\n try {\n const parsed = JSON.parse(body) as unknown\n if (typeof parsed !== \"object\" || parsed === null) return null\n return {\n changed: \"changed\" in parsed && parsed.changed === true,\n }\n } catch {\n return null\n }\n}\n\nfunction formatRemoteSyncError(response: Response, target: string, body: string) {\n const details = formatRemoteSyncResponseDetails(body)\n return [\n `${PREFIX} remote Manifest sync failed with ${response.status} ${response.statusText || \"HTTP error\"}`,\n `target: ${target}`,\n details ? `response: ${details}` : null,\n ]\n .filter((line) => line !== null)\n .join(\"\\n\")\n}\n\nfunction formatRemoteSyncNetworkError(target: string, error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n return [`${PREFIX} remote Manifest sync could not reach the hosted service`, `target: ${target}`, `error: ${message}`].join(\n \"\\n\",\n )\n}\n\nfunction formatRemoteSyncResponseDetails(body: string) {\n const details = body.trim().replace(/\\s+/g, \" \")\n if (!details) return \"\"\n return details.length > 500 ? `${details.slice(0, 500)}...` : details\n}\n\nfunction createModuleMessagesModule(locales: string[], getImportPath: (locale: string) => string) {\n const cases = locales\n .map(\n (locale) => ` case ${JSON.stringify(locale)}:\n return (await import(${JSON.stringify(getImportPath(locale))})).default`,\n )\n .join(\"\\n\")\n\n return [\n `export const locales = ${JSON.stringify(locales)}`,\n \"\",\n \"export async function loadMessages(locale) {\",\n \" switch (locale) {\",\n cases,\n \" default:\",\n \" throw new Error(`Unknown locale: ${locale}`)\",\n \" }\",\n \"}\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction createPublicMessagesModule(locales: string[], basePath: string) {\n const normalizedBasePath = basePath.replace(/\\/$/, \"\")\n return [\n `export const locales = ${JSON.stringify(locales)}`,\n \"\",\n \"export async function loadMessages(locale) {\",\n \" assertKnownLocale(locale)\",\n ` const response = await fetch(\\`${normalizedBasePath}/locales/\\${encodeURIComponent(locale)}.json\\`)`,\n \" if (!response.ok) throw new Error(`Failed to load locale: ${locale}`)\",\n \" return response.json()\",\n \"}\",\n \"\",\n createKnownLocaleAssertion(locales),\n ].join(\"\\n\")\n}\n\nfunction createRemoteMessagesModule(\n runtime: Extract<BetterTranslateRuntimeOptions, { type: \"remote\" }>,\n locales: string[],\n endpoint: string,\n) {\n const normalizedEndpoint = endpoint.replace(/\\/$/, \"\")\n const projectPath = `/projects/${encodeURIComponent(runtime.projectId)}`\n const branchPath = `/branches/${encodeURIComponent(runtime.branch ?? DEFAULT_REMOTE_BRANCH)}`\n return [\n `export const locales = ${JSON.stringify(locales)}`,\n \"\",\n \"export async function loadMessages(locale) {\",\n \" assertKnownLocale(locale)\",\n ` const response = await fetch(\\`${normalizedEndpoint}${projectPath}${branchPath}/locales/\\${encodeURIComponent(locale)}.json\\`)`,\n \" if (!response.ok) throw new Error(`Failed to load locale: ${locale}`)\",\n \" return response.json()\",\n \"}\",\n \"\",\n createKnownLocaleAssertion(locales),\n ].join(\"\\n\")\n}\n\nfunction createKnownLocaleAssertion(locales: string[]) {\n return [\n `const knownLocales = new Set(${JSON.stringify(locales)})`,\n \"\",\n \"function assertKnownLocale(locale) {\",\n \" if (!knownLocales.has(locale)) throw new Error(`Unknown locale: ${locale}`)\",\n \"}\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction normalizeLocaleMessages(input: unknown): RuntimeMessages {\n if (isRuntimeMessages(input)) return input\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"messages\" in input &&\n typeof input.messages === \"object\" &&\n input.messages !== null\n ) {\n return Object.fromEntries(\n Object.entries(input.messages).flatMap(([id, entry]) =>\n typeof entry === \"object\" && entry !== null && \"translation\" in entry && typeof entry.translation === \"string\"\n ? [[id, entry.translation]]\n : [],\n ),\n ) as RuntimeMessages\n }\n return {}\n}\n\nfunction writeFileIfChanged(path: string, contents: string) {\n if (existsSync(path) && readFileSync(path, \"utf-8\") === contents) return false\n writeFileSync(path, contents)\n return true\n}\n\nfunction collectScanFiles(root: string) {\n const files: string[] = []\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n const path = resolve(root, entry.name)\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\") continue\n files.push(...collectScanFiles(path))\n continue\n }\n files.push(path)\n }\n return files\n}\n\nfunction isRuntimeMessages(input: unknown): input is RuntimeMessages {\n return typeof input === \"object\" && input !== null && Object.values(input).every((value) => typeof value === \"string\")\n}\n\nfunction chunk<T>(items: T[], size: number) {\n const chunks: T[][] = []\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size))\n }\n return chunks\n}\n\nfunction applyEdits(code: string, edits: Array<{ start: number; end: number; replacement: string }>) {\n let transformed = code\n for (const edit of [...edits].sort((a, b) => b.start - a.start)) {\n transformed = `${transformed.slice(0, edit.start)}${edit.replacement}${transformed.slice(edit.end)}`\n }\n return transformed\n}\n\nfunction groupMessagesById(messages: ExtractedMessage[]): MessageManifest {\n const grouped: MessageManifest = {}\n\n for (const message of messages) {\n const existing = grouped[message.id]\n if (existing && !hasSameMessageShape(existing, message)) {\n throw new Error(formatCollisionError(message.id, existing, message))\n }\n if (!existing) {\n grouped[message.id] = {\n defaultMessage: message.defaultMessage,\n meta: message.meta,\n placeholders: message.placeholders,\n sources: [message.source],\n }\n continue\n }\n if (!existing.sources.some((source) => isSameSource(source, message.source))) {\n existing.sources.push(message.source)\n }\n }\n\n return grouped\n}\n\nfunction hasSameMessageShape(\n existing: Pick<ManifestEntry, \"defaultMessage\" | \"meta\" | \"placeholders\">,\n incoming: Pick<ManifestEntry, \"defaultMessage\" | \"meta\" | \"placeholders\"> | ExtractedMessage,\n) {\n return (\n existing.defaultMessage === incoming.defaultMessage &&\n serializeMeta(existing.meta) === serializeMeta(incoming.meta) &&\n JSON.stringify(existing.placeholders) === JSON.stringify(incoming.placeholders)\n )\n}\n\nfunction isSameSource(left: MessageSource, right: MessageSource) {\n return left.file === right.file && left.kind === right.kind && left.marker === right.marker\n}\n\nfunction compareManifestEntryIds([left]: [string, ManifestEntry], [right]: [string, ManifestEntry]) {\n return left.localeCompare(right)\n}\n\nfunction compareMessageSources(left: MessageSource, right: MessageSource) {\n return left.file.localeCompare(right.file) || left.kind.localeCompare(right.kind) || left.marker.localeCompare(right.marker)\n}\n\nfunction isSameExtractedMessage(left: ExtractedMessage, right?: ExtractedMessage) {\n if (!right) return false\n return hasSameMessageShape(left, right) && isSameSource(left.source, right.source)\n}\n\nfunction formatCollisionError(\n id: string,\n existing: Pick<ManifestEntry, \"defaultMessage\" | \"meta\" | \"placeholders\" | \"sources\">,\n incoming: Pick<ManifestEntry, \"defaultMessage\" | \"meta\" | \"placeholders\" | \"sources\"> | ExtractedMessage,\n) {\n const existingSources = formatSources(existing.sources)\n const incomingSources = formatSources(\"source\" in incoming ? [incoming.source] : incoming.sources)\n return [\n `${PREFIX} conflicting message definition for ${BOLD}\"${id}\"${RESET}`,\n `existing: ${JSON.stringify({ defaultMessage: existing.defaultMessage, meta: existing.meta, placeholders: existing.placeholders })}`,\n `existing sources: ${existingSources}`,\n `incoming: ${JSON.stringify({ defaultMessage: incoming.defaultMessage, meta: incoming.meta, placeholders: incoming.placeholders })}`,\n `incoming sources: ${incomingSources}`,\n ].join(\"\\n\")\n}\n\nfunction formatSources(sources: MessageSource[]) {\n return sources.map((source) => `${source.file} (${source.kind}:${source.marker})`).join(\", \")\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite.mjs","names":["isStringLiteral","getCallMetaArgument","createCallOptionsEdit","getVarEntry","getMetaArgument","isTranslateOptionsArgument","hasObjectProperty","CYAN","PREFIX","RESET","compareManifestEntryIds"],"sources":["../src/cache.ts","../src/extractors/types.ts","../src/extractors/svelte.ts","../src/extractors/typescript.ts","../src/extractor.ts","../src/local-editor/server.ts","../src/plugin.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { dirname } from \"node:path\"\n\nimport type { TranslationCache } from \"./types.js\"\n\nconst CURRENT_VERSION = 1\n\nexport function createEmptyCache(): TranslationCache {\n return { version: CURRENT_VERSION, entries: {} }\n}\n\n/** Loads the translation cache from disk, resetting it when the schema version changes. */\nexport function loadCache(path: string): TranslationCache {\n if (!existsSync(path)) return createEmptyCache()\n try {\n const data = JSON.parse(readFileSync(path, \"utf-8\")) as TranslationCache\n if (data.version !== CURRENT_VERSION) return createEmptyCache()\n return data\n } catch {\n return createEmptyCache()\n }\n}\n\n/** Persists the translation cache so future runs can reuse existing translations. */\nexport function saveCache(path: string, cache: TranslationCache) {\n const dir = dirname(path)\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n const next = JSON.stringify(cache, null, 2)\n if (existsSync(path) && readFileSync(path, \"utf-8\") === next) return\n writeFileSync(path, next)\n}\n\n/** Builds the cache key used to distinguish translations by stable lookup id and locale. */\nexport function getCacheKey(lookupId: string, locale: string) {\n return `${lookupId}\\0${locale}`\n}\n","import type { ExtractedMessage, MessageSource } from \"../types.js\"\n\nexport interface SourceMarkers {\n call: string[]\n component: string[]\n logging: boolean\n}\n\nexport interface SourceEdit {\n start: number\n end: number\n replacement: string\n}\n\nexport interface SourceAnalysis {\n parsed: boolean\n messages: ExtractedMessage[]\n edits: SourceEdit[]\n}\n\nexport function extractPlaceholdersFromMessage(message: string) {\n const names = new Set<string>()\n for (const match of message.matchAll(/\\{(\\w+)\\}/g)) {\n if (match[1]) names.add(match[1])\n }\n return [...names]\n}\n\nexport function createSource({\n filename,\n marker,\n kind,\n}: {\n filename: string\n marker: string\n kind: MessageSource[\"kind\"]\n}): MessageSource {\n return {\n file: filename,\n kind,\n marker,\n }\n}\n","import { createRequire } from \"node:module\"\n\nimport type { ExtractedMessage, TranslateOptions } from \"../types.js\"\n\nimport { getCallMessageId, getMessageId } from \"../message-id.js\"\nimport {\n createSource,\n extractPlaceholdersFromMessage,\n type SourceAnalysis,\n type SourceEdit,\n type SourceMarkers,\n} from \"./types.js\"\n\ntype SvelteNode = {\n type?: string\n start?: number\n end?: number\n name?: string\n attributes?: SvelteNode[]\n fragment?: {\n nodes?: SvelteNode[]\n }\n value?: unknown\n raw?: string\n data?: string\n expression?: SvelteNode\n [key: string]: unknown\n}\n\ntype SvelteAttribute = SvelteNode & {\n name?: string\n value?: SvelteNode | SvelteNode[] | true\n}\n\ntype SvelteCallExpression = SvelteNode & {\n callee?: SvelteNode\n arguments?: SvelteNode[]\n}\n\nconst require = createRequire(import.meta.url)\n\n/** Extracts messages from Svelte component markup and embedded expressions. */\nexport function analyzeSvelteSourceFile(code: string, filename: string, markers: SourceMarkers): SourceAnalysis {\n const messages: ExtractedMessage[] = []\n const edits: SourceEdit[] = []\n let ast: SvelteNode\n\n try {\n ast = loadSvelteCompiler().parse(code, { modern: true }) as unknown as SvelteNode\n } catch {\n return { parsed: false, messages, edits }\n }\n\n walkSvelte(ast, (node) => {\n if (node.type === \"Component\" && typeof node.name === \"string\" && markers.component.includes(node.name)) {\n analyzeTComponent(code, filename, markers, node, messages, edits)\n return\n }\n\n if (node.type === \"CallExpression\") {\n analyzeCallExpression(code, filename, markers, node as SvelteCallExpression, messages, edits)\n }\n })\n\n return { parsed: true, messages, edits }\n}\n\nfunction loadSvelteCompiler(): { parse: (code: string, options: { modern: true }) => unknown } {\n return require(\"svelte/compiler\") as { parse: (code: string, options: { modern: true }) => unknown }\n}\n\nfunction analyzeCallExpression(\n code: string,\n filename: string,\n markers: SourceMarkers,\n node: SvelteCallExpression,\n messages: ExtractedMessage[],\n edits: SourceEdit[],\n) {\n if (node.callee?.type !== \"Identifier\") return\n if (typeof node.callee.name !== \"string\" || !markers.call.includes(node.callee.name)) return\n const [messageArg] = node.arguments ?? []\n if (!isStringLiteral(messageArg)) return\n\n const value = String(messageArg.value)\n const meta = getCallMetaArgument(node.arguments ?? [])\n const id = getCallMessageId(value, meta)\n messages.push({\n id,\n defaultMessage: value,\n meta: meta ?? {},\n placeholders: extractPlaceholdersFromMessage(value),\n source: createSource({\n filename,\n marker: node.callee.name,\n kind: \"call\",\n }),\n })\n\n const edit = createCallOptionsEdit(code, node.arguments ?? [], id)\n if (edit) edits.push(edit)\n}\n\nfunction analyzeTComponent(\n code: string,\n filename: string,\n markers: SourceMarkers,\n node: SvelteNode,\n messages: ExtractedMessage[],\n edits: SourceEdit[],\n) {\n const extraction = extractSvelteChildren(code, node.fragment?.nodes ?? [])\n if (!extraction.valid) {\n if (markers.logging) console.warn(`[better-translation] Non-static <${node.name}> in ${filename}, skipping`)\n return\n }\n\n const context = getStringAttribute(node.attributes, \"context\")\n const meta = context ? { context } : undefined\n const id = getStringAttribute(node.attributes, \"id\") ?? getMessageId(extraction.message, meta)\n messages.push({\n id,\n defaultMessage: extraction.message,\n meta: meta ?? {},\n placeholders: extraction.placeholders,\n source: createSource({\n filename,\n marker: String(node.name),\n kind: \"component\",\n }),\n })\n\n const insertAt = getSvelteOpeningTagNameEnd(code, node)\n if (!hasAttribute(node.attributes, \"id\") && insertAt !== undefined) {\n edits.push({\n start: insertAt,\n end: insertAt,\n replacement: ` id=${JSON.stringify(id)}`,\n })\n }\n\n if (!hasAttribute(node.attributes, \"message\") && insertAt !== undefined) {\n edits.push({\n start: insertAt,\n end: insertAt,\n replacement: ` message=${JSON.stringify(extraction.message)}`,\n })\n }\n\n if (!hasAttribute(node.attributes, \"values\") && extraction.values.length > 0 && insertAt !== undefined) {\n edits.push({\n start: insertAt,\n end: insertAt,\n replacement: ` values={{ ${extraction.values.map((entry) => `${entry.name}: ${entry.value}`).join(\", \")} }}`,\n })\n }\n}\n\nfunction extractSvelteChildren(code: string, children: SvelteNode[]) {\n const parts: string[] = []\n const placeholders: string[] = []\n const values: Array<{ name: string; value: string }> = []\n\n for (const child of children) {\n if (child.type === \"Text\") {\n parts.push(String(child.data ?? child.raw ?? \"\"))\n continue\n }\n\n if (child.type === \"Component\" && child.name === \"Var\") {\n const entry = getVarEntry(code, child)\n if (!entry) return { message: \"\", placeholders: [], values: [], valid: false }\n placeholders.push(entry.name)\n values.push(entry)\n parts.push(`{${entry.name}}`)\n continue\n }\n\n if (child.type === \"Comment\") continue\n return { message: \"\", placeholders: [], values: [], valid: false }\n }\n\n const message = parts.join(\"\").replace(/\\s+/g, \" \").trim()\n return { message, placeholders, values, valid: message.length > 0 }\n}\n\nfunction getVarEntry(code: string, node: SvelteNode) {\n const explicitName = getStringAttribute(node.attributes, \"name\")\n const explicitValue = getExpressionAttributeSource(code, node.attributes, \"value\")\n if (explicitName && explicitValue) return { name: explicitName, value: explicitValue }\n if (explicitName) return { name: explicitName, value: JSON.stringify(explicitName) }\n\n const shorthandAttribute = getSingleExpressionAttribute(node.attributes)\n if (!shorthandAttribute) return undefined\n return {\n name: shorthandAttribute.name,\n value: code.slice(shorthandAttribute.expression.start!, shorthandAttribute.expression.end!),\n }\n}\n\nfunction getSingleExpressionAttribute(attributes?: SvelteNode[]) {\n const expressionAttributes = (attributes ?? []).flatMap((attribute) => {\n if (attribute.type !== \"Attribute\" || typeof attribute.name !== \"string\") return []\n const value = (attribute as SvelteAttribute).value\n return isExpressionAttributeValue(value) ? [{ name: attribute.name, expression: value.expression }] : []\n })\n\n return expressionAttributes.length === 1 ? expressionAttributes[0] : undefined\n}\n\nfunction getStringAttribute(attributes: SvelteNode[] | undefined, name: string) {\n const attribute = attributes?.find((entry) => entry.type === \"Attribute\" && entry.name === name) as SvelteAttribute | undefined\n if (!attribute) return undefined\n if (typeof attribute.value === \"string\") return attribute.value\n\n const value = Array.isArray(attribute.value) ? attribute.value[0] : attribute.value\n if (!value || value === true) return undefined\n if (value?.type === \"Text\") return String(value.data ?? value.raw ?? \"\")\n}\n\nfunction getExpressionAttributeSource(code: string, attributes: SvelteNode[] | undefined, name: string) {\n const attribute = attributes?.find((entry) => entry.type === \"Attribute\" && entry.name === name) as SvelteAttribute | undefined\n const value = attribute?.value\n if (!isExpressionAttributeValue(value)) return undefined\n return code.slice(value.expression.start!, value.expression.end!)\n}\n\nfunction hasAttribute(attributes: SvelteNode[] | undefined, name: string) {\n return attributes?.some((entry) => entry.type === \"Attribute\" && entry.name === name) ?? false\n}\n\nfunction getSvelteOpeningTagNameEnd(code: string, node: SvelteNode) {\n if (node.start === undefined || typeof node.name !== \"string\") return undefined\n const tagStart = code.indexOf(`<${node.name}`, node.start)\n if (tagStart < 0) return undefined\n return tagStart + node.name.length + 1\n}\n\nfunction isExpressionAttributeValue(value: SvelteAttribute[\"value\"]): value is SvelteNode & { expression: SvelteNode } {\n if (Array.isArray(value) || value === true || !value) return false\n return value.type === \"ExpressionTag\" && value.expression !== undefined\n}\n\nfunction isStringLiteral(node?: SvelteNode): node is SvelteNode & { value: string } {\n return node?.type === \"Literal\" && typeof node.value === \"string\"\n}\n\nfunction getCallMetaArgument(args: SvelteNode[]) {\n return getMetaArgument(isTranslateOptionsArgument(args[1]) ? args[1] : args[2])\n}\n\nfunction getMetaArgument(node?: SvelteNode) {\n if (!node) return undefined\n if (isStringLiteral(node)) return { context: node.value }\n if (node.type !== \"ObjectExpression\") return undefined\n\n const meta: TranslateOptions = {}\n for (const property of (node.properties as SvelteNode[] | undefined) ?? []) {\n const key = getPropertyKey(property)\n const value = property.value as SvelteNode | undefined\n if ((key === \"context\" || key === \"id\") && isStringLiteral(value)) meta[key] = value.value\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined\n}\n\nfunction createCallOptionsEdit(code: string, args: SvelteNode[], id: string): SourceEdit | undefined {\n const valuesArg = args[1]\n const optionsArg = isTranslateOptionsArgument(valuesArg) ? valuesArg : args[2]\n\n if (!optionsArg) {\n return {\n start: (valuesArg ?? args[0])!.end!,\n end: (valuesArg ?? args[0])!.end!,\n replacement: `, { id: ${JSON.stringify(id)} }`,\n }\n }\n\n if (isStringLiteral(optionsArg)) {\n const contextValue = code.slice(optionsArg.start, optionsArg.end)\n return {\n start: optionsArg.start!,\n end: optionsArg.end!,\n replacement: `{ id: ${JSON.stringify(id)}, context: ${contextValue} }`,\n }\n }\n\n if (optionsArg.type !== \"ObjectExpression\") return undefined\n if (hasObjectProperty(optionsArg, \"id\")) return undefined\n\n const objectSource = code.slice(optionsArg.start, optionsArg.end)\n const innerSource = objectSource.slice(1, -1)\n const replacement =\n innerSource.trim().length > 0 ? `{ id: ${JSON.stringify(id)},${innerSource} }` : `{ id: ${JSON.stringify(id)} }`\n\n return {\n start: optionsArg.start!,\n end: optionsArg.end!,\n replacement,\n }\n}\n\nfunction isTranslateOptionsArgument(node?: SvelteNode) {\n if (!node) return false\n if (isStringLiteral(node)) return true\n if (node.type !== \"ObjectExpression\") return false\n\n return ((node.properties as SvelteNode[] | undefined) ?? []).every((property) => {\n const key = getPropertyKey(property)\n return key === \"context\" || key === \"id\"\n })\n}\n\nfunction getPropertyKey(property: SvelteNode) {\n const key = property.key as SvelteNode | undefined\n if (key?.type === \"Identifier\" && typeof key.name === \"string\") return key.name\n if (key?.type === \"Literal\" && typeof key.value === \"string\") return key.value\n}\n\nfunction hasObjectProperty(node: SvelteNode, name: string) {\n return ((node.properties as SvelteNode[] | undefined) ?? []).some((property) => getPropertyKey(property) === name)\n}\n\nfunction walkSvelte(node: unknown, visit: (node: SvelteNode) => void, seen = new Set<unknown>()) {\n if (!node || typeof node !== \"object\" || seen.has(node)) return\n seen.add(node)\n\n const current = node as SvelteNode\n visit(current)\n\n for (const value of Object.values(current)) {\n if (!value || typeof value !== \"object\") continue\n if (Array.isArray(value)) {\n for (const item of value) walkSvelte(item, visit, seen)\n continue\n }\n walkSvelte(value, visit, seen)\n }\n}\n","import type { Argument, JSXChild, StringLiteral } from \"oxc-parser\"\nimport { parseSync, Visitor } from \"oxc-parser\"\n\nimport type { ExtractedMessage, TranslateOptions } from \"../types.js\"\n\nimport { getCallMessageId, getMessageId } from \"../message-id.js\"\nimport {\n createSource,\n extractPlaceholdersFromMessage,\n type SourceAnalysis,\n type SourceEdit,\n type SourceMarkers,\n} from \"./types.js\"\n\n/** Extracts messages and source edits from a TypeScript, JavaScript, or JSX file in one coordinated parse pass. */\nexport function analyzeTypeScriptSourceFile(code: string, filename: string, markers: SourceMarkers): SourceAnalysis {\n const messages: ExtractedMessage[] = []\n const edits: SourceEdit[] = []\n const result = parseSync(filename, code)\n if (result.errors.length > 0) return { parsed: false, messages, edits }\n\n const visitor = new Visitor({\n CallExpression(node) {\n if (\n node.callee.type === \"Identifier\" &&\n markers.call.includes(node.callee.name) &&\n node.arguments.length >= 1 &&\n isStringLiteral(node.arguments[0]!)\n ) {\n const value = (node.arguments[0] as StringLiteral).value\n const meta = getCallMetaArgument(node.arguments)\n const id = getCallMessageId(value, meta)\n messages.push({\n id,\n defaultMessage: value,\n meta: meta ?? {},\n placeholders: extractPlaceholdersFromMessage(value),\n source: createSource({\n filename,\n marker: node.callee.name,\n kind: \"call\",\n }),\n })\n\n const callOptionsEdit = createCallOptionsEdit(code, node.arguments, id)\n if (callOptionsEdit) edits.push(callOptionsEdit)\n }\n },\n\n JSXElement(node) {\n const opening = node.openingElement\n if (\n opening.name.type === \"JSXIdentifier\" &&\n opening.name.name === \"Var\" &&\n (opening.attributes as Array<unknown>).length === 0\n ) {\n const identifier = getVarChildIdentifier(node.children)\n if (identifier) {\n edits.push({\n start: node.start,\n end: node.end,\n replacement: `<Var ${identifier}={${identifier}} />`,\n })\n }\n }\n\n if (opening.name.type !== \"JSXIdentifier\") return\n if (!markers.component.includes(opening.name.name)) return\n\n const extraction = extractJSXChildren(code, node.children)\n if (!extraction.valid) {\n if (markers.logging) {\n console.warn(`[better-translation] Non-static <${opening.name.name}> in ${filename}, skipping`)\n }\n return\n }\n\n const context = getJSXStringAttribute(opening.attributes, \"context\")\n const meta = context ? { context } : undefined\n const id = getJSXStringAttribute(opening.attributes, \"id\") ?? getMessageId(extraction.message, meta)\n messages.push({\n id,\n defaultMessage: extraction.message,\n meta: meta ?? {},\n placeholders: extraction.placeholders,\n source: createSource({\n filename,\n marker: opening.name.name,\n kind: \"component\",\n }),\n })\n\n if (!hasJSXAttribute(opening.attributes as Array<unknown>, \"id\")) {\n edits.push({\n start: opening.name.end,\n end: opening.name.end,\n replacement: ` id=\"${id}\"`,\n })\n }\n\n if (!hasJSXAttribute(opening.attributes as Array<unknown>, \"message\")) {\n edits.push({\n start: opening.name.end,\n end: opening.name.end,\n replacement: ` message={${JSON.stringify(extraction.message)}}`,\n })\n }\n\n if (!hasJSXAttribute(opening.attributes as Array<unknown>, \"values\") && extraction.values.length > 0) {\n edits.push({\n start: opening.name.end,\n end: opening.name.end,\n replacement: ` values={{ ${extraction.values.map((entry) => `${entry.name}: ${entry.value}`).join(\", \")} }}`,\n })\n }\n },\n })\n\n visitor.visit(result.program)\n return { parsed: true, messages, edits }\n}\n\nfunction isStringLiteral(node: Argument): node is StringLiteral {\n return node.type === \"Literal\" && typeof (node as StringLiteral).value === \"string\"\n}\n\nfunction getMetaArgument(node?: Argument) {\n if (!node) return undefined\n if (isStringLiteral(node)) return { context: node.value }\n\n if (node.type !== \"ObjectExpression\") return undefined\n\n const meta: TranslateOptions = {}\n\n for (const property of node.properties as Array<{\n type: string\n key?: { type: string; name?: string; value?: unknown }\n value?: Argument\n }>) {\n if (\n (property.type === \"ObjectProperty\" || property.type === \"Property\") &&\n ((property.key?.type === \"Identifier\" && (property.key.name === \"context\" || property.key.name === \"id\")) ||\n (property.key?.type === \"Literal\" && (property.key.value === \"context\" || property.key.value === \"id\"))) &&\n property.value &&\n isStringLiteral(property.value)\n ) {\n const key = property.key?.type === \"Identifier\" ? property.key.name : property.key?.value\n if (key === \"context\" || key === \"id\") meta[key] = property.value.value\n }\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined\n}\n\nfunction getCallMetaArgument(args: Argument[]) {\n return getMetaArgument(isTranslateOptionsArgument(args[1]) ? args[1] : args[2])\n}\n\nfunction createCallOptionsEdit(code: string, args: Argument[], id: string) {\n const valuesArg = args[1]\n const optionsArg = isTranslateOptionsArgument(valuesArg) ? valuesArg : args[2]\n\n if (!optionsArg) {\n return {\n start: (valuesArg ?? args[0]!).end,\n end: (valuesArg ?? args[0]!).end,\n replacement: `, { id: ${JSON.stringify(id)} }`,\n }\n }\n\n if (isStringLiteral(optionsArg)) {\n const contextValue = code.slice(optionsArg.start, optionsArg.end)\n return {\n start: optionsArg.start,\n end: optionsArg.end,\n replacement: `{ id: ${JSON.stringify(id)}, context: ${contextValue} }`,\n }\n }\n\n if (optionsArg.type !== \"ObjectExpression\") return undefined\n if (hasObjectProperty(optionsArg, \"id\")) return undefined\n\n const objectSource = code.slice(optionsArg.start, optionsArg.end)\n const innerSource = objectSource.slice(1, -1)\n const replacement =\n innerSource.trim().length > 0 ? `{ id: ${JSON.stringify(id)},${innerSource} }` : `{ id: ${JSON.stringify(id)} }`\n\n return {\n start: optionsArg.start,\n end: optionsArg.end,\n replacement,\n }\n}\n\nfunction isTranslateOptionsArgument(node?: Argument) {\n if (!node) return false\n if (isStringLiteral(node)) return true\n if (node.type !== \"ObjectExpression\") return false\n\n return (node.properties as Array<unknown>).every((entry) => {\n const property = entry as\n | {\n type?: string\n key?: { type?: string; name?: string; value?: unknown }\n }\n | undefined\n\n if (property?.type !== \"ObjectProperty\" && property?.type !== \"Property\") return false\n\n return (\n (property.key?.type === \"Identifier\" && (property.key.name === \"context\" || property.key.name === \"id\")) ||\n (property.key?.type === \"Literal\" && (property.key.value === \"context\" || property.key.value === \"id\"))\n )\n })\n}\n\nfunction getJSXStringAttribute(attributes: Array<unknown>, name: string) {\n for (const attr of attributes as Array<{\n type: string\n name?: { type: string; name?: string }\n value?: { type: string; value?: unknown } | null\n }>) {\n if (\n attr.type === \"JSXAttribute\" &&\n attr.name?.type === \"JSXIdentifier\" &&\n attr.name.name === name &&\n attr.value?.type === \"Literal\" &&\n typeof attr.value.value === \"string\"\n ) {\n return attr.value.value as string\n }\n }\n}\n\nfunction hasJSXAttribute(attributes: Array<unknown>, name: string) {\n return attributes.some((attr) => {\n const attribute = attr as\n | {\n type?: string\n name?: { type?: string; name?: string }\n }\n | undefined\n\n return attribute?.type === \"JSXAttribute\" && attribute.name?.type === \"JSXIdentifier\" && attribute.name.name === name\n })\n}\n\nfunction hasObjectProperty(node: { properties: Array<unknown> }, name: string) {\n return node.properties.some((entry) => {\n const property = entry as\n | {\n type?: string\n key?: { type?: string; name?: string; value?: unknown }\n }\n | undefined\n\n if (property?.type !== \"ObjectProperty\" && property?.type !== \"Property\") return false\n return (\n (property.key?.type === \"Identifier\" && property.key.name === name) ||\n (property.key?.type === \"Literal\" && property.key.value === name)\n )\n })\n}\n\ninterface ExtractionResult {\n message: string\n placeholders: string[]\n values: Array<{ name: string; value: string }>\n valid: boolean\n}\n\nfunction extractJSXChildren(code: string, children: Array<JSXChild>): ExtractionResult {\n const parts: string[] = []\n const placeholders: string[] = []\n const values: Array<{ name: string; value: string }> = []\n\n for (const child of children) {\n switch (child.type) {\n case \"JSXText\":\n parts.push(child.value)\n break\n\n case \"JSXElement\": {\n const name = child.openingElement.name\n if (name.type !== \"JSXIdentifier\" || name.name !== \"Var\") {\n return { message: \"\", placeholders: [], values: [], valid: false }\n }\n\n const entry = getVarEntry(code, child)\n if (!entry) return { message: \"\", placeholders: [], values: [], valid: false }\n\n placeholders.push(entry.name)\n values.push(entry)\n parts.push(`{${entry.name}}`)\n break\n }\n\n case \"JSXExpressionContainer\":\n if (child.expression.type !== \"JSXEmptyExpression\") {\n return { message: \"\", placeholders: [], values: [], valid: false }\n }\n break\n\n default:\n break\n }\n }\n\n const message = parts.join(\"\").replace(/\\s+/g, \" \").trim()\n return { message, placeholders, values, valid: message.length > 0 }\n}\n\nfunction getVarEntry(\n code: string,\n node: { openingElement: { attributes: Array<unknown> }; children: Array<JSXChild> },\n): { name: string; value: string } | undefined {\n const explicitName = getJSXStringAttribute(node.openingElement.attributes as Array<unknown>, \"name\")\n const explicitValue = getJSXExpressionAttributeSource(code, node.openingElement.attributes as Array<unknown>, \"value\")\n const childValue = getVarChildrenSource(code, node.children)\n if (explicitName && explicitValue) return { name: explicitName, value: explicitValue }\n if (explicitName && childValue) return { name: explicitName, value: childValue }\n if (explicitName) return { name: explicitName, value: JSON.stringify(explicitName) }\n\n const customProp = getSingleJSXAttributeEntry(code, node.openingElement.attributes as Array<unknown>)\n if (customProp) return customProp\n\n const childIdentifier = getVarChildIdentifier(node.children)\n return childIdentifier ? { name: childIdentifier, value: childIdentifier } : undefined\n}\n\nfunction getSingleJSXAttributeEntry(code: string, attributes: Array<unknown>): { name: string; value: string } | undefined {\n const keys = attributes.flatMap((attr) => {\n const attribute = attr as\n | {\n type?: string\n name?: { type?: string; name?: string }\n value?: { type?: string; value?: unknown; expression?: { start: number; end: number } } | null\n }\n | undefined\n\n if (attribute?.type !== \"JSXAttribute\" || attribute.name?.type !== \"JSXIdentifier\" || !attribute.name.name) return []\n const value = getJSXAttributeValueSource(code, attribute.value)\n return value ? [{ name: attribute.name.name, value }] : []\n })\n\n return keys.length === 1 ? keys[0] : undefined\n}\n\nfunction getJSXExpressionAttributeSource(code: string, attributes: Array<unknown>, name: string) {\n for (const attr of attributes as Array<{\n type: string\n name?: { type: string; name?: string }\n value?: { type?: string; expression?: { start: number; end: number } } | null\n }>) {\n if (attr.type !== \"JSXAttribute\" || attr.name?.type !== \"JSXIdentifier\" || attr.name.name !== name) continue\n if (attr.value?.type !== \"JSXExpressionContainer\" || !attr.value.expression) return undefined\n return code.slice(attr.value.expression.start, attr.value.expression.end)\n }\n}\n\nfunction getJSXAttributeValueSource(\n code: string,\n value?: { type?: string; value?: unknown; expression?: { start: number; end: number } } | null,\n) {\n if (!value) return undefined\n if (value.type === \"JSXExpressionContainer\" && value.expression) {\n return code.slice(value.expression.start, value.expression.end)\n }\n if (value.type === \"Literal\" && typeof value.value === \"string\") {\n return JSON.stringify(value.value)\n }\n}\n\nfunction getVarChildIdentifier(children: Array<JSXChild>) {\n const meaningfulChildren = children.filter((child) => !(child.type === \"JSXText\" && child.value.trim().length === 0))\n if (meaningfulChildren.length !== 1) return undefined\n\n const [child] = meaningfulChildren\n if (!child || child.type !== \"JSXExpressionContainer\" || child.expression.type !== \"Identifier\") return undefined\n return child.expression.name\n}\n\nfunction getVarChildrenSource(code: string, children: Array<JSXChild>) {\n const meaningfulChildren = children.filter((child) => !(child.type === \"JSXText\" && child.value.trim().length === 0))\n if (meaningfulChildren.length === 0) return undefined\n\n if (meaningfulChildren.length === 1) {\n const [child] = meaningfulChildren\n if (!child) return undefined\n if (child.type === \"JSXExpressionContainer\" && child.expression.type !== \"JSXEmptyExpression\") {\n return code.slice(child.expression.start, child.expression.end)\n }\n }\n\n const [first] = meaningfulChildren\n const last = meaningfulChildren.at(-1)\n if (!first || !last) return undefined\n return `<>${code.slice(first.start, last.end)}</>`\n}\n","import { extname } from \"node:path\"\n\nimport type { SourceAnalysis, SourceMarkers } from \"./extractors/types.js\"\n\nimport { analyzeSvelteSourceFile } from \"./extractors/svelte.js\"\nimport { analyzeTypeScriptSourceFile } from \"./extractors/typescript.js\"\n\nexport type { SourceAnalysis, SourceEdit } from \"./extractors/types.js\"\n\n/** Extracts messages and source edits from a framework source file. */\nexport function analyzeSourceFile(code: string, filename: string, markers: SourceMarkers): SourceAnalysis {\n if (extname(filename) === \".svelte\") return analyzeSvelteSourceFile(code, filename, markers)\n return analyzeTypeScriptSourceFile(code, filename, markers)\n}\n","import { execFileSync } from \"node:child_process\"\nimport { readFileSync } from \"node:fs\"\nimport type { IncomingMessage, ServerResponse } from \"node:http\"\nimport type { ViteDevServer } from \"vite\"\n\nimport type { BetterTranslateRuntimeOptions, ManifestEntry, MessageManifest, RuntimeMessages } from \"../types.js\"\n\nexport const DEFAULT_LOCAL_EDITOR_PATH = \"/__better-translation\"\n\nconst CYAN = \"\\x1b[36m\"\nconst PREFIX = \"\\x1b[36m[better-translation]\\x1b[0m\"\nconst RESET = \"\\x1b[0m\"\n\ntype LocalEditorOptions = {\n open: boolean\n path: string\n}\n\nexport type LocalEditorRuntimeContext = {\n defaultLocale: string\n isUntranslatedLocaleValue: (value: string, entry: Pick<ManifestEntry, \"defaultMessage\">) => boolean\n locales: string[]\n log: (message: string) => void\n manifest: MessageManifest\n readLocaleMessages: (locale: string) => RuntimeMessages\n writeLocaleMessages: (locale: string, localeMessages: RuntimeMessages) => void\n}\n\nexport function getLocalEditorOptions({\n isDev,\n runtime,\n}: {\n isDev: boolean\n runtime: BetterTranslateRuntimeOptions\n}): LocalEditorOptions | null {\n if (!isDev || runtime.type !== \"local\") return null\n const editor = runtime.editor\n if (!editor) return null\n if (editor === true) return { path: DEFAULT_LOCAL_EDITOR_PATH, open: false }\n if (editor.enabled === false) return null\n return {\n path: normalizeLocalEditorPath(editor.path ?? DEFAULT_LOCAL_EDITOR_PATH),\n open: editor.open ?? false,\n }\n}\n\nexport function configureLocalEditor(server: ViteDevServer, context: LocalEditorRuntimeContext, options: LocalEditorOptions) {\n const editorPath = options.path\n server.middlewares.use(async (request, response, next) => {\n const requestUrl = new URL(request.url ?? \"/\", \"http://better-translation.local\")\n const pathname = stripTrailingSlash(requestUrl.pathname)\n if (pathname !== editorPath && !pathname.startsWith(`${editorPath}/`)) {\n next()\n return\n }\n\n try {\n if (pathname === editorPath || pathname === `${editorPath}/index.html`) {\n sendHtml(response, createLocalEditorHtml(editorPath))\n return\n }\n\n if (pathname === `${editorPath}/client.js`) {\n sendJavaScript(response, readLocalEditorAsset(\"local-editor.js\"))\n return\n }\n\n if (pathname === `${editorPath}/style.css`) {\n sendCss(response, readLocalEditorAsset(\"style.css\"))\n return\n }\n\n if (pathname.startsWith(`${editorPath}/local-editor-assets/`)) {\n const assetName = pathname.slice(`${editorPath}/local-editor-assets/`.length)\n sendAsset(response, assetName)\n return\n }\n\n if (pathname === `${editorPath}/api/messages` && request.method === \"GET\") {\n sendJson(\n response,\n getLocalEditorMessages(context, {\n q: requestUrl.searchParams.get(\"q\") ?? undefined,\n view: parseLocalEditorView(requestUrl.searchParams.get(\"view\")),\n }),\n )\n return\n }\n\n const detailMatch = pathname.match(new RegExp(`^${escapeRegExp(editorPath)}/api/messages/([^/]+)$`))\n if (detailMatch?.[1] && request.method === \"GET\") {\n sendJson(response, getLocalEditorMessageDetail(context, decodeURIComponent(detailMatch[1])))\n return\n }\n\n const updateMatch = pathname.match(new RegExp(`^${escapeRegExp(editorPath)}/api/messages/([^/]+)/locales/([^/]+)$`))\n if (updateMatch?.[1] && updateMatch[2] && request.method === \"PATCH\") {\n const body = await readJsonRequest(request)\n const value =\n typeof body === \"object\" && body !== null && \"value\" in body && typeof body.value === \"string\" ? body.value.trim() : \"\"\n if (!value) {\n sendJson(response, { error: \"Locale value is required.\" }, 400)\n return\n }\n updateLocalEditorLocaleValue(context, {\n locale: decodeURIComponent(updateMatch[2]),\n lookupId: decodeURIComponent(updateMatch[1]),\n value,\n })\n sendJson(response, getLocalEditorMessageDetail(context, decodeURIComponent(updateMatch[1])))\n return\n }\n\n sendJson(response, { error: \"Not found.\" }, 404)\n } catch (error) {\n sendJson(response, { error: error instanceof Error ? error.message : \"Local editor request failed.\" }, 500)\n }\n })\n\n server.httpServer?.once(\"listening\", () => {\n const localUrl = server.resolvedUrls?.local[0]\n const editorUrl = localUrl ? new URL(editorPath, localUrl).toString() : editorPath\n context.log(`${PREFIX} Local editor: ${CYAN}${editorUrl}${RESET}`)\n if (options.open) openLocalEditor(editorUrl)\n })\n}\n\nfunction getLocalEditorMessages(\n context: LocalEditorRuntimeContext,\n { q, view }: { q?: string; view: \"all\" | \"needs-value\" | \"manual\" | \"ai\" },\n) {\n const query = q?.trim().toLowerCase()\n const localeMessagesByLocale = readEditableLocaleMessages(context)\n const summaries = Object.entries(context.manifest)\n .sort(compareManifestEntryIds)\n .map(([id, entry]) => getLocalEditorMessageSummary(context, localeMessagesByLocale, id, entry))\n const filteredMessages = summaries.filter((message) => {\n if (query) {\n const searchableValues = [\n message.defaultMessage,\n ...Object.values(localeMessagesByLocale).map((localeMessages) => localeMessages[message.id] ?? \"\"),\n ]\n if (!searchableValues.some((value) => value.toLowerCase().includes(query))) return false\n }\n if (view === \"all\") return true\n if (view === \"needs-value\") return message.done < message.total\n if (view === \"ai\") return false\n return Object.values(localeMessagesByLocale).some((localeMessages) => localeMessages[message.id] !== undefined)\n })\n\n return {\n config: {\n appLocale: context.defaultLocale,\n defaultLocale: context.defaultLocale,\n locales: context.locales,\n },\n incompleteCount: summaries.filter((message) => message.done < message.total).length,\n messages: filteredMessages.map(({ defaultMessage, done, id, lookupId, placeholders, total }) => ({\n defaultMessage,\n done,\n id,\n lookupId,\n placeholders,\n total,\n })),\n }\n}\n\nfunction readEditableLocaleMessages(context: LocalEditorRuntimeContext) {\n return Object.fromEntries(\n context.locales\n .filter((locale) => locale !== context.defaultLocale)\n .map((locale) => [locale, context.readLocaleMessages(locale)]),\n )\n}\n\nfunction getLocalEditorMessageSummary(\n context: LocalEditorRuntimeContext,\n localeMessagesByLocale: Record<string, RuntimeMessages>,\n id: string,\n entry: ManifestEntry,\n) {\n const editableLocales = context.locales.filter((locale) => locale !== context.defaultLocale)\n\n return {\n defaultMessage: entry.defaultMessage,\n done: editableLocales.filter((locale) => localeMessagesByLocale[locale]?.[id] !== undefined).length,\n id,\n lookupId: id,\n placeholders: entry.placeholders,\n total: editableLocales.length,\n }\n}\n\nfunction getLocalEditorMessageDetail(context: LocalEditorRuntimeContext, id: string) {\n const entry = context.manifest[id]\n if (!entry) throw new Error(\"Unknown Message.\")\n const localeValues = Object.fromEntries(\n context.locales.map((locale) => {\n if (locale === context.defaultLocale) {\n return [locale, { value: entry.defaultMessage, source: \"default\", hasValue: true }]\n }\n\n const localeMessages = context.readLocaleMessages(locale)\n const value = localeMessages[id]\n const hasValue = value !== undefined\n return [locale, { value: value ?? entry.defaultMessage, source: hasValue ? \"manual\" : \"default\", hasValue }]\n }),\n )\n const editableValues = Object.entries(localeValues).filter(([locale]) => locale !== context.defaultLocale)\n\n return {\n context: typeof entry.meta.context === \"string\" ? entry.meta.context : null,\n defaultMessage: entry.defaultMessage,\n done: editableValues.filter(([, value]) => value.hasValue).length,\n id,\n localeValues,\n lookupId: id,\n placeholders: entry.placeholders,\n sources: entry.sources,\n total: editableValues.length,\n }\n}\n\nfunction updateLocalEditorLocaleValue(\n context: LocalEditorRuntimeContext,\n { locale, lookupId, value }: { locale: string; lookupId: string; value: string },\n) {\n if (locale === context.defaultLocale) throw new Error(\"Default locale Messages come from source code.\")\n if (!context.locales.includes(locale)) throw new Error(\"Unknown Locale.\")\n if (!context.manifest[lookupId]) throw new Error(\"Unknown Message.\")\n\n const localeMessages = context.readLocaleMessages(locale)\n localeMessages[lookupId] = value\n context.writeLocaleMessages(locale, localeMessages)\n}\n\nfunction createLocalEditorHtml(editorPath: string) {\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n '<meta charset=\"utf-8\" />',\n '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n \"<title>Better Translation Local Editor</title>\",\n \"</head>\",\n \"<body>\",\n '<div id=\"root\"></div>',\n `<link rel=\"stylesheet\" href=\"${editorPath}/style.css\" />`,\n `<script defer src=\"${editorPath}/client.js\"></script>`,\n \"</body>\",\n \"</html>\",\n ].join(\"\\n\")\n}\n\nfunction sendHtml(response: ServerResponse, html: string) {\n response.statusCode = 200\n response.setHeader(\"content-type\", \"text/html; charset=utf-8\")\n response.end(html)\n}\n\nfunction sendJavaScript(response: ServerResponse, code: string) {\n response.statusCode = 200\n response.setHeader(\"content-type\", \"application/javascript; charset=utf-8\")\n response.end(code)\n}\n\nfunction sendCss(response: ServerResponse, css: string) {\n response.statusCode = 200\n response.setHeader(\"content-type\", \"text/css; charset=utf-8\")\n response.end(css)\n}\n\nfunction sendAsset(response: ServerResponse, assetName: string) {\n if (!/^[\\w.-]+$/.test(assetName)) {\n sendJson(response, { error: \"Not found.\" }, 404)\n return\n }\n\n response.statusCode = 200\n response.setHeader(\"content-type\", getAssetContentType(assetName))\n response.end(readFileSync(new URL(`./local-editor-assets/${assetName}`, import.meta.url)))\n}\n\nfunction sendJson(response: ServerResponse, payload: unknown, statusCode = 200) {\n response.statusCode = statusCode\n response.setHeader(\"content-type\", \"application/json; charset=utf-8\")\n response.end(JSON.stringify(payload))\n}\n\nasync function readJsonRequest(request: IncomingMessage) {\n const chunks: Buffer[] = []\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n if (chunks.length === 0) return null\n return JSON.parse(Buffer.concat(chunks).toString(\"utf-8\")) as unknown\n}\n\nfunction parseLocalEditorView(value: string | null): \"all\" | \"needs-value\" | \"manual\" | \"ai\" {\n if (value === \"needs-value\" || value === \"manual\" || value === \"ai\") return value\n return \"all\"\n}\n\nfunction normalizeLocalEditorPath(path: string) {\n const withLeadingSlash = path.startsWith(\"/\") ? path : `/${path}`\n return stripTrailingSlash(withLeadingSlash)\n}\n\nfunction stripTrailingSlash(path: string) {\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n\nfunction openLocalEditor(url: string) {\n try {\n if (process.platform === \"darwin\") execFileSync(\"open\", [url], { stdio: \"ignore\" })\n else if (process.platform === \"win32\") execFileSync(\"cmd\", [\"/c\", \"start\", \"\", url], { stdio: \"ignore\" })\n else execFileSync(\"xdg-open\", [url], { stdio: \"ignore\" })\n } catch {\n // Opening the browser is a convenience only.\n }\n}\n\nfunction readLocalEditorAsset(fileName: \"local-editor.js\" | \"style.css\") {\n return readFileSync(new URL(`./${fileName}`, import.meta.url), \"utf-8\")\n}\n\nfunction getAssetContentType(assetName: string) {\n if (assetName.endsWith(\".woff2\")) return \"font/woff2\"\n if (assetName.endsWith(\".woff\")) return \"font/woff\"\n if (assetName.endsWith(\".css\")) return \"text/css; charset=utf-8\"\n if (assetName.endsWith(\".js\")) return \"application/javascript; charset=utf-8\"\n if (assetName.endsWith(\".svg\")) return \"image/svg+xml\"\n return \"application/octet-stream\"\n}\n\nfunction compareManifestEntryIds([left]: [string, ManifestEntry], [right]: [string, ManifestEntry]) {\n return left.localeCompare(right)\n}\n","import { execFileSync } from \"node:child_process\"\nimport { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"node:fs\"\nimport { dirname, relative, resolve } from \"node:path\"\nimport { normalizePath, type Plugin, type ResolvedConfig } from \"vite\"\n\nimport type {\n BetterTranslatePluginOptions,\n BetterTranslateRuntimeOptions,\n ExtractedMessage,\n ManifestEntry,\n MessageManifest,\n MessageManifestFile,\n MessageSource,\n RuntimeMessages,\n TranslateFn,\n TranslateMessage,\n TranslationCache,\n} from \"./types.js\"\n\nimport { createEmptyCache, getCacheKey, loadCache, saveCache } from \"./cache.js\"\nimport { analyzeSourceFile } from \"./extractor.js\"\nimport { configureLocalEditor, getLocalEditorOptions } from \"./local-editor/server.js\"\nimport { serializeMeta } from \"./message-id.js\"\n\nconst PREFIX = \"\\x1b[36m[better-translation]\\x1b[0m\"\nconst DIM = \"\\x1b[2m\"\nconst RESET = \"\\x1b[0m\"\nconst BOLD = \"\\x1b[1m\"\nconst CYAN = \"\\x1b[36m\"\nconst REMOTE_API_BASE_URL = \"https://better-translation.vercel.app\"\nconst DEFAULT_REMOTE_API_KEY_ENV = \"BETTER_TRANSLATION_API_KEY\"\nconst DEFAULT_REMOTE_BRANCH = \"main\"\nconst DEFAULT_CACHE_DIR = \".cache/better-translation\"\nconst DEFAULT_TRANSLATION_CACHE_FILE = `${DEFAULT_CACHE_DIR}/cache.json`\nconst DEFAULT_PRIVATE_MANIFEST_FILE = `${DEFAULT_CACHE_DIR}/manifest.json`\nconst DEFAULT_REMOTE_OFFLINE_OUTPUT_DIR = `${DEFAULT_CACHE_DIR}/runtime`\nconst DEFAULT_LOCAL_OUTPUT_DIR = \"src/lib/bt\"\nconst DEFAULT_PUBLIC_OUTPUT_SUBDIR = \"bt\"\nconst DEFAULT_PUBLIC_BASE_PATH = \"/bt\"\nconst DEFAULT_ROOT_DIR = \"src\"\nconst DEFAULT_SCAN_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\", \".svelte\"]\nconst VIRTUAL_MESSAGES_MODULE_ID = \"better-translation/messages\"\nconst RESOLVED_VIRTUAL_MESSAGES_MODULE_ID = `\\0${VIRTUAL_MESSAGES_MODULE_ID}`\nconst CALL_MARKERS = [\"t\", \"useT\"]\nconst COMPONENT_MARKERS = [\"T\"]\nconst LOCALES_SUBDIR = \"locales\"\nconst DEFAULT_TRANSLATION_BATCH_SIZE = 25\n\ninterface SyncResult {\n manifestChanged: boolean\n localeMessagesChanged: boolean\n}\n\nfunction formatLocale(locale: string) {\n return locale.toUpperCase()\n}\n\nfunction formatLocales(locales: string[]) {\n return locales.map(formatLocale).join(\", \")\n}\n\n/** Scans source files for translatable messages and keeps locale JSON files in sync. */\nexport function betterTranslation(options: BetterTranslatePluginOptions): Plugin {\n const {\n locales,\n defaultLocale = locales[0] ?? \"en\",\n rootDir = DEFAULT_ROOT_DIR,\n cacheFile = DEFAULT_TRANSLATION_CACHE_FILE,\n logging = true,\n runtime,\n } = options\n const configuredRuntime = normalizeRuntimeOptions(runtime)\n const manifest: MessageManifest = {}\n const fileMessages = new Map<string, ExtractedMessage[]>()\n let cache: TranslationCache = createEmptyCache()\n let resolvedRuntime = configuredRuntime\n let usesLocalStorage = shouldUseLocalStorage(configuredRuntime, false)\n let resolvedTranslate: TranslateFn | undefined = configuredRuntime.type === \"local\" ? configuredRuntime.translate : undefined\n let localesDir =\n configuredRuntime.type === \"local\" ? (configuredRuntime.output ?? DEFAULT_LOCAL_OUTPUT_DIR) : DEFAULT_LOCAL_OUTPUT_DIR\n let publicBasePath =\n configuredRuntime.type === \"local\" && configuredRuntime.target === \"public\"\n ? (configuredRuntime.basePath ?? DEFAULT_PUBLIC_BASE_PATH)\n : DEFAULT_PUBLIC_BASE_PATH\n let remoteUrl = configuredRuntime.type === \"remote\" ? (configuredRuntime.endpoint ?? REMOTE_API_BASE_URL) : REMOTE_API_BASE_URL\n let root = \"\"\n let isDev = false\n let translateTimer: ReturnType<typeof setTimeout> | null = null\n let remoteSyncTimer: ReturnType<typeof setTimeout> | null = null\n let lastSyncedRemoteManifestSignature: string | null = null\n let sourceRoots: string[] = []\n\n function log(message: string) {\n if (logging) console.log(message)\n }\n\n async function syncRemote() {\n if (resolvedRuntime.type !== \"remote\") return\n\n const payload = {\n defaultLocale,\n locales,\n messages: buildMessageManifest(),\n }\n const signature = JSON.stringify(payload)\n if (lastSyncedRemoteManifestSignature === signature) return\n\n const apiKey = resolveRemoteSyncApiKey()\n const target = formatRemoteManifestTarget(resolvedRuntime, remoteUrl)\n if (!apiKey) {\n throw new Error(\n [\n `${PREFIX} remote Manifest sync requires a Project API key`,\n `set ${DEFAULT_REMOTE_API_KEY_ENV} or pass runtime.apiKey in the Vite plugin config`,\n `target: ${target}`,\n ].join(\"\\n\"),\n )\n }\n\n let response: Response\n try {\n response = await fetch(target, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n })\n } catch (error) {\n throw new Error(formatRemoteSyncNetworkError(target, error))\n }\n\n const body = await response.text()\n\n if (!response.ok) {\n throw new Error(formatRemoteSyncError(response, target, body))\n }\n\n const result = parseRemoteSyncResult(body)\n if (result?.changed) log(`${PREFIX} ${BOLD}Synced${RESET} Messages -> ${CYAN}${formatRuntime(resolvedRuntime)}${RESET}`)\n lastSyncedRemoteManifestSignature = signature\n }\n\n function resolveRemoteSyncApiKey() {\n const explicitApiKey = resolvedRuntime.type === \"remote\" ? resolvedRuntime.apiKey?.trim() : null\n if (explicitApiKey) return explicitApiKey\n\n const envApiKey = process.env[DEFAULT_REMOTE_API_KEY_ENV]?.trim()\n return envApiKey || null\n }\n\n function buildMessageManifest(): MessageManifestFile {\n return Object.fromEntries(\n Object.entries(manifest)\n .sort(compareManifestEntryIds)\n .map(([id, entry]) => [\n id,\n {\n defaultMessage: entry.defaultMessage,\n meta: entry.meta,\n placeholders: entry.placeholders,\n sources: entry.sources.length > 1 ? [...entry.sources].sort(compareMessageSources) : entry.sources,\n },\n ]),\n )\n }\n\n function shouldScanFile(id: string) {\n const cleanId = id.split(\"?\", 1)[0] ?? id\n if (cleanId.includes(\"node_modules\")) return false\n const extension = DEFAULT_SCAN_EXTENSIONS.find((ext) => cleanId.endsWith(ext))\n if (!extension) return false\n return sourceRoots.some(\n (sourceRoot) => cleanId === sourceRoot || cleanId.startsWith(`${sourceRoot}/`) || cleanId.startsWith(`${sourceRoot}\\\\`),\n )\n }\n\n function getPrivateManifestPath() {\n return resolve(root, DEFAULT_PRIVATE_MANIFEST_FILE)\n }\n\n function getLocalesDirPath() {\n return resolve(root, localesDir, LOCALES_SUBDIR)\n }\n\n function getLocalePath(locale: string) {\n return resolve(getLocalesDirPath(), `${locale}.json`)\n }\n\n function readLocaleMessages(locale: string): RuntimeMessages {\n const path = getLocalePath(locale)\n if (!existsSync(path)) return {}\n\n try {\n const input = JSON.parse(readFileSync(path, \"utf-8\")) as unknown\n return normalizeLocaleMessages(input)\n } catch {\n return {}\n }\n }\n\n function writePrivateManifest() {\n if (!usesLocalStorage) return\n const path = getPrivateManifestPath()\n const dir = dirname(path)\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n writeFileIfChanged(path, JSON.stringify(buildMessageManifest(), null, 2) + \"\\n\")\n }\n\n function buildLocalLocaleMessages(locale: string, manifestEntries: Array<[string, ManifestEntry]>): RuntimeMessages {\n const existingMessages = readLocaleMessages(locale)\n const messages: RuntimeMessages = {}\n\n if (locale === defaultLocale) {\n for (const [id, entry] of manifestEntries) {\n messages[id] = entry.defaultMessage\n }\n return messages\n }\n\n for (const [id, entry] of manifestEntries) {\n if (Object.hasOwn(messages, id)) continue\n const existingMessage = existingMessages[id]\n const cachedMessage = getFreshCachedMessage(id, locale)\n\n if (existingMessage !== undefined && !isUntranslatedLocaleValue(existingMessage, entry)) {\n messages[id] = existingMessage\n continue\n }\n\n if (cachedMessage !== undefined) messages[id] = cachedMessage\n else if (shouldWriteDefaultLocaleFallback()) messages[id] = entry.defaultMessage\n }\n return messages\n }\n\n function writeLocaleFilesToDisk() {\n if (!usesLocalStorage) return\n const dir = getLocalesDirPath()\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n const manifestEntries = Object.entries(manifest).sort(compareManifestEntryIds)\n for (const locale of locales) {\n writeFileIfChanged(\n resolve(dir, `${locale}.json`),\n JSON.stringify(buildLocalLocaleMessages(locale, manifestEntries), null, 2) + \"\\n\",\n )\n }\n }\n\n function getMissingMessagesByLocale() {\n const missingByLocale = new Map<string, TranslateMessage[]>()\n const manifestEntries = Object.entries(manifest).sort(compareManifestEntryIds)\n\n for (const locale of locales) {\n if (locale === defaultLocale) continue\n const existingMessages = readLocaleMessages(locale)\n for (const [id, entry] of manifestEntries) {\n const existingMessage = existingMessages[id]\n const hasExistingMessage = existingMessage !== undefined && !isUntranslatedLocaleValue(existingMessage, entry)\n if (!hasExistingMessage && getFreshCachedMessage(id, locale) === undefined) {\n const misses = missingByLocale.get(locale) ?? []\n misses.push({\n id,\n text: entry.defaultMessage,\n meta: entry.meta,\n placeholders: entry.placeholders,\n sources: entry.sources,\n })\n missingByLocale.set(locale, misses)\n }\n }\n }\n\n return missingByLocale\n }\n\n function assertLocalBuildTranslationsComplete() {\n const expectedIds = new Set(Object.keys(manifest))\n const issues: string[] = []\n\n for (const locale of locales) {\n const localePath = getLocalePath(locale)\n if (!existsSync(localePath)) {\n issues.push(`- ${locale}: missing file at ${relative(root, localePath)}`)\n continue\n }\n\n const localeMessages = readLocaleMessages(locale)\n const missingIds = [...expectedIds].filter((id) => !Object.hasOwn(localeMessages, id))\n const orphanIds = Object.keys(localeMessages).filter((id) => !expectedIds.has(id))\n\n if (locale === defaultLocale) {\n const staleIds = [...expectedIds].filter((id) => localeMessages[id] !== manifest[id]!.defaultMessage)\n if (missingIds.length > 0) issues.push(formatLocaleIssue(locale, \"missing\", missingIds))\n if (orphanIds.length > 0) issues.push(formatLocaleIssue(locale, \"orphaned\", orphanIds))\n if (staleIds.length > 0) issues.push(formatLocaleIssue(locale, \"outdated default messages\", staleIds))\n continue\n }\n\n if (missingIds.length > 0) issues.push(formatLocaleIssue(locale, \"missing\", missingIds))\n if (orphanIds.length > 0) issues.push(formatLocaleIssue(locale, \"orphaned\", orphanIds))\n }\n\n if (issues.length === 0) return\n\n throw new Error(\n [\n `${PREFIX} committed locale artifacts are out of sync for local production build`,\n `local production builds are check-only and never regenerate locale files`,\n `run the dev workflow to regenerate locale artifacts and commit the result`,\n ...issues,\n ].join(\"\\n\"),\n )\n }\n\n async function translateMissingMessages() {\n if (!resolvedTranslate) return false\n const missingByLocale = getMissingMessagesByLocale()\n\n const totalMisses = [...missingByLocale.values()].reduce((count, misses) => count + misses.length, 0)\n if (totalMisses === 0) return false\n\n const missLocales = [...missingByLocale.keys()]\n log(\n `${PREFIX} ${BOLD}Translating${RESET} ${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? \"Message\" : \"Messages\"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`,\n )\n\n let translatedCount = 0\n for (const [locale, misses] of missingByLocale) {\n const batchSize = getTranslationBatchSize(resolvedRuntime)\n for (const batch of chunk(misses, batchSize)) {\n const result = await resolvedTranslate(batch, locale)\n\n for (const miss of batch) {\n const translated = result[miss.id]?.trim()\n if (!translated) continue\n cache.entries[getCacheKey(miss.id, locale)] = {\n sourceText: miss.text,\n meta: miss.meta,\n locale,\n translation: translated,\n timestamp: Date.now(),\n }\n translatedCount += 1\n }\n\n saveCache(resolve(root, cacheFile), cache)\n writeLocaleFilesToDisk()\n writePrivateManifest()\n log(\n `${PREFIX} ${BOLD}Translated${RESET} ${CYAN}${translatedCount}${RESET}/${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? \"Message\" : \"Messages\"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`,\n )\n }\n }\n\n log(\n `${PREFIX} ${BOLD}Translated${RESET} ${CYAN}${translatedCount}${RESET}/${CYAN}${totalMisses}${RESET} ${totalMisses === 1 ? \"Message\" : \"Messages\"} -> ${CYAN}${formatLocales(missLocales)}${RESET}`,\n )\n\n return true\n }\n\n function getFreshCachedMessage(id: string, locale: string) {\n const entry = manifest[id]\n const cachedMessage = cache.entries[getCacheKey(id, locale)]\n if (!entry || !cachedMessage) return undefined\n if (cachedMessage.sourceText !== entry.defaultMessage) return undefined\n if (serializeMeta(cachedMessage.meta) !== serializeMeta(entry.meta)) return undefined\n return cachedMessage.translation\n }\n\n function isUntranslatedLocaleValue(value: string, entry: Pick<ManifestEntry, \"defaultMessage\">) {\n return resolvedTranslate !== undefined && value.trim() === entry.defaultMessage.trim()\n }\n\n function shouldWriteDefaultLocaleFallback() {\n return resolvedTranslate !== undefined || isRemoteOfflineDev(resolvedRuntime, isDev)\n }\n\n function scheduleDevTranslation() {\n if (!resolvedTranslate) return\n if (!isDev) return\n if (translateTimer) clearTimeout(translateTimer)\n translateTimer = setTimeout(async () => {\n const translated = await translateMissingMessages()\n if (translated) saveCache(resolve(root, cacheFile), cache)\n writeLocaleFilesToDisk()\n writePrivateManifest()\n }, 1000)\n }\n\n function scheduleDevRemoteSync() {\n if (usesLocalStorage || !isDev) return\n if (remoteSyncTimer) clearTimeout(remoteSyncTimer)\n remoteSyncTimer = setTimeout(() => {\n void syncRemote().catch((error) => console.error(error instanceof Error ? error.message : error))\n }, 1000)\n }\n\n function writeLocaleMessages(locale: string, localeMessages: RuntimeMessages) {\n const dir = getLocalesDirPath()\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n\n const messages: RuntimeMessages = {}\n for (const [id, entry] of Object.entries(manifest).sort(compareManifestEntryIds)) {\n if (locale === defaultLocale) {\n messages[id] = entry.defaultMessage\n continue\n }\n\n const existingMessage = localeMessages[id]\n const cachedMessage = getFreshCachedMessage(id, locale)\n if (existingMessage !== undefined) messages[id] = existingMessage\n else if (cachedMessage !== undefined) messages[id] = cachedMessage\n else if (shouldWriteDefaultLocaleFallback()) messages[id] = entry.defaultMessage\n }\n\n writeFileIfChanged(getLocalePath(locale), JSON.stringify(messages, null, 2) + \"\\n\")\n }\n\n function removeFileMessages(file: string) {\n const previous = fileMessages.get(file)\n if (!previous) return false\n\n for (const message of previous) {\n const entry = manifest[message.id]\n if (!entry) continue\n entry.sources = entry.sources.filter((source) => !isSameSource(source, message.source))\n if (entry.sources.length === 0) delete manifest[message.id]\n }\n\n fileMessages.delete(file)\n return true\n }\n\n function syncFileMessages(file: string, messages: ExtractedMessage[]): SyncResult {\n const previousMessages = fileMessages.get(file) ?? []\n const nextEntries = groupMessagesById(messages)\n for (const [id, entry] of Object.entries(nextEntries)) {\n const existing = manifest[id]\n if (existing && !hasSameMessageShape(existing, entry)) {\n throw new Error(formatCollisionError(id, existing, entry))\n }\n }\n\n removeFileMessages(file)\n for (const [id, entry] of Object.entries(nextEntries)) {\n if (!manifest[id]) {\n manifest[id] = entry\n continue\n }\n for (const source of entry.sources) {\n if (!manifest[id]!.sources.some((existingSource) => isSameSource(existingSource, source))) {\n manifest[id]!.sources.push(source)\n }\n }\n }\n\n if (messages.length > 0) fileMessages.set(file, messages)\n return {\n manifestChanged:\n previousMessages.length !== messages.length ||\n previousMessages.some((message, index) => !isSameExtractedMessage(message, messages[index])),\n localeMessagesChanged:\n previousMessages.length !== messages.length ||\n previousMessages.some((message, index) => !hasSameMessageShape(message, messages[index]!)),\n }\n }\n\n function syncSourceCode(file: string, code: string) {\n const analysis = analyzeSourceFile(code, file, {\n call: CALL_MARKERS,\n component: COMPONENT_MARKERS,\n logging,\n })\n if (!analysis.parsed) return null\n return syncFileMessages(\n file,\n analysis.messages.map((message) => ({\n ...message,\n source: {\n ...message.source,\n file: toRootRelativePath(message.source.file),\n },\n })),\n )\n }\n\n function removeTrackedFile(file: string): SyncResult {\n const hadPreviousMessages = removeFileMessages(file)\n return {\n manifestChanged: hadPreviousMessages,\n localeMessagesChanged: hadPreviousMessages,\n }\n }\n\n function applySyncResult(syncResult: SyncResult | null, options: { scheduleTranslation: boolean }) {\n if (!syncResult) return\n if (syncResult.localeMessagesChanged) {\n writeLocaleFilesToDisk()\n writePrivateManifest()\n if (options.scheduleTranslation) scheduleDevTranslation()\n return\n }\n if (syncResult.manifestChanged) writePrivateManifest()\n }\n\n function scanAllSourceFiles() {\n for (const id of Object.keys(manifest)) delete manifest[id]\n fileMessages.clear()\n\n for (const sourceRoot of sourceRoots) {\n if (!existsSync(sourceRoot)) continue\n for (const file of collectScanFiles(sourceRoot).sort()) {\n const code = readFileSync(file, \"utf-8\")\n syncSourceCode(file, code)\n }\n }\n }\n\n function toRootRelativePath(file: string) {\n return relative(root, file).replaceAll(\"\\\\\", \"/\")\n }\n\n function createVirtualMessagesModule() {\n if (isRemoteOfflineDev(resolvedRuntime, isDev)) {\n return createModuleMessagesModule(locales, (locale) => `/${normalizePath(toRootRelativePath(getLocalePath(locale)))}`)\n }\n if (resolvedRuntime.type === \"remote\") return createRemoteMessagesModule(resolvedRuntime, locales, remoteUrl)\n if (resolvedRuntime.target === \"public\") return createPublicMessagesModule(locales, publicBasePath)\n return createModuleMessagesModule(locales, (locale) => `/${normalizePath(toRootRelativePath(getLocalePath(locale)))}`)\n }\n\n return {\n name: \"better-translation-extract\",\n enforce: \"pre\",\n\n config() {\n return {\n ssr: {\n noExternal: [\"better-translation\"],\n },\n }\n },\n\n configResolved(config) {\n root = config.root\n isDev = config.command === \"serve\"\n resolvedRuntime = resolveRuntimeOptions(configuredRuntime, config)\n usesLocalStorage = shouldUseLocalStorage(resolvedRuntime, isDev)\n resolvedTranslate = resolvedRuntime.type === \"local\" ? resolvedRuntime.translate : undefined\n localesDir = getRuntimeOutputDir(resolvedRuntime, isDev)\n publicBasePath =\n resolvedRuntime.type === \"local\" && resolvedRuntime.target === \"public\"\n ? (resolvedRuntime.basePath ?? DEFAULT_PUBLIC_BASE_PATH)\n : DEFAULT_PUBLIC_BASE_PATH\n remoteUrl = resolvedRuntime.type === \"remote\" ? (resolvedRuntime.endpoint ?? REMOTE_API_BASE_URL) : REMOTE_API_BASE_URL\n sourceRoots = (Array.isArray(rootDir) ? rootDir : [rootDir]).map((dir) => resolve(root, dir))\n log(\n `${PREFIX} Locales: ${CYAN}${formatLocales(locales)}${RESET} | Default: ${CYAN}${formatLocale(defaultLocale)}${RESET} | Runtime: ${CYAN}${formatRuntime(resolvedRuntime)}${RESET} | Out Dir: ${DIM}${usesLocalStorage ? localesDir : \"n/a\"}${RESET} | Roots: ${DIM}${(Array.isArray(rootDir) ? rootDir : [rootDir]).join(\", \")}${RESET}`,\n )\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MESSAGES_MODULE_ID) return RESOLVED_VIRTUAL_MESSAGES_MODULE_ID\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_MESSAGES_MODULE_ID) return createVirtualMessagesModule()\n },\n\n async buildStart() {\n cache = loadCache(resolve(root, cacheFile))\n scanAllSourceFiles()\n if (usesLocalStorage && !isDev) {\n assertLocalBuildTranslationsComplete()\n return\n }\n writeLocaleFilesToDisk()\n writePrivateManifest()\n\n if (isDev) scheduleDevTranslation()\n },\n\n configureServer(server) {\n const localEditorOptions = getLocalEditorOptions({ isDev, runtime: resolvedRuntime })\n if (localEditorOptions) {\n configureLocalEditor(\n server,\n { defaultLocale, isUntranslatedLocaleValue, locales, log, manifest, readLocaleMessages, writeLocaleMessages },\n localEditorOptions,\n )\n }\n server.watcher.add(sourceRoots)\n server.httpServer?.once(\"listening\", () => scheduleDevRemoteSync())\n\n const syncFileFromDisk = (file: string) => {\n if (!shouldScanFile(file) || !existsSync(file)) return\n applySyncResult(syncSourceCode(file, readFileSync(file, \"utf-8\")), { scheduleTranslation: true })\n scheduleDevRemoteSync()\n }\n\n const removeFileFromManifest = (file: string) => {\n if (!shouldScanFile(file)) return\n applySyncResult(removeTrackedFile(file), { scheduleTranslation: true })\n scheduleDevRemoteSync()\n }\n\n server.watcher.on(\"add\", syncFileFromDisk)\n server.watcher.on(\"change\", syncFileFromDisk)\n server.watcher.on(\"unlink\", removeFileFromManifest)\n },\n\n transform(code, id) {\n const cleanId = id.split(\"?\", 1)[0] ?? id\n if (!shouldScanFile(cleanId)) return\n\n const analysis = analyzeSourceFile(code, cleanId, {\n call: CALL_MARKERS,\n component: COMPONENT_MARKERS,\n logging,\n })\n\n if (analysis.edits.length === 0) return\n return {\n code: applyEdits(code, analysis.edits),\n map: null,\n }\n },\n\n async generateBundle() {\n if (usesLocalStorage) {\n assertLocalBuildTranslationsComplete()\n } else if (isDev) {\n await translateMissingMessages()\n }\n\n if (!usesLocalStorage) {\n await syncRemote()\n }\n },\n\n closeBundle() {\n if (usesLocalStorage && !isDev) return\n saveCache(resolve(root, cacheFile), cache)\n },\n }\n}\n\nfunction formatLocaleIssue(locale: string, label: string, ids: string[]) {\n const preview = ids\n .slice(0, 5)\n .map((id) => JSON.stringify(id))\n .join(\", \")\n const suffix = ids.length > 5 ? `, ... ${ids.length - 5} more` : \"\"\n return `- ${locale}: ${label} (${preview}${suffix})`\n}\n\nfunction shouldUseLocalStorage(runtime: BetterTranslateRuntimeOptions, isDev: boolean) {\n return runtime.type === \"local\" || isRemoteOfflineDev(runtime, isDev)\n}\n\nfunction isRemoteOfflineDev(runtime: BetterTranslateRuntimeOptions, isDev: boolean) {\n return runtime.type === \"remote\" && isDev && runtime.dev?.offline === true\n}\n\nfunction getRuntimeOutputDir(runtime: BetterTranslateRuntimeOptions, isDev: boolean) {\n if (runtime.type === \"local\") return runtime.output!\n if (isRemoteOfflineDev(runtime, isDev)) return DEFAULT_REMOTE_OFFLINE_OUTPUT_DIR\n return DEFAULT_LOCAL_OUTPUT_DIR\n}\n\nfunction normalizeRuntimeOptions(runtime: BetterTranslateRuntimeOptions | undefined): BetterTranslateRuntimeOptions {\n if (runtime) {\n if (runtime.type !== \"local\") return runtime\n if (!runtime.translate) return { ...runtime, target: runtime.target ?? \"module\" }\n return {\n ...runtime,\n target: runtime.target ?? \"module\",\n translationBatchSize: normalizeTranslationBatchSize(runtime.translationBatchSize),\n }\n }\n return { type: \"local\", target: \"module\" }\n}\n\nfunction resolveRuntimeOptions(runtime: BetterTranslateRuntimeOptions, config: ResolvedConfig): BetterTranslateRuntimeOptions {\n if (runtime.type === \"remote\") {\n const projectId = typeof runtime.projectId === \"string\" ? runtime.projectId.trim() : \"\"\n if (!projectId) {\n throw new Error(`${PREFIX} remote runtime requires a projectId`)\n }\n return {\n ...runtime,\n projectId,\n endpoint: runtime.endpoint ?? REMOTE_API_BASE_URL,\n branch: resolveBranch(runtime, config.root),\n dev: {\n offline: runtime.dev?.offline ?? false,\n },\n }\n }\n\n const target = runtime.target ?? \"module\"\n if (target === \"module\") {\n return {\n ...runtime,\n target,\n output: runtime.output ?? DEFAULT_LOCAL_OUTPUT_DIR,\n }\n }\n\n if (!config.publicDir) {\n throw new Error(`${PREFIX} runtime target \"public\" requires Vite publicDir to be enabled`)\n }\n\n const output = runtime.output ?? normalizePath(relative(config.root, resolve(config.publicDir, DEFAULT_PUBLIC_OUTPUT_SUBDIR)))\n const outputPath = resolve(config.root, output)\n const publicBasePath = runtime.basePath ?? inferPublicBasePath(outputPath, config.publicDir)\n\n return {\n ...runtime,\n target,\n output,\n basePath: publicBasePath,\n }\n}\n\nfunction inferPublicBasePath(outputPath: string, publicDir: string) {\n const relativeToPublic = normalizePath(relative(publicDir, outputPath))\n if (relativeToPublic.startsWith(\"..\")) {\n throw new Error(`${PREFIX} runtime target \"public\" output must be inside Vite publicDir unless basePath is provided`)\n }\n return `/${relativeToPublic}`.replace(/\\/$/, \"\")\n}\n\nfunction formatRuntime(runtime: BetterTranslateRuntimeOptions) {\n return runtime.type === \"local\" ? `Local/${runtime.target ?? \"module\"}` : `Remote/${runtime.branch ?? \"auto\"}`\n}\n\nfunction resolveBranch(runtime: Pick<Extract<BetterTranslateRuntimeOptions, { type: \"remote\" }>, \"branch\">, root: string) {\n if (runtime.branch && runtime.branch !== \"auto\") return runtime.branch\n\n const envBranch = process.env.BETTER_TRANSLATION_BRANCH?.trim()\n if (envBranch) return envBranch\n\n const providerBranch = process.env.VERCEL_GIT_COMMIT_REF?.trim()\n if (providerBranch) return providerBranch\n\n const gitBranch = readCurrentGitBranch(root)\n return gitBranch ?? DEFAULT_REMOTE_BRANCH\n}\n\nfunction readCurrentGitBranch(root: string) {\n try {\n const branch = execFileSync(\"git\", [\"branch\", \"--show-current\"], {\n cwd: root,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim()\n return branch || null\n } catch {\n return null\n }\n}\n\nfunction formatRemoteManifestTarget(runtime: Extract<BetterTranslateRuntimeOptions, { type: \"remote\" }>, endpoint: string) {\n return `${endpoint.replace(/\\/$/, \"\")}/api/projects/${encodeURIComponent(runtime.projectId)}/branches/${encodeURIComponent(runtime.branch ?? DEFAULT_REMOTE_BRANCH)}/manifest`\n}\n\nfunction parseRemoteSyncResult(body: string) {\n try {\n const parsed = JSON.parse(body) as unknown\n if (typeof parsed !== \"object\" || parsed === null) return null\n return {\n changed: \"changed\" in parsed && parsed.changed === true,\n }\n } catch {\n return null\n }\n}\n\nfunction formatRemoteSyncError(response: Response, target: string, body: string) {\n const details = formatRemoteSyncResponseDetails(body)\n return [\n `${PREFIX} remote Manifest sync failed with ${response.status} ${response.statusText || \"HTTP error\"}`,\n `target: ${target}`,\n details ? `response: ${details}` : null,\n ]\n .filter((line) => line !== null)\n .join(\"\\n\")\n}\n\nfunction formatRemoteSyncNetworkError(target: string, error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n return [`${PREFIX} remote Manifest sync could not reach the hosted service`, `target: ${target}`, `error: ${message}`].join(\n \"\\n\",\n )\n}\n\nfunction formatRemoteSyncResponseDetails(body: string) {\n const details = body.trim().replace(/\\s+/g, \" \")\n if (!details) return \"\"\n return details.length > 500 ? `${details.slice(0, 500)}...` : details\n}\n\nfunction createModuleMessagesModule(locales: string[], getImportPath: (locale: string) => string) {\n const cases = locales\n .map(\n (locale) => ` case ${JSON.stringify(locale)}:\n return (await import(${JSON.stringify(getImportPath(locale))})).default`,\n )\n .join(\"\\n\")\n\n return [\n `export const locales = ${JSON.stringify(locales)}`,\n \"\",\n \"export async function loadMessages(locale) {\",\n \" switch (locale) {\",\n cases,\n \" default:\",\n \" throw new Error(`Unknown locale: ${locale}`)\",\n \" }\",\n \"}\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction createPublicMessagesModule(locales: string[], basePath: string) {\n const normalizedBasePath = basePath.replace(/\\/$/, \"\")\n return [\n `export const locales = ${JSON.stringify(locales)}`,\n \"\",\n \"export async function loadMessages(locale) {\",\n \" assertKnownLocale(locale)\",\n ` const response = await fetch(\\`${normalizedBasePath}/locales/\\${encodeURIComponent(locale)}.json\\`)`,\n \" if (!response.ok) throw new Error(`Failed to load locale: ${locale}`)\",\n \" return response.json()\",\n \"}\",\n \"\",\n createKnownLocaleAssertion(locales),\n ].join(\"\\n\")\n}\n\nfunction createRemoteMessagesModule(\n runtime: Extract<BetterTranslateRuntimeOptions, { type: \"remote\" }>,\n locales: string[],\n endpoint: string,\n) {\n const normalizedEndpoint = endpoint.replace(/\\/$/, \"\")\n const projectPath = `/projects/${encodeURIComponent(runtime.projectId)}`\n const branchPath = `/branches/${encodeURIComponent(runtime.branch ?? DEFAULT_REMOTE_BRANCH)}`\n return [\n `export const locales = ${JSON.stringify(locales)}`,\n \"\",\n \"export async function loadMessages(locale) {\",\n \" assertKnownLocale(locale)\",\n ` const response = await fetch(\\`${normalizedEndpoint}${projectPath}${branchPath}/locales/\\${encodeURIComponent(locale)}.json\\`)`,\n \" if (!response.ok) throw new Error(`Failed to load locale: ${locale}`)\",\n \" return response.json()\",\n \"}\",\n \"\",\n createKnownLocaleAssertion(locales),\n ].join(\"\\n\")\n}\n\nfunction createKnownLocaleAssertion(locales: string[]) {\n return [\n `const knownLocales = new Set(${JSON.stringify(locales)})`,\n \"\",\n \"function assertKnownLocale(locale) {\",\n \" if (!knownLocales.has(locale)) throw new Error(`Unknown locale: ${locale}`)\",\n \"}\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction normalizeLocaleMessages(input: unknown): RuntimeMessages {\n if (isRuntimeMessages(input)) return input\n if (\n typeof input === \"object\" &&\n input !== null &&\n \"messages\" in input &&\n typeof input.messages === \"object\" &&\n input.messages !== null\n ) {\n return Object.fromEntries(\n Object.entries(input.messages).flatMap(([id, entry]) =>\n typeof entry === \"object\" && entry !== null && \"translation\" in entry && typeof entry.translation === \"string\"\n ? [[id, entry.translation]]\n : [],\n ),\n ) as RuntimeMessages\n }\n return {}\n}\n\nfunction writeFileIfChanged(path: string, contents: string) {\n if (existsSync(path) && readFileSync(path, \"utf-8\") === contents) return false\n writeFileSync(path, contents)\n return true\n}\n\nfunction collectScanFiles(root: string) {\n const files: string[] = []\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n const path = resolve(root, entry.name)\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\") continue\n files.push(...collectScanFiles(path))\n continue\n }\n files.push(path)\n }\n return files\n}\n\nfunction isRuntimeMessages(input: unknown): input is RuntimeMessages {\n return typeof input === \"object\" && input !== null && Object.values(input).every((value) => typeof value === \"string\")\n}\n\nfunction chunk<T>(items: T[], size: number) {\n const chunks: T[][] = []\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size))\n }\n return chunks\n}\n\nfunction normalizeTranslationBatchSize(size: number | undefined) {\n if (typeof size !== \"number\" || !Number.isFinite(size)) return DEFAULT_TRANSLATION_BATCH_SIZE\n return Math.max(1, Math.floor(size))\n}\n\nfunction getTranslationBatchSize(runtime: BetterTranslateRuntimeOptions) {\n if (runtime.type !== \"local\") return DEFAULT_TRANSLATION_BATCH_SIZE\n return normalizeTranslationBatchSize(runtime.translate ? runtime.translationBatchSize : undefined)\n}\n\nfunction applyEdits(code: string, edits: Array<{ start: number; end: number; replacement: string }>) {\n let transformed = code\n for (const edit of [...edits].sort((a, b) => b.start - a.start)) {\n transformed = `${transformed.slice(0, edit.start)}${edit.replacement}${transformed.slice(edit.end)}`\n }\n return transformed\n}\n\nfunction groupMessagesById(messages: ExtractedMessage[]): MessageManifest {\n const grouped: MessageManifest = {}\n\n for (const message of messages) {\n const existing = grouped[message.id]\n if (existing && !hasSameMessageShape(existing, message)) {\n throw new Error(formatCollisionError(message.id, existing, message))\n }\n if (!existing) {\n grouped[message.id] = {\n defaultMessage: message.defaultMessage,\n meta: message.meta,\n placeholders: message.placeholders,\n sources: [message.source],\n }\n continue\n }\n if (!existing.sources.some((source) => isSameSource(source, message.source))) {\n existing.sources.push(message.source)\n }\n }\n\n return grouped\n}\n\nfunction hasSameMessageShape(\n existing: Pick<ManifestEntry, \"defaultMessage\" | \"meta\" | \"placeholders\">,\n incoming: Pick<ManifestEntry, \"defaultMessage\" | \"meta\" | \"placeholders\"> | ExtractedMessage,\n) {\n return (\n existing.defaultMessage === incoming.defaultMessage &&\n serializeMeta(existing.meta) === serializeMeta(incoming.meta) &&\n JSON.stringify(existing.placeholders) === JSON.stringify(incoming.placeholders)\n )\n}\n\nfunction isSameSource(left: MessageSource, right: MessageSource) {\n return left.file === right.file && left.kind === right.kind && left.marker === right.marker\n}\n\nfunction compareManifestEntryIds([left]: [string, ManifestEntry], [right]: [string, ManifestEntry]) {\n return left.localeCompare(right)\n}\n\nfunction compareMessageSources(left: MessageSource, right: MessageSource) {\n return left.file.localeCompare(right.file) || left.kind.localeCompare(right.kind) || left.marker.localeCompare(right.marker)\n}\n\nfunction isSameExtractedMessage(left: ExtractedMessage, right?: ExtractedMessage) {\n if (!right) return false\n return hasSameMessageShape(left, right) && isSameSource(left.source, right.source)\n}\n\nfunction formatCollisionError(\n id: string,\n existing: Pick<ManifestEntry, \"defaultMessage\" | \"meta\" | \"placeholders\" | \"sources\">,\n incoming: Pick<ManifestEntry, \"defaultMessage\" | \"meta\" | \"placeholders\" | \"sources\"> | ExtractedMessage,\n) {\n const existingSources = formatSources(existing.sources)\n const incomingSources = formatSources(\"source\" in incoming ? [incoming.source] : incoming.sources)\n return [\n `${PREFIX} conflicting message definition for ${BOLD}\"${id}\"${RESET}`,\n `existing: ${JSON.stringify({ defaultMessage: existing.defaultMessage, meta: existing.meta, placeholders: existing.placeholders })}`,\n `existing sources: ${existingSources}`,\n `incoming: ${JSON.stringify({ defaultMessage: incoming.defaultMessage, meta: incoming.meta, placeholders: incoming.placeholders })}`,\n `incoming sources: ${incomingSources}`,\n ].join(\"\\n\")\n}\n\nfunction formatSources(sources: MessageSource[]) {\n return sources.map((source) => `${source.file} (${source.kind}:${source.marker})`).join(\", \")\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-translation",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Vite plugin and runtime helpers for Better Translation.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-DHBiF-i2.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;UAeiB,aAAA;EAcf;EAZA,IAAA;EAcA;EAZA,IAAA;EAcS;EAZT,MAAA;AAAA;AAgBF;AAAA,UAZiB,aAAA;;EAEf,cAAA;EAUwD;EARxD,IAAA,EAAM,gBAAA;EAWuB;EAT7B,YAAA;EAS+C;EAP/C,OAAA,EAAS,aAAa;AAAA;;KAIZ,eAAA,GAAkB,MAAM,SAAS,aAAA;;KAGjC,mBAAA,GAAsB,eAAe;AAoDjD;AAAA,KAjDY,eAAA,GAAkB,MAAM;AAoFpC;AAAA,UAnCiB,gBAAA;;EAEf,EAAA;EAmCA;EAjCA,OAAO;AAAA;;UAIQ,gBAAA;EAqCH;EAnCZ,EAAA;EAqCmB;EAnCnB,IAAA;EAmCoD;EAjCpD,IAAA,EAAM,gBAAA;EAqC4C;EAnClD,YAAA;EAmCkD;EAjClD,OAAA,EAAS,aAAa;AAAA;;KAIZ,WAAA,IAAe,QAAA,EAAU,gBAAA,IAAoB,MAAA,aAAmB,OAAA,CAAQ,MAAA;;UAGnE,iCAAA;EAwCb;EAtCF,OAAA;EAsCS;EApCT,IAAA;EAyCuC;EAvCvC,IAAA;AAAA;AAuCkH;AAAA,UAnCnG,kCAAA;EAsC4B;EApC3C,IAAA;EAgDuC;EA9CvC,MAAA;EAsCA;EApCA,MAAA;EAwCA;EAtCA,QAAA;EA0CA;EAxCA,SAAA,GAAY,WAAA;EAwC2B;EAtCvC,MAAA,aAAmB,iCAAiC;AAAA;;UAIrC,mCAAA;;EAEf,IAAA;;EAEA,QAAA;;EAEA,SAAA;;EAEA,MAAA;;EAEA,MAAA;;EAEA,GAAA;oEAEE,OAAA;EAAA;AAAA;;KAKQ,6BAAA,GAAgC,kCAAA,GAAqC,mCAAmC;;UAGnG,4BAAA;;EAEf,OAAA;;EAEA,aAAA;;EAEA,OAAA;;EAEA,SAAA;;EAEA,OAAA;;EAEA,OAAA,GAAU,6BAA6B;AAAA"}