@gtkx/cli 2.0.0-beta.3 → 2.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/cli.js +4 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/codegen/config-dependencies.d.ts +3 -0
  4. package/dist/codegen/config-dependencies.d.ts.map +1 -0
  5. package/dist/codegen/config-dependencies.js +355 -0
  6. package/dist/codegen/config-dependencies.js.map +1 -0
  7. package/dist/codegen/run-codegen.d.ts +3 -2
  8. package/dist/codegen/run-codegen.d.ts.map +1 -1
  9. package/dist/codegen/run-codegen.js +31 -6
  10. package/dist/codegen/run-codegen.js.map +1 -1
  11. package/dist/codegen/store-resolver.d.ts +1 -0
  12. package/dist/codegen/store-resolver.d.ts.map +1 -1
  13. package/dist/codegen/store-resolver.js +4 -2
  14. package/dist/codegen/store-resolver.js.map +1 -1
  15. package/dist/commands/cleanup.d.ts +9 -0
  16. package/dist/commands/cleanup.d.ts.map +1 -0
  17. package/dist/commands/cleanup.js +31 -0
  18. package/dist/commands/cleanup.js.map +1 -0
  19. package/dist/commands/dev.d.ts.map +1 -1
  20. package/dist/commands/dev.js +4 -2
  21. package/dist/commands/dev.js.map +1 -1
  22. package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
  23. package/dist/deploy/freedesktop/validate.js +45 -12
  24. package/dist/deploy/freedesktop/validate.js.map +1 -1
  25. package/dist/deploy/payload/stage.d.ts.map +1 -1
  26. package/dist/deploy/payload/stage.js +24 -3
  27. package/dist/deploy/payload/stage.js.map +1 -1
  28. package/dist/deploy/settings/extra-files.d.ts.map +1 -1
  29. package/dist/deploy/settings/extra-files.js +4 -3
  30. package/dist/deploy/settings/extra-files.js.map +1 -1
  31. package/dist/dev/catalog-writes.d.ts +8 -0
  32. package/dist/dev/catalog-writes.d.ts.map +1 -0
  33. package/dist/dev/catalog-writes.js +26 -0
  34. package/dist/dev/catalog-writes.js.map +1 -0
  35. package/dist/dev/runner-deps.d.ts.map +1 -1
  36. package/dist/dev/runner-deps.js +10 -6
  37. package/dist/dev/runner-deps.js.map +1 -1
  38. package/dist/dev/runner.d.ts +1 -0
  39. package/dist/dev/runner.d.ts.map +1 -1
  40. package/dist/dev/runner.js +8 -2
  41. package/dist/dev/runner.js.map +1 -1
  42. package/dist/dev/supervisor.d.ts +2 -1
  43. package/dist/dev/supervisor.d.ts.map +1 -1
  44. package/dist/dev/supervisor.js +128 -26
  45. package/dist/dev/supervisor.js.map +1 -1
  46. package/dist/i18n/catalogs.d.ts +6 -2
  47. package/dist/i18n/catalogs.d.ts.map +1 -1
  48. package/dist/i18n/catalogs.js +9 -7
  49. package/dist/i18n/catalogs.js.map +1 -1
  50. package/dist/i18n/source-messages.d.ts +3 -1
  51. package/dist/i18n/source-messages.d.ts.map +1 -1
  52. package/dist/i18n/source-messages.js +14 -2
  53. package/dist/i18n/source-messages.js.map +1 -1
  54. package/dist/internal/build-output.d.ts.map +1 -1
  55. package/dist/internal/build-output.js +45 -8
  56. package/dist/internal/build-output.js.map +1 -1
  57. package/dist/internal/prepare-project.d.ts +1 -0
  58. package/dist/internal/prepare-project.d.ts.map +1 -1
  59. package/dist/internal/prepare-project.js +8 -2
  60. package/dist/internal/prepare-project.js.map +1 -1
  61. package/dist/vite-plugins/i18n.d.ts +11 -2
  62. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  63. package/dist/vite-plugins/i18n.js +20 -6
  64. package/dist/vite-plugins/i18n.js.map +1 -1
  65. package/dist/vite-plugins/index.d.ts +2 -0
  66. package/dist/vite-plugins/index.d.ts.map +1 -1
  67. package/dist/vite-plugins/index.js +10 -2
  68. package/dist/vite-plugins/index.js.map +1 -1
  69. package/package.json +12 -10
  70. package/src/cli.ts +5 -0
  71. package/src/codegen/config-dependencies.ts +470 -0
  72. package/src/codegen/run-codegen.ts +37 -5
  73. package/src/codegen/store-resolver.ts +5 -2
  74. package/src/commands/cleanup.ts +36 -0
  75. package/src/commands/dev.ts +9 -2
  76. package/src/deploy/freedesktop/validate.ts +63 -13
  77. package/src/deploy/payload/stage.ts +42 -3
  78. package/src/deploy/settings/extra-files.ts +5 -3
  79. package/src/dev/catalog-writes.ts +35 -0
  80. package/src/dev/runner-deps.ts +14 -6
  81. package/src/dev/runner.ts +11 -2
  82. package/src/dev/supervisor.ts +177 -29
  83. package/src/i18n/catalogs.ts +20 -8
  84. package/src/i18n/source-messages.ts +19 -3
  85. package/src/internal/build-output.ts +67 -9
  86. package/src/internal/prepare-project.ts +9 -3
  87. package/src/vite-plugins/i18n.ts +42 -9
  88. package/src/vite-plugins/index.ts +19 -3
