better-translation 0.2.3 → 0.2.4-canary.0

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-C3EkBdeb.mjs";
1
+ import { s as TranslateFn } from "./types-Ca8X5uZF.mjs";
2
2
  import { generateText } from "ai";
3
3
 
4
4
  //#region src/ai.d.ts
@@ -1,4 +1,4 @@
1
- import { s as RuntimeMessages } from "./types-C3EkBdeb.mjs";
1
+ import { o as RuntimeMessages } from "./types-Ca8X5uZF.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-C3EkBdeb.mjs";
1
+ import { l as TranslateOptions } from "./types-Ca8X5uZF.mjs";
2
2
  import { ReactNode } from "react";
3
3
 
4
4
  //#region src/react.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.mts","names":[],"sources":["../src/react.tsx"],"mappings":";;;;;UAaiB,sBAAA;EAAA;EAEf,QAAA,EAAU,MAAA;;EAEV,QAAA,EAAU,SAAS;AAAA;;iBAIL,iBAAA,CAAA;EAAoB,QAAA;EAAU;AAAA,GAAY,sBAAA,+BAAsB,GAAA,CAAA,OAAA;;iBAMhE,WAAA,CAAA,GAAW,MAAA;AAAA,KAItB,aAAA,GAAgB,MAAM;AAAA,KACtB,WAAA,IAAe,OAAA,UAAiB,eAAA,GAAkB,aAAA,GAAgB,gBAAA,EAAkB,OAAA,GAAU,gBAAA;;iBAGnF,IAAA,CAAA,GAAQ,WAAW;;KAevB,QAAA;EA7B8C,sFA+BxD,QAAA,GAAW,SAAA;AAAA,IACT,MAAA,SAAe,SAAA;;iBAGH,GAAA,CAAI,KAAA,EAAO,QAAQ,+BAAA,GAAA,CAAA,OAAA;;UAKlB,MAAA;EAxCyC;EA0CxD,EAAA;EA1C8E;EA4C9E,OAAA;EA5C8E;EA8C9E,QAAA,GAAW,SAAS;AAAA;;iBAIN,CAAA,CAAA;EAAI,EAAA;EAAI,OAAA;EAAS;AAAA,GAAY,MAAA,+BAAM,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"react.d.mts","names":[],"sources":["../src/react.tsx"],"mappings":";;;;;UAaiB,sBAAA;EAAA;EAEf,QAAA,EAAU,MAAA;;EAEV,QAAA,EAAU,SAAS;AAAA;;iBAIL,iBAAA;EAAoB,QAAA;EAAU;AAAA,GAAY,sBAAA,+BAAsB,GAAA,CAAA,OAAA;;iBAMhE,WAAA,IAAW,MAAA;AAAA,KAItB,aAAA,GAAgB,MAAM;AAAA,KACtB,WAAA,IAAe,OAAA,UAAiB,eAAA,GAAkB,aAAA,GAAgB,gBAAA,EAAkB,OAAA,GAAU,gBAAA;;iBAGnF,IAAA,IAAQ,WAAW;;KAevB,QAAA;EA7B8C,sFA+BxD,QAAA,GAAW,SAAA;AAAA,IACT,MAAA,SAAe,SAAA;;iBAGH,GAAA,CAAI,KAAA,EAAO,QAAQ,+BAAA,GAAA,CAAA,OAAA;;UAKlB,MAAA;EAxCyC;EA0CxD,EAAA;EA1C8E;EA4C9E,OAAA;EA5C8E;EA8C9E,QAAA,GAAW,SAAS;AAAA;;iBAIN,CAAA;EAAI,EAAA;EAAI,OAAA;EAAS;AAAA,GAAY,MAAA,+BAAM,GAAA,CAAA,OAAA"}
package/dist/server.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { u as TranslateOptions } from "./types-C3EkBdeb.mjs";
1
+ import { l as TranslateOptions } from "./types-Ca8X5uZF.mjs";
2
2
 
3
3
  //#region src/server.d.ts
4
4
  type MessageValues = Record<string, unknown>;
@@ -91,15 +91,6 @@ interface BetterTranslateRemoteRuntimeOptions {
91
91
  }
92
92
  /** Controls where locale artifacts live and how the virtual runtime loader reads them. */
93
93
  type BetterTranslateRuntimeOptions = BetterTranslateLocalRuntimeOptions | BetterTranslateRemoteRuntimeOptions;
94
- /** Runtime metadata emitted by the plugin for server-side loaders. */
95
- interface BetterTranslateRuntimeConfig {
96
- /** Runtime backend configured for locale artifacts. */
97
- runtime: BetterTranslateLocalRuntimeOptions | Omit<BetterTranslateRemoteRuntimeOptions, "apiKey">;
98
- /** Locale code treated as the source language. */
99
- defaultLocale: string;
100
- /** All locale codes emitted by the plugin. */
101
- locales: string[];
102
- }
103
94
  /** Public configuration for the Better Translation Vite plugin. */
