@gtkx/cli 1.6.0 → 2.0.0-beta.1

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 (186) hide show
  1. package/README.md +5 -5
  2. package/dist/codegen/freshness.d.ts.map +1 -1
  3. package/dist/codegen/freshness.js +45 -16
  4. package/dist/codegen/freshness.js.map +1 -1
  5. package/dist/codegen/reference.d.ts.map +1 -1
  6. package/dist/codegen/reference.js +1 -7
  7. package/dist/codegen/reference.js.map +1 -1
  8. package/dist/codegen/report.d.ts.map +1 -1
  9. package/dist/codegen/report.js +5 -16
  10. package/dist/codegen/report.js.map +1 -1
  11. package/dist/codegen/run-codegen.d.ts +3 -5
  12. package/dist/codegen/run-codegen.d.ts.map +1 -1
  13. package/dist/codegen/run-codegen.js +23 -100
  14. package/dist/codegen/run-codegen.js.map +1 -1
  15. package/dist/codegen/store-resolver.d.ts +0 -1
  16. package/dist/codegen/store-resolver.d.ts.map +1 -1
  17. package/dist/codegen/store-resolver.js +8 -17
  18. package/dist/codegen/store-resolver.js.map +1 -1
  19. package/dist/commands/docs.d.ts.map +1 -1
  20. package/dist/commands/docs.js +5 -15
  21. package/dist/commands/docs.js.map +1 -1
  22. package/dist/deploy/freedesktop/copyright.d.ts.map +1 -1
  23. package/dist/deploy/freedesktop/copyright.js +2 -13
  24. package/dist/deploy/freedesktop/copyright.js.map +1 -1
  25. package/dist/deploy/freedesktop/xml.d.ts.map +1 -1
  26. package/dist/deploy/freedesktop/xml.js +21 -25
  27. package/dist/deploy/freedesktop/xml.js.map +1 -1
  28. package/dist/deploy/node-runtime/license.d.ts.map +1 -1
  29. package/dist/deploy/node-runtime/license.js +2 -9
  30. package/dist/deploy/node-runtime/license.js.map +1 -1
  31. package/dist/deploy/notices/packages.d.ts.map +1 -1
  32. package/dist/deploy/notices/packages.js +3 -10
  33. package/dist/deploy/notices/packages.js.map +1 -1
  34. package/dist/deploy/payload/copy-tree.d.ts.map +1 -1
  35. package/dist/deploy/payload/copy-tree.js +3 -3
  36. package/dist/deploy/payload/copy-tree.js.map +1 -1
  37. package/dist/deploy/payload/stage.d.ts.map +1 -1
  38. package/dist/deploy/payload/stage.js +1 -3
  39. package/dist/deploy/payload/stage.js.map +1 -1
  40. package/dist/deploy/settings/build-manifest.d.ts.map +1 -1
  41. package/dist/deploy/settings/build-manifest.js +4 -15
  42. package/dist/deploy/settings/build-manifest.js.map +1 -1
  43. package/dist/deploy/settings/libraries.d.ts.map +1 -1
  44. package/dist/deploy/settings/libraries.js +2 -19
  45. package/dist/deploy/settings/libraries.js.map +1 -1
  46. package/dist/deploy/settings/paths.d.ts +1 -2
  47. package/dist/deploy/settings/paths.d.ts.map +1 -1
  48. package/dist/deploy/settings/paths.js +5 -15
  49. package/dist/deploy/settings/paths.js.map +1 -1
  50. package/dist/deploy/settings/screenshots.d.ts.map +1 -1
  51. package/dist/deploy/settings/screenshots.js +6 -31
  52. package/dist/deploy/settings/screenshots.js.map +1 -1
  53. package/dist/deploy/targets/flatpak-pnpm.js +4 -4
  54. package/dist/deploy/targets/flatpak-pnpm.js.map +1 -1
  55. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  56. package/dist/deploy/targets/flatpak-source.js +4 -4
  57. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  58. package/dist/deploy/targets/flatpak-sources.js +1 -1
  59. package/dist/deploy/targets/flatpak-sources.js.map +1 -1
  60. package/dist/dev/runner-main.d.ts.map +1 -1
  61. package/dist/dev/runner-main.js +1 -2
  62. package/dist/dev/runner-main.js.map +1 -1
  63. package/dist/dev/schema-dir.d.ts +1 -1
  64. package/dist/dev/schema-dir.d.ts.map +1 -1
  65. package/dist/dev/schema-dir.js +2 -4
  66. package/dist/dev/schema-dir.js.map +1 -1
  67. package/dist/i18n/catalogs.d.ts.map +1 -1
  68. package/dist/i18n/catalogs.js +2 -1
  69. package/dist/i18n/catalogs.js.map +1 -1
  70. package/dist/i18n/metadata-templates.d.ts.map +1 -1
  71. package/dist/i18n/metadata-templates.js +2 -1
  72. package/dist/i18n/metadata-templates.js.map +1 -1
  73. package/dist/i18n/source-messages.d.ts +3 -21
  74. package/dist/i18n/source-messages.d.ts.map +1 -1
  75. package/dist/i18n/source-messages.js +66 -85
  76. package/dist/i18n/source-messages.js.map +1 -1
  77. package/dist/i18n/types.d.ts +6 -7
  78. package/dist/i18n/types.d.ts.map +1 -1
  79. package/dist/i18n/types.js +83 -96
  80. package/dist/i18n/types.js.map +1 -1
  81. package/dist/internal/docs-elements.js +2 -2
  82. package/dist/internal/docs-elements.js.map +1 -1
  83. package/dist/internal/icon-path.d.ts.map +1 -1
  84. package/dist/internal/icon-path.js +5 -16
  85. package/dist/internal/icon-path.js.map +1 -1
  86. package/dist/internal/source-imports.d.ts.map +1 -1
  87. package/dist/internal/source-imports.js +10 -41
  88. package/dist/internal/source-imports.js.map +1 -1
  89. package/dist/settings/render.d.ts +0 -1
  90. package/dist/settings/render.d.ts.map +1 -1
  91. package/dist/settings/render.js +1 -11
  92. package/dist/settings/render.js.map +1 -1
  93. package/dist/settings/schema.d.ts +2 -2
  94. package/dist/settings/schema.d.ts.map +1 -1
  95. package/dist/settings/schema.js +21 -62
  96. package/dist/settings/schema.js.map +1 -1
  97. package/dist/vite-plugins/asset-imports.d.ts +1 -2
  98. package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
  99. package/dist/vite-plugins/asset-imports.js +19 -32
  100. package/dist/vite-plugins/asset-imports.js.map +1 -1
  101. package/dist/vite-plugins/asset-specifier.d.ts +1 -3
  102. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
  103. package/dist/vite-plugins/asset-specifier.js +1 -4
  104. package/dist/vite-plugins/asset-specifier.js.map +1 -1
  105. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  106. package/dist/vite-plugins/i18n.js +2 -1
  107. package/dist/vite-plugins/i18n.js.map +1 -1
  108. package/dist/vite-plugins/index.d.ts.map +1 -1
  109. package/dist/vite-plugins/index.js +2 -4
  110. package/dist/vite-plugins/index.js.map +1 -1
  111. package/dist/vite-plugins/resources.d.ts.map +1 -1
  112. package/dist/vite-plugins/resources.js +32 -97
  113. package/dist/vite-plugins/resources.js.map +1 -1
  114. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  115. package/dist/vite-plugins/settings-worker-env.js +2 -4
  116. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  117. package/dist/vite-plugins/settings.d.ts +1 -2
  118. package/dist/vite-plugins/settings.d.ts.map +1 -1
  119. package/dist/vite-plugins/settings.js +8 -14
  120. package/dist/vite-plugins/settings.js.map +1 -1
  121. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  122. package/dist/vite-plugins/undeclared-library.js +10 -13
  123. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  124. package/dist/vite-plugins/worker.d.ts.map +1 -1
  125. package/dist/vite-plugins/worker.js +0 -1
  126. package/dist/vite-plugins/worker.js.map +1 -1
  127. package/package.json +21 -15
  128. package/src/codegen/freshness.ts +66 -17
  129. package/src/codegen/reference.ts +1 -8
  130. package/src/codegen/report.ts +5 -21
  131. package/src/codegen/run-codegen.ts +28 -145
  132. package/src/codegen/store-resolver.ts +8 -24
  133. package/src/commands/docs.ts +5 -17
  134. package/src/deploy/freedesktop/copyright.ts +2 -14
  135. package/src/deploy/freedesktop/xml.ts +24 -32
  136. package/src/deploy/node-runtime/license.ts +2 -8
  137. package/src/deploy/notices/packages.ts +3 -11
  138. package/src/deploy/payload/copy-tree.ts +3 -4
  139. package/src/deploy/payload/stage.ts +2 -6
  140. package/src/deploy/settings/build-manifest.ts +4 -16
  141. package/src/deploy/settings/libraries.ts +1 -22
  142. package/src/deploy/settings/paths.ts +6 -16
  143. package/src/deploy/settings/screenshots.ts +8 -46
  144. package/src/deploy/targets/flatpak-pnpm.ts +4 -4
  145. package/src/deploy/targets/flatpak-source.ts +4 -4
  146. package/src/deploy/targets/flatpak-sources.ts +1 -1
  147. package/src/dev/runner-main.ts +1 -2
  148. package/src/dev/schema-dir.ts +2 -4
  149. package/src/i18n/catalogs.ts +2 -1
  150. package/src/i18n/metadata-templates.ts +2 -1
  151. package/src/i18n/source-messages.ts +77 -115
  152. package/src/i18n/types.ts +97 -131
  153. package/src/internal/docs-elements.ts +2 -2
  154. package/src/internal/icon-path.ts +6 -19
  155. package/src/internal/source-imports.ts +14 -50
  156. package/src/settings/render.ts +1 -13
  157. package/src/settings/schema.ts +19 -81
  158. package/src/vite-plugins/asset-imports.ts +20 -44
  159. package/src/vite-plugins/asset-specifier.ts +0 -5
  160. package/src/vite-plugins/i18n.ts +2 -1
  161. package/src/vite-plugins/index.ts +2 -4
  162. package/src/vite-plugins/resources.ts +37 -140
  163. package/src/vite-plugins/settings-worker-env.ts +2 -4
  164. package/src/vite-plugins/settings.ts +11 -20
  165. package/src/vite-plugins/undeclared-library.ts +14 -20
  166. package/src/vite-plugins/worker.ts +0 -1
  167. package/dist/i18n/binding-extractor.d.ts +0 -30
  168. package/dist/i18n/binding-extractor.d.ts.map +0 -1
  169. package/dist/i18n/binding-extractor.js +0 -1324
  170. package/dist/i18n/binding-extractor.js.map +0 -1
  171. package/dist/i18n/extractor-plugin.d.ts +0 -8
  172. package/dist/i18n/extractor-plugin.d.ts.map +0 -1
  173. package/dist/i18n/extractor-plugin.js +0 -247
  174. package/dist/i18n/extractor-plugin.js.map +0 -1
  175. package/dist/internal/data-dir.d.ts +0 -4
  176. package/dist/internal/data-dir.d.ts.map +0 -1
  177. package/dist/internal/data-dir.js +0 -52
  178. package/dist/internal/data-dir.js.map +0 -1
  179. package/dist/vite-plugins/animated.d.ts +0 -5
  180. package/dist/vite-plugins/animated.d.ts.map +0 -1
  181. package/dist/vite-plugins/animated.js +0 -325
  182. package/dist/vite-plugins/animated.js.map +0 -1
  183. package/src/i18n/binding-extractor.ts +0 -1969
  184. package/src/i18n/extractor-plugin.ts +0 -413
  185. package/src/internal/data-dir.ts +0 -70
  186. package/src/vite-plugins/animated.ts +0 -486