@@ -11,11 +11,15 @@ type CatalogProject = {
11
11
  poFiles: string[];
12
12
  root: string;
13
13
  };
14
+ type WrittenCatalog = {
15
+ content: Buffer;
16
+ path: string;
17
+ };
14
18
  declare const LOCALE_DIRNAME = "locale";
15
19
  declare const requiresCatalogInitialization: (project: CatalogProject) => boolean;
16
20
  declare const resolveCatalogProject: (root: string, domain: string) => CatalogProject | null;
17
21
  declare const compileCatalogs: (project: CatalogProject, outputDir: string) => string[];
18
- declare const synchronizeCatalogs: (project: CatalogProject) => void;
22
+ declare const synchronizeCatalogs: (project: CatalogProject) => WrittenCatalog[];
19
23
  declare const isCatalogSource: (root: string, path: string) => boolean;
20
- export { type CatalogProject, LOCALE_DIRNAME, compileCatalogs, isCatalogSource, requiresCatalogInitialization, resolveCatalogProject, synchronizeCatalogs, };
24
+ export { type CatalogProject, LOCALE_DIRNAME, compileCatalogs, isCatalogSource, requiresCatalogInitialization, resolveCatalogProject, synchronizeCatalogs, type WrittenCatalog, };
21
25
  //# sourceMappingURL=catalogs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalogs.d.ts","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"AAcA,KAAK,OAAO,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AASF,QAAA,MAAM,cAAc,WAAW,CAAC;AAiChC,QAAA,MAAM,6BAA6B,GAAI,SAAS,cAAc,KAAG,OACA,CAAC;AAElE,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,cAAc,GAAG,IA8B9E,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,SAAS,cAAc,EAAE,WAAW,MAAM,KAAG,MAAM,EAmB3E,CAAC;AAmDF,QAAA,MAAM,mBAAmB,GAAI,SAAS,cAAc,KAAG,IAqBtD,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,OAUrD,CAAC;AAEF,OAAO,EACH,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,eAAe,EACf,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,GACtB,CAAC"}
