@pulsetechnologies/i18n 0.3.0 → 0.5.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/README.md CHANGED
@@ -54,6 +54,7 @@ Commands:
54
54
  |---|---|
55
55
  | `npx pulse-i18n check` | **The CI gate.** Exits 1 when, for any language, a string is missing, a translation was made from English that has since changed, a key no longer exists in English, or a `{{placeholder}}`, `$t()` or `<0>` tag, or a glossary term, was dropped or invented. Plural forms are checked per language: Arabic needs 6, Japanese 1, and Spanish, French and Portuguese need `_many`. Pending reviews show as warnings. |
56
56
  | `npx pulse-i18n translate [--locale es,fr] [--batch 60] [--parallel 4]` | Fills exactly what `check` flags, translating up to `--parallel` languages at once (default 4: about a quarter of the one-at-a-time time), using Claude Opus 5.5 (structured JSON output, `fallbacks: "default"`, a cached prompt prefix). It validates every answer, retries once naming the problem, and reports anything still wrong without writing it. Needs `ANTHROPIC_API_KEY` (or `ant auth login`) and `npm i -D @anthropic-ai/sdk`. |
57
+ | `npx pulse-i18n extract <files…> [--write] [--project tsconfig.json]` | **Codemod**: moves a React/TSX app's English into the catalog. JSX text (joined with text-typed `{values}` into one message), UI attributes, `setErr`/`notify`/`confirm`-style calls, and sentences with simple inline markup (as `<Trans>`) become `t()` calls, with the exact rendered English as the catalog value, so English output can't change. Uses the type checker so a React element is never folded into a string. Computed values with no English in them (`list.join(", ")`, dates) and `"Hi " + name` chains join the message; `<code>` content stays a value. Add your own message helpers with `"calls": { "run": [1] }` (callee → argument positions). Re-runs reuse the name `t` was imported under. Reports what it leaves for a person: module-level constants, data-table labels, values that hold English (plurals), nested markup. Needs `"extract": { "import": "src/i18n.ts" }` in the config and `typescript` installed. Dry run unless `--write`. |
57
58
  | `npx pulse-i18n approve <locale> [prefix]` | Marks reviewed translations as approved. |
58
59
 
59
60
  `translate` keeps `<dir>/.pulse-i18n-lock.json` (commit it). It records the English each translation was made from, so:
package/dist/tools/cli.js CHANGED
@@ -3,6 +3,8 @@
3
3
  // pulse-i18n check CI gate; exits 1 when anything is missing, outdated or broken
4
4
  // pulse-i18n translate [--locale es,fr] [--batch 60] [--parallel 4]
5
5
  // fill what check flags, with Claude (needs ANTHROPIC_API_KEY)
6
+ // pulse-i18n extract <files…> [--write] [--project tsconfig.json]
7
+ // move a React app's English text into the catalog (codemod)
6
8
  // pulse-i18n approve <locale> [prefix]
7
9
  // mark translations a person has reviewed
8
10
  //
@@ -14,6 +16,7 @@ import { dirname, resolve } from "node:path";
14
16
  import { isLocaleCode } from "../locales.js";
15
17
  import { claudeTranslator } from "./claude.js";
16
18
  import { approve, check, translate } from "./pipeline.js";