104
95
  interface BetterTranslatePluginOptions {
105
96
  /** All locale codes that should be emitted. */
@@ -116,5 +107,5 @@ interface BetterTranslatePluginOptions {
116
107
  runtime?: BetterTranslateRuntimeOptions;
117
108
  }
118
109
  //#endregion
119
- export { BetterTranslateRuntimeOptions as a, TranslateFn as c, BetterTranslateRuntimeConfig as i, TranslateMessage as l, BetterTranslatePluginOptions as n, MessageManifestFile as o, BetterTranslateRemoteRuntimeOptions as r, RuntimeMessages as s, BetterTranslateLocalRuntimeOptions as t, TranslateOptions as u };
120
- //# sourceMappingURL=types-C3EkBdeb.d.mts.map
110
+ export { MessageManifestFile as a, TranslateMessage as c, BetterTranslateRuntimeOptions as i, TranslateOptions as l, BetterTranslatePluginOptions as n, RuntimeMessages as o, BetterTranslateRemoteRuntimeOptions as r, TranslateFn as s, BetterTranslateLocalRuntimeOptions as t };
111
+ //# sourceMappingURL=types-Ca8X5uZF.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-C3EkBdeb.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;UAeiB,aAAA;EAkBZ;EAhBH,IAAA;EAoB4B;EAlB5B,IAAA;EA0BsB;EAxBtB,MAAA;EAoBA;EAlBA,IAAA;EAoBA;EAlBA,MAAA;EAoBS;EAlBT,OAAA;EAkBsB;EAhBtB,SAAA;EAoByB;EAlBzB,KAAA;EAkB4B;EAhB5B,GAAA;AAAA;;UAIe,aAAA;EAegC;EAb/C,cAAA;EAgBU;EAdV,IAAA,EAAM,gBAAA;;EAEN,YAAA;EAYkC;EAVlC,OAAA,EAAS,aAAa;AAAA;;KAIZ,eAAA,GAAkB,MAAM,SAAS,aAAA;AA2DpC;AAAA,KAxDG,mBAAA,GAAsB,eAAe;;KAGrC,eAAA,GAAkB,MAAM;;UAiDnB,gBAAA;EA2Cf;EAzCA,EAAA;EA6CA;EA3CA,OAAO;AAAA;;UAIQ,gBAAA;EA6CN;EA3CT,EAAA;EAgDuC;EA9CvC,IAAA;EA8C0C;EA5C1C,IAAA,EAAM,gBAAA;EA+CS;EA7Cf,YAAA;;EAEA,OAAA,EAAS,aAAa;AAAA;;KAIZ,WAAA,IAAe,QAAA,EAAU,gBAAA,IAAoB,MAAA,aAAmB,OAAA,CAAQ,MAAA;;UAGnE,kCAAA;EAsCN;EApCT,IAAA;EAoCmD;EAlCnD,MAAA;EAsCA;EApCA,MAAA;EAoCO;EAlCP,QAAA;EAsC2C;EApC3C,SAAA,GAAY,WAAW;AAAA;;UAIR,mCAAA;EAsCf;EApCA,IAAA;EAwCA;EAtCA,QAAA;EAwCU;EAtCV,SAAA;EAsCuC;EApCvC,MAAA;;EAEA,MAAA;;EAEA,GAAA;oEAEE,OAAA;EAAA;AAAA;;KAKQ,6BAAA,GAAgC,kCAAA,GAAqC,mCAAmC;;UAGnG,4BAAA;;EAEf,OAAA,EAAS,kCAAA,GAAqC,IAAA,CAAK,mCAAA;;EAEnD,aAAA;;EAEA,OAAA;AAAA;;UAIe,4BAAA;;EAEf,OAAA;;EAEA,aAAA;;EAEA,OAAA;;EAEA,SAAA;;EAEA,OAAA;;EAEA,OAAA,GAAU,6BAA6B;AAAA"}
1
+ {"version":3,"file":"types-Ca8X5uZF.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;UAeiB,aAAA;EAkBZ;EAhBH,IAAA;EAoB4B;EAlB5B,IAAA;EA0BsB;EAxBtB,MAAA;EAoBA;EAlBA,IAAA;EAoBA;EAlBA,MAAA;EAoBS;EAlBT,OAAA;EAkBsB;EAhBtB,SAAA;EAoByB;EAlBzB,KAAA;EAkB4B;EAhB5B,GAAA;AAAA;;UAIe,aAAA;EAegC;EAb/C,cAAA;EAgBU;EAdV,IAAA,EAAM,gBAAA;;EAEN,YAAA;EAYkC;EAVlC,OAAA,EAAS,aAAa;AAAA;;KAIZ,eAAA,GAAkB,MAAM,SAAS,aAAA;AA2DpC;AAAA,KAxDG,mBAAA,GAAsB,eAAe;;KAGrC,eAAA,GAAkB,MAAM;;UAiDnB,gBAAA;EA2Cf;EAzCA,EAAA;EA6CA;EA3CA,OAAO;AAAA;;UAIQ,gBAAA;EA6CN;EA3CT,EAAA;EAgDuC;EA9CvC,IAAA;EA8C0C;EA5C1C,IAAA,EAAM,gBAAA;EA+CS;EA7Cf,YAAA;;EAEA,OAAA,EAAS,aAAa;AAAA;;KAIZ,WAAA,IAAe,QAAA,EAAU,gBAAA,IAAoB,MAAA,aAAmB,OAAA,CAAQ,MAAA;;UAGnE,kCAAA;EAgDf;EA9CA,IAAA;EA8CuC;EA5CvC,MAAA;;EAEA,MAAA;;EAEA,QAAA;;EAEA,SAAA,GAAY,WAAW;AAAA;;UAIR,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"}
package/dist/vite.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { a as BetterTranslateRuntimeOptions, c as TranslateFn, i as BetterTranslateRuntimeConfig, l as TranslateMessage, n as BetterTranslatePluginOptions, o as MessageManifestFile, r as BetterTranslateRemoteRuntimeOptions, s as RuntimeMessages, t as BetterTranslateLocalRuntimeOptions, u as TranslateOptions } from "./types-C3EkBdeb.mjs";
1
+ import { a as MessageManifestFile, c as TranslateMessage, i as BetterTranslateRuntimeOptions, l as TranslateOptions, n as BetterTranslatePluginOptions, o as RuntimeMessages, r as BetterTranslateRemoteRuntimeOptions, s as TranslateFn, t as BetterTranslateLocalRuntimeOptions } from "./types-Ca8X5uZF.mjs";
2
2
  import { Plugin } from "vite";
3
3
 
4
4
  //#region src/plugin.d.ts
5
5
  /** Scans source files for translatable messages and keeps locale JSON files in sync. */
6
6
  declare function betterTranslation(options: BetterTranslatePluginOptions): Plugin;
7
7
  //#endregion
8
- export { type BetterTranslateLocalRuntimeOptions, type BetterTranslatePluginOptions, type BetterTranslateRemoteRuntimeOptions, type BetterTranslateRuntimeConfig, type BetterTranslateRuntimeOptions, type MessageManifestFile, type RuntimeMessages, type TranslateFn, type TranslateMessage, type TranslateOptions, betterTranslation };
8
+ export { type BetterTranslateLocalRuntimeOptions, type BetterTranslatePluginOptions, type BetterTranslateRemoteRuntimeOptions, type BetterTranslateRuntimeOptions, type MessageManifestFile, type RuntimeMessages, type TranslateFn, type TranslateMessage, type TranslateOptions, betterTranslation };
9
9
  //# sourceMappingURL=vite.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite.d.mts","names":[],"sources":["../src/plugin.ts"],"mappings":";;;;;iBAkEgB,iBAAA,CAAkB,OAAA,EAAS,4BAAA,GAA+B,MAAM"}
1
+ {"version":3,"file":"vite.d.mts","names":[],"sources":["../src/plugin.ts"],"mappings":";;;;;iBA4DgB,iBAAA,CAAkB,OAAA,EAAS,4BAAA,GAA+B,MAAM"}
package/dist/vite.mjs CHANGED
@@ -303,13 +303,6 @@ function getVarChildIdentifier(children) {
303
303
  return child.expression.name;
304
304
  }
305
305
  //#endregion
306
- //#region src/runtime-config.ts
307
- const DEFAULT_LOCAL_OUTPUT_DIR = "src/lib/bt";
308
- const RUNTIME_CONFIG_FILENAME = "runtime.json";
309
- function getRuntimeConfigPath(root, dir) {
310
- return resolve(root, dir, RUNTIME_CONFIG_FILENAME);
311
- }
312
- //#endregion
313
306
  //#region src/plugin.ts
314
307
  const PREFIX = "\x1B[36m[better-translation]\x1B[0m";
315
308
  const DIM = "\x1B[2m";
@@ -321,7 +314,11 @@ const DEFAULT_REMOTE_API_KEY_ENV = "BETTER_TRANSLATION_API_KEY";
321
314
  const DEFAULT_REMOTE_BRANCH = "main";
322
315
  const DEFAULT_CACHE_DIR = ".cache/better-translation";
323
316
  const DEFAULT_TRANSLATION_CACHE_FILE = `${DEFAULT_CACHE_DIR}/cache.json`;
317
+ const DEFAULT_PRIVATE_MANIFEST_FILE = `${DEFAULT_CACHE_DIR}/manifest.json`;
324
318
  const DEFAULT_REMOTE_OFFLINE_OUTPUT_DIR = `${DEFAULT_CACHE_DIR}/runtime`;
319
+ const DEFAULT_LOCAL_OUTPUT_DIR = "src/lib/bt";
320
+ const DEFAULT_PUBLIC_OUTPUT_SUBDIR = "bt";
321
+ const DEFAULT_PUBLIC_BASE_PATH = "/bt";
325
322
  const DEFAULT_ROOT_DIR = "src";
326
323
  const DEFAULT_SCAN_EXTENSIONS = [
327
324
  ".ts",
@@ -333,14 +330,7 @@ const VIRTUAL_MESSAGES_MODULE_ID = "better-translation/messages";
333
330
  const RESOLVED_VIRTUAL_MESSAGES_MODULE_ID = `\0${VIRTUAL_MESSAGES_MODULE_ID}`;
334
331
  const CALL_MARKERS = ["t", "useT"];
335
332
  const COMPONENT_MARKERS = ["T"];
336
- const PRIVATE_MANIFEST_FILENAME = "manifest.json";
337
333
  const LOCALES_SUBDIR = "locales";
338
- const GITIGNORE_FILENAME = ".gitignore";
339
- const GITIGNORE_CONTENTS = [
340
- "# Generated by better-translation/vite",
341
- "manifest.json",
342
- ""
343
- ].join("\n");
344
334
  function formatLocale(locale) {
345
335
  return locale.toUpperCase();
346
336
  }
@@ -357,8 +347,8 @@ function betterTranslation(options) {
357
347
  let resolvedRuntime = configuredRuntime;
358
348
  let usesLocalStorage = shouldUseLocalStorage(configuredRuntime, false);
359
349
  let resolvedTranslate = configuredRuntime.type === "local" ? configuredRuntime.translate : void 0;
360
- let localesDir = configuredRuntime.type === "local" ? configuredRuntime.output ?? "src/lib/bt" : DEFAULT_LOCAL_OUTPUT_DIR;
361
- let publicBasePath = configuredRuntime.type === "local" && configuredRuntime.target === "public" ? configuredRuntime.basePath ?? "/bt" : "/bt";
350
+ let localesDir = configuredRuntime.type === "local" ? configuredRuntime.output ?? DEFAULT_LOCAL_OUTPUT_DIR : DEFAULT_LOCAL_OUTPUT_DIR;
351
+ let publicBasePath = configuredRuntime.type === "local" && configuredRuntime.target === "public" ? configuredRuntime.basePath ?? DEFAULT_PUBLIC_BASE_PATH : DEFAULT_PUBLIC_BASE_PATH;
362
352
  let remoteUrl = configuredRuntime.type === "remote" ? configuredRuntime.endpoint ?? REMOTE_API_BASE_URL : REMOTE_API_BASE_URL;
363
353
  let root = "";
364
354
  let isDev = false;
@@ -410,11 +400,11 @@ function betterTranslation(options) {
410
400
  return process.env[DEFAULT_REMOTE_API_KEY_ENV]?.trim() || null;
411
401
  }
412
402
  function buildMessageManifest() {
413
- return Object.fromEntries(Object.entries(manifest).map(([id, entry]) => [id, {
403
+ return Object.fromEntries(Object.entries(manifest).sort(compareManifestEntryIds).map(([id, entry]) => [id, {
414
404
  defaultMessage: entry.defaultMessage,
415
405
  meta: entry.meta,
416
406
  placeholders: entry.placeholders,
417
- sources: entry.sources
407
+ sources: entry.sources.length > 1 ? [...entry.sources].sort(compareMessageSources) : entry.sources
418
408
  }]));
419
409
  }
420
410
  function shouldScanFile(id) {
@@ -424,22 +414,7 @@ function betterTranslation(options) {
424
414
  return sourceRoots.some((sourceRoot) => cleanId === sourceRoot || cleanId.startsWith(`${sourceRoot}/`) || cleanId.startsWith(`${sourceRoot}\\`));
425
415
  }
426
416
  function getPrivateManifestPath() {
427
- return resolve(root, localesDir, PRIVATE_MANIFEST_FILENAME);
428
- }
429
- function getRuntimeConfig() {
430
- return {
431
- runtime: getRuntimeConfigRuntime(resolvedRuntime),
432
- defaultLocale,
433
- locales
434
- };
435
- }
436
- function writeRuntimeConfig() {
437
- if (!usesLocalStorage) return;
438
- const runtimeConfig = JSON.stringify(getRuntimeConfig(), null, 2) + "\n";
439
- const path = getRuntimeConfigPath(root, localesDir);
440
- const dir = dirname(path);
441
- if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
442
- writeFileIfChanged(path, runtimeConfig);
417
+ return resolve(root, DEFAULT_PRIVATE_MANIFEST_FILE);
443
418
  }
444
419
  function getLocalesDirPath() {
445
420
  return resolve(root, localesDir, LOCALES_SUBDIR);
@@ -463,50 +438,15 @@ function betterTranslation(options) {
463
438
  if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
464
439
  writeFileIfChanged(path, JSON.stringify(buildMessageManifest(), null, 2) + "\n");
465
440
  }
466
- function assertFileContents(path, expected, label) {
467
- if (!existsSync(path)) throw new Error(`${PREFIX} missing committed ${label} at ${relative(root, path)}`);
468
- if (readFileSync(path, "utf-8") !== expected) throw new Error([
469
- `${PREFIX} committed ${label} is out of date`,
470
- `expected committed file at ${relative(root, path)} to match the generated output`,
471
- `run the dev workflow to regenerate locale artifacts and commit the result`
472
- ].join("\n"));
473
- }
474
- function assertJsonFileContents(path, expected, label) {
475
- if (!existsSync(path)) throw new Error(`${PREFIX} missing committed ${label} at ${relative(root, path)}`);
476
- let actual;
477
- try {
478
- actual = JSON.parse(readFileSync(path, "utf-8"));
479
- } catch {
480
- throw new Error(`${PREFIX} committed ${label} is invalid JSON at ${relative(root, path)}`);
481
- }
482
- if (JSON.stringify(actual) !== JSON.stringify(expected)) throw new Error([
483
- `${PREFIX} committed ${label} is out of date`,
484
- `expected committed file at ${relative(root, path)} to match the generated output`,
485
- `run the dev workflow to regenerate locale artifacts and commit the result`
486
- ].join("\n"));
487
- }
488
- function writeGitignore() {
489
- if (!usesLocalStorage) return;
490
- const path = resolve(root, localesDir, GITIGNORE_FILENAME);
491
- const dir = dirname(path);
492
- if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
493
- writeFileIfChanged(path, GITIGNORE_CONTENTS);
494
- }
495
- function assertGeneratedFilesCommitted() {
496
- if (!usesLocalStorage) return;
497
- assertJsonFileContents(getRuntimeConfigPath(root, localesDir), getRuntimeConfig(), "runtime config");
498
- assertFileContents(resolve(root, localesDir, GITIGNORE_FILENAME), GITIGNORE_CONTENTS, "generated .gitignore");
499
- }
500
- function buildLocalLocaleMessages(locale) {
441
+ function buildLocalLocaleMessages(locale, manifestEntries) {
501
442
  const existingMessages = readLocaleMessages(locale);
502
443
  const messages = {};
503
444
  if (locale === defaultLocale) {
504
- for (const [id, entry] of Object.entries(manifest)) messages[id] = entry.defaultMessage;
445
+ for (const [id, entry] of manifestEntries) messages[id] = entry.defaultMessage;
505
446
  return messages;
506
447
  }
507
- for (const id of Object.keys(manifest)) {
448
+ for (const [id, entry] of manifestEntries) {
508
449
  if (Object.hasOwn(messages, id)) continue;
509
- const entry = manifest[id];
510
450
  const existingMessage = existingMessages[id];
511
451
  const cachedMessage = getFreshCachedMessage(id, locale);
512
452
  if (existingMessage !== void 0 && !isUntranslatedLocaleValue(existingMessage, entry)) {
@@ -522,14 +462,16 @@ function betterTranslation(options) {
522
462
  if (!usesLocalStorage) return;
523
463
  const dir = getLocalesDirPath();
524
464
  if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
525
- for (const locale of locales) writeFileIfChanged(resolve(dir, `${locale}.json`), JSON.stringify(buildLocalLocaleMessages(locale), null, 2) + "\n");
465
+ const manifestEntries = Object.entries(manifest).sort(compareManifestEntryIds);
466
+ for (const locale of locales) writeFileIfChanged(resolve(dir, `${locale}.json`), JSON.stringify(buildLocalLocaleMessages(locale, manifestEntries), null, 2) + "\n");
526
467
  }
527
468
  function getMissingMessagesByLocale() {
528
469
  const missingByLocale = /* @__PURE__ */ new Map();
470
+ const manifestEntries = Object.entries(manifest).sort(compareManifestEntryIds);
529
471
  for (const locale of locales) {
530
472
  if (locale === defaultLocale) continue;
531
473
  const existingMessages = readLocaleMessages(locale);
532
- for (const [id, entry] of Object.entries(manifest)) {
474
+ for (const [id, entry] of manifestEntries) {
533
475
  const existingMessage = existingMessages[id];
534
476
  if (!(existingMessage !== void 0 && !isUntranslatedLocaleValue(existingMessage, entry)) && getFreshCachedMessage(id, locale) === void 0) {
535
477
  const misses = missingByLocale.get(locale) ?? [];
@@ -728,7 +670,7 @@ function betterTranslation(options) {
728
670
  usesLocalStorage = shouldUseLocalStorage(resolvedRuntime, isDev);
729
671
  resolvedTranslate = resolvedRuntime.type === "local" ? resolvedRuntime.translate : void 0;
730
672
  localesDir = getRuntimeOutputDir(resolvedRuntime, isDev);
731
- publicBasePath = resolvedRuntime.type === "local" && resolvedRuntime.target === "public" ? resolvedRuntime.basePath ?? "/bt" : "/bt";
673
+ publicBasePath = resolvedRuntime.type === "local" && resolvedRuntime.target === "public" ? resolvedRuntime.basePath ?? DEFAULT_PUBLIC_BASE_PATH : DEFAULT_PUBLIC_BASE_PATH;
732
674
  remoteUrl = resolvedRuntime.type === "remote" ? resolvedRuntime.endpoint ?? REMOTE_API_BASE_URL : REMOTE_API_BASE_URL;
733
675
  sourceRoots = (Array.isArray(rootDir) ? rootDir : [rootDir]).map((dir) => resolve(root, dir));
734
676
  log(`${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}`);
@@ -743,12 +685,9 @@ function betterTranslation(options) {
743
685
  cache = loadCache(resolve(root, cacheFile));
744
686
  scanAllSourceFiles();
745
687
  if (usesLocalStorage && !isDev) {
746
- assertGeneratedFilesCommitted();
747
688
  assertLocalBuildTranslationsComplete();
748
689
  return;
749
690
  }
750
- writeRuntimeConfig();
751
- writeGitignore();
752
691
  writeLocaleFilesToDisk();
753
692
  writePrivateManifest();
754
693
  if (isDev) scheduleDevTranslation();
@@ -785,10 +724,8 @@ function betterTranslation(options) {
785
724
  };
786
725
  },
787
726
  async generateBundle() {
788
- if (usesLocalStorage) {
789
- if (!isDev) assertGeneratedFilesCommitted();
790
- assertLocalBuildTranslationsComplete();
791
- } else if (isDev) await translateMissingMessages();
727
+ if (usesLocalStorage) assertLocalBuildTranslationsComplete();
728
+ else if (isDev) await translateMissingMessages();
792
729
  if (!usesLocalStorage) await syncRemote();
793
730
  },
794
731
  closeBundle() {
@@ -806,16 +743,6 @@ function shouldUseLocalStorage(runtime, isDev) {
806
743
  function isRemoteOfflineDev(runtime, isDev) {
807
744
  return runtime.type === "remote" && isDev && runtime.dev?.offline === true;
808
745
  }
809
- function getRuntimeConfigRuntime(runtime) {
810
- if (runtime.type === "local") return runtime;
811
- return {
812
- type: "remote",
813
- projectId: runtime.projectId,
814
- ...runtime.endpoint === void 0 ? {} : { endpoint: runtime.endpoint },
815
- ...runtime.branch === void 0 ? {} : { branch: runtime.branch },
816
- ...runtime.dev === void 0 ? {} : { dev: runtime.dev }
817
- };
818
- }
819
746
  function getRuntimeOutputDir(runtime, isDev) {
820
747
  if (runtime.type === "local") return runtime.output;
821
748
  if (isRemoteOfflineDev(runtime, isDev)) return DEFAULT_REMOTE_OFFLINE_OUTPUT_DIR;
@@ -847,10 +774,10 @@ function resolveRuntimeOptions(runtime, config) {
847
774
  if (target === "module") return {
848
775
  ...runtime,
849
776
  target,
850
- output: runtime.output ?? "src/lib/bt"
777
+ output: runtime.output ?? DEFAULT_LOCAL_OUTPUT_DIR
851
778
  };
852
779
  if (!config.publicDir) throw new Error(`${PREFIX} runtime target "public" requires Vite publicDir to be enabled`);
853
- const output = runtime.output ?? normalizePath(relative(config.root, resolve(config.publicDir, "bt")));
780
+ const output = runtime.output ?? normalizePath(relative(config.root, resolve(config.publicDir, DEFAULT_PUBLIC_OUTPUT_SUBDIR)));
854
781
  const outputPath = resolve(config.root, output);
855
782
  const publicBasePath = runtime.basePath ?? inferPublicBasePath(outputPath, config.publicDir);
856
783
  return {
@@ -1037,6 +964,12 @@ function hasSameMessageShape(existing, incoming) {
1037
964
  function isSameSource(left, right) {
1038
965
  return left.file === right.file && left.kind === right.kind && left.marker === right.marker && left.start === right.start && left.end === right.end;
1039
966
  }
967
+ function compareManifestEntryIds([left], [right]) {
968
+ return left.localeCompare(right);
969
+ }
970
+ function compareMessageSources(left, right) {
971
+ return left.file.localeCompare(right.file) || left.start - right.start || left.end - right.end || left.kind.localeCompare(right.kind) || left.marker.localeCompare(right.marker);
972
+ }
1040
973
  function isSameExtractedMessage(left, right) {
1041
974
  if (!right) return false;
1042
975
  return hasSameMessageShape(left, right) && isSameSource(left.source, right.source);
package/dist/vite.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.mjs","names":[],"sources":["../src/cache.ts","../src/extractor.ts","../src/runtime-config.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 { Argument, JSXChild, StringLiteral } from \"oxc-parser\"\nimport { parseSync, Visitor } from \"oxc-parser\"\n\nimport type { ExtractedMessage, MessageSource, TranslateOptions } from \"./types.js\"\n\nimport { getCallMessageId, getMessageId } from \"./message-id.js\"\n\ninterface Markers {\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\n/** Extracts messages and source edits from a file in one coordinated parse pass. */\nexport function analyzeSourceFile(code: string, filename: string, markers: Markers): 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 const lineStarts = getLineStarts(code)\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 lineStarts,\n marker: node.callee.name,\n kind: \"call\",\n start: node.start,\n end: node.end,\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(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 lineStarts,\n marker: opening.name.name,\n kind: \"component\",\n start: node.start,\n end: node.end,\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 })\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\nfunction 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\nfunction createSource({\n filename,\n lineStarts,\n marker,\n kind,\n start,\n end,\n}: {\n filename: string\n lineStarts: number[]\n marker: string\n kind: MessageSource[\"kind\"]\n start: number\n end: number\n}): MessageSource {\n const startPosition = getPosition(start, lineStarts)\n const endPosition = getPosition(end, lineStarts)\n\n return {\n file: filename,\n kind,\n marker,\n line: startPosition.line,\n column: startPosition.column,\n endLine: endPosition.line,\n endColumn: endPosition.column,\n start,\n end,\n }\n}\n\nfunction getLineStarts(code: string) {\n const starts = [0]\n for (let i = 0; i < code.length; i++) {\n if (code[i] === \"\\n\") starts.push(i + 1)\n }\n return starts\n}\n\nfunction getPosition(offset: number, lineStarts: number[]) {\n let low = 0\n let high = lineStarts.length - 1\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const lineStart = lineStarts[mid]!\n const nextLineStart = lineStarts[mid + 1] ?? Number.POSITIVE_INFINITY\n\n if (offset < lineStart) {\n high = mid - 1\n continue\n }\n\n if (offset >= nextLineStart) {\n low = mid + 1\n continue\n }\n\n return { line: mid + 1, column: offset - lineStart + 1 }\n }\n\n const lastLine = lineStarts.length - 1\n const lastStart = lineStarts[lastLine] ?? 0\n return { line: lastLine + 1, column: offset - lastStart + 1 }\n}\n\ninterface ExtractionResult {\n message: string\n placeholders: string[]\n valid: boolean\n}\n\nfunction extractJSXChildren(children: Array<JSXChild>): ExtractionResult {\n const parts: string[] = []\n const placeholders: 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: [], valid: false }\n }\n\n const varName = getVarPlaceholderName(child)\n if (!varName) return { message: \"\", placeholders: [], valid: false }\n\n placeholders.push(varName)\n parts.push(`{${varName}}`)\n break\n }\n\n case \"JSXExpressionContainer\":\n if (child.expression.type !== \"JSXEmptyExpression\") {\n return { message: \"\", placeholders: [], 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, valid: message.length > 0 }\n}\n\nfunction getVarPlaceholderName(node: { openingElement: { attributes: Array<unknown> }; children: Array<JSXChild> }) {\n const explicitName = getJSXStringAttribute(node.openingElement.attributes as Array<unknown>, \"name\")\n if (explicitName) return explicitName\n\n const customPropName = getSingleJSXAttributeName(node.openingElement.attributes as Array<unknown>)\n if (customPropName) return customPropName\n\n return getVarChildIdentifier(node.children)\n}\n\nfunction getSingleJSXAttributeName(attributes: Array<unknown>) {\n const keys = attributes.flatMap((attr) => {\n const attribute = attr as\n | {\n type?: string\n name?: { type?: string; name?: string }\n }\n | undefined\n\n if (attribute?.type !== \"JSXAttribute\" || attribute.name?.type !== \"JSXIdentifier\") return []\n return [attribute.name.name]\n })\n\n return keys.length === 1 ? keys[0] : undefined\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","import { existsSync, readFileSync } from \"node:fs\"\nimport { dirname, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport type { BetterTranslateRuntimeConfig } from \"./types.js\"\n\nexport const DEFAULT_LOCAL_OUTPUT_DIR = \"src/lib/bt\"\nexport const DEFAULT_PUBLIC_OUTPUT_SUBDIR = \"bt\"\nexport const DEFAULT_PUBLIC_BASE_PATH = \"/bt\"\nexport const RUNTIME_CONFIG_FILENAME = \"runtime.json\"\nexport const COMMON_RUNTIME_CONFIG_DIRS = [\n DEFAULT_LOCAL_OUTPUT_DIR,\n `public/${DEFAULT_PUBLIC_OUTPUT_SUBDIR}`,\n `assets/${DEFAULT_LOCAL_OUTPUT_DIR}`,\n]\n\nexport function getRuntimeConfigPath(root: string, dir: string) {\n return resolve(root, dir, RUNTIME_CONFIG_FILENAME)\n}\n\nexport function getRuntimeConfigCandidatePaths(importMetaUrl: string, dirs = COMMON_RUNTIME_CONFIG_DIRS) {\n return getSearchBaseDirs(importMetaUrl).flatMap((baseDir) => dirs.map((dir) => resolve(baseDir, dir, RUNTIME_CONFIG_FILENAME)))\n}\n\nexport function getLocalConfigCandidatePaths(dir: string, importMetaUrl: string, fileName: string) {\n return getSearchBaseDirs(importMetaUrl).map((baseDir) => resolve(baseDir, dir, fileName))\n}\n\nexport function readRuntimeConfigFromPaths(paths: string[]) {\n for (const path of dedupe(paths)) {\n if (!existsSync(path)) continue\n try {\n return JSON.parse(readFileSync(path, \"utf-8\")) as BetterTranslateRuntimeConfig\n } catch {\n continue\n }\n }\n return null\n}\n\nfunction dedupe(paths: string[]) {\n return [...new Set(paths)]\n}\n\nfunction getSearchBaseDirs(importMetaUrl: string) {\n const currentDir = dirname(fileURLToPath(importMetaUrl))\n const candidates = [...collectParentDirs(process.cwd()), ...collectParentDirs(currentDir)]\n return dedupe(candidates)\n}\n\nfunction collectParentDirs(startDir: string, maxDepth = 6) {\n const dirs: string[] = []\n let currentDir = startDir\n\n for (let i = 0; i <= maxDepth; i++) {\n dirs.push(currentDir)\n const parentDir = dirname(currentDir)\n if (parentDir === currentDir) break\n currentDir = parentDir\n }\n\n return dirs\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 BetterTranslateRuntimeConfig,\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 { serializeMeta } from \"./message-id.js\"\nimport {\n DEFAULT_LOCAL_OUTPUT_DIR,\n DEFAULT_PUBLIC_BASE_PATH,\n DEFAULT_PUBLIC_OUTPUT_SUBDIR,\n getRuntimeConfigPath,\n} from \"./runtime-config.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.dev\"\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_REMOTE_OFFLINE_OUTPUT_DIR = `${DEFAULT_CACHE_DIR}/runtime`\nconst DEFAULT_ROOT_DIR = \"src\"\nconst DEFAULT_SCAN_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\"]\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 PRIVATE_MANIFEST_FILENAME = \"manifest.json\"\nconst LOCALES_SUBDIR = \"locales\"\nconst GITIGNORE_FILENAME = \".gitignore\"\nconst GITIGNORE_CONTENTS = [\"# Generated by better-translation/vite\", \"manifest.json\", \"\"].join(\"\\n\")\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 const messageCount = result?.messageCount ?? Object.keys(payload.messages).length\n log(\n `${PREFIX} ${BOLD}Synced${RESET} ${CYAN}${messageCount}${RESET} ${messageCount === 1 ? \"Message\" : \"Messages\"} -> ${CYAN}${formatRuntime(resolvedRuntime)}${RESET}`,\n )\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).map(([id, entry]) => [\n id,\n {\n defaultMessage: entry.defaultMessage,\n meta: entry.meta,\n placeholders: entry.placeholders,\n sources: 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, localesDir, PRIVATE_MANIFEST_FILENAME)\n }\n\n function getRuntimeConfig(): BetterTranslateRuntimeConfig {\n return {\n runtime: getRuntimeConfigRuntime(resolvedRuntime),\n defaultLocale,\n locales,\n }\n }\n\n function writeRuntimeConfig() {\n if (!usesLocalStorage) return\n\n const runtimeConfig = JSON.stringify(getRuntimeConfig(), null, 2) + \"\\n\"\n const path = getRuntimeConfigPath(root, localesDir)\n const dir = dirname(path)\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n writeFileIfChanged(path, runtimeConfig)\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 assertFileContents(path: string, expected: string, label: string) {\n if (!existsSync(path)) {\n throw new Error(`${PREFIX} missing committed ${label} at ${relative(root, path)}`)\n }\n const actual = readFileSync(path, \"utf-8\")\n if (actual !== expected) {\n throw new Error(\n [\n `${PREFIX} committed ${label} is out of date`,\n `expected committed file at ${relative(root, path)} to match the generated output`,\n `run the dev workflow to regenerate locale artifacts and commit the result`,\n ].join(\"\\n\"),\n )\n }\n }\n\n function assertJsonFileContents(path: string, expected: unknown, label: string) {\n if (!existsSync(path)) {\n throw new Error(`${PREFIX} missing committed ${label} at ${relative(root, path)}`)\n }\n\n let actual: unknown\n try {\n actual = JSON.parse(readFileSync(path, \"utf-8\")) as unknown\n } catch {\n throw new Error(`${PREFIX} committed ${label} is invalid JSON at ${relative(root, path)}`)\n }\n\n if (JSON.stringify(actual) !== JSON.stringify(expected)) {\n throw new Error(\n [\n `${PREFIX} committed ${label} is out of date`,\n `expected committed file at ${relative(root, path)} to match the generated output`,\n `run the dev workflow to regenerate locale artifacts and commit the result`,\n ].join(\"\\n\"),\n )\n }\n }\n\n function writeGitignore() {\n if (!usesLocalStorage) return\n const path = resolve(root, localesDir, GITIGNORE_FILENAME)\n const dir = dirname(path)\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n writeFileIfChanged(path, GITIGNORE_CONTENTS)\n }\n\n function assertGeneratedFilesCommitted() {\n if (!usesLocalStorage) return\n assertJsonFileContents(getRuntimeConfigPath(root, localesDir), getRuntimeConfig(), \"runtime config\")\n assertFileContents(resolve(root, localesDir, GITIGNORE_FILENAME), GITIGNORE_CONTENTS, \"generated .gitignore\")\n }\n\n function buildLocalLocaleMessages(locale: string): RuntimeMessages {\n const existingMessages = readLocaleMessages(locale)\n const messages: RuntimeMessages = {}\n\n if (locale === defaultLocale) {\n for (const [id, entry] of Object.entries(manifest)) {\n messages[id] = entry.defaultMessage\n }\n return messages\n }\n\n for (const id of Object.keys(manifest)) {\n if (Object.hasOwn(messages, id)) continue\n const entry = manifest[id]!\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 for (const locale of locales) {\n writeFileIfChanged(resolve(dir, `${locale}.json`), JSON.stringify(buildLocalLocaleMessages(locale), null, 2) + \"\\n\")\n }\n }\n\n function getMissingMessagesByLocale() {\n const missingByLocale = new Map<string, TranslateMessage[]>()\n\n for (const locale of locales) {\n if (locale === defaultLocale) continue\n const existingMessages = readLocaleMessages(locale)\n for (const [id, entry] of Object.entries(manifest)) {\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 result = await resolvedTranslate(misses, locale)\n\n for (const miss of misses) {\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\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 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 assertGeneratedFilesCommitted()\n assertLocalBuildTranslationsComplete()\n return\n }\n writeRuntimeConfig()\n writeGitignore()\n writeLocaleFilesToDisk()\n writePrivateManifest()\n\n if (isDev) scheduleDevTranslation()\n },\n\n configureServer(server) {\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 if (!isDev) {\n assertGeneratedFilesCommitted()\n }\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 getRuntimeConfigRuntime(runtime: BetterTranslateRuntimeOptions): BetterTranslateRuntimeConfig[\"runtime\"] {\n if (runtime.type === \"local\") return runtime\n\n return {\n type: \"remote\",\n projectId: runtime.projectId,\n ...(runtime.endpoint === undefined ? {} : { endpoint: runtime.endpoint }),\n ...(runtime.branch === undefined ? {} : { branch: runtime.branch }),\n ...(runtime.dev === undefined ? {} : { dev: runtime.dev }),\n }\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 const messageCount = \"messageCount\" in parsed && typeof parsed.messageCount === \"number\" ? parsed.messageCount : undefined\n return { messageCount }\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 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 (\n left.file === right.file &&\n left.kind === right.kind &&\n left.marker === right.marker &&\n left.start === right.start &&\n left.end === right.end\n )\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.line}:${source.column}`).join(\", \")\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite.mjs","names":[],"sources":["../src/cache.ts","../src/extractor.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 { Argument, JSXChild, StringLiteral } from \"oxc-parser\"\nimport { parseSync, Visitor } from \"oxc-parser\"\n\nimport type { ExtractedMessage, MessageSource, TranslateOptions } from \"./types.js\"\n\nimport { getCallMessageId, getMessageId } from \"./message-id.js\"\n\ninterface Markers {\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\n/** Extracts messages and source edits from a file in one coordinated parse pass. */\nexport function analyzeSourceFile(code: string, filename: string, markers: Markers): 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 const lineStarts = getLineStarts(code)\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 lineStarts,\n marker: node.callee.name,\n kind: \"call\",\n start: node.start,\n end: node.end,\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(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 lineStarts,\n marker: opening.name.name,\n kind: \"component\",\n start: node.start,\n end: node.end,\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 })\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\nfunction 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\nfunction createSource({\n filename,\n lineStarts,\n marker,\n kind,\n start,\n end,\n}: {\n filename: string\n lineStarts: number[]\n marker: string\n kind: MessageSource[\"kind\"]\n start: number\n end: number\n}): MessageSource {\n const startPosition = getPosition(start, lineStarts)\n const endPosition = getPosition(end, lineStarts)\n\n return {\n file: filename,\n kind,\n marker,\n line: startPosition.line,\n column: startPosition.column,\n endLine: endPosition.line,\n endColumn: endPosition.column,\n start,\n end,\n }\n}\n\nfunction getLineStarts(code: string) {\n const starts = [0]\n for (let i = 0; i < code.length; i++) {\n if (code[i] === \"\\n\") starts.push(i + 1)\n }\n return starts\n}\n\nfunction getPosition(offset: number, lineStarts: number[]) {\n let low = 0\n let high = lineStarts.length - 1\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const lineStart = lineStarts[mid]!\n const nextLineStart = lineStarts[mid + 1] ?? Number.POSITIVE_INFINITY\n\n if (offset < lineStart) {\n high = mid - 1\n continue\n }\n\n if (offset >= nextLineStart) {\n low = mid + 1\n continue\n }\n\n return { line: mid + 1, column: offset - lineStart + 1 }\n }\n\n const lastLine = lineStarts.length - 1\n const lastStart = lineStarts[lastLine] ?? 0\n return { line: lastLine + 1, column: offset - lastStart + 1 }\n}\n\ninterface ExtractionResult {\n message: string\n placeholders: string[]\n valid: boolean\n}\n\nfunction extractJSXChildren(children: Array<JSXChild>): ExtractionResult {\n const parts: string[] = []\n const placeholders: 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: [], valid: false }\n }\n\n const varName = getVarPlaceholderName(child)\n if (!varName) return { message: \"\", placeholders: [], valid: false }\n\n placeholders.push(varName)\n parts.push(`{${varName}}`)\n break\n }\n\n case \"JSXExpressionContainer\":\n if (child.expression.type !== \"JSXEmptyExpression\") {\n return { message: \"\", placeholders: [], 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, valid: message.length > 0 }\n}\n\nfunction getVarPlaceholderName(node: { openingElement: { attributes: Array<unknown> }; children: Array<JSXChild> }) {\n const explicitName = getJSXStringAttribute(node.openingElement.attributes as Array<unknown>, \"name\")\n if (explicitName) return explicitName\n\n const customPropName = getSingleJSXAttributeName(node.openingElement.attributes as Array<unknown>)\n if (customPropName) return customPropName\n\n return getVarChildIdentifier(node.children)\n}\n\nfunction getSingleJSXAttributeName(attributes: Array<unknown>) {\n const keys = attributes.flatMap((attr) => {\n const attribute = attr as\n | {\n type?: string\n name?: { type?: string; name?: string }\n }\n | undefined\n\n if (attribute?.type !== \"JSXAttribute\" || attribute.name?.type !== \"JSXIdentifier\") return []\n return [attribute.name.name]\n })\n\n return keys.length === 1 ? keys[0] : undefined\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","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 { 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.dev\"\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\"]\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\"\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 const messageCount = result?.messageCount ?? Object.keys(payload.messages).length\n log(\n `${PREFIX} ${BOLD}Synced${RESET} ${CYAN}${messageCount}${RESET} ${messageCount === 1 ? \"Message\" : \"Messages\"} -> ${CYAN}${formatRuntime(resolvedRuntime)}${RESET}`,\n )\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 result = await resolvedTranslate(misses, locale)\n\n for (const miss of misses) {\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\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 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 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 const messageCount = \"messageCount\" in parsed && typeof parsed.messageCount === \"number\" ? parsed.messageCount : undefined\n return { messageCount }\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 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 (\n left.file === right.file &&\n left.kind === right.kind &&\n left.marker === right.marker &&\n left.start === right.start &&\n left.end === right.end\n )\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 (\n left.file.localeCompare(right.file) ||\n left.start - right.start ||\n left.end - right.end ||\n left.kind.localeCompare(right.kind) ||\n left.marker.localeCompare(right.marker)\n )\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.line}:${source.column}`).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.2.3",
3
+ "version": "0.2.4-canary.0",
4
4
  "description": "Vite plugin and runtime helpers for Better Translation.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,8 +41,8 @@
41
41
  "prepack": "bun run build"
42
42
  },
43
43
  "dependencies": {
44
- "ai": "6.0.193",
45
- "oxc-parser": "0.133.0"
44
+ "ai": "6.0.195",
45
+ "oxc-parser": "0.134.0"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@better-translation/tsconfig": "workspace:*",