1
+ {"version":3,"file":"catalogs.d.ts","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"AAcA,KAAK,OAAO,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AASF,KAAK,cAAc,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,QAAA,MAAM,cAAc,WAAW,CAAC;AAiChC,QAAA,MAAM,6BAA6B,GAAI,SAAS,cAAc,KAAG,OACA,CAAC;AAElE,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,cAAc,GAAG,IA8B9E,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,SAAS,cAAc,EAAE,WAAW,MAAM,KAAG,MAAM,EAmB3E,CAAC;AA4DF,QAAA,MAAM,mBAAmB,GAAI,SAAS,cAAc,KAAG,cAAc,EAiBpE,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,OAUrD,CAAC;AAEF,OAAO,EACH,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,eAAe,EACf,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,GACtB,CAAC"}
@@ -103,26 +103,28 @@ const prepareCatalog = (catalog, index, template, stagingDir) => {
103
103
  else {
104
104
  initializeCatalog(catalog, template, output);
105
105
  }
106
+ const content = readFileSync(output);
106
107
  return {
107
- isChanged: !isExisting || !readFileSync(output).equals(readFileSync(catalog.path)),
108
+ content,
109
+ isChanged: !isExisting || !content.equals(readFileSync(catalog.path)),
108
110
  output,
109
111
  target: catalog.path,
110
112
  };
111
113
  };
114
+ const replaceCatalog = (catalog) => {
115
+ renameSync(catalog.output, catalog.target);
116
+ return { content: catalog.content, path: catalog.target };
117
+ };
112
118
  const synchronizeCatalogs = (project) => {
113
119
  if (project.catalogs.length === 0) {
114
- return;
120
+ return [];
115
121
  }
116
122
  const template = join(project.poDir, `${project.domain}.pot`);
117
123
  requireFile(template);
118
124
  const stagingDir = mkdtempSync(join(project.poDir, ".gtkx-catalog-"));
119
125
  try {
120
126
  const merged = project.catalogs.map((catalog, index) => prepareCatalog(catalog, index, template, stagingDir));
121
- for (const catalog of merged) {
122
- if (catalog.isChanged) {
123
- renameSync(catalog.output, catalog.target);
124
- }
125
- }
127
+ return merged.filter((catalog) => catalog.isChanged).map((catalog) => replaceCatalog(catalog));
126
128
  }
127
129
  finally {
128
130
  rmSync(stagingDir, { recursive: true, force: true });
@@ -1 +1 @@
1
- {"version":3,"file":"catalogs.js","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPathInside } from \"@gtkx/utils\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\n\ntype Catalog = {\n locale: string;\n path: string;\n};\n\ntype CatalogProject = {\n catalogs: Catalog[];\n domain: string;\n linguasPath: string;\n locales: string[];\n poDir: string;\n poFiles: string[];\n root: string;\n};\n\ntype PreparedCatalog = {\n isChanged: boolean;\n output: string;\n target: string;\n};\n\nconst PO_DIRNAME = \"po\";\nconst LOCALE_DIRNAME = \"locale\";\nconst LINGUAS_FILENAME = \"LINGUAS\";\nconst LOCALE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.@+-]*$/;\nconst DOMAIN_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst MODE_MASK = 0o7777;\n\nconst parseLocales = (linguasPath: string): string[] => {\n const source = readFileSync(linguasPath, \"utf8\");\n\n const tokens = source\n .split(/\\r?\\n/)\n .flatMap((line) => line.replace(/#.*/, \"\").trim().split(/\\s+/))\n .filter((token) => token.length > 0);\n\n const seen: Set<string> = new Set();\n\n for (const token of tokens) {\n if (!LOCALE_PATTERN.test(token) || seen.has(token)) {\n throw new Error(`Invalid locale in ${linguasPath}: ${token}`);\n }\n\n seen.add(token);\n }\n\n return tokens;\n};\n\nconst requireFile = (path: string): void => {\n if (!existsSync(path) || !statSync(path).isFile()) {\n throw new Error(`Missing translation catalog: ${path}`);\n }\n};\n\nconst requiresCatalogInitialization = (project: CatalogProject): boolean =>\n project.catalogs.some((catalog) => !existsSync(catalog.path));\n\nconst resolveCatalogProject = (root: string, domain: string): CatalogProject | null => {\n const projectRoot = resolve(root);\n const poDir = join(projectRoot, PO_DIRNAME);\n\n if (!existsSync(poDir)) {\n return null;\n }\n\n if (!statSync(poDir).isDirectory()) {\n throw new Error(`Translation source is not a directory: ${poDir}`);\n }\n\n if (!DOMAIN_PATTERN.test(domain)) {\n throw new Error(`Invalid translation domain: ${domain}`);\n }\n\n const linguasPath = join(poDir, LINGUAS_FILENAME);\n requireFile(linguasPath);\n const locales = parseLocales(linguasPath);\n const catalogs = locales.map((locale) => ({ locale, path: join(poDir, `${locale}.po`) }));\n\n return {\n catalogs,\n domain,\n linguasPath,\n locales,\n poDir,\n poFiles: catalogs.map((catalog) => catalog.path),\n root: projectRoot,\n };\n};\n\nconst compileCatalogs = (project: CatalogProject, outputDir: string): string[] => {\n const localeDir = resolve(outputDir);\n\n for (const catalog of project.catalogs) {\n requireFile(catalog.path);\n }\n\n return project.catalogs.map((catalog) => {\n const output = join(localeDir, catalog.locale, \"LC_MESSAGES\", `${project.domain}.mo`);\n mkdirSync(dirname(output), { recursive: true });\n\n runCliTool({\n tool: \"msgfmt\",\n args: [\"--check\", \"--output-file\", output, catalog.path],\n target: catalog.path,\n });\n\n return output;\n });\n};\n\nconst initializeCatalog = (catalog: Catalog, template: string, output: string): void => {\n runCliTool({\n tool: \"msginit\",\n args: [\n \"--no-translator\",\n \"--no-wrap\",\n `--locale=${catalog.locale}`,\n `--input=${template}`,\n `--output-file=${output}`,\n ],\n options: { stdio: \"pipe\" },\n target: catalog.path,\n });\n};\n\nconst mergeCatalog = (catalog: Catalog, template: string, output: string): void => {\n requireFile(catalog.path);\n\n runCliTool({\n tool: \"msgmerge\",\n args: [\"--quiet\", \"--no-wrap\", `--output-file=${output}`, catalog.path, template],\n target: catalog.path,\n });\n\n chmodSync(output, statSync(catalog.path).mode & MODE_MASK);\n};\n\nconst prepareCatalog = (\n catalog: Catalog,\n index: number,\n template: string,\n stagingDir: string,\n): PreparedCatalog => {\n const output = join(stagingDir, `${String(index)}.po`);\n const isExisting = existsSync(catalog.path);\n\n if (isExisting) {\n mergeCatalog(catalog, template, output);\n } else {\n initializeCatalog(catalog, template, output);\n }\n\n return {\n isChanged: !isExisting || !readFileSync(output).equals(readFileSync(catalog.path)),\n output,\n target: catalog.path,\n };\n};\n\nconst synchronizeCatalogs = (project: CatalogProject): void => {\n if (project.catalogs.length === 0) {\n return;\n }\n\n const template = join(project.poDir, `${project.domain}.pot`);\n requireFile(template);\n const stagingDir = mkdtempSync(join(project.poDir, \".gtkx-catalog-\"));\n\n try {\n const merged = project.catalogs.map((catalog, index) =>\n prepareCatalog(catalog, index, template, stagingDir));\n\n for (const catalog of merged) {\n if (catalog.isChanged) {\n renameSync(catalog.output, catalog.target);\n }\n }\n } finally {\n rmSync(stagingDir, { recursive: true, force: true });\n }\n};\n\nconst isCatalogSource = (root: string, path: string): boolean => {\n const projectRoot = resolve(root);\n const sourcePath = isAbsolute(path) ? resolve(path) : resolve(projectRoot, path);\n const poPath = relative(join(projectRoot, PO_DIRNAME), sourcePath);\n\n if (!isPathInside(join(projectRoot, PO_DIRNAME), sourcePath)) {\n return false;\n }\n\n return !poPath.includes(sep) && (poPath === LINGUAS_FILENAME || poPath.endsWith(\".po\"));\n};\n\nexport {\n type CatalogProject,\n LOCALE_DIRNAME,\n compileCatalogs,\n isCatalogSource,\n requiresCatalogInitialization,\n resolveCatalogProject,\n synchronizeCatalogs,\n};\n"]}
1
+ {"version":3,"file":"catalogs.js","sourceRoot":"","sources":["../../src/i18n/catalogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPathInside } from \"@gtkx/utils\";\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\n\ntype Catalog = {\n locale: string;\n path: string;\n};\n\ntype CatalogProject = {\n catalogs: Catalog[];\n domain: string;\n linguasPath: string;\n locales: string[];\n poDir: string;\n poFiles: string[];\n root: string;\n};\n\ntype PreparedCatalog = {\n content: Buffer;\n isChanged: boolean;\n output: string;\n target: string;\n};\n\ntype WrittenCatalog = {\n content: Buffer;\n path: string;\n};\n\nconst PO_DIRNAME = \"po\";\nconst LOCALE_DIRNAME = \"locale\";\nconst LINGUAS_FILENAME = \"LINGUAS\";\nconst LOCALE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.@+-]*$/;\nconst DOMAIN_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst MODE_MASK = 0o7777;\n\nconst parseLocales = (linguasPath: string): string[] => {\n const source = readFileSync(linguasPath, \"utf8\");\n\n const tokens = source\n .split(/\\r?\\n/)\n .flatMap((line) => line.replace(/#.*/, \"\").trim().split(/\\s+/))\n .filter((token) => token.length > 0);\n\n const seen: Set<string> = new Set();\n\n for (const token of tokens) {\n if (!LOCALE_PATTERN.test(token) || seen.has(token)) {\n throw new Error(`Invalid locale in ${linguasPath}: ${token}`);\n }\n\n seen.add(token);\n }\n\n return tokens;\n};\n\nconst requireFile = (path: string): void => {\n if (!existsSync(path) || !statSync(path).isFile()) {\n throw new Error(`Missing translation catalog: ${path}`);\n }\n};\n\nconst requiresCatalogInitialization = (project: CatalogProject): boolean =>\n project.catalogs.some((catalog) => !existsSync(catalog.path));\n\nconst resolveCatalogProject = (root: string, domain: string): CatalogProject | null => {\n const projectRoot = resolve(root);\n const poDir = join(projectRoot, PO_DIRNAME);\n\n if (!existsSync(poDir)) {\n return null;\n }\n\n if (!statSync(poDir).isDirectory()) {\n throw new Error(`Translation source is not a directory: ${poDir}`);\n }\n\n if (!DOMAIN_PATTERN.test(domain)) {\n throw new Error(`Invalid translation domain: ${domain}`);\n }\n\n const linguasPath = join(poDir, LINGUAS_FILENAME);\n requireFile(linguasPath);\n const locales = parseLocales(linguasPath);\n const catalogs = locales.map((locale) => ({ locale, path: join(poDir, `${locale}.po`) }));\n\n return {\n catalogs,\n domain,\n linguasPath,\n locales,\n poDir,\n poFiles: catalogs.map((catalog) => catalog.path),\n root: projectRoot,\n };\n};\n\nconst compileCatalogs = (project: CatalogProject, outputDir: string): string[] => {\n const localeDir = resolve(outputDir);\n\n for (const catalog of project.catalogs) {\n requireFile(catalog.path);\n }\n\n return project.catalogs.map((catalog) => {\n const output = join(localeDir, catalog.locale, \"LC_MESSAGES\", `${project.domain}.mo`);\n mkdirSync(dirname(output), { recursive: true });\n\n runCliTool({\n tool: \"msgfmt\",\n args: [\"--check\", \"--output-file\", output, catalog.path],\n target: catalog.path,\n });\n\n return output;\n });\n};\n\nconst initializeCatalog = (catalog: Catalog, template: string, output: string): void => {\n runCliTool({\n tool: \"msginit\",\n args: [\n \"--no-translator\",\n \"--no-wrap\",\n `--locale=${catalog.locale}`,\n `--input=${template}`,\n `--output-file=${output}`,\n ],\n options: { stdio: \"pipe\" },\n target: catalog.path,\n });\n};\n\nconst mergeCatalog = (catalog: Catalog, template: string, output: string): void => {\n requireFile(catalog.path);\n\n runCliTool({\n tool: \"msgmerge\",\n args: [\"--quiet\", \"--no-wrap\", `--output-file=${output}`, catalog.path, template],\n target: catalog.path,\n });\n\n chmodSync(output, statSync(catalog.path).mode & MODE_MASK);\n};\n\nconst prepareCatalog = (\n catalog: Catalog,\n index: number,\n template: string,\n stagingDir: string,\n): PreparedCatalog => {\n const output = join(stagingDir, `${String(index)}.po`);\n const isExisting = existsSync(catalog.path);\n\n if (isExisting) {\n mergeCatalog(catalog, template, output);\n } else {\n initializeCatalog(catalog, template, output);\n }\n\n const content = readFileSync(output);\n\n return {\n content,\n isChanged: !isExisting || !content.equals(readFileSync(catalog.path)),\n output,\n target: catalog.path,\n };\n};\n\nconst replaceCatalog = (catalog: PreparedCatalog): WrittenCatalog => {\n renameSync(catalog.output, catalog.target);\n\n return { content: catalog.content, path: catalog.target };\n};\n\nconst synchronizeCatalogs = (project: CatalogProject): WrittenCatalog[] => {\n if (project.catalogs.length === 0) {\n return [];\n }\n\n const template = join(project.poDir, `${project.domain}.pot`);\n requireFile(template);\n const stagingDir = mkdtempSync(join(project.poDir, \".gtkx-catalog-\"));\n\n try {\n const merged = project.catalogs.map((catalog, index) =>\n prepareCatalog(catalog, index, template, stagingDir));\n\n return merged.filter((catalog) => catalog.isChanged).map((catalog) => replaceCatalog(catalog));\n } finally {\n rmSync(stagingDir, { recursive: true, force: true });\n }\n};\n\nconst isCatalogSource = (root: string, path: string): boolean => {\n const projectRoot = resolve(root);\n const sourcePath = isAbsolute(path) ? resolve(path) : resolve(projectRoot, path);\n const poPath = relative(join(projectRoot, PO_DIRNAME), sourcePath);\n\n if (!isPathInside(join(projectRoot, PO_DIRNAME), sourcePath)) {\n return false;\n }\n\n return !poPath.includes(sep) && (poPath === LINGUAS_FILENAME || poPath.endsWith(\".po\"));\n};\n\nexport {\n type CatalogProject,\n LOCALE_DIRNAME,\n compileCatalogs,\n isCatalogSource,\n requiresCatalogInitialization,\n resolveCatalogProject,\n synchronizeCatalogs,\n type WrittenCatalog,\n};\n"]}
@@ -1,5 +1,7 @@
1
1
  import type { CatalogProject } from "./catalogs.js";
2
+ declare class SourceExtractionError extends Error {
3
+ }
2
4
  declare const extractSourceCatalogTo: (project: CatalogProject, paths: string[], output: string) => Promise<void>;
3
5
  declare const extractSourceCatalog: (project: CatalogProject, paths: string[], shouldPreserveMetadataMessages?: boolean) => Promise<void>;
4
- export { extractSourceCatalog, extractSourceCatalogTo };
6
+ export { extractSourceCatalog, extractSourceCatalogTo, SourceExtractionError };
5
7
  //# sourceMappingURL=source-messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"source-messages.d.ts","sourceRoot":"","sources":["../../src/i18n/source-messages.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA64DpD,QAAA,MAAM,sBAAsB,GACxB,SAAS,cAAc,EACvB,OAAO,MAAM,EAAE,EACf,QAAQ,MAAM,KACf,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,QAAA,MAAM,oBAAoB,GACtB,SAAS,cAAc,EACvB,OAAO,MAAM,EAAE,EACf,wCAAqC,KACtC,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"source-messages.d.ts","sourceRoot":"","sources":["../../src/i18n/source-messages.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAqGpD,cAAM,qBAAsB,SAAQ,KAAK;CAAG;AAwzD5C,QAAA,MAAM,sBAAsB,GACxB,SAAS,cAAc,EACvB,OAAO,MAAM,EAAE,EACf,QAAQ,MAAM,KACf,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,QAAA,MAAM,oBAAoB,GACtB,SAAS,cAAc,EACvB,OAAO,MAAM,EAAE,EACf,wCAAqC,KACtC,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,CAAC"}
@@ -35,7 +35,19 @@ const STATIC_KEY_WRAPPER_TYPES = new Set([
35
35
  ]);
36
36
  class SourceExtractionError extends Error {
37
37
  }
38
- const sourceErrorMessage = (error) => error instanceof Error ? error.message : String(error);
38
+ const sourceErrorMessage = (error) => {
39
+ if (!(error instanceof Error)) {
40
+ return String(error);
41
+ }
42
+ if ("code" in error &&
43
+ error.code === "BABEL_PARSE_ERROR") {
44
+ const separator = error.message.indexOf(": ");
45
+ if (separator !== -1) {
46
+ return error.message.slice(separator + 2);
47
+ }
48
+ }
49
+ return error.message;
50
+ };
39
51
  const projectSourcePath = (root, path) => {
40
52
  const absolute = isAbsolute(path) ? resolve(path) : resolve(root, path);
41
53
  return toPosixPath(isPathInside(root, absolute) ? relative(root, absolute) : path);
@@ -1332,5 +1344,5 @@ const extractSourceCatalog = async (project, paths, shouldPreserveMetadataMessag
1332
1344
  writePotfiles(project, sourceFiles);
1333
1345
  extractCatalogTemplate({ project, messages, shouldPreserveMetadataMessages });
1334
1346
  };
1335
- export { extractSourceCatalog, extractSourceCatalogTo };
1347
+ export { extractSourceCatalog, extractSourceCatalogTo, SourceExtractionError };
1336
1348
  //# sourceMappingURL=source-messages.js.map