19
+ import { formatExtract, readExtractConfig, runExtract } from "./extract-cli.js";
17
20
  function flag(args, name) {
18
21
  const i = args.indexOf(`--${name}`);
19
22
  return i >= 0 ? args[i + 1] : undefined;
@@ -70,6 +73,18 @@ export async function main(argv) {
70
73
  console.error(`FAILED ${f.locale}/${f.ns} ${f.key}: ${f.problems.join("; ")}`);
71
74
  return r.failed.length ? 1 : 0;
72
75
  }
76
+ if (cmd === "extract") {
77
+ const configPath = resolve(flag(args, "config") ?? "pulse-i18n.config.json");
78
+ const write = args.includes("--write");
79
+ const project = flag(args, "project") ?? "tsconfig.json";
80
+ const files = args.filter((a, i) => !a.startsWith("--") && !["--config", "--project"].includes(args[i - 1] ?? ""));
81
+ if (!files.length)
82
+ throw new Error("usage: pulse-i18n extract <files…> [--write] [--project tsconfig.json]");
83
+ const summaries = await runExtract(readExtractConfig(configPath), files, { write, project });
84
+ for (const line of formatExtract(summaries, write))
85
+ console.log(line);
86
+ return 0;
87
+ }
73
88
  if (cmd === "approve") {
74
89
  const [locale, prefix] = args.filter((a) => !a.startsWith("--") && a !== flag(args, "config"));
75
90
  if (!isLocaleCode(locale))
@@ -77,7 +92,7 @@ export async function main(argv) {
77
92
  console.log(`approved ${approve(cfg, locale, prefix ?? "")} in ${locale}`);
78
93
  return 0;
79
94
  }
80
- console.error("usage: pulse-i18n check | translate [--locale es,fr] [--batch 60] [--parallel 4] | approve <locale> [prefix] [--config file]");
95
+ console.error("usage: pulse-i18n check | translate [--locale es,fr] [--batch 60] [--parallel 4] | extract <files…> [--write] | approve <locale> [prefix] [--config file]");
81
96
  return 2;
82
97
  }
83
98
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/tools/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/tools/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type Finding } from "./extract.js";
2
+ import type { PipelineConfig } from "./pipeline.js";
3
+ export interface ExtractConfig {
4
+ /** The app's i18n module that exports `t` (relative to the config file), e.g. "src/i18n.ts". */
5
+ import: string;
6
+ /** Extension to use in the import specifier: ".js" (NodeNext / bundler style) or "" (none). */
7
+ importExtension?: string;
8
+ /** Catalog namespace (file) to add keys to; default "common". */
9
+ namespace?: string;
10
+ /** The app's own message helpers: callee name -> argument positions holding UI text, e.g. { "run": [1] }. */
11
+ calls?: Record<string, number[]>;
12
+ }
13
+ export interface ExtractSummary {
14
+ file: string;
15
+ converted: number;
16
+ skipped: Finding[];
17
+ }
18
+ export declare function runExtract(cfg: PipelineConfig & {
19
+ extract?: ExtractConfig;
20
+ configDir: string;
21
+ }, files: string[], opts: {
22
+ write: boolean;
23
+ project: string;
24
+ }): Promise<ExtractSummary[]>;
25
+ export declare function formatExtract(summaries: ExtractSummary[], write: boolean): string[];
26
+ /** Read the raw config (with its directory) for extract, which needs more than the pipeline does. */
27
+ export declare function readExtractConfig(path: string): PipelineConfig & {
28
+ extract?: ExtractConfig;
29
+ configDir: string;
30
+ };
@@ -0,0 +1,74 @@
1
+ // `pulse-i18n extract <files…> [--write] [--project tsconfig.json]`: run the codemod over an app.
2
+ // Without --write it only reports. typescript is an optional peer: only this command loads it.
3
+ import { readFileSync, writeFileSync } from "node:fs";
4
+ import { basename, dirname, relative, resolve } from "node:path";
5
+ import { SOURCE_LOCALE } from "../locales.js";
6
+ import { readCatalog, writeCatalog } from "./catalogs.js";
7
+ import { extractFile } from "./extract.js";
8
+ const prefixFor = (file) => {
9
+ const b = basename(file).replace(/\.[^.]+$/, "").replace(/[^A-Za-z0-9]+(.)?/g, (_m, c) => (c ? c.toUpperCase() : ""));
10
+ return b[0].toLowerCase() + b.slice(1);
11
+ };
12
+ export async function runExtract(cfg, files, opts) {
13
+ if (!cfg.extract?.import)
14
+ throw new Error('pulse-i18n.config.json needs "extract": { "import": "src/i18n.ts" } (the module that exports t)');
15
+ let ts;
16
+ try {
17
+ ts = (await import("typescript")).default ?? (await import("typescript"));
18
+ }
19
+ catch {
20
+ throw new Error("pulse-i18n extract needs typescript: npm i -D typescript");
21
+ }
22
+ const projectFile = resolve(opts.project);
23
+ const parsed = ts.getParsedCommandLineOfConfigFile(projectFile, {}, { ...ts.sys, onUnRecoverableConfigFileDiagnostic: (d) => { throw new Error(ts.flattenDiagnosticMessageText(d.messageText, "\n")); } });
24
+ if (!parsed)
25
+ throw new Error(`could not read ${projectFile}`);
26
+ const targets = files.map((f) => resolve(f));
27
+ const program = ts.createProgram({ rootNames: [...new Set([...parsed.fileNames, ...targets])], options: { ...parsed.options, noEmit: true } });
28
+ const checker = program.getTypeChecker();
29
+ const ns = cfg.extract.namespace ?? "common";
30
+ const catalog = readCatalog(cfg.dir, SOURCE_LOCALE, ns);
31
+ const added = new Map();
32
+ const i18nModule = resolve(cfg.configDir, cfg.extract.import);
33
+ const ext = cfg.extract.importExtension ?? ".js";
34
+ const summaries = [];
35
+ for (const file of targets) {
36
+ const sf = program.getSourceFile(file);
37
+ if (!sf)
38
+ throw new Error(`${file} is not part of ${projectFile}`);
39
+ let spec = relative(dirname(file), i18nModule).replace(/\\/g, "/").replace(/\.(ts|tsx)$/, ext);
40
+ if (!spec.startsWith("."))
41
+ spec = `./${spec}`;
42
+ const taken = new Map([...catalog, ...added]);
43
+ const r = extractFile(ts, sf, { prefix: prefixFor(file), importFrom: spec, calls: cfg.extract.calls }, taken, checker);
44
+ for (const [k, v] of r.messages)
45
+ if (!catalog.has(k))
46
+ added.set(k, v);
47
+ summaries.push({ file: relative(process.cwd(), file), converted: r.converted, skipped: r.skipped });
48
+ if (opts.write && r.converted)
49
+ writeFileSync(file, r.code);
50
+ }
51
+ if (opts.write && added.size)
52
+ writeCatalog(cfg.dir, SOURCE_LOCALE, ns, [...catalog, ...added]);
53
+ return summaries;
54
+ }
55
+ export function formatExtract(summaries, write) {
56
+ const lines = [];
57
+ let converted = 0;
58
+ let skipped = 0;
59
+ for (const s of summaries) {
60
+ converted += s.converted;
61
+ skipped += s.skipped.length;
62
+ lines.push(`${s.file}: ${s.converted} converted${s.skipped.length ? `, ${s.skipped.length} left for a person` : ""}`);
63
+ for (const f of s.skipped)
64
+ lines.push(` ${s.file}:${f.line} ${f.reason}: ${JSON.stringify(f.text.slice(0, 120))}`);
65
+ }
66
+ lines.push(`${write ? "converted" : "would convert"} ${converted} strings; ${skipped} left for a person${write ? "" : " (dry run: add --write)"}`);
67
+ return lines;
68
+ }
69
+ /** Read the raw config (with its directory) for extract, which needs more than the pipeline does. */
70
+ export function readExtractConfig(path) {
71
+ const raw = JSON.parse(readFileSync(path, "utf8"));
72
+ return { ...raw, dir: resolve(dirname(path), raw.dir), configDir: dirname(path) };
73
+ }
74
+ //# sourceMappingURL=extract-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-cli.js","sourceRoot":"","sources":["../../src/tools/extract-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type * as TS from "typescript";
2
+ export interface ExtractOptions {
3
+ /** Prefix for this file's keys, e.g. "app" for App.tsx. */
4
+ prefix: string;
5
+ /** Module specifier this file imports `t` from, e.g. "./i18n.js". */
6
+ importFrom: string;
7
+ attributes?: string[];
8
+ callees?: string[];
9
+ /** The app's own message helpers: callee name -> which arguments hold UI text, e.g. { run: [1] }. */
10
+ calls?: Record<string, number[]>;
11
+ }
12
+ export interface Finding {
13
+ line: number;
14
+ reason: string;
15
+ text: string;
16
+ }
17
+ export interface ExtractResult {
18
+ code: string;
19
+ /** New catalog entries, key → English. */
20
+ messages: Map<string, string>;
21
+ skipped: Finding[];
22
+ converted: number;
23
+ }
24
+ export declare const DEFAULT_ATTRIBUTES: string[];
25
+ export declare const DEFAULT_CALLEES: string[];
26
+ /** JSX text as React renders it (Babel's cleanJSXElementLiteralChild), entities still encoded. */
27
+ export declare function cleanJsxText(raw: string): string;
28
+ /**
29
+ * `checker` (from a ts.Program over the app) decides which {values} may join a sentence: only ones
30
+ * typed as text or numbers. A React element folded into a translated string would print
31
+ * "[object Object]", and a boolean React renders as nothing would print "true". Without a checker,
32
+ * no value joins a sentence (each piece of text becomes its own message).
33
+ */
34
+ export declare function extractFile(ts: typeof TS, sf: TS.SourceFile, opts: ExtractOptions, taken: Map<string, string>, checker?: TS.TypeChecker): ExtractResult;
@@ -0,0 +1,485 @@
1
+ export const DEFAULT_ATTRIBUTES = ["placeholder", "title", "aria-label", "alt", "label", "aria-description", "aria-placeholder"];
2
+ export const DEFAULT_CALLEES = ["setErr", "setError", "setMsg", "setMessage", "setNotice", "setInfo", "setStatus", "notify", "toast", "confirm", "alert", "prompt"];
3
+ const SKIP_TAGS = new Set(["code", "pre", "kbd", "samp", "style", "script", "svg", "path", "g", "circle", "rect", "line", "polyline", "polygon", "text", "tspan"]);
4
+ const INLINE_TAGS = new Set(["b", "strong", "i", "em", "a", "span", "small", "u", "mark", "sup", "sub", "abbr", "time", "q", "s", "del", "ins", "br", "label"]);
5
+ const UI_PROPS = new Set(["label", "title", "description", "placeholder", "text", "message", "hint", "help", "tooltip", "heading", "subtitle", "caption", "empty", "cta"]);
6
+ const HAS_LETTER = /\p{L}/u;
7
+ // React decodes HTML entities in JSX text; the catalog must hold the decoded character.
8
+ const ENTITIES = {
9
+ amp: "&", lt: "<", gt: ">", quot: "\"", apos: "'", nbsp: " ", rsquo: "’", lsquo: "‘", rdquo: "”", ldquo: "“",
10
+ middot: "·", hellip: "…", mdash: "—", ndash: "–", copy: "©", reg: "®", trade: "™", times: "×", rarr: "→", larr: "←",
11
+ uarr: "↑", darr: "↓", bull: "•", deg: "°", euro: "€", pound: "£", yen: "¥", cent: "¢", laquo: "«", raquo: "»", check: "✓",
12
+ };
13
+ function decodeEntities(s) {
14
+ let bad = false;
15
+ const out = s.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (m, e) => {
16
+ if (e[0] === "#")
17
+ return String.fromCodePoint(e[1] === "x" || e[1] === "X" ? parseInt(e.slice(2), 16) : parseInt(e.slice(1), 10));
18
+ const v = ENTITIES[e.toLowerCase()];
19
+ if (v === undefined)
20
+ bad = true;
21
+ return v ?? m;
22
+ });
23
+ return bad ? null : out;
24
+ }
25
+ /** JSX text as React renders it (Babel's cleanJSXElementLiteralChild), entities still encoded. */
26
+ export function cleanJsxText(raw) {
27
+ const lines = raw.split(/\r\n|\n|\r/);
28
+ let lastNonEmpty = 0;
29
+ lines.forEach((l, i) => { if (/[^ \t]/.test(l))
30
+ lastNonEmpty = i; });
31
+ let out = "";
32
+ lines.forEach((line, i) => {
33
+ let s = line.replace(/\t/g, " ");
34
+ if (i !== 0)
35
+ s = s.replace(/^[ ]+/, "");
36
+ if (i !== lines.length - 1)
37
+ s = s.replace(/[ ]+$/, "");
38
+ if (s)
39
+ out += i !== lastNonEmpty ? `${s} ` : s;
40
+ });
41
+ return out;
42
+ }
43
+ function camel(words) {
44
+ return words.map((w, i) => (i === 0 ? w.toLowerCase() : w[0].toUpperCase() + w.slice(1).toLowerCase())).join("");
45
+ }
46
+ /**
47
+ * `checker` (from a ts.Program over the app) decides which {values} may join a sentence: only ones
48
+ * typed as text or numbers. A React element folded into a translated string would print
49
+ * "[object Object]", and a boolean React renders as nothing would print "true". Without a checker,
50
+ * no value joins a sentence (each piece of text becomes its own message).
51
+ */
52
+ export function extractFile(ts, sf, opts, taken, checker) {
53
+ const source = sf.text;
54
+ const fileName = sf.fileName;
55
+ const attributes = new Set(opts.attributes ?? DEFAULT_ATTRIBUTES);
56
+ const calls = new Map([...(opts.callees ?? DEFAULT_CALLEES).map((c) => [c, [0]]), ...Object.entries(opts.calls ?? {})]);
57
+ const messages = new Map();
58
+ const skipped = [];
59
+ const edits = [];
60
+ let usesTrans = false;
61
+ const line = (pos) => sf.getLineAndCharacterOfPosition(pos).line + 1;
62
+ // The name `t` is imported as: plain `t`, unless the file already uses that identifier anywhere.
63
+ const idents = new Set();
64
+ const collect = (n) => { if (ts.isIdentifier(n))
65
+ idents.add(n.text); n.forEachChild(collect); };
66
+ collect(sf);
67
+ // Reuse the name a previous run imported t under, so re-running never adds a second import.
68
+ const prior = sf.statements.filter(ts.isImportDeclaration).flatMap((d) => ts.isStringLiteral(d.moduleSpecifier) && d.moduleSpecifier.text === opts.importFrom && d.importClause?.namedBindings && ts.isNamedImports(d.importClause.namedBindings)
69
+ ? d.importClause.namedBindings.elements.filter((el) => (el.propertyName ?? el.name).text === "t").map((el) => el.name.text)
70
+ : [])[0];
71
+ const T = prior ?? ["t", "tr", "tx", "i18nT"].find((n) => !idents.has(n));
72
+ const keyFor = (text) => {
73
+ for (const [k, v] of messages)
74
+ if (v === text)
75
+ return k;
76
+ for (const [k, v] of taken)
77
+ if (v === text && k.startsWith(`${opts.prefix}.`))
78
+ return k;
79
+ const words = text.replace(/\{\{\w+\}\}/g, " ").normalize("NFKD").replace(/[^\p{L}\p{N}]+/gu, " ").trim().split(/\s+/).filter(Boolean).slice(0, 5);
80
+ const base = `${opts.prefix}.${camel(words.length ? words : ["text"])}`;
81
+ let key = base;
82
+ for (let i = 2; taken.has(key) || messages.has(key); i++)
83
+ key = `${base}${i}`;
84
+ return key;
85
+ };
86
+ const insideFunction = (n) => {
87
+ for (let p = n.parent; p; p = p.parent) {
88
+ if (ts.isFunctionLike(p))
89
+ return true;
90
+ }
91
+ return false;
92
+ };
93
+ /** Text-like for React: every part of the type is a string or number (null/undefined allowed). */
94
+ const textTyped = (e) => {
95
+ if (!checker)
96
+ return false;
97
+ const type = checker.getTypeAtLocation(e);
98
+ const parts = type.isUnion() ? type.types : [type];
99
+ const ok = ts.TypeFlags.StringLike | ts.TypeFlags.NumberLike | ts.TypeFlags.Null | ts.TypeFlags.Undefined;
100
+ return parts.some((p) => (p.flags & (ts.TypeFlags.StringLike | ts.TypeFlags.NumberLike)) !== 0) && parts.every((p) => (p.flags & ok) !== 0);
101
+ };
102
+ const nullable = (e) => {
103
+ if (!checker)
104
+ return false;
105
+ const type = checker.getTypeAtLocation(e);
106
+ return (type.isUnion() ? type.types : [type]).some((p) => (p.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) !== 0);
107
+ };
108
+ /** A placeholder-able expression: names and property chains, simple calls, numbers. */
109
+ const isSimple = (e) => ts.isIdentifier(e) || ts.isNumericLiteral(e) ||
110
+ ((ts.isPropertyAccessExpression(e) || ts.isNonNullExpression(e) || ts.isParenthesizedExpression(e)) && isSimple(e.expression)) ||
111
+ (ts.isElementAccessExpression(e) && isSimple(e.expression)) ||
112
+ (ts.isCallExpression(e) && isSimple(e.expression) && e.arguments.every((a) => isSimple(a) || ts.isStringLiteral(a)));
113
+ const nameOf = (e) => {
114
+ if (ts.isIdentifier(e))
115
+ return e.text;
116
+ if (ts.isPropertyAccessExpression(e))
117
+ return e.name.text;
118
+ if (ts.isNonNullExpression(e) || ts.isParenthesizedExpression(e))
119
+ return nameOf(e.expression);
120
+ if (ts.isCallExpression(e)) {
121
+ // list.join(", ") is about the list; x.toLocaleString() about x.
122
+ const callee = e.expression;
123
+ if (ts.isPropertyAccessExpression(callee) && ["join", "toLocaleString", "toString", "toFixed", "trim", "toUpperCase", "toLowerCase", "slice", "toLocaleDateString", "toLocaleTimeString", "toISOString"].includes(callee.name.text))
124
+ return nameOf(callee.expression);
125
+ return nameOf(callee);
126
+ }
127
+ if (ts.isNewExpression(e))
128
+ return nameOf(e.expression) === "Date" ? "date" : "value";
129
+ if (ts.isElementAccessExpression(e))
130
+ return nameOf(e.expression);
131
+ return "value";
132
+ };
133
+ const varsFor = (exprs) => {
134
+ const used = new Map();
135
+ return exprs.map((e) => {
136
+ let n = nameOf(e).replace(/[^A-Za-z0-9_]/g, "") || "value";
137
+ if (n === T)
138
+ n = "value";
139
+ const c = used.get(n) ?? 0;
140
+ used.set(n, c + 1);
141
+ // React renders null/undefined as nothing; i18next would print the {{placeholder}} itself.
142
+ return { name: c ? `${n}${c + 1}` : n, expr: nullable(e) ? `${e.getText(sf)} ?? ""` : e.getText(sf) };
143
+ });
144
+ };
145
+ const call = (key, vars) => vars.length ? `${T}(${JSON.stringify(key)}, { ${vars.map((v) => (v.name === v.expr ? v.name : `${v.name}: ${v.expr}`)).join(", ")} })` : `${T}(${JSON.stringify(key)})`;
146
+ /** No English of its own: no string literal with letters inside (t() calls are already translated). */
147
+ const letterFree = (e) => {
148
+ let ok = true;
149
+ const walk = (n) => {
150
+ if (!ok)
151
+ return;
152
+ if (ts.isCallExpression(n) && ts.isIdentifier(n.expression) && n.expression.text === T)
153
+ return;
154
+ if ((ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n) || ts.isTemplateHead(n) || ts.isTemplateMiddle(n) || ts.isTemplateTail(n)) && HAS_LETTER.test(n.text)) {
155
+ ok = false;
156
+ return;
157
+ }
158
+ n.forEachChild(walk);
159
+ };
160
+ walk(e);
161
+ return ok;
162
+ };
163
+ /** Rewrite a UI string expression in place: literals, templates, and the branches of ?: / ?? / ||. */
164
+ const convertExpr = (e, where) => {
165
+ if (ts.isParenthesizedExpression(e))
166
+ return convertExpr(e.expression, where);
167
+ if (ts.isConditionalExpression(e)) {
168
+ convertExpr(e.whenTrue, where);
169
+ convertExpr(e.whenFalse, where);
170
+ return;
171
+ }
172
+ if (ts.isBinaryExpression(e) && [ts.SyntaxKind.QuestionQuestionToken, ts.SyntaxKind.BarBarToken].includes(e.operatorToken.kind)) {
173
+ convertExpr(e.left, where);
174
+ convertExpr(e.right, where);
175
+ return;
176
+ }
177
+ let text = null;
178
+ let vars = [];
179
+ if (ts.isStringLiteral(e) || ts.isNoSubstitutionTemplateLiteral(e))
180
+ text = e.text;
181
+ else if (ts.isTemplateExpression(e)) {
182
+ const spans = e.templateSpans;
183
+ // A value may join the message when it's simple, or when it holds no English of its own
184
+ // (`${list.join(", ")}`, a date); one that does (`${n === 1 ? "" : "s"}`) needs a person.
185
+ if (!spans.every((s) => isSimple(s.expression) || letterFree(s.expression))) {
186
+ if (HAS_LETTER.test(e.head.text + spans.map((s) => s.literal.text).join("")))
187
+ skipped.push({ line: line(e.getStart(sf)), reason: `${where}: template with English inside a value`, text: e.getText(sf) });
188
+ return;
189
+ }
190
+ vars = varsFor(spans.map((s) => s.expression));
191
+ text = e.head.text + spans.map((s, i) => `{{${vars[i].name}}}${s.literal.text}`).join("");
192
+ }
193
+ else if (ts.isBinaryExpression(e) && e.operatorToken.kind === ts.SyntaxKind.PlusToken) {
194
+ // "a" + x + "b": the same as a template, but only when text starts the chain. 1 + 2 + " items"
195
+ // adds the numbers first, which a template would not.
196
+ const ops = [];
197
+ const flat = (x) => {
198
+ if (ts.isBinaryExpression(x) && x.operatorToken.kind === ts.SyntaxKind.PlusToken) {
199
+ flat(x.left);
200
+ ops.push(x.right);
201
+ }
202
+ else if (ts.isParenthesizedExpression(x) && ts.isBinaryExpression(x.expression) && x.expression.operatorToken.kind === ts.SyntaxKind.PlusToken)
203
+ ops.push(x);
204
+ else
205
+ ops.push(x);
206
+ };
207
+ flat(e);
208
+ const lit = (x) => ts.isStringLiteral(x) || ts.isNoSubstitutionTemplateLiteral(x);
209
+ if (!(lit(ops[0]) || lit(ops[1])) || !ops.some((x) => lit(x) && HAS_LETTER.test(x.text)))
210
+ return;
211
+ const values = ops.filter((x) => !lit(x));
212
+ if (!values.every((x) => isSimple(x) || letterFree(x))) {
213
+ skipped.push({ line: line(e.getStart(sf)), reason: `${where}: joined text with English inside a value`, text: e.getText(sf).slice(0, 160) });
214
+ return;
215
+ }
216
+ vars = varsFor(values);
217
+ let k = 0;
218
+ text = ops.map((x) => (lit(x) ? x.text : `{{${vars[k++].name}}}`)).join("");
219
+ }
220
+ else
221
+ return;
222
+ if (!text || !HAS_LETTER.test(text.replace(/\{\{\w+\}\}/g, "")))
223
+ return;
224
+ if (!insideFunction(e)) {
225
+ skipped.push({ line: line(e.getStart(sf)), reason: `${where} at module level (evaluated once; move it into a function)`, text });
226
+ return;
227
+ }
228
+ const key = keyFor(text);
229
+ messages.set(key, text);
230
+ edits.push({ start: e.getStart(sf), end: e.getEnd(), text: call(key, vars) });
231
+ };
232
+ const CODE_TAGS = new Set(["code", "kbd", "samp"]);
233
+ const isInline = (c) => (ts.isJsxElement(c) && (INLINE_TAGS.has(c.openingElement.tagName.getText(sf)) || CODE_TAGS.has(c.openingElement.tagName.getText(sf)))) ||
234
+ (ts.isJsxSelfClosingElement(c) && INLINE_TAGS.has(c.tagName.getText(sf)));
235
+ /** Children of a JSX element: runs of text and simple {values} become one message each. Returns
236
+ * true when the children are one sentence with inline markup, left whole for a person. */
237
+ /**
238
+ * One sentence with simple inline markup becomes <Trans>: the translator sees
239
+ * "Click <1>Manage logins</1> to …" and every language keeps the bold. Simple means each inline
240
+ * element holds only text and text-typed {values}, nothing nested. Returns false otherwise.
241
+ */
242
+ const transConvert = (children) => {
243
+ const components = [];
244
+ const exprs = [];
245
+ const literals = [];
246
+ const piece = (c, nested) => {
247
+ // <code>customer_id</code> inside a sentence: kept as a component whose content is a value, so
248
+ // the sentence translates and the code itself can't be.
249
+ if (!nested && ts.isJsxElement(c) && ["code", "kbd", "samp"].includes(c.openingElement.tagName.getText(sf)) && c.children.every((x) => ts.isJsxText(x))) {
250
+ const text = decodeEntities(cleanJsxText(c.children.map((x) => x.text).join("")));
251
+ if (text === null)
252
+ return null;
253
+ literals.push(text);
254
+ const open = c.openingElement;
255
+ const attrs = open.attributes.getText(sf).trim();
256
+ components.push(`<${open.tagName.getText(sf)}${attrs ? ` ${attrs}` : ""} />`);
257
+ const i = components.length - 1;
258
+ return `<${i}>\u0001${literals.length - 1}\u0001</${i}>`;
259
+ }
260
+ if (ts.isJsxText(c))
261
+ return decodeEntities(cleanJsxText(c.text));
262
+ if (ts.isJsxExpression(c)) {
263
+ if (!c.expression)
264
+ return "";
265
+ const e = c.expression;
266
+ if (ts.isStringLiteral(e) || ts.isNoSubstitutionTemplateLiteral(e))
267
+ return e.text;
268
+ if (isSimple(e) && textTyped(e)) {
269
+ exprs.push(e);
270
+ return `\u0000${exprs.length - 1}\u0000`;
271
+ }
272
+ return null;
273
+ }
274
+ if (nested || !ts.isJsxElement(c) || !INLINE_TAGS.has(c.openingElement.tagName.getText(sf)))
275
+ return null;
276
+ const inner = [];
277
+ for (const x of c.children) {
278
+ const p = piece(x, true);
279
+ if (p === null)
280
+ return null;
281
+ inner.push(p);
282
+ }
283
+ const open = c.openingElement;
284
+ const attrs = open.attributes.getText(sf).trim();
285
+ components.push(`<${open.tagName.getText(sf)}${attrs ? ` ${attrs}` : ""} />`);
286
+ const i = components.length - 1;
287
+ return `<${i}>${inner.join("")}</${i}>`;
288
+ };
289
+ const pieces = [];
290
+ for (const c of children) {
291
+ const p = piece(c, false);
292
+ if (p === null)
293
+ return false;
294
+ pieces.push(p);
295
+ }
296
+ const vars = varsFor(exprs);
297
+ const codeVars = literals.map((text, i) => ({ name: `code${literals.length > 1 ? i + 1 : ""}`, expr: JSON.stringify(text) }));
298
+ vars.push(...codeVars);
299
+ const message = pieces
300
+ .join("")
301
+ .replace(/\u0000(\d+)\u0000/g, (_m, i) => `{{${vars[Number(i)].name}}}`)
302
+ .replace(/\u0001(\d+)\u0001/g, (_m, i) => `{{${codeVars[Number(i)].name}}}`)
303
+ .trim();
304
+ if (!insideFunction(children[0])) {
305
+ skipped.push({ line: line(children[0].getStart(sf)), reason: "JSX at module level", text: message });
306
+ return true;
307
+ }
308
+ const key = keyFor(message);
309
+ messages.set(key, message);
310
+ const start = children[0].getFullStart();
311
+ const end = children[children.length - 1].getEnd();
312
+ const original = source.slice(start, end);
313
+ const lead = original.match(/^\s*/)[0];
314
+ const trail = original.slice(lead.length).match(/\s*$/)[0];
315
+ const values = vars.length ? ` values={{ ${vars.map((v) => (v.name === v.expr ? v.name : `${v.name}: ${v.expr}`)).join(", ")} }}` : "";
316
+ edits.push({ start: start + lead.length, end: end - trail.length, text: `<Trans i18nKey=${JSON.stringify(key)} components={[${components.join(", ")}]}${values} />` });
317
+ usesTrans = true;
318
+ return true;
319
+ };
320
+ const convertChildren = (children) => {
321
+ const hasInline = children.some(isInline);
322
+ const hasText = children.some((c) => ts.isJsxText(c) && HAS_LETTER.test(c.text));
323
+ if (hasInline && hasText) {
324
+ if (transConvert(children))
325
+ return true;
326
+ const first = children.find((c) => ts.isJsxText(c) && HAS_LETTER.test(c.text));
327
+ skipped.push({ line: line(first.getStart(sf)), reason: "text mixed with inline markup (use <Trans>)", text: children.map((c) => c.getText(sf)).join("").replace(/\s+/g, " ").trim().slice(0, 160) });
328
+ return true;
329
+ }
330
+ let run = [];
331
+ const flush = () => {
332
+ if (!run.length)
333
+ return;
334
+ const parts = [];
335
+ for (const c of run) {
336
+ if (ts.isJsxText(c))
337
+ parts.push({ text: cleanJsxText(c.text) });
338
+ else if (ts.isJsxExpression(c) && c.expression && (ts.isStringLiteral(c.expression) || ts.isNoSubstitutionTemplateLiteral(c.expression)))
339
+ parts.push({ text: c.expression.text });
340
+ else if (ts.isJsxExpression(c) && c.expression)
341
+ parts.push({ expr: c.expression });
342
+ }
343
+ const raw = parts.filter((p) => p.text !== undefined).map((p) => p.text).join("");
344
+ const decoded = decodeEntities(raw);
345
+ if (!HAS_LETTER.test(raw)) {
346
+ run = [];
347
+ return;
348
+ }
349
+ if (decoded === null) {
350
+ skipped.push({ line: line(run[0].getStart(sf)), reason: "unknown HTML entity", text: raw });
351
+ run = [];
352
+ return;
353
+ }
354
+ const exprs = parts.filter((p) => p.expr).map((p) => p.expr);
355
+ const vars = varsFor(exprs);
356
+ let k = 0;
357
+ const message = parts.map((p) => (p.expr ? `{{${vars[k++].name}}}` : decodeEntities(p.text))).join("");
358
+ if (!insideFunction(run[0])) {
359
+ skipped.push({ line: line(run[0].getStart(sf)), reason: "JSX at module level", text: message });
360
+ run = [];
361
+ return;
362
+ }
363
+ const trimmed = message.trim();
364
+ const key = keyFor(trimmed);
365
+ messages.set(key, trimmed);
366
+ // Keep the run's outer whitespace exactly as written (it is part of how React renders it).
367
+ const first = run[0];
368
+ const last = run[run.length - 1];
369
+ const start = first.getFullStart();
370
+ const end = last.getEnd();
371
+ const original = source.slice(start, end);
372
+ const lead = original.match(/^\s*/)[0];
373
+ const trail = original.slice(lead.length).match(/\s*$/)[0];
374
+ edits.push({ start: start + lead.length, end: end - trail.length, text: `{${call(key, vars)}}` });
375
+ run = [];
376
+ };
377
+ for (const c of children) {
378
+ const isTextish = ts.isJsxText(c) ||
379
+ (ts.isJsxExpression(c) && c.expression !== undefined &&
380
+ (ts.isStringLiteral(c.expression) || ts.isNoSubstitutionTemplateLiteral(c.expression) || (isSimple(c.expression) && textTyped(c.expression))));
381
+ if (isTextish)
382
+ run.push(c);
383
+ else {
384
+ flush();
385
+ if (ts.isJsxExpression(c) && c.expression)
386
+ convertExpr(c.expression, "JSX value");
387
+ }
388
+ }
389
+ flush();
390
+ return false;
391
+ };
392
+ const tagOf = (n) => (ts.isJsxElement(n) ? n.openingElement : n).tagName.getText(sf);
393
+ const hidden = (attrs) => attrs.properties.some((p) => ts.isJsxAttribute(p) && p.name.getText(sf) === "aria-hidden" && (!p.initializer || p.initializer.getText(sf) !== "{false}"));
394
+ const visit = (n) => {
395
+ if (ts.isJsxElement(n) || ts.isJsxSelfClosingElement(n)) {
396
+ const tag = tagOf(n);
397
+ if (SKIP_TAGS.has(tag))
398
+ return;
399
+ const attrs = (ts.isJsxElement(n) ? n.openingElement : n).attributes;
400
+ for (const p of attrs.properties) {
401
+ if (!ts.isJsxAttribute(p) || !p.initializer || !attributes.has(p.name.getText(sf)))
402
+ continue;
403
+ const init = p.initializer;
404
+ if (ts.isStringLiteral(init)) {
405
+ if (HAS_LETTER.test(init.text)) {
406
+ if (!insideFunction(init)) {
407
+ skipped.push({ line: line(init.getStart(sf)), reason: "attribute at module level", text: init.text });
408
+ continue;
409
+ }
410
+ const key = keyFor(init.text);
411
+ messages.set(key, init.text);
412
+ edits.push({ start: init.getStart(sf), end: init.getEnd(), text: `{${call(key, [])}}` });
413
+ }
414
+ }
415
+ else if (ts.isJsxExpression(init) && init.expression)
416
+ convertExpr(init.expression, `attribute ${p.name.getText(sf)}`);
417
+ }
418
+ for (const p of attrs.properties)
419
+ if (ts.isJsxAttribute(p) && p.initializer && ts.isJsxExpression(p.initializer) && p.initializer.expression)
420
+ p.initializer.expression.forEachChild(visit);
421
+ if (ts.isJsxElement(n) && !hidden(attrs)) {
422
+ const mixed = convertChildren(n.children);
423
+ // A sentence left whole keeps its inline pieces whole too ("here" alone would translate badly).
424
+ for (const c of n.children)
425
+ if (!ts.isJsxText(c) && !(mixed && isInline(c)))
426
+ visitNested(c);
427
+ }
428
+ return;
429
+ }
430
+ if (ts.isJsxFragment(n)) {
431
+ const mixed = convertChildren(n.children);
432
+ for (const c of n.children)
433
+ if (!ts.isJsxText(c) && !(mixed && isInline(c)))
434
+ visitNested(c);
435
+ return;
436
+ }
437
+ if (ts.isCallExpression(n)) {
438
+ const callee = ts.isIdentifier(n.expression) ? n.expression.text : ts.isPropertyAccessExpression(n.expression) ? n.expression.name.text : "";
439
+ for (const i of calls.get(callee) ?? [])
440
+ if (n.arguments[i])
441
+ convertExpr(n.arguments[i], `${callee}()`);
442
+ }
443
+ if (ts.isPropertyAssignment(n) && UI_PROPS.has(n.name.getText(sf)) && (ts.isStringLiteral(n.initializer) || ts.isNoSubstitutionTemplateLiteral(n.initializer)) && /\p{L}.*\s/u.test(n.initializer.text)) {
444
+ skipped.push({ line: line(n.getStart(sf)), reason: `object property ${n.name.getText(sf)}: UI text or data? (convert by hand if UI)`, text: n.initializer.text });
445
+ }
446
+ n.forEachChild(visit);
447
+ };
448
+ // Expressions inside JSX children: their own JSX and calls, but not the children list again.
449
+ const visitNested = (c) => {
450
+ if (ts.isJsxExpression(c)) {
451
+ if (c.expression)
452
+ c.expression.forEachChild(visit);
453
+ if (c.expression && (ts.isJsxElement(c.expression) || ts.isJsxSelfClosingElement(c.expression) || ts.isJsxFragment(c.expression)))
454
+ visit(c.expression);
455
+ }
456
+ else
457
+ visit(c);
458
+ };
459
+ visit(sf);
460
+ if (!edits.length)
461
+ return { code: source, messages, skipped, converted: 0 };
462
+ // Apply from the end, refusing overlaps (a bug, not a case to guess at).
463
+ edits.sort((a, b) => b.start - a.start);
464
+ for (let i = 1; i < edits.length; i++)
465
+ if (edits[i].end > edits[i - 1].start)
466
+ throw new Error(`${fileName}: overlapping edits at line ${line(edits[i].start)}`);
467
+ let code = source;
468
+ for (const e of edits)
469
+ code = code.slice(0, e.start) + e.text + code.slice(e.end);
470
+ // Import t (as T) after the last import, unless this file already imports it.
471
+ // Edits never touch the imports, so positions up to the last import still match the original.
472
+ const imports = sf.statements.filter(ts.isImportDeclaration);
473
+ const at = imports.length ? imports[imports.length - 1].getEnd() : 0;
474
+ const add = [];
475
+ const needsT = edits.some((e) => e.text.includes(`${T}(`));
476
+ const hasT = new RegExp(`import\\s*\\{[^}]*\\bt(\\s+as\\s+${T})?\\b[^}]*\\}\\s*from\\s*["']${opts.importFrom.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}["']`).test(code);
477
+ if (needsT && !hasT)
478
+ add.push(`import { ${T === "t" ? "t" : `t as ${T}`} } from ${JSON.stringify(opts.importFrom)};`);
479
+ if (usesTrans && !/import\s*\{[^}]*\bTrans\b[^}]*\}\s*from\s*["']react-i18next["']/.test(code))
480
+ add.push(`import { Trans } from "react-i18next";`);
481
+ if (add.length)
482
+ code = at ? `${code.slice(0, at)}\n${add.join("\n")}${code.slice(at)}` : `${add.join("\n")}\n${code}`;
483
+ return { code, messages, skipped, converted: edits.length };
484
+ }
485
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/tools/extract.ts"],"names":[],"mappings":"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"}
@@ -2,3 +2,5 @@ export * from "./catalogs.js";
2
2
  export * from "./placeholders.js";