@@ -1,10 +1,11 @@
1
- import { findKeys } from "i18next-cli";
1
+ import { isPathInside, isPathWithin, toPosixPath } from "@gtkx/utils";
2
+ import { runExtractor } from "i18next-cli";
2
3
  import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
3
- import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
4
5
  import { runCliTool } from "../internal/run-cli-tool.js";
5
6
  import { replaceCatalogTemplate } from "./catalog-template.js";
6
- import { gtkxExtractorPlugin } from "./extractor-plugin.js";
7
7
  import { metadataTemplateFiles } from "./metadata-templates.js";
8
+ import { clearI18nResources, i18nToolkitConfig } from "./types.js";
8
9
  const CONTEXT_SEPARATOR = "\u{4}";
9
10
  const DEFAULT_NAMESPACE = "translation";
10
11
  const POTFILES_FILENAME = "POTFILES.in";
@@ -27,29 +28,6 @@ const quietLogger = () => {
27
28
  },
28
29
  };
29
30
  };
30
- const extractorConfig = (sourceFiles) => {
31
- const integration = gtkxExtractorPlugin();
32
- return {
33
- locales: ["en"],
34
- plugins: [integration.plugin],
35
- extract: {
36
- input: sourceFiles,
37
- output: "unused/{{language}}/{{namespace}}.json",
38
- contextSeparator: CONTEXT_SEPARATOR,
39
- defaultNS: DEFAULT_NAMESPACE,
40
- disablePlurals: false,
41
- extractFromComments: false,
42
- functions: [],
43
- generateBasePluralForms: false,
44
- keySeparator: ".",
45
- nsSeparator: false,
46
- pluralSeparator: "_",
47
- transComponents: integration.transComponents,
48
- useTranslationNames: [],
49
- warnOnConflicts: "error",
50
- },
51
- };
52
- };
53
31
  const splitContext = (key) => {
54
32
  const index = key.lastIndexOf(CONTEXT_SEPARATOR);
55
33
  if (index === -1) {
@@ -75,27 +53,30 @@ const normalizedLocations = (locations) => {
75
53
  return unique.values().toArray().toSorted(compareLocations);
76
54
  };
77
55
  const pointSource = (entry, msgid) => {
78
- if (entry.explicitDefault !== true || typeof entry.defaultValue !== "string") {
56
+ if (typeof entry.defaultValue !== "string") {
79
57
  return msgid;
80
58
  }
81
- return entry.defaultValue;
59
+ if (entry.explicitDefault === true) {
60
+ return entry.defaultValue;
61
+ }
62
+ return entry.defaultValue === msgid || msgid.endsWith(`.${entry.defaultValue}`)
63
+ ? msgid
64
+ : entry.defaultValue;
82
65
  };
83
66
  const pointMessage = (entry) => {
84
67
  const { context, msgid } = splitContext(entry.key);
85
68
  validateIdentity(context, msgid);
86
- const isDefaultExplicit = entry.explicitDefault === true;
87
69
  const singular = pointSource(entry, msgid);
88
70
  if (singular.length === 0) {
89
71
  throw new Error("Translation source strings cannot be empty");
90
72
  }
91
73
  return {
92
74
  context,
93
- kind: isDefaultExplicit ? "default" : "point",
94
75
  locations: normalizedLocations(entry.locations ?? []),
95
- msgid,
96
76
  namespace: namespaceFor(entry),
97
77
  plural: null,
98
78
  singular,
79
+ sourceKey: msgid,
99
80
  };
100
81
  };
101
82
  const expandedPlural = (entry) => {
@@ -145,20 +126,18 @@ const pluralMessage = ({ baseKey, namespace, variants }) => {
145
126
  const { one, other } = pairedVariants(variants);
146
127
  const { context, msgid } = splitContext(baseKey);
147
128
  validateIdentity(context, msgid);
148
- const hasStableKey = one.defaultValue !== other.defaultValue;
149
- const singular = hasStableKey ? one.defaultValue : msgid;
129
+ const singular = one.defaultValue;
150
130
  const plural = other.defaultValue;
151
131
  if (singular === plural || singular.length === 0 || plural.length === 0) {
152
132
  throw new Error("GNU gettext plural source strings must be distinct and non-empty");
153
133
  }
154
134
  return {
155
135
  context,
156
- kind: hasStableKey ? "pluralDefaults" : "plural",
157
136
  locations: normalizedLocations(variants.flatMap((variant) => variant.locations)),
158
- msgid,
159
137
  namespace,
160
138
  plural,
161
139
  singular,
140
+ sourceKey: msgid,
162
141
  };
163
142
  };
164
143
  const pluralMessages = (entries) => groupedPlurals(entries).map((group) => pluralMessage(group));
@@ -185,40 +164,61 @@ const sourceMessages = (entries) => {
185
164
  };
186
165
  const compareMessages = (left, right) => left.namespace.localeCompare(right.namespace) ||
187
166
  (left.context ?? "").localeCompare(right.context ?? "") ||
188
- left.msgid.localeCompare(right.msgid) ||
189
167
  left.singular.localeCompare(right.singular) ||
190
168
  (left.plural ?? "").localeCompare(right.plural ?? "");
169
+ const inferLocations = (message, sources) => {
170
+ if (message.locations.length > 0) {
171
+ return message;
172
+ }
173
+ const locations = [];
174
+ for (const [file, source] of sources) {
175
+ const index = source.indexOf(message.sourceKey);
176
+ if (index !== -1) {
177
+ locations.push({ file, line: source.slice(0, index).split("\n").length });
178
+ }
179
+ }
180
+ return { ...message, locations };
181
+ };
191
182
  const normalizedSourceFiles = (root, paths) => {
192
183
  const files = paths
193
184
  .map((path) => resolve(root, path))
194
- .filter((path) => {
195
- const projectPath = relative(root, path);
196
- return projectPath !== ".." && !projectPath.startsWith(`..${sep}`) && !isAbsolute(projectPath);
197
- });
185
+ .filter((path) => isPathWithin(root, path));
198
186
  return new Set(files).values().toArray().toSorted((left, right) => left.localeCompare(right));
199
187
  };
200
- const findSourceMessages = async (sourceFiles) => {
188
+ const findSourceMessages = async (root, sourceFiles) => {
201
189
  if (sourceFiles.length === 0) {
190
+ clearI18nResources(root);
202
191
  return [];
203
192
  }
204
- const fileErrors = [];
193
+ let extracted;
205
194
  const { logger, reports } = quietLogger();
206
- const { allKeys } = await findKeys(extractorConfig(sourceFiles), logger, fileErrors);
207
- if (fileErrors.length > 0 || reports.length > 0) {
208
- throw new Error([...fileErrors, ...reports].join("\n"));
195
+ const capture = {
196
+ name: "gtkx-gettext",
197
+ onEnd(keys) {
198
+ extracted = keys;
199
+ },
200
+ };
201
+ const result = await runExtractor(i18nToolkitConfig(root, sourceFiles, [capture]), {
202
+ logger,
203
+ quiet: true,
204
+ syncPrimaryWithDefaults: true,
205
+ trustDerivedDefaults: true,
206
+ });
207
+ if (extracted === undefined || reports.length > 0 || result.hasErrors) {
208
+ throw new Error(reports.join("\n") || "i18next extraction failed");
209
209
  }
210
- return sourceMessages(allKeys.values().toArray()).toSorted(compareMessages);
210
+ const sources = new Map(sourceFiles.map((file) => [file, readFileSync(file, "utf8")]));
211
+ return sourceMessages(extracted.values().toArray())
212
+ .map((message) => inferLocations(message, sources))
213
+ .toSorted(compareMessages);
211
214
  };
212
215
  const projectPath = (root, path) => {
213
216
  const absolute = isAbsolute(path) ? resolve(path) : resolve(root, path);
214
217
  const projectRelative = relative(root, absolute);
215
- if (projectRelative === "" ||
216
- projectRelative === ".." ||
217
- projectRelative.startsWith(`..${sep}`) ||
218
- isAbsolute(projectRelative)) {
218
+ if (!isPathInside(root, absolute)) {
219
219
  return null;
220
220
  }
221
- return projectRelative.replaceAll("\\", "/");
221
+ return toPosixPath(projectRelative);
222
222
  };
223
223
  const writePotfiles = (project, sourceFiles) => {
224
224
  const paths = sourceFiles
@@ -241,7 +241,6 @@ const renderCatalogCall = (message) => {
241
241
  ? `gettext(${msgid});`
242
242
  : `pgettext(${JSON.stringify(message.context)}, ${msgid});`;
243
243
  };
244
- const readSources = (sourceFiles) => new Map(sourceFiles.map((path) => [path, readFileSync(path, "utf8")]));
245
244
  const locatedOwners = (project, message) => {
246
245
  const owners = [];
247
246
  for (const location of message.locations) {
@@ -253,30 +252,14 @@ const locatedOwners = (project, message) => {
253
252
  const unique = new Map(owners.map((owner) => [`${owner.path}\0${String(owner.line)}`, owner]));
254
253
  return unique.values().toArray();
255
254
  };
256
- const inferredOwner = (project, message, sources) => {
257
- for (const [path, source] of sources) {
258
- const index = source.indexOf(message.msgid);
259
- if (index !== -1) {
260
- return {
261
- path: projectPath(project.root, path) ?? SYNTHETIC_FILENAME,
262
- line: source.slice(0, index).split("\n").length,
263
- };
264
- }
265
- }
266
- return null;
267
- };
268
- const sourceOwners = (project, message, sources) => {
255
+ const sourceOwners = (project, message) => {
269
256
  const located = locatedOwners(project, message);
270
- if (located.length > 0) {
271
- return located;
272
- }
273
- return [inferredOwner(project, message, sources) ?? { path: SYNTHETIC_FILENAME, line: undefined }];
257
+ return located.length > 0 ? located : [{ path: SYNTHETIC_FILENAME, line: undefined }];
274
258
  };
275
- const syntheticEntries = (project, messages, sourceFiles) => {
276
- const sources = readSources(sourceFiles);
259
+ const syntheticEntries = (project, messages) => {
277
260
  const entries = new Map();
278
261
  for (const message of messages) {
279
- for (const owner of sourceOwners(project, message, sources)) {
262
+ for (const owner of sourceOwners(project, message)) {
280
263
  const owned = entries.get(owner.path) ?? [];
281
264
  owned.push({ call: renderCatalogCall(message), line: owner.line });
282
265
  entries.set(owner.path, owned);
@@ -314,8 +297,8 @@ const renderSyntheticSource = (entries) => {
314
297
  }
315
298
  return `${lines.join("\n")}\n`;
316
299
  };
317
- const writeSyntheticSources = (workDir, project, messages, sourceFiles) => {
318
- const entries = syntheticEntries(project, messages, sourceFiles);
300
+ const writeSyntheticSources = (workDir, project, messages) => {
301
+ const entries = syntheticEntries(project, messages);
319
302
  const paths = [];
320
303
  for (const [path, owned] of entries) {
321
304
  const target = join(workDir, path);
@@ -327,8 +310,8 @@ const writeSyntheticSources = (workDir, project, messages, sourceFiles) => {
327
310
  writeFileSync(potfiles, `${paths.toSorted((left, right) => left.localeCompare(right)).join("\n")}\n`);
328
311
  return potfiles;
329
312
  };
330
- const extractSourceMessages = ({ project, messages, sourceFiles, output, workDir }) => {
331
- const potfilesPath = writeSyntheticSources(workDir, project, messages, sourceFiles);
313
+ const extractSourceMessages = ({ project, messages, output, workDir }) => {
314
+ const potfilesPath = writeSyntheticSources(workDir, project, messages);
332
315
  runCliTool({
333
316
  tool: "xgettext",
334
317
  args: [
@@ -365,7 +348,7 @@ const joinMetadataFragment = (output, fragment) => {
365
348
  target: output,
366
349
  });
367
350
  };
368
- const extractCatalogTemplate = ({ project, messages, sourceFiles, shouldPreserveMetadataMessages, output = resolve(project.poDir, `${project.domain}.pot`), }) => {
351
+ const extractCatalogTemplate = ({ project, messages, shouldPreserveMetadataMessages, output = resolve(project.poDir, `${project.domain}.pot`), }) => {
369
352
  const workDir = mkdtempSync(join(project.poDir, ".gtkx-i18n-"));
370
353
  const source = join(workDir, "source.pot");
371
354
  const hasPreviousTemplate = existsSync(output);
@@ -373,11 +356,11 @@ const extractCatalogTemplate = ({ project, messages, sourceFiles, shouldPreserve
373
356
  if (shouldPreserveMetadataMessages && hasPreviousTemplate) {
374
357
  const fragment = join(workDir, "metadata.pot");
375
358
  extractMetadataFragment(project, output, fragment);
376
- extractSourceMessages({ project, messages, sourceFiles, output: source, workDir });
359
+ extractSourceMessages({ project, messages, output: source, workDir });
377
360
  joinMetadataFragment(source, fragment);
378
361
  }
379
362
  else {
380
- extractSourceMessages({ project, messages, sourceFiles, output: source, workDir });
363
+ extractSourceMessages({ project, messages, output: source, workDir });
381
364
  }
382
365
  replaceCatalogTemplate(source, output);
383
366
  }
@@ -387,17 +370,15 @@ const extractCatalogTemplate = ({ project, messages, sourceFiles, shouldPreserve
387
370
  };
388
371
  const extractSourceCatalogTo = async (project, paths, output) => {
389
372
  const sourceFiles = normalizedSourceFiles(project.root, paths);
390
- const messages = await findSourceMessages(sourceFiles);
373
+ const messages = await findSourceMessages(project.root, sourceFiles);
391
374
  writePotfiles(project, sourceFiles);
392
- extractCatalogTemplate({ project, messages, sourceFiles, shouldPreserveMetadataMessages: false, output });
393
- return { messages, sourceFiles };
375
+ extractCatalogTemplate({ project, messages, shouldPreserveMetadataMessages: false, output });
394
376
  };
395
377
  const extractSourceCatalog = async (project, paths, shouldPreserveMetadataMessages = true) => {
396
378
  const sourceFiles = normalizedSourceFiles(project.root, paths);
397
- const messages = await findSourceMessages(sourceFiles);
379
+ const messages = await findSourceMessages(project.root, sourceFiles);
398
380
  writePotfiles(project, sourceFiles);
399
- extractCatalogTemplate({ project, messages, sourceFiles, shouldPreserveMetadataMessages });
400
- return { messages, sourceFiles };
381
+ extractCatalogTemplate({ project, messages, shouldPreserveMetadataMessages });
401
382
  };
402
383
  export { extractSourceCatalog, extractSourceCatalogTo };
403
384
  //# sourceMappingURL=source-messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"source-messages.js","sourceRoot":"","sources":["../../src/i18n/source-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtractedKey, I18nextToolkitConfig, Logger } from \"i18next-cli\";\nimport { findKeys } from \"i18next-cli\";\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport type { CatalogProject } from \"./catalogs.js\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\nimport { replaceCatalogTemplate } from \"./catalog-template.js\";\nimport { gtkxExtractorPlugin } from \"./extractor-plugin.js\";\nimport { metadataTemplateFiles } from \"./metadata-templates.js\";\n\ntype SourceLocation = {\n file: string;\n line?: number | undefined;\n column?: number | undefined;\n};\n\ntype SourceMessage = {\n context: string | null;\n kind: \"default\" | \"plural\" | \"pluralDefaults\" | \"point\";\n locations: SourceLocation[];\n msgid: string;\n namespace: string;\n plural: string | null;\n singular: string;\n};\n\ntype SourceCatalog = {\n messages: SourceMessage[];\n sourceFiles: string[];\n};\n\ntype SyntheticEntry = {\n call: string;\n line: number | undefined;\n};\n\ntype SourceExtraction = {\n messages: SourceMessage[];\n output: string;\n project: CatalogProject;\n sourceFiles: string[];\n workDir: string;\n};\n\ntype CatalogTemplateExtraction = {\n messages: SourceMessage[];\n output?: string | undefined;\n project: CatalogProject;\n shouldPreserveMetadataMessages: boolean;\n sourceFiles: string[];\n};\n\ntype PluralVariant = {\n category: string;\n defaultValue: string;\n locations: SourceLocation[];\n};\n\ntype PluralGroup = {\n baseKey: string;\n namespace: string;\n variants: PluralVariant[];\n};\n\nconst CONTEXT_SEPARATOR = \"\\u{4}\";\nconst DEFAULT_NAMESPACE = \"translation\";\nconst POTFILES_FILENAME = \"POTFILES.in\";\nconst SYNTHETIC_FILENAME = \"messages.js\";\n\nconst quietLogger = (): { logger: Logger; reports: string[] } => {\n const reports: string[] = [];\n\n return {\n reports,\n logger: {\n info() {\n return;\n },\n warn(message, more) {\n const detail = more === undefined ? \"\" : ` ${String(more)}`;\n reports.push(`${message}${detail}`);\n },\n error(message) {\n reports.push(String(message));\n },\n },\n };\n};\n\nconst extractorConfig = (sourceFiles: string[]): I18nextToolkitConfig => {\n const integration = gtkxExtractorPlugin();\n\n return {\n locales: [\"en\"],\n plugins: [integration.plugin],\n extract: {\n input: sourceFiles,\n output: \"unused/{{language}}/{{namespace}}.json\",\n contextSeparator: CONTEXT_SEPARATOR,\n defaultNS: DEFAULT_NAMESPACE,\n disablePlurals: false,\n extractFromComments: false,\n functions: [],\n generateBasePluralForms: false,\n keySeparator: \".\",\n nsSeparator: false,\n pluralSeparator: \"_\",\n transComponents: integration.transComponents,\n useTranslationNames: [],\n warnOnConflicts: \"error\",\n },\n };\n};\n\nconst splitContext = (key: string): { context: string | null; msgid: string } => {\n const index = key.lastIndexOf(CONTEXT_SEPARATOR);\n\n if (index === -1) {\n return { context: null, msgid: key };\n }\n\n return { context: key.slice(index + CONTEXT_SEPARATOR.length), msgid: key.slice(0, index) };\n};\n\nconst namespaceFor = (entry: ExtractedKey): string =>\n typeof entry.ns === \"string\" ? entry.ns : DEFAULT_NAMESPACE;\n\nconst validateIdentity = (context: string | null, msgid: string): void => {\n if (context === \"\" || msgid.length === 0) {\n throw new Error(\"Translation keys and contexts cannot be empty\");\n }\n};\n\nconst compareLocations = (left: SourceLocation, right: SourceLocation): number =>\n left.file.localeCompare(right.file) ||\n (left.line ?? 0) - (right.line ?? 0) ||\n (left.column ?? 0) - (right.column ?? 0);\n\nconst normalizedLocations = (locations: SourceLocation[]): SourceLocation[] => {\n const unique: Map<string, SourceLocation> = new Map();\n\n for (const location of locations) {\n const key = `${location.file}\\0${String(location.line)}\\0${String(location.column)}`;\n unique.set(key, location);\n }\n\n return unique.values().toArray().toSorted(compareLocations);\n};\n\nconst pointSource = (entry: ExtractedKey, msgid: string): string => {\n if (entry.explicitDefault !== true || typeof entry.defaultValue !== \"string\") {\n return msgid;\n }\n\n return entry.defaultValue;\n};\n\nconst pointMessage = (entry: ExtractedKey): SourceMessage => {\n const { context, msgid } = splitContext(entry.key);\n validateIdentity(context, msgid);\n const isDefaultExplicit = entry.explicitDefault === true;\n const singular = pointSource(entry, msgid);\n\n if (singular.length === 0) {\n throw new Error(\"Translation source strings cannot be empty\");\n }\n\n return {\n context,\n kind: isDefaultExplicit ? \"default\" : \"point\",\n locations: normalizedLocations(entry.locations ?? []),\n msgid,\n namespace: namespaceFor(entry),\n plural: null,\n singular,\n };\n};\n\nconst expandedPlural = (entry: ExtractedKey): { baseKey: string; variant: PluralVariant } => {\n if (entry.isOrdinal === true) {\n throw new Error(\"GNU gettext catalogs do not support i18next ordinal plurals\");\n }\n\n const suffix = /_(few|many|one|other|two|zero)$/u.exec(entry.key);\n const defaultValue = entry.defaultValue;\n const category = suffix?.[1];\n\n if (suffix === null || category === undefined || typeof defaultValue !== \"string\") {\n throw new Error(\"Unable to recover an i18next plural source pair\");\n }\n\n return {\n baseKey: entry.key.slice(0, -suffix[0].length),\n variant: {\n category,\n defaultValue,\n locations: entry.locations ?? [],\n },\n };\n};\n\nconst groupedPlurals = (entries: ExtractedKey[]): PluralGroup[] => {\n const groups: Map<string, PluralGroup> = new Map();\n\n for (const entry of entries) {\n const { baseKey, variant } = expandedPlural(entry);\n const namespace = namespaceFor(entry);\n const key = `${namespace}\\0${baseKey}`;\n const group = groups.get(key) ?? { baseKey, namespace, variants: [] };\n group.variants.push(variant);\n groups.set(key, group);\n }\n\n return groups.values().toArray();\n};\n\nconst pairedVariants = (variants: PluralVariant[]): { one: PluralVariant; other: PluralVariant } => {\n const categories = new Map(variants.map((variant) => [variant.category, variant]));\n\n if (categories.size !== 2 || !categories.has(\"one\") || !categories.has(\"other\")) {\n throw new Error(\"GNU gettext requires one singular and one plural source string\");\n }\n\n const one = categories.get(\"one\");\n const other = categories.get(\"other\");\n\n if (one === undefined || other === undefined) {\n throw new Error(\"Unable to recover an i18next plural source pair\");\n }\n\n return { one, other };\n};\n\nconst pluralMessage = ({ baseKey, namespace, variants }: PluralGroup): SourceMessage => {\n const { one, other } = pairedVariants(variants);\n const { context, msgid } = splitContext(baseKey);\n validateIdentity(context, msgid);\n const hasStableKey = one.defaultValue !== other.defaultValue;\n const singular = hasStableKey ? one.defaultValue : msgid;\n const plural = other.defaultValue;\n\n if (singular === plural || singular.length === 0 || plural.length === 0) {\n throw new Error(\"GNU gettext plural source strings must be distinct and non-empty\");\n }\n\n return {\n context,\n kind: hasStableKey ? \"pluralDefaults\" : \"plural\",\n locations: normalizedLocations(variants.flatMap((variant) => variant.locations)),\n msgid,\n namespace,\n plural,\n singular,\n };\n};\n\nconst pluralMessages = (entries: ExtractedKey[]): SourceMessage[] =>\n groupedPlurals(entries).map((group) => pluralMessage(group));\n\nconst assertCardinal = (entry: ExtractedKey): void => {\n if (entry.isOrdinal === true) {\n throw new Error(\"GNU gettext catalogs do not support i18next ordinal plurals\");\n }\n};\n\nconst sourceMessages = (entries: ExtractedKey[]): SourceMessage[] => {\n const points: ExtractedKey[] = [];\n const plurals: ExtractedKey[] = [];\n\n for (const entry of entries) {\n assertCardinal(entry);\n\n if (entry.isExpandedPlural === true) {\n plurals.push(entry);\n continue;\n }\n\n if (entry.hasCount === true) {\n throw new Error(\"Count-based translations require an explicit plural source string\");\n }\n\n points.push(entry);\n }\n\n return [...points.map((entry) => pointMessage(entry)), ...pluralMessages(plurals)];\n};\n\nconst compareMessages = (left: SourceMessage, right: SourceMessage): number =>\n left.namespace.localeCompare(right.namespace) ||\n (left.context ?? \"\").localeCompare(right.context ?? \"\") ||\n left.msgid.localeCompare(right.msgid) ||\n left.singular.localeCompare(right.singular) ||\n (left.plural ?? \"\").localeCompare(right.plural ?? \"\");\n\nconst normalizedSourceFiles = (root: string, paths: string[]): string[] => {\n const files = paths\n .map((path) => resolve(root, path))\n .filter((path) => {\n const projectPath = relative(root, path);\n\n return projectPath !== \"..\" && !projectPath.startsWith(`..${sep}`) && !isAbsolute(projectPath);\n });\n\n return new Set(files).values().toArray().toSorted((left, right) => left.localeCompare(right));\n};\n\nconst findSourceMessages = async (sourceFiles: string[]): Promise<SourceMessage[]> => {\n if (sourceFiles.length === 0) {\n return [];\n }\n\n const fileErrors: string[] = [];\n const { logger, reports } = quietLogger();\n const { allKeys } = await findKeys(extractorConfig(sourceFiles), logger, fileErrors);\n\n if (fileErrors.length > 0 || reports.length > 0) {\n throw new Error([...fileErrors, ...reports].join(\"\\n\"));\n }\n\n return sourceMessages(allKeys.values().toArray()).toSorted(compareMessages);\n};\n\nconst projectPath = (root: string, path: string): string | null => {\n const absolute = isAbsolute(path) ? resolve(path) : resolve(root, path);\n const projectRelative = relative(root, absolute);\n\n if (\n projectRelative === \"\" ||\n projectRelative === \"..\" ||\n projectRelative.startsWith(`..${sep}`) ||\n isAbsolute(projectRelative)\n ) {\n return null;\n }\n\n return projectRelative.replaceAll(\"\\\\\", \"/\");\n};\n\nconst writePotfiles = (project: CatalogProject, sourceFiles: string[]): string => {\n const paths = sourceFiles\n .map((path) => projectPath(project.root, path))\n .filter((path): path is string => path !== null);\n\n const sorted = [...new Set(paths)].toSorted((left, right) => left.localeCompare(right));\n const target = resolve(project.poDir, POTFILES_FILENAME);\n writeFileSync(target, sorted.length === 0 ? \"\" : `${sorted.join(\"\\n\")}\\n`);\n\n return target;\n};\n\nconst renderCatalogCall = (message: SourceMessage): string => {\n const msgid = JSON.stringify(message.singular);\n\n if (message.plural !== null) {\n const plural = JSON.stringify(message.plural);\n\n return message.context === null\n ? `ngettext(${msgid}, ${plural}, 0);`\n : `npgettext(${JSON.stringify(message.context)}, ${msgid}, ${plural}, 0);`;\n }\n\n return message.context === null\n ? `gettext(${msgid});`\n : `pgettext(${JSON.stringify(message.context)}, ${msgid});`;\n};\n\nconst readSources = (sourceFiles: string[]): Map<string, string> =>\n new Map(sourceFiles.map((path) => [path, readFileSync(path, \"utf8\")]));\n\nconst locatedOwners = (\n project: CatalogProject,\n message: SourceMessage,\n): { path: string; line: number | undefined }[] => {\n const owners: { path: string; line: number | undefined }[] = [];\n\n for (const location of message.locations) {\n const path = projectPath(project.root, location.file);\n\n if (path !== null) {\n owners.push({ path, line: location.line });\n }\n }\n\n const unique = new Map(owners.map((owner) => [`${owner.path}\\0${String(owner.line)}`, owner]));\n\n return unique.values().toArray();\n};\n\nconst inferredOwner = (\n project: CatalogProject,\n message: SourceMessage,\n sources: Map<string, string>,\n): { path: string; line: number } | null => {\n for (const [path, source] of sources) {\n const index = source.indexOf(message.msgid);\n\n if (index !== -1) {\n return {\n path: projectPath(project.root, path) ?? SYNTHETIC_FILENAME,\n line: source.slice(0, index).split(\"\\n\").length,\n };\n }\n }\n\n return null;\n};\n\nconst sourceOwners = (\n project: CatalogProject,\n message: SourceMessage,\n sources: Map<string, string>,\n): { path: string; line: number | undefined }[] => {\n const located = locatedOwners(project, message);\n\n if (located.length > 0) {\n return located;\n }\n\n return [inferredOwner(project, message, sources) ?? { path: SYNTHETIC_FILENAME, line: undefined }];\n};\n\nconst syntheticEntries = (\n project: CatalogProject,\n messages: SourceMessage[],\n sourceFiles: string[],\n): Map<string, SyntheticEntry[]> => {\n const sources = readSources(sourceFiles);\n const entries: Map<string, SyntheticEntry[]> = new Map();\n\n for (const message of messages) {\n for (const owner of sourceOwners(project, message, sources)) {\n const owned = entries.get(owner.path) ?? [];\n owned.push({ call: renderCatalogCall(message), line: owner.line });\n entries.set(owner.path, owned);\n }\n }\n\n if (entries.size === 0) {\n entries.set(SYNTHETIC_FILENAME, []);\n }\n\n return entries;\n};\n\nconst compareSyntheticEntries = (left: SyntheticEntry, right: SyntheticEntry): number =>\n (left.line ?? Number.MAX_SAFE_INTEGER) - (right.line ?? Number.MAX_SAFE_INTEGER);\n\nconst lastSyntheticLine = (entries: SyntheticEntry[]): number => {\n let line = 0;\n\n for (const entry of entries) {\n line = Math.max(line, entry.line ?? 0);\n }\n\n return line;\n};\n\nconst appendSyntheticEntry = (lines: string[], entry: SyntheticEntry, requestedLine: number): void => {\n const index = requestedLine - 1;\n const existing = lines[index];\n\n if (existing === undefined || existing.length === 0) {\n lines[index] = entry.call;\n\n return;\n }\n\n lines[index] = `${existing} ${entry.call}`;\n};\n\nconst renderSyntheticSource = (entries: SyntheticEntry[]): string => {\n const lines: string[] = [];\n const sorted = entries.toSorted(compareSyntheticEntries);\n let nextLine = lastSyntheticLine(entries) + 1;\n\n for (const entry of sorted) {\n const requestedLine = Math.max(1, entry.line ?? nextLine++);\n appendSyntheticEntry(lines, entry, requestedLine);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n};\n\nconst writeSyntheticSources = (\n workDir: string,\n project: CatalogProject,\n messages: SourceMessage[],\n sourceFiles: string[],\n): string => {\n const entries = syntheticEntries(project, messages, sourceFiles);\n const paths: string[] = [];\n\n for (const [path, owned] of entries) {\n const target = join(workDir, path);\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, renderSyntheticSource(owned));\n paths.push(path);\n }\n\n const potfiles = join(workDir, POTFILES_FILENAME);\n writeFileSync(potfiles, `${paths.toSorted((left, right) => left.localeCompare(right)).join(\"\\n\")}\\n`);\n\n return potfiles;\n};\n\nconst extractSourceMessages = ({ project, messages, sourceFiles, output, workDir }: SourceExtraction): void => {\n const potfilesPath = writeSyntheticSources(workDir, project, messages, sourceFiles);\n\n runCliTool({\n tool: \"xgettext\",\n args: [\n \"--language=JavaScript\",\n \"--from-code=UTF-8\",\n \"--force-po\",\n \"--keyword=gettext:1\",\n \"--keyword=ngettext:1,2\",\n \"--keyword=pgettext:1c,2\",\n \"--keyword=npgettext:1c,2,3\",\n `--directory=${workDir}`,\n `--files-from=${potfilesPath}`,\n `--output=${output}`,\n ],\n target: output,\n });\n};\n\nconst extractMetadataFragment = (project: CatalogProject, input: string, output: string): void => {\n runCliTool({\n tool: \"msggrep\",\n args: [\n \"--force-po\",\n `--output-file=${output}`,\n ...metadataTemplateFiles(project).map((file) => `--location=${file.relativePath}`),\n input,\n ],\n target: input,\n });\n};\n\nconst joinMetadataFragment = (output: string, fragment: string): void => {\n runCliTool({\n tool: \"xgettext\",\n args: [\"--language=PO\", \"--join-existing\", \"--force-po\", `--output=${output}`, fragment],\n target: output,\n });\n};\n\nconst extractCatalogTemplate = ({\n project,\n messages,\n sourceFiles,\n shouldPreserveMetadataMessages,\n output = resolve(project.poDir, `${project.domain}.pot`),\n}: CatalogTemplateExtraction): void => {\n const workDir = mkdtempSync(join(project.poDir, \".gtkx-i18n-\"));\n const source = join(workDir, \"source.pot\");\n const hasPreviousTemplate = existsSync(output);\n\n try {\n if (shouldPreserveMetadataMessages && hasPreviousTemplate) {\n const fragment = join(workDir, \"metadata.pot\");\n extractMetadataFragment(project, output, fragment);\n extractSourceMessages({ project, messages, sourceFiles, output: source, workDir });\n joinMetadataFragment(source, fragment);\n } else {\n extractSourceMessages({ project, messages, sourceFiles, output: source, workDir });\n }\n\n replaceCatalogTemplate(source, output);\n } finally {\n rmSync(workDir, { recursive: true, force: true });\n }\n};\n\nconst extractSourceCatalogTo = async (\n project: CatalogProject,\n paths: string[],\n output: string,\n): Promise<SourceCatalog> => {\n const sourceFiles = normalizedSourceFiles(project.root, paths);\n const messages = await findSourceMessages(sourceFiles);\n writePotfiles(project, sourceFiles);\n extractCatalogTemplate({ project, messages, sourceFiles, shouldPreserveMetadataMessages: false, output });\n\n return { messages, sourceFiles };\n};\n\nconst extractSourceCatalog = async (\n project: CatalogProject,\n paths: string[],\n shouldPreserveMetadataMessages = true,\n): Promise<SourceCatalog> => {\n const sourceFiles = normalizedSourceFiles(project.root, paths);\n const messages = await findSourceMessages(sourceFiles);\n writePotfiles(project, sourceFiles);\n extractCatalogTemplate({ project, messages, sourceFiles, shouldPreserveMetadataMessages });\n\n return { messages, sourceFiles };\n};\n\nexport { type SourceMessage, extractSourceCatalog, extractSourceCatalogTo };\n"]}
1
+ {"version":3,"file":"source-messages.js","sourceRoot":"","sources":["../../src/i18n/source-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtractedKey, ExtractedKeysMap, Logger, Plugin } from \"i18next-cli\";\nimport { isPathInside, isPathWithin, toPosixPath } from \"@gtkx/utils\";\nimport { runExtractor } from \"i18next-cli\";\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport type { CatalogProject } from \"./catalogs.js\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\nimport { replaceCatalogTemplate } from \"./catalog-template.js\";\nimport { metadataTemplateFiles } from \"./metadata-templates.js\";\nimport { clearI18nResources, i18nToolkitConfig } from \"./types.js\";\n\ntype SourceLocation = {\n file: string;\n line?: number | undefined;\n column?: number | undefined;\n};\n\ntype SourceMessage = {\n context: string | null;\n locations: SourceLocation[];\n namespace: string;\n plural: string | null;\n singular: string;\n sourceKey: string;\n};\n\ntype SyntheticEntry = {\n call: string;\n line: number | undefined;\n};\n\ntype SourceExtraction = {\n messages: SourceMessage[];\n output: string;\n project: CatalogProject;\n workDir: string;\n};\n\ntype CatalogTemplateExtraction = {\n messages: SourceMessage[];\n output?: string | undefined;\n project: CatalogProject;\n shouldPreserveMetadataMessages: boolean;\n};\n\ntype PluralVariant = {\n category: string;\n defaultValue: string;\n locations: SourceLocation[];\n};\n\ntype PluralGroup = {\n baseKey: string;\n namespace: string;\n variants: PluralVariant[];\n};\n\nconst CONTEXT_SEPARATOR = \"\\u{4}\";\nconst DEFAULT_NAMESPACE = \"translation\";\nconst POTFILES_FILENAME = \"POTFILES.in\";\nconst SYNTHETIC_FILENAME = \"messages.js\";\n\nconst quietLogger = (): { logger: Logger; reports: string[] } => {\n const reports: string[] = [];\n\n return {\n reports,\n logger: {\n info() {\n return;\n },\n warn(message, more) {\n const detail = more === undefined ? \"\" : ` ${String(more)}`;\n reports.push(`${message}${detail}`);\n },\n error(message) {\n reports.push(String(message));\n },\n },\n };\n};\n\nconst splitContext = (key: string): { context: string | null; msgid: string } => {\n const index = key.lastIndexOf(CONTEXT_SEPARATOR);\n\n if (index === -1) {\n return { context: null, msgid: key };\n }\n\n return { context: key.slice(index + CONTEXT_SEPARATOR.length), msgid: key.slice(0, index) };\n};\n\nconst namespaceFor = (entry: ExtractedKey): string =>\n typeof entry.ns === \"string\" ? entry.ns : DEFAULT_NAMESPACE;\n\nconst validateIdentity = (context: string | null, msgid: string): void => {\n if (context === \"\" || msgid.length === 0) {\n throw new Error(\"Translation keys and contexts cannot be empty\");\n }\n};\n\nconst compareLocations = (left: SourceLocation, right: SourceLocation): number =>\n left.file.localeCompare(right.file) ||\n (left.line ?? 0) - (right.line ?? 0) ||\n (left.column ?? 0) - (right.column ?? 0);\n\nconst normalizedLocations = (locations: SourceLocation[]): SourceLocation[] => {\n const unique: Map<string, SourceLocation> = new Map();\n\n for (const location of locations) {\n const key = `${location.file}\\0${String(location.line)}\\0${String(location.column)}`;\n unique.set(key, location);\n }\n\n return unique.values().toArray().toSorted(compareLocations);\n};\n\nconst pointSource = (entry: ExtractedKey, msgid: string): string => {\n if (typeof entry.defaultValue !== \"string\") {\n return msgid;\n }\n\n if (entry.explicitDefault === true) {\n return entry.defaultValue;\n }\n\n return entry.defaultValue === msgid || msgid.endsWith(`.${entry.defaultValue}`)\n ? msgid\n : entry.defaultValue;\n};\n\nconst pointMessage = (entry: ExtractedKey): SourceMessage => {\n const { context, msgid } = splitContext(entry.key);\n validateIdentity(context, msgid);\n const singular = pointSource(entry, msgid);\n\n if (singular.length === 0) {\n throw new Error(\"Translation source strings cannot be empty\");\n }\n\n return {\n context,\n locations: normalizedLocations(entry.locations ?? []),\n namespace: namespaceFor(entry),\n plural: null,\n singular,\n sourceKey: msgid,\n };\n};\n\nconst expandedPlural = (entry: ExtractedKey): { baseKey: string; variant: PluralVariant } => {\n if (entry.isOrdinal === true) {\n throw new Error(\"GNU gettext catalogs do not support i18next ordinal plurals\");\n }\n\n const suffix = /_(few|many|one|other|two|zero)$/u.exec(entry.key);\n const defaultValue = entry.defaultValue;\n const category = suffix?.[1];\n\n if (suffix === null || category === undefined || typeof defaultValue !== \"string\") {\n throw new Error(\"Unable to recover an i18next plural source pair\");\n }\n\n return {\n baseKey: entry.key.slice(0, -suffix[0].length),\n variant: {\n category,\n defaultValue,\n locations: entry.locations ?? [],\n },\n };\n};\n\nconst groupedPlurals = (entries: ExtractedKey[]): PluralGroup[] => {\n const groups: Map<string, PluralGroup> = new Map();\n\n for (const entry of entries) {\n const { baseKey, variant } = expandedPlural(entry);\n const namespace = namespaceFor(entry);\n const key = `${namespace}\\0${baseKey}`;\n const group = groups.get(key) ?? { baseKey, namespace, variants: [] };\n group.variants.push(variant);\n groups.set(key, group);\n }\n\n return groups.values().toArray();\n};\n\nconst pairedVariants = (variants: PluralVariant[]): { one: PluralVariant; other: PluralVariant } => {\n const categories = new Map(variants.map((variant) => [variant.category, variant]));\n\n if (categories.size !== 2 || !categories.has(\"one\") || !categories.has(\"other\")) {\n throw new Error(\"GNU gettext requires one singular and one plural source string\");\n }\n\n const one = categories.get(\"one\");\n const other = categories.get(\"other\");\n\n if (one === undefined || other === undefined) {\n throw new Error(\"Unable to recover an i18next plural source pair\");\n }\n\n return { one, other };\n};\n\nconst pluralMessage = ({ baseKey, namespace, variants }: PluralGroup): SourceMessage => {\n const { one, other } = pairedVariants(variants);\n const { context, msgid } = splitContext(baseKey);\n validateIdentity(context, msgid);\n const singular = one.defaultValue;\n const plural = other.defaultValue;\n\n if (singular === plural || singular.length === 0 || plural.length === 0) {\n throw new Error(\"GNU gettext plural source strings must be distinct and non-empty\");\n }\n\n return {\n context,\n locations: normalizedLocations(variants.flatMap((variant) => variant.locations)),\n namespace,\n plural,\n singular,\n sourceKey: msgid,\n };\n};\n\nconst pluralMessages = (entries: ExtractedKey[]): SourceMessage[] =>\n groupedPlurals(entries).map((group) => pluralMessage(group));\n\nconst assertCardinal = (entry: ExtractedKey): void => {\n if (entry.isOrdinal === true) {\n throw new Error(\"GNU gettext catalogs do not support i18next ordinal plurals\");\n }\n};\n\nconst sourceMessages = (entries: ExtractedKey[]): SourceMessage[] => {\n const points: ExtractedKey[] = [];\n const plurals: ExtractedKey[] = [];\n\n for (const entry of entries) {\n assertCardinal(entry);\n\n if (entry.isExpandedPlural === true) {\n plurals.push(entry);\n continue;\n }\n\n if (entry.hasCount === true) {\n throw new Error(\"Count-based translations require an explicit plural source string\");\n }\n\n points.push(entry);\n }\n\n return [...points.map((entry) => pointMessage(entry)), ...pluralMessages(plurals)];\n};\n\nconst compareMessages = (left: SourceMessage, right: SourceMessage): number =>\n left.namespace.localeCompare(right.namespace) ||\n (left.context ?? \"\").localeCompare(right.context ?? \"\") ||\n left.singular.localeCompare(right.singular) ||\n (left.plural ?? \"\").localeCompare(right.plural ?? \"\");\n\nconst inferLocations = (message: SourceMessage, sources: Map<string, string>): SourceMessage => {\n if (message.locations.length > 0) {\n return message;\n }\n\n const locations: SourceLocation[] = [];\n\n for (const [file, source] of sources) {\n const index = source.indexOf(message.sourceKey);\n\n if (index !== -1) {\n locations.push({ file, line: source.slice(0, index).split(\"\\n\").length });\n }\n }\n\n return { ...message, locations };\n};\n\nconst normalizedSourceFiles = (root: string, paths: string[]): string[] => {\n const files = paths\n .map((path) => resolve(root, path))\n .filter((path) => isPathWithin(root, path));\n\n return new Set(files).values().toArray().toSorted((left, right) => left.localeCompare(right));\n};\n\nconst findSourceMessages = async (root: string, sourceFiles: string[]): Promise<SourceMessage[]> => {\n if (sourceFiles.length === 0) {\n clearI18nResources(root);\n\n return [];\n }\n\n let extracted: ExtractedKeysMap | undefined;\n const { logger, reports } = quietLogger();\n\n const capture: Plugin = {\n name: \"gtkx-gettext\",\n onEnd(keys) {\n extracted = keys;\n },\n };\n\n const result = await runExtractor(i18nToolkitConfig(root, sourceFiles, [capture]), {\n logger,\n quiet: true,\n syncPrimaryWithDefaults: true,\n trustDerivedDefaults: true,\n });\n\n if (extracted === undefined || reports.length > 0 || result.hasErrors) {\n throw new Error(reports.join(\"\\n\") || \"i18next extraction failed\");\n }\n\n const sources = new Map(sourceFiles.map((file) => [file, readFileSync(file, \"utf8\")]));\n\n return sourceMessages(extracted.values().toArray())\n .map((message) => inferLocations(message, sources))\n .toSorted(compareMessages);\n};\n\nconst projectPath = (root: string, path: string): string | null => {\n const absolute = isAbsolute(path) ? resolve(path) : resolve(root, path);\n const projectRelative = relative(root, absolute);\n\n if (!isPathInside(root, absolute)) {\n return null;\n }\n\n return toPosixPath(projectRelative);\n};\n\nconst writePotfiles = (project: CatalogProject, sourceFiles: string[]): string => {\n const paths = sourceFiles\n .map((path) => projectPath(project.root, path))\n .filter((path): path is string => path !== null);\n\n const sorted = [...new Set(paths)].toSorted((left, right) => left.localeCompare(right));\n const target = resolve(project.poDir, POTFILES_FILENAME);\n writeFileSync(target, sorted.length === 0 ? \"\" : `${sorted.join(\"\\n\")}\\n`);\n\n return target;\n};\n\nconst renderCatalogCall = (message: SourceMessage): string => {\n const msgid = JSON.stringify(message.singular);\n\n if (message.plural !== null) {\n const plural = JSON.stringify(message.plural);\n\n return message.context === null\n ? `ngettext(${msgid}, ${plural}, 0);`\n : `npgettext(${JSON.stringify(message.context)}, ${msgid}, ${plural}, 0);`;\n }\n\n return message.context === null\n ? `gettext(${msgid});`\n : `pgettext(${JSON.stringify(message.context)}, ${msgid});`;\n};\n\nconst locatedOwners = (\n project: CatalogProject,\n message: SourceMessage,\n): { path: string; line: number | undefined }[] => {\n const owners: { path: string; line: number | undefined }[] = [];\n\n for (const location of message.locations) {\n const path = projectPath(project.root, location.file);\n\n if (path !== null) {\n owners.push({ path, line: location.line });\n }\n }\n\n const unique = new Map(owners.map((owner) => [`${owner.path}\\0${String(owner.line)}`, owner]));\n\n return unique.values().toArray();\n};\n\nconst sourceOwners = (\n project: CatalogProject,\n message: SourceMessage,\n): { path: string; line: number | undefined }[] => {\n const located = locatedOwners(project, message);\n\n return located.length > 0 ? located : [{ path: SYNTHETIC_FILENAME, line: undefined }];\n};\n\nconst syntheticEntries = (\n project: CatalogProject,\n messages: SourceMessage[],\n): Map<string, SyntheticEntry[]> => {\n const entries: Map<string, SyntheticEntry[]> = new Map();\n\n for (const message of messages) {\n for (const owner of sourceOwners(project, message)) {\n const owned = entries.get(owner.path) ?? [];\n owned.push({ call: renderCatalogCall(message), line: owner.line });\n entries.set(owner.path, owned);\n }\n }\n\n if (entries.size === 0) {\n entries.set(SYNTHETIC_FILENAME, []);\n }\n\n return entries;\n};\n\nconst compareSyntheticEntries = (left: SyntheticEntry, right: SyntheticEntry): number =>\n (left.line ?? Number.MAX_SAFE_INTEGER) - (right.line ?? Number.MAX_SAFE_INTEGER);\n\nconst lastSyntheticLine = (entries: SyntheticEntry[]): number => {\n let line = 0;\n\n for (const entry of entries) {\n line = Math.max(line, entry.line ?? 0);\n }\n\n return line;\n};\n\nconst appendSyntheticEntry = (lines: string[], entry: SyntheticEntry, requestedLine: number): void => {\n const index = requestedLine - 1;\n const existing = lines[index];\n\n if (existing === undefined || existing.length === 0) {\n lines[index] = entry.call;\n\n return;\n }\n\n lines[index] = `${existing} ${entry.call}`;\n};\n\nconst renderSyntheticSource = (entries: SyntheticEntry[]): string => {\n const lines: string[] = [];\n const sorted = entries.toSorted(compareSyntheticEntries);\n let nextLine = lastSyntheticLine(entries) + 1;\n\n for (const entry of sorted) {\n const requestedLine = Math.max(1, entry.line ?? nextLine++);\n appendSyntheticEntry(lines, entry, requestedLine);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n};\n\nconst writeSyntheticSources = (\n workDir: string,\n project: CatalogProject,\n messages: SourceMessage[],\n): string => {\n const entries = syntheticEntries(project, messages);\n const paths: string[] = [];\n\n for (const [path, owned] of entries) {\n const target = join(workDir, path);\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, renderSyntheticSource(owned));\n paths.push(path);\n }\n\n const potfiles = join(workDir, POTFILES_FILENAME);\n writeFileSync(potfiles, `${paths.toSorted((left, right) => left.localeCompare(right)).join(\"\\n\")}\\n`);\n\n return potfiles;\n};\n\nconst extractSourceMessages = ({ project, messages, output, workDir }: SourceExtraction): void => {\n const potfilesPath = writeSyntheticSources(workDir, project, messages);\n\n runCliTool({\n tool: \"xgettext\",\n args: [\n \"--language=JavaScript\",\n \"--from-code=UTF-8\",\n \"--force-po\",\n \"--keyword=gettext:1\",\n \"--keyword=ngettext:1,2\",\n \"--keyword=pgettext:1c,2\",\n \"--keyword=npgettext:1c,2,3\",\n `--directory=${workDir}`,\n `--files-from=${potfilesPath}`,\n `--output=${output}`,\n ],\n target: output,\n });\n};\n\nconst extractMetadataFragment = (project: CatalogProject, input: string, output: string): void => {\n runCliTool({\n tool: \"msggrep\",\n args: [\n \"--force-po\",\n `--output-file=${output}`,\n ...metadataTemplateFiles(project).map((file) => `--location=${file.relativePath}`),\n input,\n ],\n target: input,\n });\n};\n\nconst joinMetadataFragment = (output: string, fragment: string): void => {\n runCliTool({\n tool: \"xgettext\",\n args: [\"--language=PO\", \"--join-existing\", \"--force-po\", `--output=${output}`, fragment],\n target: output,\n });\n};\n\nconst extractCatalogTemplate = ({\n project,\n messages,\n shouldPreserveMetadataMessages,\n output = resolve(project.poDir, `${project.domain}.pot`),\n}: CatalogTemplateExtraction): void => {\n const workDir = mkdtempSync(join(project.poDir, \".gtkx-i18n-\"));\n const source = join(workDir, \"source.pot\");\n const hasPreviousTemplate = existsSync(output);\n\n try {\n if (shouldPreserveMetadataMessages && hasPreviousTemplate) {\n const fragment = join(workDir, \"metadata.pot\");\n extractMetadataFragment(project, output, fragment);\n extractSourceMessages({ project, messages, output: source, workDir });\n joinMetadataFragment(source, fragment);\n } else {\n extractSourceMessages({ project, messages, output: source, workDir });\n }\n\n replaceCatalogTemplate(source, output);\n } finally {\n rmSync(workDir, { recursive: true, force: true });\n }\n};\n\nconst extractSourceCatalogTo = async (\n project: CatalogProject,\n paths: string[],\n output: string,\n): Promise<void> => {\n const sourceFiles = normalizedSourceFiles(project.root, paths);\n const messages = await findSourceMessages(project.root, sourceFiles);\n writePotfiles(project, sourceFiles);\n extractCatalogTemplate({ project, messages, shouldPreserveMetadataMessages: false, output });\n};\n\nconst extractSourceCatalog = async (\n project: CatalogProject,\n paths: string[],\n shouldPreserveMetadataMessages = true,\n): Promise<void> => {\n const sourceFiles = normalizedSourceFiles(project.root, paths);\n const messages = await findSourceMessages(project.root, sourceFiles);\n writePotfiles(project, sourceFiles);\n extractCatalogTemplate({ project, messages, shouldPreserveMetadataMessages });\n};\n\nexport { extractSourceCatalog, extractSourceCatalogTo };\n"]}
@@ -1,10 +1,9 @@
1
- import type { SourceMessage } from "./source-messages.js";
2
- type I18nTypesResult = {
3
- isWritten: boolean;
4
- path: string;
5
- };
1
+ import type { I18nextToolkitConfig, Plugin } from "i18next-cli";
6
2
  declare const I18N_TYPES_FILENAME = "i18n.d.ts";
7
3
  declare const i18nTypesPath: (root: string) => string;
8
- declare const emitI18nTypes: (root: string, messages: SourceMessage[], isEnabled?: boolean) => I18nTypesResult;
9
- export { I18N_TYPES_FILENAME, emitI18nTypes, i18nTypesPath };
4
+ declare const clearI18nResources: (root: string) => void;
5
+ declare const i18nToolkitConfig: (root: string, sourceFiles: string[], plugins?: Plugin[]) => I18nextToolkitConfig;
6
+ declare const emitI18nTypes: (root: string) => Promise<void>;
7
+ declare const clearI18nTypes: (root: string) => void;
8
+ export { I18N_TYPES_FILENAME, clearI18nResources, clearI18nTypes, emitI18nTypes, i18nToolkitConfig, i18nTypesPath, };
10
9
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/i18n/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,KAAK,eAAe,GAAG;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,QAAA,MAAM,mBAAmB,cAAc,CAAC;AAwHxC,QAAA,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAkE,CAAC;AAUzG,QAAA,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,UAAU,aAAa,EAAE,EAAE,mBAAgB,KAAG,eAYlF,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/i18n/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAU,MAAM,EAAE,MAAM,aAAa,CAAC;AAOxE,QAAA,MAAM,mBAAmB,cAAc,CAAC;AAKxC,QAAA,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAuD,CAAC;AAG9F,QAAA,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,IAE1C,CAAC;AAEF,QAAA,MAAM,iBAAiB,GACnB,MAAM,MAAM,EACZ,aAAa,MAAM,EAAE,EACrB,UAAS,MAAM,EAAO,KACvB,oBA0BD,CAAC;AA6CH,QAAA,MAAM,aAAa,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAUvD,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,IAItC,CAAC;AAEF,OAAO,EACH,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,GAChB,CAAC"}