3
3
  export * from "./pipeline.js";
4
4
  export { claudeTranslator, systemPrompt, MODEL } from "./claude.js";
5
+ export * from "./extract.js";
6
+ export { runExtract, formatExtract, readExtractConfig } from "./extract-cli.js";
@@ -2,4 +2,6 @@ export * from "./catalogs.js";
2
2
  export * from "./placeholders.js";
3
3
  export * from "./pipeline.js";
4
4
  export { claudeTranslator, systemPrompt, MODEL } from "./claude.js";
5
+ export * from "./extract.js";
6
+ export { runExtract, formatExtract, readExtractConfig } from "./extract-cli.js";
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpE,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pulsetechnologies/i18n",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Shared language list, detection, formatting and language picker for every Pulse product.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -49,7 +49,8 @@
49
49
  "i18next": ">=25",
50
50
  "react": ">=18",
51
51
  "react-i18next": ">=15",
52
- "@anthropic-ai/sdk": ">=0.131"
52
+ "@anthropic-ai/sdk": ">=0.131",
53
+ "typescript": ">=5"
53
54
  },
54
55
  "peerDependenciesMeta": {
55
56
  "react": {
@@ -60,6 +61,9 @@
60
61
  },
61
62
  "@anthropic-ai/sdk": {
62
63
  "optional": true
64
+ },
65
+ "typescript": {
66
+ "optional": true
63
67
  }
64
68
  },
65
69
  "devDependencies": {