prosebook 0.1.0 → 0.2.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.
@@ -137,13 +137,15 @@ interface RuleBase {
137
137
  /** Its severity under `extends: 'strict'`; `error` when unset. */
138
138
  strict?: Severity;
139
139
  /**
140
- * Only entries of these kinds, or on these surfaces; an entry that says neither is skipped. Only
141
- * the source unless `locale` says otherwise, since most writing rules are written for one language:
142
- * `all` reads every locale, and a list those languages and their regions (`de` covers `de-CH`).
140
+ * Only entries of these kinds, on these surfaces, or in these areas (a key's first segment); an
141
+ * entry that says no kind or surface is skipped by a rule that names some. Only the source unless
142
+ * `locale` says otherwise, since most writing rules are written for one language: `all` reads
143
+ * every locale, and a list those languages and their regions (`de` covers `de-CH`).
143
144
  */
144
145
  on?: {
145
146
  kind?: string[];
146
147
  surface?: string[];
148
+ area?: string[];
147
149
  locale?: 'all' | string[];
148
150
  };
149
151
  }
@@ -256,7 +258,10 @@ declare function words(text: string): string[];
256
258
  declare function sentences(text: string): number;
257
259
  /** A word or phrase on its own, not inside a longer word or a hyphenated compound. */
258
260
  declare function phrase(p: string): RegExp;
259
- /** The singular of an English plural noun, or nothing where it doesn't look like one. */
261
+ /**
262
+ * The singular of an English plural noun, or nothing where it doesn't look like one. A word with no
263
+ * vowel is a unit or an abbreviation (`kbps`, `fps`, `hrs`), which reads the same after 1.
264
+ */
260
265
  declare function singularOf(word: string): string | undefined;
261
266
  declare const CORE_RULES: {
262
267
  whitespace: {
@@ -336,6 +341,14 @@ declare const CORE_RULES: {
336
341
  match: string;
337
342
  }[];
338
343
  };
344
+ path: {
345
+ description: string;
346
+ check: ({ text, config }: RuleContext) => {
347
+ message: string;
348
+ match: string;
349
+ fix: string;
350
+ }[];
351
+ };
339
352
  contractions: {
340
353
  description: string;
341
354
  check: ({ text }: RuleContext) => {
@@ -411,13 +424,18 @@ interface WordLists {
411
424
  concepts?: Record<string, string>;
412
425
  /** Words that keep their capital inside a sentence-case string: product names, platforms. */
413
426
  properNouns?: string[];
427
+ /** What a path through menus or settings is written with, spaced: `›` by default, as in Settings › General. */
428
+ pathSeparator?: string;
414
429
  }
430
+ type RuleSeverities = Partial<Record<CoreRule, Severity>> & Record<string, Severity>;
415
431
  interface LintConfig extends WordLists {
416
432
  /** `recommended` (the default) checks shape; `strict` adds the word lists and rules of a house style guide. */
417
433
  extends?: 'recommended' | 'strict' | 'none';
418
434
  /** Rules of your own, as `<plugin>/<rule>`. Each takes the severity it gives itself under `extends`. */
419
435
  plugins?: Plugin[];
420
- rules?: Partial<Record<CoreRule, Severity>> & Record<string, Severity>;
436
+ rules?: RuleSeverities;
437
+ /** Severities for one area's entries (a key's first segment) over `rules`: `{ native: { 'sentence-case': 'off' } }`. */
438
+ areas?: Record<string, RuleSeverities>;
421
439
  }
422
440
  interface ProsebookConfig {
423
441
  /** The source-language catalog: one `<area>.yaml` per area. */
@@ -481,6 +499,7 @@ interface ResolvedConfig {
481
499
  rule: CheckRule;
482
500
  severity: Severity;
483
501
  }>;
502
+ areas: Record<string, Record<string, Severity>>;
484
503
  } & Required<WordLists>;
485
504
  scan: {
486
505
  dirs: string[];
@@ -495,4 +514,4 @@ declare const CONFIG_FILES: string[];
495
514
  declare function loadConfig(root: string, inline?: ProsebookConfig): Promise<ResolvedConfig>;
496
515
  declare function resolveConfig(root: string, config: ProsebookConfig): ResolvedConfig;
497
516
  export { sentences as A, EntryLocation as B, RuleContext as C, definePlugin as D, compileRule as E, KindRule as F, entryLocation as G, Message as H, STRICT_LISTS as I, whereOf as J, loadCatalog as K, Severity as L, words as M, DEFAULT_KINDS as N, lint as O, DEFAULT_SURFACES as P, Catalog as R, Rule as S, applyEdits as T, Problem as U, KEY_PATTERN as V, Translation as W, MessageFormatElement as Y, HOLE as _, WordLists as a, Readings as b, resolveConfig as c, CheckRule as d, ConditionalRule as f, Finding as g, ExistenceRule as h, ResolvedConfig as i, singularOf as j, phrase as k, CORE_RULES as l, Edit as m, LintConfig as n, defineConfig as o, CoreRule as p, previewOf as q, ProsebookConfig as r, loadConfig as s, CONFIG_FILES as t, CapitalizationRule as u, OccurrenceRule as v, SubstitutionRule as w, Report as x, Plugin as y, CatalogError as z };
498
- //# sourceMappingURL=config-CF7HziDa.d.ts.map
517
+ //# sourceMappingURL=config-_4HfnJQu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-_4HfnJQu.d.ts","names":[],"sources":["../src/tools/catalog.ts","../src/tools/presets.ts","../src/tools/lint.ts","../src/tools/config.ts"],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as sentences, C as RuleContext, D as definePlugin, F as KindRule, L as Severity, M as words, S as Rule, _ as HOLE, a as WordLists, b as Readings, c as resolveConfig, d as CheckRule, f as ConditionalRule, h as ExistenceRule, i as ResolvedConfig, k as phrase, n as LintConfig, o as defineConfig, r as ProsebookConfig, s as loadConfig, t as CONFIG_FILES, u as CapitalizationRule, v as OccurrenceRule, w as SubstitutionRule, x as Report, y as Plugin } from "./config-CF7HziDa.js";
1
+ import { A as sentences, C as RuleContext, D as definePlugin, F as KindRule, L as Severity, M as words, S as Rule, _ as HOLE, a as WordLists, b as Readings, c as resolveConfig, d as CheckRule, f as ConditionalRule, h as ExistenceRule, i as ResolvedConfig, k as phrase, n as LintConfig, o as defineConfig, r as ProsebookConfig, s as loadConfig, t as CONFIG_FILES, u as CapitalizationRule, v as OccurrenceRule, w as SubstitutionRule, x as Report, y as Plugin } from "./config-_4HfnJQu.js";
2
2
  export { CONFIG_FILES, type CapitalizationRule, type CheckRule, type ConditionalRule, type ExistenceRule, HOLE, type KindRule, LintConfig, type OccurrenceRule, type Plugin, ProsebookConfig, type Readings, type Report, ResolvedConfig, type Rule, type RuleContext, type Severity, type SubstitutionRule, WordLists, defineConfig, definePlugin, loadConfig, phrase, resolveConfig, sentences, words };
package/dist/config.js CHANGED
@@ -1 +1 @@
1
- export { t as CONFIG_FILES, l as HOLE, n as defineConfig, f as definePlugin, r as loadConfig, m as phrase, i as resolveConfig, h as sentences, _ as words } from "./config-CxVMn19f.js";
1
+ export { t as CONFIG_FILES, l as HOLE, n as defineConfig, f as definePlugin, r as loadConfig, m as phrase, i as resolveConfig, h as sentences, _ as words } from "./config-D--RITk2.js";
@@ -1,6 +1,6 @@
1
1
  import { n as flatten, t as createHelpers } from "./helpers-BPuPGjQP.js";
2
- import { E as tagsOf, g as singularOf, w as parseMessage, y as argsOf } from "./config-CxVMn19f.js";
3
- import { A as loadCatalog, C as compileLocale, D as KEY_PATTERN, E as CatalogError, F as writeMessage, P as readMessage, i as looksLikeCode, w as localeExpression } from "./scan-B0tZ7y-D.js";
2
+ import { E as tagsOf, g as singularOf, w as parseMessage, y as argsOf } from "./config-D--RITk2.js";
3
+ import { E as localeExpression, I as readMessage, L as writeMessage, M as loadCatalog, O as CatalogError, T as compileLocale, a as looksLikeCode, k as KEY_PATTERN } from "./scan-Ch2BfIUD.js";
4
4
  import { basename, dirname, extname, join, relative, resolve } from "node:path";
5
5
  import { pathToFileURL } from "node:url";
6
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
@@ -1030,4 +1030,4 @@ function location(file, line, column) {
1030
1030
  }
1031
1031
  export { wordDiff as a, draftPlurals as c, syntaxKind as d, typescriptOracle as f, formatDiff as i, planExtract as l, applyMigrate as n, applyExtract as o, planMigrate as r, areaOf as s, SarifReport as t, slugOf as u };
1032
1032
 
1033
- //# sourceMappingURL=sarif-PkPvsB07.js.map
1033
+ //# sourceMappingURL=sarif-CI8HOokm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sarif-PkPvsB07.js","names":[],"sources":["../src/tools/types.ts","../src/tools/extract.ts","../src/tools/diff.ts","../src/tools/migrate.ts","../src/tools/sarif.ts"],"sourcesContent":["/**\n * What kind of value an expression in JSX holds, so `extract` can write `{n, number}` for a number and\n * `{d, date, medium}` for a date instead of a bare `{x}`, which is text and prints a number unformatted.\n *\n * The project's own TypeScript (7 or later, through its `unstable/async` API) answers where it can; the\n * syntax of the expression answers where it can't: a JavaScript project, a file outside any tsconfig,\n * or no TypeScript installed. Not the `unstable/sync` API: on Linux and macOS it reads the compiler's\n * pipes through a Node internal (`stdout._handle.fd`) that Bun doesn't have, so under Bun it throws.\n */\nimport { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\n\nimport type * as TsAsync from 'typescript/unstable/async';\nimport type { Checker, Type } from 'typescript/unstable/async';\n\n// oxlint-disable-next-line typescript/no-explicit-any -- a loose ESTree node: the walk reads whichever fields each node type has\ntype Node = { type: string; start: number; end: number; [field: string]: any };\n\ntype TsNode = { pos: number; end: number; forEachChild(visit: (child: TsNode) => unknown): unknown };\n\n/** `node` is markup or an object, which a message can't hold as text. */\nexport type ValueKind = 'string' | 'number' | 'date' | 'node' | 'unknown';\n\nexport interface Span {\n start: number;\n end: number;\n}\n\nexport interface TypeOracle {\n /** Where the answers come from, for the report. */\n readonly source: string;\n /** The kind of each span's expression in `file`, or nothing where the oracle can't say. */\n kinds(file: string, spans: readonly Span[]): Promise<(ValueKind | undefined)[]>;\n close(): Promise<void>;\n}\n\n/** The nearest `tsconfig.json` at or above the file's folder. */\nfunction tsconfigFor(file: string): string | undefined {\n for (let dir = dirname(resolve(file)); ; dir = dirname(dir)) {\n const candidate = join(dir, 'tsconfig.json');\n if (existsSync(candidate)) return candidate;\n if (dirname(dir) === dir) return undefined;\n }\n}\n\n// TypeFlags, as the TypeScript 7 API numbers them.\nconst ANY_OR_UNKNOWN = 3;\nconst NUMBER_LIKE = 67648 | 4224;\nconst STRING_LIKE = 12583968;\nconst UNION = 134217728;\nconst OBJECT = 1048576;\n\n/**\n * An oracle over the projects the files belong to, or nothing where TypeScript 7 isn't installed or\n * none of the files has a tsconfig. One compiler process serves every project and is closed by `close`.\n */\nexport async function typescriptOracle(root: string, files: readonly string[]): Promise<TypeOracle | undefined> {\n const configs = [...new Set(files.map(tsconfigFor).filter((c) => c !== undefined))];\n if (configs.length === 0) return undefined;\n let ts: typeof TsAsync;\n try {\n ts = await import('typescript/unstable/async');\n } catch {\n return undefined;\n }\n let api: InstanceType<typeof ts.API>;\n let snapshot: Awaited<ReturnType<InstanceType<typeof ts.API>['updateSnapshot']>>;\n try {\n api = new ts.API({ cwd: root });\n snapshot = await api.updateSnapshot({ openProjects: configs });\n } catch {\n return undefined;\n }\n\n const classify = async (checker: Checker, type: Type | undefined): Promise<ValueKind | undefined> => {\n if (type === undefined) return undefined;\n const t = (await checker.getNonNullableType(type)) ?? type;\n if ((t.flags & ANY_OR_UNKNOWN) !== 0) return 'unknown';\n if ((t.flags & UNION) !== 0) {\n const members = (await (t as Type & { getTypes(): Promise<readonly Type[] | undefined> }).getTypes()) ?? [];\n const kinds = new Set(await Promise.all(members.map((m) => classify(checker, m))));\n if (kinds.size === 1) return [...kinds][0];\n return kinds.has('node') ? 'node' : 'unknown';\n }\n if ((t.flags & NUMBER_LIKE) !== 0) return 'number';\n if ((t.flags & STRING_LIKE) !== 0) return 'string';\n if ((await checker.typeToString(t)) === 'Date') return 'date';\n if ((t.flags & OBJECT) !== 0) return 'node';\n return 'unknown';\n };\n\n return {\n source: 'TypeScript',\n async kinds(file, spans) {\n const project = await snapshot.getDefaultProjectForFile(resolve(file));\n const sourceFile = await project?.program.getSourceFile(resolve(file));\n if (project === undefined || sourceFile === undefined) return spans.map(() => undefined);\n // The smallest node covering each span is the expression itself.\n const nodes = spans.map(({ start, end }) => {\n let node: TsNode = sourceFile;\n for (;;) {\n let next: TsNode | undefined;\n node.forEachChild((child) => {\n if (next === undefined && child.pos <= start && child.end >= end) next = child;\n });\n if (next === undefined) return node;\n node = next;\n }\n });\n const types = await project.checker.getTypeAtLocation(nodes as never[]);\n return Promise.all(types.map((type) => classify(project.checker, type)));\n },\n close() {\n return api.close();\n },\n };\n}\n\n/** The kind an expression's syntax gives away, where it does: `items.length`, `a * b`, `new Date()`. */\nexport function syntaxKind(expr: Node): ValueKind | undefined {\n switch (expr.type) {\n case 'Literal':\n return typeof expr.value === 'number' ? 'number' : typeof expr.value === 'string' ? 'string' : undefined;\n case 'TemplateLiteral':\n return 'string';\n case 'MemberExpression':\n return !expr.computed && ['length', 'size', 'count'].includes(expr.property?.name as string) ? 'number' : undefined;\n case 'BinaryExpression':\n return ['-', '*', '/', '%', '**'].includes(expr.operator as string) ? 'number' : undefined;\n case 'NewExpression':\n return expr.callee?.type === 'Identifier' && expr.callee.name === 'Date' ? 'date' : undefined;\n case 'CallExpression':\n return expr.callee?.type === 'MemberExpression' && expr.callee.object?.name === 'Math' ? 'number' : undefined;\n default:\n return undefined;\n }\n}\n","/**\n * `prosebook extract`: moves hardcoded JSX text into the catalog and rewrites the code to read it.\n *\n * It works on runs, not fragments. The children of an element that together make one sentence, text,\n * simple expressions and inline elements holding only text, become one message: `Hi {user.name}, <a\n * href=\"/x\">go</a>!` is `Hi {name}, <a>go</a>!`, so a translator can reorder the whole sentence. A run\n * becomes `<Text id=… />`, which needs no hook; a readable attribute becomes `t('…')`, with `useCopy()`\n * added to its component. Keys, kinds, surfaces and contexts are suggestions, marked for review.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, extname, join, relative } from 'node:path';\n\nimport { parseSync } from 'oxc-parser';\nimport { stringify } from 'yaml';\n\nimport { CatalogError, KEY_PATTERN, loadCatalog } from './catalog.ts';\nimport type { ResolvedConfig } from './config.ts';\nimport { parseMessage } from './icu.ts';\nimport { singularOf } from './lint.ts';\nimport { looksLikeCode } from './scan.ts';\nimport { writeMessage } from './syntax.ts';\nimport { syntaxKind, typescriptOracle, type Span, type ValueKind } from './types.ts';\n\n// oxlint-disable-next-line typescript/no-explicit-any -- a loose ESTree node: the walk reads whichever fields each node type has\ntype Node = { type: string; start: number; end: number; [field: string]: any };\n\nexport interface Extraction {\n file: string;\n line: number;\n column: number;\n key: string;\n /** The ICU message. */\n message: string;\n /** Whether an entry with this key and message already exists, so none is added. */\n reused: boolean;\n where: string;\n /** The code that replaces the hardcoded text. */\n replacement: string;\n}\n\nexport interface NewEntry {\n key: string;\n area: string;\n message: string;\n kind?: string;\n surface?: string;\n context: string;\n args: Record<string, string>;\n}\n\ninterface Edit {\n start: number;\n end: number;\n text: string;\n}\n\nexport interface FilePlan {\n path: string;\n file: string;\n code: string;\n edits: Edit[];\n extractions: Extraction[];\n warnings: string[];\n}\n\nexport interface ExtractPlan {\n files: FilePlan[];\n entries: NewEntry[];\n /** What said which placeholders are numbers and dates: `TypeScript`, or `syntax` alone. */\n types: string;\n}\n\nconst MODULE = 'prosebook/react';\nconst NON_PROSE = new Set(['code', 'pre', 'kbd', 'samp', 'script', 'style', 'svg', 'path', 'Text']);\nconst LETTER = /\\p{L}/u;\n\n/** Elements that sit inside a sentence, and so become a tag in its message rather than ending it. */\nconst INLINE = new Set([\n 'a',\n 'abbr',\n 'b',\n 'bdi',\n 'cite',\n 'del',\n 'dfn',\n 'em',\n 'i',\n 'ins',\n 'kbd',\n 'mark',\n 'q',\n 's',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'time',\n 'u',\n 'var',\n]);\nconst isInline = (name: string) => INLINE.has(name) || /^[A-Z]\\w*Link$|^Link$/.test(name);\n\n/** Elements whose text has an obvious kind and surface. */\nconst ROLES: Record<string, [kind: string, surface: string]> = {\n button: ['action', 'action'],\n h1: ['name', 'heading'],\n h2: ['name', 'heading'],\n h3: ['name', 'heading'],\n h4: ['name', 'heading'],\n h5: ['name', 'heading'],\n h6: ['name', 'heading'],\n th: ['name', 'heading'],\n legend: ['name', 'heading'],\n caption: ['name', 'heading'],\n label: ['name', 'label'],\n option: ['name', 'choice'],\n title: ['name', 'title'],\n};\n\n/** Readable attributes: the kind and surface their value has, and the key suffix that says which it is. */\nconst ATTRIBUTE_ROLES: Record<string, [kind: string | undefined, surface: string, suffix: string]> = {\n placeholder: [undefined, 'placeholder', 'placeholder'],\n title: ['name', 'tooltip', 'tooltip'],\n 'aria-label': ['name', 'aria', 'aria'],\n 'aria-description': ['description', 'aria', 'aria-description'],\n 'aria-placeholder': [undefined, 'aria', 'aria-placeholder'],\n alt: [undefined, 'aria', 'alt'],\n label: ['name', 'label', 'label'],\n};\n\n/** The area a file's strings go in: its name in kebab case, or its folder's for an `index`. */\nexport function areaOf(file: string): string {\n let name = basename(file, extname(file));\n if (['index', 'page', 'layout', 'route', 'main'].includes(name)) name = basename(dirname(file));\n const kebab = name\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return kebab === '' ? 'app' : kebab;\n}\n\n/** A key segment from the words of a message: its first four, plain ASCII, lowercase. */\nexport function slugOf(message: string): string {\n const words = message\n .replace(/<\\/?[\\w-]+>|\\{[^}]*\\}/g, ' ')\n .replace(/ı/g, 'i')\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n .split(' ')\n .filter(Boolean)\n .slice(0, 4);\n return words.length === 0 ? 'text' : words.join('-');\n}\n\n/**\n * A count followed by a plural noun, `{n, number} files`, as the plural it needs: `{n, plural, one {#\n * file} other {# files}}`. English only, and a draft: the TODO above the entry asks for a look.\n */\nexport function draftPlurals(message: string): string {\n return message.replace(/\\{(\\w+), number\\} (\\p{L}+)(?![\\p{L}'])/gu, (whole, name: string, word: string) => {\n const one = singularOf(word);\n return one === undefined ? whole : `{${name}, plural, one {# ${one}} other {# ${word}}}`;\n });\n}\n\n/** A message built as MF1, as the catalog writes messages: an MF2 catalog gets it in MF2. */\nfunction inSyntax(config: ResolvedConfig, mf1: string): string {\n return config.messageFormat === 2 ? writeMessage(2, parseMessage(mf1), config.source) : mf1;\n}\n\n/** Text written literally inside an ICU message. */\nfunction escapeIcu(text: string): string {\n return text.replace(/[{}<]/g, (c) => `'${c}'`);\n}\n\n/** JSX text as React renders it: lines trimmed where they meet a line break, blank lines dropped. */\nfunction jsxText(value: string): string {\n const lines = value.split(/\\r\\n|\\n|\\r/);\n // As Babel does: a value with no visible characters still keeps its one line, so a lone space renders.\n let lastNonEmpty = 0;\n lines.forEach((line, i) => {\n if (/[^ \\t]/.test(line)) lastNonEmpty = i;\n });\n let out = '';\n lines.forEach((line, i) => {\n let trimmed = line.replace(/\\t/g, ' ');\n if (i !== 0) trimmed = trimmed.replace(/^ +/, '');\n if (i !== lines.length - 1) trimmed = trimmed.replace(/ +$/, '');\n if (trimmed === '') return;\n out += i === lastNonEmpty ? trimmed : `${trimmed} `;\n });\n return out;\n}\n\nconst SIMPLE_EXPRESSIONS = new Set([\n 'Identifier',\n 'MemberExpression',\n 'CallExpression',\n 'TemplateLiteral',\n 'Literal',\n 'BinaryExpression',\n 'TSNonNullExpression',\n 'ChainExpression',\n]);\n\n/** A value that reads as a placeholder: no JSX and no functions inside it, which would be markup or logic. */\nfunction simple(expr: Node): boolean {\n if (!SIMPLE_EXPRESSIONS.has(expr.type)) return false;\n let found = false;\n const walk = (node: Node) => {\n if (found) return;\n if (/^JSX|FunctionExpression$/.test(node.type)) found = true;\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) value.forEach((v) => isNode(v) && walk(v));\n else if (isNode(value)) walk(value);\n }\n };\n walk(expr);\n return !found;\n}\n\n/** Every name bound inside a node: declarations, parameters, catch clauses, imports. With `deep` false, only its own scope's. */\nfunction bindingsIn(root: Node, deep = true): Set<string> {\n const names = new Set<string>();\n const pattern = (p: Node | null | undefined) => {\n if (!p) return;\n if (p.type === 'Identifier') names.add(p.name as string);\n else if (p.type === 'ObjectPattern')\n for (const prop of p.properties as Node[]) pattern(prop.type === 'RestElement' ? prop : prop.value);\n else if (p.type === 'ArrayPattern') for (const el of p.elements as (Node | null)[]) pattern(el);\n else if (p.type === 'AssignmentPattern') pattern(p.left);\n else if (p.type === 'RestElement') pattern(p.argument);\n };\n const walk = (node: Node, top: boolean) => {\n if (node.type === 'VariableDeclarator') pattern(node.id);\n if (node.type === 'ImportSpecifier' || node.type === 'ImportDefaultSpecifier' || node.type === 'ImportNamespaceSpecifier')\n pattern(node.local);\n if ((node.type === 'FunctionDeclaration' || node.type === 'ClassDeclaration') && node.id) pattern(node.id);\n if (node.type === 'CatchClause') pattern(node.param);\n const isFunction = /Function(?:Declaration|Expression)$|^ArrowFunctionExpression$/.test(node.type);\n if (isFunction && (deep || top)) for (const param of node.params as Node[]) pattern(param);\n if (isFunction && !deep && !top) return;\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const child of value) if (isNode(child)) walk(child, false);\n } else if (isNode(value)) {\n walk(value, false);\n }\n }\n };\n walk(root, true);\n return names;\n}\n\nfunction elementName(el: Node): string | undefined {\n const name = el.openingElement?.name as Node | undefined;\n return name?.type === 'JSXIdentifier' ? (name.name as string) : undefined;\n}\n\nfunction isNode(value: unknown): value is Node {\n return typeof value === 'object' && value !== null && typeof (value as Node).type === 'string';\n}\n\ninterface Context {\n config: ResolvedConfig;\n area: string;\n /** Every key's source message, the catalog's and those added in this run. */\n known: Map<string, string>;\n entries: NewEntry[];\n /** The kind of value each JSX expression holds, by `start:end`. */\n kinds: Map<string, ValueKind>;\n}\n\n/** Plans the extraction from one file: the edits and the entries, without writing anything. */\nfunction planFile(path: string, ctx: Context): FilePlan {\n const code = readFileSync(path, 'utf8');\n const file = relative(ctx.config.root, path).replaceAll('\\\\', '/');\n const plan: FilePlan = { path, file, code, edits: [], extractions: [], warnings: [] };\n const { program } = parseSync(file, code);\n const topLevel = bindingsIn(program, false);\n const lines = code.split('\\n');\n const lineStarts: number[] = [];\n let offset = 0;\n for (const line of lines) {\n lineStarts.push(offset);\n offset += line.length + 1;\n }\n const position = (at: number) => {\n let line = lineStarts.findIndex((s) => s > at);\n line = line === -1 ? lineStarts.length : line;\n return { line, column: at - lineStarts[line - 1]! + 1 };\n };\n const ignored = (at: number) => {\n const { line } = position(at);\n return (lines[line - 1] ?? '').includes('prosebook-ignore') || (lines[line - 2] ?? '').includes('prosebook-ignore');\n };\n\n let needText = false;\n let needUseCopy = false;\n /** Per component, by where it starts: the call that reads the catalog there. */\n const hooked = new Map<number, string>();\n /** Children now inside a `<Text>`, which the walk does not enter. */\n const consumed = new Set<Node>();\n /** Enclosing functions, innermost last: the component each belongs to, and whether it is one. */\n const components: { fn: Node; name: string | undefined; isComponent: boolean }[] = [];\n\n const componentName = (fn: Node, parent: Node | undefined): string | undefined => {\n if (fn.id?.name) return fn.id.name as string;\n if (parent?.type === 'VariableDeclarator' && parent.id?.type === 'Identifier') return parent.id.name as string;\n return undefined;\n };\n\n const entryFor = (\n message: string,\n args: Record<string, string>,\n role: [string | undefined, string | undefined],\n context: string,\n suffix?: string,\n ) => {\n for (const [key, text] of ctx.known) if (text === message && key.startsWith(`${ctx.area}.`)) return { key, reused: true };\n\n const base = `${ctx.area}.${slugOf(message)}${suffix ? `-${suffix}` : ''}`;\n let key = base;\n for (let n = 2; ctx.known.has(key); n++) key = `${base}-${n}`;\n ctx.known.set(key, message);\n const [kind, surface] = role;\n ctx.entries.push({\n key,\n area: ctx.area,\n message,\n ...(kind !== undefined && kind in ctx.config.kinds ? { kind } : {}),\n ...(surface !== undefined && surface in ctx.config.surfaces ? { surface } : {}),\n context,\n args,\n });\n return { key, reused: false };\n };\n\n const where = (element: string | undefined) => {\n const component = components.at(-1)?.name;\n return `${component ? `In ${component}` : `In ${file}`}${element ? `, the text of a <${element}>` : ''}.`;\n };\n\n /** The children of one element, split into runs at anything that cannot sit inside a sentence. */\n const extractChildren = (parent: Node, children: Node[]) => {\n const parentName = parent.type === 'JSXElement' ? elementName(parent) : undefined;\n let run: Node[] = [];\n const flush = () => {\n if (run.length > 0) extractRun(run, parentName);\n run = [];\n };\n for (const child of children) {\n if (inlineable(child)) run.push(child);\n else flush();\n }\n flush();\n };\n\n const inlineable = (child: Node): boolean => {\n if (child.type === 'JSXText') return true;\n if (child.type === 'JSXExpressionContainer') return simple(child.expression as Node);\n if (child.type === 'JSXElement') {\n const name = elementName(child);\n if (name === undefined || child.openingElement.selfClosing || !isInline(name)) return false;\n return (child.children as Node[]).every(inlineable);\n }\n return false;\n };\n\n const extractRun = (run: Node[], parentName: string | undefined) => {\n // Whitespace-only text at either end stays where it is, so the layout around the run is unchanged.\n const blank = (n: Node) => n.type === 'JSXText' && jsxText(n.value as string).trim() === '';\n const from = run.findIndex((n) => !blank(n));\n if (from === -1) return;\n const nodes = run.slice(from, run.findLastIndex((n) => !blank(n)) + 1);\n // Elements with nothing but whitespace between them are layout, not a sentence: each one's text is\n // its own, as `<li><a href>Home</a></li>` is \"Home\".\n if (nodes.every((n) => n.type === 'JSXElement' || blank(n))) return;\n const first = nodes[0]!;\n const last = nodes.at(-1)!;\n const values = new Map<string, string>();\n const argDocs: Record<string, string> = {};\n const names = new Map<string, string>();\n const tags = new Set<string>();\n\n const argName = (expr: Node): string => {\n const source = code.slice(expr.start, expr.end);\n const known = names.get(source);\n if (known !== undefined) return known;\n let inner = expr;\n while (inner.type === 'TSNonNullExpression' || inner.type === 'ChainExpression') inner = inner.expression;\n let name =\n inner.type === 'Identifier'\n ? (inner.name as string)\n : inner.type === 'MemberExpression' && !inner.computed && inner.property?.type === 'Identifier'\n ? (inner.property.name as string)\n : 'value';\n const base = name;\n for (let n = 2; values.has(name) || tags.has(name); n++) name = `${base}${n}`;\n names.set(source, name);\n values.set(name, source);\n argDocs[name] = `TODO: what \\`${source}\\` holds`;\n return name;\n };\n\n const piece = (node: Node): string => {\n if (node.type === 'JSXText') return escapeIcu(jsxText(node.value as string));\n if (node.type === 'JSXElement') {\n let tag = elementName(node)!.toLowerCase();\n const base = tag;\n for (let n = 2; tags.has(tag) || values.has(tag); n++) tag = `${base}${n}`;\n tags.add(tag);\n const open = code.slice(node.openingElement.start, node.openingElement.end);\n const close = code.slice(node.closingElement.start, node.closingElement.end);\n values.set(tag, `(chunks) => ${open}{chunks}${close}`);\n return `<${tag}>${(node.children as Node[]).map(piece).join('')}</${tag}>`;\n }\n const expr = node.expression as Node;\n if (expr.type === 'Literal' && typeof expr.value === 'string') return escapeIcu(expr.value);\n if (expr.type === 'TemplateLiteral' && expr.expressions.length === 0) return escapeIcu(expr.quasis[0].value.cooked as string);\n const kind = ctx.kinds.get(`${expr.start}:${expr.end}`) ?? syntaxKind(expr);\n if (kind === 'node') markup.push(code.slice(expr.start, expr.end));\n return `{${argName(expr)}${kind === 'number' ? ', number' : kind === 'date' ? ', date, medium' : ''}}`;\n };\n\n const markup: string[] = [];\n let message = nodes.map(piece).join('').trim();\n if (markup.length > 0) {\n const at = position(first.start);\n plan.warnings.push(\n `${file}:${at.line}:${at.column} {${markup.join('}, {')}} holds markup, not text, so this sentence was left as it is: make it a tag, or give the text around it entries of its own`,\n );\n return;\n }\n if (/^en\\b/.test(ctx.config.source)) message = draftPlurals(message);\n // A run of spaces, placeholders and punctuation is layout, not words.\n const words = message.replace(/\\{[^}]*\\}|<\\/?[\\w-]+>|'[{}<]'/g, '');\n if (!LETTER.test(words) || (values.size === 0 && looksLikeCode(message))) return;\n // The whitespace at either end stays in the code as it was: a space still renders as one, and a\n // line break still renders as nothing.\n const start = first.type === 'JSXText' ? first.start + (/^\\s*/.exec(first.value as string)?.[0].length ?? 0) : first.start;\n const end = last.type === 'JSXText' ? last.end - (/\\s*$/.exec(last.value as string)?.[0].length ?? 0) : last.end;\n if (ignored(start)) return;\n\n message = inSyntax(ctx.config, message);\n const role = parentName !== undefined ? ROLES[parentName] : undefined;\n const { key, reused } = entryFor(message, argDocs, role ?? [undefined, undefined], where(parentName));\n const props = [...values].map(([name, source]) => `${/^[A-Za-z_$][\\w$]*$/.test(name) ? name : JSON.stringify(name)}: ${source}`);\n const replacement = `<Text id=${JSON.stringify(key)}${props.length > 0 ? ` values={{ ${props.join(', ')} }}` : ''} />`;\n plan.edits.push({ start, end, text: replacement });\n for (const n of nodes) consumed.add(n);\n plan.extractions.push({ file, ...position(start), key, message, reused, where: 'text', replacement });\n needText = true;\n };\n\n const extractAttribute = (attr: Node, element: Node) => {\n const name = attr.name?.type === 'JSXIdentifier' ? (attr.name.name as string) : '';\n if (!ctx.config.scan.attributes.includes(name) || attr.value === null) return;\n const value = attr.value as Node;\n let text: string | undefined;\n if (value.type === 'Literal' && typeof value.value === 'string') {\n text = value.value;\n } else if (value.type === 'JSXExpressionContainer') {\n const expr = value.expression as Node;\n if (expr.type === 'Literal' && typeof expr.value === 'string') text = expr.value;\n if (expr.type === 'TemplateLiteral' && expr.expressions.length === 0) text = expr.quasis[0].value.cooked as string;\n }\n if (text === undefined || !LETTER.test(text) || looksLikeCode(text) || ignored(attr.start)) return;\n const at = position(value.start);\n const fn = components.findLast((c) => c.isComponent)?.fn;\n if (fn === undefined || fn.body?.type !== 'BlockStatement') {\n plan.warnings.push(\n `${file}:${at.line}:${at.column} ${name}=\"${text}\" is not inside a component with a body, so it has no t() to read; left as it is`,\n );\n return;\n }\n const call = hookFor(fn);\n if (call === undefined) {\n plan.warnings.push(\n `${file}:${at.line}:${at.column} ${name}=\"${text}\": its component binds both \\`t\\` and \\`copy\\` already; left as it is`,\n );\n return;\n }\n const [kind, surface, suffix] = ATTRIBUTE_ROLES[name] ?? [undefined, undefined, name];\n const tag = elementName(element) ?? 'element';\n const component = components.at(-1)?.name;\n const context = `${component ? `In ${component}` : `In ${file}`}, the ${name} of a <${tag}>.`;\n const message = inSyntax(ctx.config, escapeIcu(text));\n const { key, reused } = entryFor(message, {}, [kind, surface], context, suffix);\n const replacement = `{${call}(${JSON.stringify(key)})}`;\n plan.edits.push({ start: value.start, end: value.end, text: replacement });\n plan.extractions.push({ file, ...at, key, message, reused, where: name, replacement });\n };\n\n /**\n * Makes sure the component can read the catalog, and returns the call that does: `t` from\n * `useCopy()`, or `copy.t` where the component or the module already binds a `t` of its own.\n */\n const hookFor = (fn: Node): string | undefined => {\n const chosen = hooked.get(fn.start);\n if (chosen !== undefined) return chosen;\n const taken = new Set([...topLevel, ...bindingsIn(fn)]);\n const body = code.slice(fn.body.start, fn.body.end);\n const insert = (text: string) => plan.edits.push({ start: fn.body.start + 1, end: fn.body.start + 1, text });\n const firstStatement = fn.body.body[0] as Node | undefined;\n const indent = firstStatement ? ' '.repeat(position(firstStatement.start).column - 1) : ' ';\n let call: string | undefined;\n const destructured = /\\{([^{}]*)\\}\\s*=\\s*useCopy\\(\\)/.exec(body);\n const whole = /\\b(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*useCopy\\(\\)/.exec(body);\n if (destructured !== null && /(^|[\\s,])t(\\s*[,}]|\\s*$)/.test(destructured[1]!)) {\n call = 't';\n } else if (whole !== null) {\n call = `${whole[1]}.t`;\n } else if (destructured !== null && !taken.has('t')) {\n const at = fn.body.start + destructured.index + 1;\n plan.edits.push({ start: at, end: at, text: ' t,' });\n call = 't';\n } else if (!taken.has('t')) {\n insert(`\n${indent}const { t } = useCopy();`);\n call = 't';\n } else if (!taken.has('copy')) {\n insert(`\n${indent}const copy = useCopy();`);\n call = 'copy.t';\n }\n if (call !== undefined && destructured === null && whole === null) needUseCopy = true;\n if (call !== undefined) hooked.set(fn.start, call);\n return call;\n };\n\n const visit = (node: Node, parent: Node | undefined) => {\n const isFunction = node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression';\n if (isFunction) {\n const own = componentName(node, parent);\n const isComponent = own !== undefined && /^(?:[A-Z]|use[A-Z])/.test(own);\n components.push({ fn: node, name: isComponent ? own : components.at(-1)?.name, isComponent });\n }\n if (node.type === 'JSXElement' || node.type === 'JSXFragment') {\n const name = node.type === 'JSXElement' ? elementName(node) : undefined;\n if (node.type === 'JSXElement') {\n for (const attr of node.openingElement.attributes as Node[]) {\n if (attr.type !== 'JSXAttribute') continue;\n extractAttribute(attr, node);\n // `render={() => <p>Hi</p>}` holds JSX of its own.\n if (attr.value?.type === 'JSXExpressionContainer') visit(attr.value as Node, attr);\n }\n }\n if (name === undefined || !NON_PROSE.has(name)) {\n extractChildren(node, node.children as Node[]);\n for (const child of node.children as Node[]) if (!consumed.has(child)) visit(child, node);\n }\n return;\n }\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const child of value) if (isNode(child)) visit(child, node);\n } else if (isNode(value)) {\n visit(value, node);\n }\n }\n if (isFunction) components.pop();\n };\n\n visit(program, undefined);\n plan.extractions.sort((a, b) => (a.line !== b.line ? a.line - b.line : a.column - b.column));\n if (needText || needUseCopy) importEdit(program, code, plan, [...(needText ? ['Text'] : []), ...(needUseCopy ? ['useCopy'] : [])]);\n return plan;\n}\n\n/** Adds the names to an existing `prosebook/react` import, or a new import after the last one. */\nfunction importEdit(program: Node, code: string, plan: FilePlan, wanted: string[]) {\n const imports = (program.body as Node[]).filter((s) => s.type === 'ImportDeclaration');\n const existing = imports.find((s) => s.source.value === MODULE && s.importKind !== 'type');\n if (existing) {\n const named = (existing.specifiers as Node[]).filter((s) => s.type === 'ImportSpecifier');\n const have = new Set(named.map((s) => s.local.name as string));\n const missing = wanted.filter((w) => !have.has(w));\n if (missing.length === 0) return;\n if (named.length > 0) {\n plan.edits.push({ start: named.at(-1)!.end, end: named.at(-1)!.end, text: `, ${missing.join(', ')}` });\n return;\n }\n }\n const line = `import { ${wanted.join(', ')} } from '${MODULE}';`;\n const last = imports.at(-1);\n if (last) {\n plan.edits.push({ start: last.end, end: last.end, text: `\\n${line}` });\n } else {\n const directive = /^(?:\\s*(['\"])use \\w+\\1;?\\s*\\n)*/.exec(code)?.[0] ?? '';\n plan.edits.push({ start: directive.length, end: directive.length, text: `${line}\\n${directive === '' ? '\\n' : ''}` });\n }\n}\n\n/** The spans of every expression inside JSX, which are the ones that may become placeholders. */\nfunction jsxExpressions(file: string, code: string): Span[] {\n const spans: Span[] = [];\n const walk = (node: Node) => {\n if (node.type === 'JSXExpressionContainer' && node.expression.type !== 'JSXEmptyExpression')\n spans.push({ start: node.expression.start as number, end: node.expression.end as number });\n\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const child of value) if (isNode(child)) walk(child);\n } else if (isNode(value)) {\n walk(value);\n }\n }\n };\n walk(parseSync(file, code).program);\n return spans;\n}\n\n/**\n * Plans an extraction over the files in `paths` against the current catalog. With `types` (the\n * default), the project's TypeScript says which placeholders are numbers and dates.\n */\nexport async function planExtract(\n config: ResolvedConfig,\n paths: string[],\n options: { area?: string; types?: boolean } = {},\n): Promise<ExtractPlan> {\n if (options.area !== undefined && !KEY_PATTERN.test(`${options.area}.x`))\n throw new Error(`prosebook: \"${options.area}\" is not an area: lowercase words joined by -`);\n const known = new Map<string, string>();\n if (existsSync(config.catalog)) {\n try {\n for (const m of loadCatalog(config).messages) known.set(m.key, m.text);\n } catch (e) {\n if (!(e instanceof CatalogError)) throw e;\n throw new Error(`prosebook: fix the catalog before extracting into it:\\n${e.message}`, { cause: e });\n }\n }\n const entries: NewEntry[] = [];\n const oracle = options.types === false ? undefined : await typescriptOracle(config.root, paths);\n try {\n // One file at a time: each plan sees the entries the ones before it added.\n const files: FilePlan[] = [];\n for (const path of paths) {\n const kinds = new Map<string, ValueKind>();\n if (oracle) {\n const spans = jsxExpressions(path, readFileSync(path, 'utf8'));\n (await oracle.kinds(path, spans)).forEach((kind, i) => {\n if (kind !== undefined && kind !== 'unknown') kinds.set(`${spans[i]!.start}:${spans[i]!.end}`, kind);\n });\n }\n files.push(planFile(path, { config, area: options.area ?? areaOf(path), known, entries, kinds }));\n }\n return { files, entries, types: oracle?.source ?? 'syntax' };\n } finally {\n await oracle?.close();\n }\n}\n\n/** Applies a plan: rewrites the files and appends the new entries to their area's catalog file. */\nexport function applyExtract(config: ResolvedConfig, plan: ExtractPlan): string[] {\n const written: string[] = [];\n for (const file of plan.files) {\n if (file.edits.length === 0) continue;\n let code = file.code;\n for (const edit of [...file.edits].sort((a, b) => (a.start !== b.start ? b.start - a.start : b.end - a.end)))\n code = code.slice(0, edit.start) + edit.text + code.slice(edit.end);\n\n writeFileSync(file.path, code);\n written.push(file.path);\n }\n const byArea = new Map<string, NewEntry[]>();\n for (const entry of plan.entries) byArea.set(entry.area, [...(byArea.get(entry.area) ?? []), entry]);\n for (const [area, entries] of byArea) {\n const path = join(config.catalog, `${area}.yaml`);\n // Written as YAML 1.1, which quotes `n`, `yes` and `on`: they then read the same under 1.1 and 1.2,\n // as the catalog requires.\n const blocks = entries.map((e) => {\n const body: Record<string, unknown> = {};\n if (e.kind) body.kind = e.kind;\n if (e.surface) body.surface = e.surface;\n body.context = e.context;\n if (Object.keys(e.args).length > 0) body.args = e.args;\n body[config.source] = e.message;\n return `# TODO(prosebook extract): check the key, kind and context.\\n${stringify({ [e.key]: body }, { lineWidth: 0, version: '1.1' })}`;\n });\n mkdirSync(config.catalog, { recursive: true });\n const current = existsSync(path) ? readFileSync(path, 'utf8') : '# yaml-language-server: $schema=./catalog.schema.json\\n';\n writeFileSync(path, `${current.replace(/\\n*$/, '\\n')}\\n${blocks.join('\\n')}`);\n written.push(path);\n }\n return written;\n}\n","/**\n * A word diff, for showing a translator what changed in the source since they translated it. Words,\n * runs of whitespace and single punctuation marks are the units, so an ICU brace or a period changes\n * on its own rather than taking its word with it.\n */\n\nexport interface DiffPart {\n op: 'same' | 'add' | 'del';\n text: string;\n}\n\nconst TOKEN = /\\s+|[\\p{L}\\p{N}_'’]+|[^\\s\\p{L}\\p{N}_]/gu;\n\n/** Past this many cells the table costs more than the diff is worth: show the whole change instead. */\nconst MAX_CELLS = 250_000;\n\nexport function wordDiff(before: string, after: string): DiffPart[] {\n const a = before.match(TOKEN) ?? [];\n const b = after.match(TOKEN) ?? [];\n if (a.length * b.length > MAX_CELLS) {\n const whole: DiffPart[] = [\n { op: 'del', text: before },\n { op: 'add', text: after },\n ];\n return merge(whole);\n }\n // The longest common subsequence, by suffix, so the walk below reads front to back.\n const lcs: number[][] = Array.from({ length: a.length + 1 }, () => Array.from({ length: b.length + 1 }, () => 0));\n for (let i = a.length - 1; i >= 0; i--) {\n for (let j = b.length - 1; j >= 0; j--)\n lcs[i]![j] = a[i] === b[j] ? lcs[i + 1]![j + 1]! + 1 : Math.max(lcs[i + 1]![j]!, lcs[i]![j + 1]!);\n }\n\n const parts: DiffPart[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n if (a[i] === b[j]) {\n parts.push({ op: 'same', text: a[i]! });\n i++;\n j++;\n } else if (lcs[i + 1]![j]! >= lcs[i]![j + 1]!) {\n parts.push({ op: 'del', text: a[i++]! });\n } else {\n parts.push({ op: 'add', text: b[j++]! });\n }\n }\n while (i < a.length) parts.push({ op: 'del', text: a[i++]! });\n while (j < b.length) parts.push({ op: 'add', text: b[j++]! });\n return merge(parts);\n}\n\n/**\n * Adjacent parts of one kind joined, and a space shared by two changes folded into them, so a\n * replaced phrase reads `[-old words-]{+new words+}` rather than alternating word by word.\n */\nfunction merge(parts: DiffPart[]): DiffPart[] {\n const out: DiffPart[] = [];\n for (let k = 0; k < parts.length; k++) {\n const part = parts[k]!;\n const prev = out.at(-1);\n const next = parts[k + 1];\n if (part.op === 'same' && /^\\s+$/.test(part.text) && prev && prev.op !== 'same' && next && next.op !== 'same') {\n // Whitespace between two changes belongs to both.\n out.push({ op: 'del', text: part.text }, { op: 'add', text: part.text });\n continue;\n }\n out.push({ ...part });\n }\n const joined: DiffPart[] = [];\n for (const part of out.filter((p) => p.text !== '')) {\n // Gather each stretch of changes as all its deletions, then all its additions.\n const last = joined.at(-1);\n if (last && last.op === part.op) last.text += part.text;\n else if (part.op === 'del' && last?.op === 'add' && joined.at(-2)?.op === 'del') joined.at(-2)!.text += part.text;\n else joined.push({ ...part });\n }\n return joined;\n}\n\n/** The diff as one line: `Save [-the-]{+a+} draft`, the notation of `git diff --word-diff`. */\nexport function formatDiff(parts: DiffPart[]): string {\n return parts.map((p) => (p.op === 'same' ? p.text : p.op === 'del' ? `[-${p.text}-]` : `{+${p.text}+}`)).join('');\n}\n","/**\n * `prosebook migrate`: a catalog and its translations rewritten from one syntax to the other. Each\n * message is written in the target syntax, read back, and rendered both ways over sample values, so\n * one that can't be written, or would come out different, is reported before anything changes.\n */\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { isMap, parseDocument, Scalar } from 'yaml';\n\nimport { createHelpers, flatten } from '#src/runtime/helpers.ts';\nimport type { CompiledMessages } from '#src/runtime/types.ts';\n\nimport { loadCatalog } from './catalog.ts';\nimport { compileLocale, localeExpression } from './compile.ts';\nimport type { ResolvedConfig } from './config.ts';\nimport { argsOf, tagsOf, type MessageFormatElement } from './icu.ts';\nimport { readMessage, writeMessage, type MessageFormatVersion } from './syntax.ts';\n\ninterface Located {\n key: string;\n locale: string;\n /** The file, relative to the project root. */\n file: string;\n}\n\nexport interface MigratePlan {\n to: MessageFormatVersion;\n rewrites: (Located & { before: string; after: string })[];\n /** Messages the target syntax can't say, and why. Nothing is written while there are any. */\n blocked: (Located & { reason: string })[];\n /** Messages that would render differently, with the first values that show it. */\n changed: (Located & { values: string; before: string; after: string })[];\n}\n\nexport function planMigrate(config: ResolvedConfig, to: MessageFormatVersion): MigratePlan {\n const catalog = loadCatalog(config);\n const plan: MigratePlan = { to, rewrites: [], blocked: [], changed: [] };\n for (const m of catalog.messages) {\n const versions = [\n { locale: config.source, text: m.text, ast: m.ast, file: m.file },\n ...[...m.translations].map(([locale, t]) => ({ locale, text: t.text, ast: t.ast, file: t.file })),\n ];\n for (const { locale, text, ast, file } of versions) {\n const at = { key: m.key, locale, file };\n let after: string;\n let back: MessageFormatElement[];\n try {\n after = writeMessage(to, ast, locale);\n back = readMessage(to, after, locale);\n } catch (e) {\n plan.blocked.push({ ...at, reason: (e as Error).message });\n continue;\n }\n const difference = firstDifference(ast, back, locale);\n if (difference !== undefined) plan.changed.push({ ...at, ...difference });\n if (after !== text) plan.rewrites.push({ ...at, before: text, after });\n }\n }\n return plan;\n}\n\n/** Writes the plan's rewrites into the YAML files, keeping their comments and layout. Returns the files written. */\nexport function applyMigrate(config: ResolvedConfig, plan: MigratePlan): string[] {\n if (plan.blocked.length > 0) throw new Error('prosebook: some messages have no equivalent in the target syntax; nothing was written');\n const byFile = Map.groupBy(plan.rewrites, (r) => r.file);\n for (const [file, rewrites] of byFile) {\n const path = join(config.root, file);\n // As YAML 1.1, so a new value that 1.1 would read differently, like `n`, is quoted.\n const doc = parseDocument(readFileSync(path, 'utf8'), { version: '1.1' });\n for (const r of rewrites) {\n const value = doc.createNode(r.after);\n if (r.after.includes('\\n')) value.type = Scalar.BLOCK_LITERAL;\n const entry = doc.get(r.key, true);\n if (isMap(entry)) entry.set(config.source, value);\n else doc.set(r.key, value);\n }\n writeFileSync(path, doc.toString({ lineWidth: 0 }));\n }\n return [...byFile.keys()];\n}\n\nconst NUMBERS = [0, 1, 2, 3, 5, 11, 21, 101, 1.5, 1234.5];\nconst DATE = new Date(Date.UTC(2026, 0, 5, 14, 30, 15));\n\nfunction samplesOf(type: string): unknown[] {\n if (type === 'number') return NUMBERS;\n if (type === 'Date | number') return [DATE];\n const named = [...type.matchAll(/\"((?:[^\"\\\\]|\\\\.)*)\"/g)].map((m) => JSON.parse(`\"${m[1]}\"`) as string);\n return named.length > 0 ? [...named, 'zzz'] : ['Ada'];\n}\n\n/** Every combination of sample values, or each argument varied alone where there are too many. */\nfunction* samples(a: MessageFormatElement[], b: MessageFormatElement[]): Generator<Record<string, unknown>> {\n const types = new Map<string, Set<unknown>>();\n for (const [name, type] of [...argsOf(a), ...argsOf(b)]) {\n const set = types.get(name) ?? new Set();\n for (const value of samplesOf(type)) set.add(value);\n types.set(name, set);\n }\n const tags = Object.fromEntries(\n [...new Set([...tagsOf(a), ...tagsOf(b)])].map((t) => [t, (c: unknown[]) => `<${t}>${c.join('')}</${t}>`]),\n );\n const names = [...types.keys()];\n const lists = names.map((n) => [...types.get(n)!]);\n if (lists.reduce((n, l) => n * l.length, 1) <= 1000) {\n let combos: unknown[][] = [[]];\n for (const list of lists) combos = combos.flatMap((c) => list.map((v) => [...c, v]));\n for (const combo of combos) yield { ...tags, ...Object.fromEntries(names.map((n, i) => [n, combo[i]])) };\n return;\n }\n const base = Object.fromEntries(names.map((n, i) => [n, lists[i]![0]]));\n for (const [i, n] of names.entries()) for (const value of lists[i]!) yield { ...tags, ...base, [n]: value };\n}\n\nfunction renderer(ast: MessageFormatElement[], locale: string): (values: Record<string, unknown>) => string {\n // oxlint-disable-next-line no-new-func, typescript/no-implied-eval -- evaluating our own compiled message, as the bundle would\n const messages = new Function(`return ${localeExpression(compileLocale([['m', ast]]))};`)() as CompiledMessages;\n const message = messages.m!;\n const h = createHelpers(locale);\n return (values) => (typeof message === 'string' ? message : flatten(message(values, h)).join(''));\n}\n\nfunction firstDifference(a: MessageFormatElement[], b: MessageFormatElement[], locale: string) {\n const before = renderer(a, locale);\n const after = renderer(b, locale);\n for (const values of samples(a, b)) {\n const x = before(values);\n const y = after(values);\n if (x !== y) {\n const shown = Object.entries(values)\n .filter(([, v]) => typeof v !== 'function')\n .map(([k, v]) => `${k}: ${v instanceof Date ? v.toISOString() : JSON.stringify(v)}`);\n return { values: `{ ${shown.join(', ')} }`, before: x, after: y };\n }\n }\n return undefined;\n}\n","/**\n * Findings as SARIF 2.1.0, the static-analysis format code scanning reads (GitHub's among them), so\n * `lint`, `scan`, `status` and `check` can annotate a pull request on the line the string is written.\n *\n * Paths are relative to the project root under `%SRCROOT%`, which the log maps to the root itself:\n * a project that isn't at the top of its repository still resolves to the right files.\n */\nimport { pathToFileURL } from 'node:url';\n\nexport interface SarifResult {\n /** A rule the report describes, or one of a lint plugin's. */\n rule: string;\n level: 'error' | 'warning';\n message: string;\n /** Relative to the project root, with forward slashes; none for a problem that isn't in a file. */\n file?: string;\n /** From 1; none for the file as a whole. */\n line?: number;\n column?: number;\n}\n\nexport interface SarifTool {\n name: string;\n version: string;\n informationUri: string;\n}\n\n/** Collects what a command found, then writes it as one SARIF run. */\nexport class SarifReport {\n readonly results: SarifResult[] = [];\n private readonly rules = new Map<string, string | undefined>();\n\n /** Describes a rule in one sentence; the first description given for an id stands. */\n rule(id: string, description?: string): void {\n if (this.rules.get(id) === undefined) this.rules.set(id, description);\n }\n\n add(result: SarifResult): void {\n if (!this.rules.has(result.rule)) this.rules.set(result.rule, undefined);\n this.results.push(result);\n }\n\n toJSON(root: string, tool: SarifTool): object {\n const ids = [...this.rules.keys()];\n return {\n $schema: 'https://json.schemastore.org/sarif-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n ...tool,\n rules: ids.map((id) => {\n const description = this.rules.get(id);\n return description === undefined ? { id } : { id, shortDescription: { text: description } };\n }),\n },\n },\n originalUriBaseIds: { '%SRCROOT%': { uri: pathToFileURL(root).href.replace(/\\/?$/, '/') } },\n results: this.results.map((r) => ({\n ruleId: r.rule,\n ruleIndex: ids.indexOf(r.rule),\n level: r.level,\n message: { text: r.message },\n locations: r.file === undefined ? [] : [location(r.file, r.line, r.column)],\n })),\n },\n ],\n };\n }\n}\n\nfunction location(file: string, line: number | undefined, column: number | undefined): object {\n return {\n physicalLocation: {\n artifactLocation: { uri: encodeURI(file), uriBaseId: '%SRCROOT%' },\n ...(line === undefined ? {} : { region: { startLine: line, startColumn: column ?? 1 } }),\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sarif-CI8HOokm.js","names":[],"sources":["../src/tools/types.ts","../src/tools/extract.ts","../src/tools/diff.ts","../src/tools/migrate.ts","../src/tools/sarif.ts"],"sourcesContent":["/**\n * What kind of value an expression in JSX holds, so `extract` can write `{n, number}` for a number and\n * `{d, date, medium}` for a date instead of a bare `{x}`, which is text and prints a number unformatted.\n *\n * The project's own TypeScript (7 or later, through its `unstable/async` API) answers where it can; the\n * syntax of the expression answers where it can't: a JavaScript project, a file outside any tsconfig,\n * or no TypeScript installed. Not the `unstable/sync` API: on Linux and macOS it reads the compiler's\n * pipes through a Node internal (`stdout._handle.fd`) that Bun doesn't have, so under Bun it throws.\n */\nimport { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\n\nimport type * as TsAsync from 'typescript/unstable/async';\nimport type { Checker, Type } from 'typescript/unstable/async';\n\n// oxlint-disable-next-line typescript/no-explicit-any -- a loose ESTree node: the walk reads whichever fields each node type has\ntype Node = { type: string; start: number; end: number; [field: string]: any };\n\ntype TsNode = { pos: number; end: number; forEachChild(visit: (child: TsNode) => unknown): unknown };\n\n/** `node` is markup or an object, which a message can't hold as text. */\nexport type ValueKind = 'string' | 'number' | 'date' | 'node' | 'unknown';\n\nexport interface Span {\n start: number;\n end: number;\n}\n\nexport interface TypeOracle {\n /** Where the answers come from, for the report. */\n readonly source: string;\n /** The kind of each span's expression in `file`, or nothing where the oracle can't say. */\n kinds(file: string, spans: readonly Span[]): Promise<(ValueKind | undefined)[]>;\n close(): Promise<void>;\n}\n\n/** The nearest `tsconfig.json` at or above the file's folder. */\nfunction tsconfigFor(file: string): string | undefined {\n for (let dir = dirname(resolve(file)); ; dir = dirname(dir)) {\n const candidate = join(dir, 'tsconfig.json');\n if (existsSync(candidate)) return candidate;\n if (dirname(dir) === dir) return undefined;\n }\n}\n\n// TypeFlags, as the TypeScript 7 API numbers them.\nconst ANY_OR_UNKNOWN = 3;\nconst NUMBER_LIKE = 67648 | 4224;\nconst STRING_LIKE = 12583968;\nconst UNION = 134217728;\nconst OBJECT = 1048576;\n\n/**\n * An oracle over the projects the files belong to, or nothing where TypeScript 7 isn't installed or\n * none of the files has a tsconfig. One compiler process serves every project and is closed by `close`.\n */\nexport async function typescriptOracle(root: string, files: readonly string[]): Promise<TypeOracle | undefined> {\n const configs = [...new Set(files.map(tsconfigFor).filter((c) => c !== undefined))];\n if (configs.length === 0) return undefined;\n let ts: typeof TsAsync;\n try {\n ts = await import('typescript/unstable/async');\n } catch {\n return undefined;\n }\n let api: InstanceType<typeof ts.API>;\n let snapshot: Awaited<ReturnType<InstanceType<typeof ts.API>['updateSnapshot']>>;\n try {\n api = new ts.API({ cwd: root });\n snapshot = await api.updateSnapshot({ openProjects: configs });\n } catch {\n return undefined;\n }\n\n const classify = async (checker: Checker, type: Type | undefined): Promise<ValueKind | undefined> => {\n if (type === undefined) return undefined;\n const t = (await checker.getNonNullableType(type)) ?? type;\n if ((t.flags & ANY_OR_UNKNOWN) !== 0) return 'unknown';\n if ((t.flags & UNION) !== 0) {\n const members = (await (t as Type & { getTypes(): Promise<readonly Type[] | undefined> }).getTypes()) ?? [];\n const kinds = new Set(await Promise.all(members.map((m) => classify(checker, m))));\n if (kinds.size === 1) return [...kinds][0];\n return kinds.has('node') ? 'node' : 'unknown';\n }\n if ((t.flags & NUMBER_LIKE) !== 0) return 'number';\n if ((t.flags & STRING_LIKE) !== 0) return 'string';\n if ((await checker.typeToString(t)) === 'Date') return 'date';\n if ((t.flags & OBJECT) !== 0) return 'node';\n return 'unknown';\n };\n\n return {\n source: 'TypeScript',\n async kinds(file, spans) {\n const project = await snapshot.getDefaultProjectForFile(resolve(file));\n const sourceFile = await project?.program.getSourceFile(resolve(file));\n if (project === undefined || sourceFile === undefined) return spans.map(() => undefined);\n // The smallest node covering each span is the expression itself.\n const nodes = spans.map(({ start, end }) => {\n let node: TsNode = sourceFile;\n for (;;) {\n let next: TsNode | undefined;\n node.forEachChild((child) => {\n if (next === undefined && child.pos <= start && child.end >= end) next = child;\n });\n if (next === undefined) return node;\n node = next;\n }\n });\n const types = await project.checker.getTypeAtLocation(nodes as never[]);\n return Promise.all(types.map((type) => classify(project.checker, type)));\n },\n close() {\n return api.close();\n },\n };\n}\n\n/** The kind an expression's syntax gives away, where it does: `items.length`, `a * b`, `new Date()`. */\nexport function syntaxKind(expr: Node): ValueKind | undefined {\n switch (expr.type) {\n case 'Literal':\n return typeof expr.value === 'number' ? 'number' : typeof expr.value === 'string' ? 'string' : undefined;\n case 'TemplateLiteral':\n return 'string';\n case 'MemberExpression':\n return !expr.computed && ['length', 'size', 'count'].includes(expr.property?.name as string) ? 'number' : undefined;\n case 'BinaryExpression':\n return ['-', '*', '/', '%', '**'].includes(expr.operator as string) ? 'number' : undefined;\n case 'NewExpression':\n return expr.callee?.type === 'Identifier' && expr.callee.name === 'Date' ? 'date' : undefined;\n case 'CallExpression':\n return expr.callee?.type === 'MemberExpression' && expr.callee.object?.name === 'Math' ? 'number' : undefined;\n default:\n return undefined;\n }\n}\n","/**\n * `prosebook extract`: moves hardcoded JSX text into the catalog and rewrites the code to read it.\n *\n * It works on runs, not fragments. The children of an element that together make one sentence, text,\n * simple expressions and inline elements holding only text, become one message: `Hi {user.name}, <a\n * href=\"/x\">go</a>!` is `Hi {name}, <a>go</a>!`, so a translator can reorder the whole sentence. A run\n * becomes `<Text id=… />`, which needs no hook; a readable attribute becomes `t('…')`, with `useCopy()`\n * added to its component. Keys, kinds, surfaces and contexts are suggestions, marked for review.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, extname, join, relative } from 'node:path';\n\nimport { parseSync } from 'oxc-parser';\nimport { stringify } from 'yaml';\n\nimport { CatalogError, KEY_PATTERN, loadCatalog } from './catalog.ts';\nimport type { ResolvedConfig } from './config.ts';\nimport { parseMessage } from './icu.ts';\nimport { singularOf } from './lint.ts';\nimport { looksLikeCode } from './scan.ts';\nimport { writeMessage } from './syntax.ts';\nimport { syntaxKind, typescriptOracle, type Span, type ValueKind } from './types.ts';\n\n// oxlint-disable-next-line typescript/no-explicit-any -- a loose ESTree node: the walk reads whichever fields each node type has\ntype Node = { type: string; start: number; end: number; [field: string]: any };\n\nexport interface Extraction {\n file: string;\n line: number;\n column: number;\n key: string;\n /** The ICU message. */\n message: string;\n /** Whether an entry with this key and message already exists, so none is added. */\n reused: boolean;\n where: string;\n /** The code that replaces the hardcoded text. */\n replacement: string;\n}\n\nexport interface NewEntry {\n key: string;\n area: string;\n message: string;\n kind?: string;\n surface?: string;\n context: string;\n args: Record<string, string>;\n}\n\ninterface Edit {\n start: number;\n end: number;\n text: string;\n}\n\nexport interface FilePlan {\n path: string;\n file: string;\n code: string;\n edits: Edit[];\n extractions: Extraction[];\n warnings: string[];\n}\n\nexport interface ExtractPlan {\n files: FilePlan[];\n entries: NewEntry[];\n /** What said which placeholders are numbers and dates: `TypeScript`, or `syntax` alone. */\n types: string;\n}\n\nconst MODULE = 'prosebook/react';\nconst NON_PROSE = new Set(['code', 'pre', 'kbd', 'samp', 'script', 'style', 'svg', 'path', 'Text']);\nconst LETTER = /\\p{L}/u;\n\n/** Elements that sit inside a sentence, and so become a tag in its message rather than ending it. */\nconst INLINE = new Set([\n 'a',\n 'abbr',\n 'b',\n 'bdi',\n 'cite',\n 'del',\n 'dfn',\n 'em',\n 'i',\n 'ins',\n 'kbd',\n 'mark',\n 'q',\n 's',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'time',\n 'u',\n 'var',\n]);\nconst isInline = (name: string) => INLINE.has(name) || /^[A-Z]\\w*Link$|^Link$/.test(name);\n\n/** Elements whose text has an obvious kind and surface. */\nconst ROLES: Record<string, [kind: string, surface: string]> = {\n button: ['action', 'action'],\n h1: ['name', 'heading'],\n h2: ['name', 'heading'],\n h3: ['name', 'heading'],\n h4: ['name', 'heading'],\n h5: ['name', 'heading'],\n h6: ['name', 'heading'],\n th: ['name', 'heading'],\n legend: ['name', 'heading'],\n caption: ['name', 'heading'],\n label: ['name', 'label'],\n option: ['name', 'choice'],\n title: ['name', 'title'],\n};\n\n/** Readable attributes: the kind and surface their value has, and the key suffix that says which it is. */\nconst ATTRIBUTE_ROLES: Record<string, [kind: string | undefined, surface: string, suffix: string]> = {\n placeholder: [undefined, 'placeholder', 'placeholder'],\n title: ['name', 'tooltip', 'tooltip'],\n 'aria-label': ['name', 'aria', 'aria'],\n 'aria-description': ['description', 'aria', 'aria-description'],\n 'aria-placeholder': [undefined, 'aria', 'aria-placeholder'],\n alt: [undefined, 'aria', 'alt'],\n label: ['name', 'label', 'label'],\n};\n\n/** The area a file's strings go in: its name in kebab case, or its folder's for an `index`. */\nexport function areaOf(file: string): string {\n let name = basename(file, extname(file));\n if (['index', 'page', 'layout', 'route', 'main'].includes(name)) name = basename(dirname(file));\n const kebab = name\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return kebab === '' ? 'app' : kebab;\n}\n\n/** A key segment from the words of a message: its first four, plain ASCII, lowercase. */\nexport function slugOf(message: string): string {\n const words = message\n .replace(/<\\/?[\\w-]+>|\\{[^}]*\\}/g, ' ')\n .replace(/ı/g, 'i')\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n .split(' ')\n .filter(Boolean)\n .slice(0, 4);\n return words.length === 0 ? 'text' : words.join('-');\n}\n\n/**\n * A count followed by a plural noun, `{n, number} files`, as the plural it needs: `{n, plural, one {#\n * file} other {# files}}`. English only, and a draft: the TODO above the entry asks for a look.\n */\nexport function draftPlurals(message: string): string {\n return message.replace(/\\{(\\w+), number\\} (\\p{L}+)(?![\\p{L}'])/gu, (whole, name: string, word: string) => {\n const one = singularOf(word);\n return one === undefined ? whole : `{${name}, plural, one {# ${one}} other {# ${word}}}`;\n });\n}\n\n/** A message built as MF1, as the catalog writes messages: an MF2 catalog gets it in MF2. */\nfunction inSyntax(config: ResolvedConfig, mf1: string): string {\n return config.messageFormat === 2 ? writeMessage(2, parseMessage(mf1), config.source) : mf1;\n}\n\n/** Text written literally inside an ICU message. */\nfunction escapeIcu(text: string): string {\n return text.replace(/[{}<]/g, (c) => `'${c}'`);\n}\n\n/** JSX text as React renders it: lines trimmed where they meet a line break, blank lines dropped. */\nfunction jsxText(value: string): string {\n const lines = value.split(/\\r\\n|\\n|\\r/);\n // As Babel does: a value with no visible characters still keeps its one line, so a lone space renders.\n let lastNonEmpty = 0;\n lines.forEach((line, i) => {\n if (/[^ \\t]/.test(line)) lastNonEmpty = i;\n });\n let out = '';\n lines.forEach((line, i) => {\n let trimmed = line.replace(/\\t/g, ' ');\n if (i !== 0) trimmed = trimmed.replace(/^ +/, '');\n if (i !== lines.length - 1) trimmed = trimmed.replace(/ +$/, '');\n if (trimmed === '') return;\n out += i === lastNonEmpty ? trimmed : `${trimmed} `;\n });\n return out;\n}\n\nconst SIMPLE_EXPRESSIONS = new Set([\n 'Identifier',\n 'MemberExpression',\n 'CallExpression',\n 'TemplateLiteral',\n 'Literal',\n 'BinaryExpression',\n 'TSNonNullExpression',\n 'ChainExpression',\n]);\n\n/** A value that reads as a placeholder: no JSX and no functions inside it, which would be markup or logic. */\nfunction simple(expr: Node): boolean {\n if (!SIMPLE_EXPRESSIONS.has(expr.type)) return false;\n let found = false;\n const walk = (node: Node) => {\n if (found) return;\n if (/^JSX|FunctionExpression$/.test(node.type)) found = true;\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) value.forEach((v) => isNode(v) && walk(v));\n else if (isNode(value)) walk(value);\n }\n };\n walk(expr);\n return !found;\n}\n\n/** Every name bound inside a node: declarations, parameters, catch clauses, imports. With `deep` false, only its own scope's. */\nfunction bindingsIn(root: Node, deep = true): Set<string> {\n const names = new Set<string>();\n const pattern = (p: Node | null | undefined) => {\n if (!p) return;\n if (p.type === 'Identifier') names.add(p.name as string);\n else if (p.type === 'ObjectPattern')\n for (const prop of p.properties as Node[]) pattern(prop.type === 'RestElement' ? prop : prop.value);\n else if (p.type === 'ArrayPattern') for (const el of p.elements as (Node | null)[]) pattern(el);\n else if (p.type === 'AssignmentPattern') pattern(p.left);\n else if (p.type === 'RestElement') pattern(p.argument);\n };\n const walk = (node: Node, top: boolean) => {\n if (node.type === 'VariableDeclarator') pattern(node.id);\n if (node.type === 'ImportSpecifier' || node.type === 'ImportDefaultSpecifier' || node.type === 'ImportNamespaceSpecifier')\n pattern(node.local);\n if ((node.type === 'FunctionDeclaration' || node.type === 'ClassDeclaration') && node.id) pattern(node.id);\n if (node.type === 'CatchClause') pattern(node.param);\n const isFunction = /Function(?:Declaration|Expression)$|^ArrowFunctionExpression$/.test(node.type);\n if (isFunction && (deep || top)) for (const param of node.params as Node[]) pattern(param);\n if (isFunction && !deep && !top) return;\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const child of value) if (isNode(child)) walk(child, false);\n } else if (isNode(value)) {\n walk(value, false);\n }\n }\n };\n walk(root, true);\n return names;\n}\n\nfunction elementName(el: Node): string | undefined {\n const name = el.openingElement?.name as Node | undefined;\n return name?.type === 'JSXIdentifier' ? (name.name as string) : undefined;\n}\n\nfunction isNode(value: unknown): value is Node {\n return typeof value === 'object' && value !== null && typeof (value as Node).type === 'string';\n}\n\ninterface Context {\n config: ResolvedConfig;\n area: string;\n /** Every key's source message, the catalog's and those added in this run. */\n known: Map<string, string>;\n entries: NewEntry[];\n /** The kind of value each JSX expression holds, by `start:end`. */\n kinds: Map<string, ValueKind>;\n}\n\n/** Plans the extraction from one file: the edits and the entries, without writing anything. */\nfunction planFile(path: string, ctx: Context): FilePlan {\n const code = readFileSync(path, 'utf8');\n const file = relative(ctx.config.root, path).replaceAll('\\\\', '/');\n const plan: FilePlan = { path, file, code, edits: [], extractions: [], warnings: [] };\n const { program } = parseSync(file, code);\n const topLevel = bindingsIn(program, false);\n const lines = code.split('\\n');\n const lineStarts: number[] = [];\n let offset = 0;\n for (const line of lines) {\n lineStarts.push(offset);\n offset += line.length + 1;\n }\n const position = (at: number) => {\n let line = lineStarts.findIndex((s) => s > at);\n line = line === -1 ? lineStarts.length : line;\n return { line, column: at - lineStarts[line - 1]! + 1 };\n };\n const ignored = (at: number) => {\n const { line } = position(at);\n return (lines[line - 1] ?? '').includes('prosebook-ignore') || (lines[line - 2] ?? '').includes('prosebook-ignore');\n };\n\n let needText = false;\n let needUseCopy = false;\n /** Per component, by where it starts: the call that reads the catalog there. */\n const hooked = new Map<number, string>();\n /** Children now inside a `<Text>`, which the walk does not enter. */\n const consumed = new Set<Node>();\n /** Enclosing functions, innermost last: the component each belongs to, and whether it is one. */\n const components: { fn: Node; name: string | undefined; isComponent: boolean }[] = [];\n\n const componentName = (fn: Node, parent: Node | undefined): string | undefined => {\n if (fn.id?.name) return fn.id.name as string;\n if (parent?.type === 'VariableDeclarator' && parent.id?.type === 'Identifier') return parent.id.name as string;\n return undefined;\n };\n\n const entryFor = (\n message: string,\n args: Record<string, string>,\n role: [string | undefined, string | undefined],\n context: string,\n suffix?: string,\n ) => {\n for (const [key, text] of ctx.known) if (text === message && key.startsWith(`${ctx.area}.`)) return { key, reused: true };\n\n const base = `${ctx.area}.${slugOf(message)}${suffix ? `-${suffix}` : ''}`;\n let key = base;\n for (let n = 2; ctx.known.has(key); n++) key = `${base}-${n}`;\n ctx.known.set(key, message);\n const [kind, surface] = role;\n ctx.entries.push({\n key,\n area: ctx.area,\n message,\n ...(kind !== undefined && kind in ctx.config.kinds ? { kind } : {}),\n ...(surface !== undefined && surface in ctx.config.surfaces ? { surface } : {}),\n context,\n args,\n });\n return { key, reused: false };\n };\n\n const where = (element: string | undefined) => {\n const component = components.at(-1)?.name;\n return `${component ? `In ${component}` : `In ${file}`}${element ? `, the text of a <${element}>` : ''}.`;\n };\n\n /** The children of one element, split into runs at anything that cannot sit inside a sentence. */\n const extractChildren = (parent: Node, children: Node[]) => {\n const parentName = parent.type === 'JSXElement' ? elementName(parent) : undefined;\n let run: Node[] = [];\n const flush = () => {\n if (run.length > 0) extractRun(run, parentName);\n run = [];\n };\n for (const child of children) {\n if (inlineable(child)) run.push(child);\n else flush();\n }\n flush();\n };\n\n const inlineable = (child: Node): boolean => {\n if (child.type === 'JSXText') return true;\n if (child.type === 'JSXExpressionContainer') return simple(child.expression as Node);\n if (child.type === 'JSXElement') {\n const name = elementName(child);\n if (name === undefined || child.openingElement.selfClosing || !isInline(name)) return false;\n return (child.children as Node[]).every(inlineable);\n }\n return false;\n };\n\n const extractRun = (run: Node[], parentName: string | undefined) => {\n // Whitespace-only text at either end stays where it is, so the layout around the run is unchanged.\n const blank = (n: Node) => n.type === 'JSXText' && jsxText(n.value as string).trim() === '';\n const from = run.findIndex((n) => !blank(n));\n if (from === -1) return;\n const nodes = run.slice(from, run.findLastIndex((n) => !blank(n)) + 1);\n // Elements with nothing but whitespace between them are layout, not a sentence: each one's text is\n // its own, as `<li><a href>Home</a></li>` is \"Home\".\n if (nodes.every((n) => n.type === 'JSXElement' || blank(n))) return;\n const first = nodes[0]!;\n const last = nodes.at(-1)!;\n const values = new Map<string, string>();\n const argDocs: Record<string, string> = {};\n const names = new Map<string, string>();\n const tags = new Set<string>();\n\n const argName = (expr: Node): string => {\n const source = code.slice(expr.start, expr.end);\n const known = names.get(source);\n if (known !== undefined) return known;\n let inner = expr;\n while (inner.type === 'TSNonNullExpression' || inner.type === 'ChainExpression') inner = inner.expression;\n let name =\n inner.type === 'Identifier'\n ? (inner.name as string)\n : inner.type === 'MemberExpression' && !inner.computed && inner.property?.type === 'Identifier'\n ? (inner.property.name as string)\n : 'value';\n const base = name;\n for (let n = 2; values.has(name) || tags.has(name); n++) name = `${base}${n}`;\n names.set(source, name);\n values.set(name, source);\n argDocs[name] = `TODO: what \\`${source}\\` holds`;\n return name;\n };\n\n const piece = (node: Node): string => {\n if (node.type === 'JSXText') return escapeIcu(jsxText(node.value as string));\n if (node.type === 'JSXElement') {\n let tag = elementName(node)!.toLowerCase();\n const base = tag;\n for (let n = 2; tags.has(tag) || values.has(tag); n++) tag = `${base}${n}`;\n tags.add(tag);\n const open = code.slice(node.openingElement.start, node.openingElement.end);\n const close = code.slice(node.closingElement.start, node.closingElement.end);\n values.set(tag, `(chunks) => ${open}{chunks}${close}`);\n return `<${tag}>${(node.children as Node[]).map(piece).join('')}</${tag}>`;\n }\n const expr = node.expression as Node;\n if (expr.type === 'Literal' && typeof expr.value === 'string') return escapeIcu(expr.value);\n if (expr.type === 'TemplateLiteral' && expr.expressions.length === 0) return escapeIcu(expr.quasis[0].value.cooked as string);\n const kind = ctx.kinds.get(`${expr.start}:${expr.end}`) ?? syntaxKind(expr);\n if (kind === 'node') markup.push(code.slice(expr.start, expr.end));\n return `{${argName(expr)}${kind === 'number' ? ', number' : kind === 'date' ? ', date, medium' : ''}}`;\n };\n\n const markup: string[] = [];\n let message = nodes.map(piece).join('').trim();\n if (markup.length > 0) {\n const at = position(first.start);\n plan.warnings.push(\n `${file}:${at.line}:${at.column} {${markup.join('}, {')}} holds markup, not text, so this sentence was left as it is: make it a tag, or give the text around it entries of its own`,\n );\n return;\n }\n if (/^en\\b/.test(ctx.config.source)) message = draftPlurals(message);\n // A run of spaces, placeholders and punctuation is layout, not words.\n const words = message.replace(/\\{[^}]*\\}|<\\/?[\\w-]+>|'[{}<]'/g, '');\n if (!LETTER.test(words) || (values.size === 0 && looksLikeCode(message))) return;\n // The whitespace at either end stays in the code as it was: a space still renders as one, and a\n // line break still renders as nothing.\n const start = first.type === 'JSXText' ? first.start + (/^\\s*/.exec(first.value as string)?.[0].length ?? 0) : first.start;\n const end = last.type === 'JSXText' ? last.end - (/\\s*$/.exec(last.value as string)?.[0].length ?? 0) : last.end;\n if (ignored(start)) return;\n\n message = inSyntax(ctx.config, message);\n const role = parentName !== undefined ? ROLES[parentName] : undefined;\n const { key, reused } = entryFor(message, argDocs, role ?? [undefined, undefined], where(parentName));\n const props = [...values].map(([name, source]) => `${/^[A-Za-z_$][\\w$]*$/.test(name) ? name : JSON.stringify(name)}: ${source}`);\n const replacement = `<Text id=${JSON.stringify(key)}${props.length > 0 ? ` values={{ ${props.join(', ')} }}` : ''} />`;\n plan.edits.push({ start, end, text: replacement });\n for (const n of nodes) consumed.add(n);\n plan.extractions.push({ file, ...position(start), key, message, reused, where: 'text', replacement });\n needText = true;\n };\n\n const extractAttribute = (attr: Node, element: Node) => {\n const name = attr.name?.type === 'JSXIdentifier' ? (attr.name.name as string) : '';\n if (!ctx.config.scan.attributes.includes(name) || attr.value === null) return;\n const value = attr.value as Node;\n let text: string | undefined;\n if (value.type === 'Literal' && typeof value.value === 'string') {\n text = value.value;\n } else if (value.type === 'JSXExpressionContainer') {\n const expr = value.expression as Node;\n if (expr.type === 'Literal' && typeof expr.value === 'string') text = expr.value;\n if (expr.type === 'TemplateLiteral' && expr.expressions.length === 0) text = expr.quasis[0].value.cooked as string;\n }\n if (text === undefined || !LETTER.test(text) || looksLikeCode(text) || ignored(attr.start)) return;\n const at = position(value.start);\n const fn = components.findLast((c) => c.isComponent)?.fn;\n if (fn === undefined || fn.body?.type !== 'BlockStatement') {\n plan.warnings.push(\n `${file}:${at.line}:${at.column} ${name}=\"${text}\" is not inside a component with a body, so it has no t() to read; left as it is`,\n );\n return;\n }\n const call = hookFor(fn);\n if (call === undefined) {\n plan.warnings.push(\n `${file}:${at.line}:${at.column} ${name}=\"${text}\": its component binds both \\`t\\` and \\`copy\\` already; left as it is`,\n );\n return;\n }\n const [kind, surface, suffix] = ATTRIBUTE_ROLES[name] ?? [undefined, undefined, name];\n const tag = elementName(element) ?? 'element';\n const component = components.at(-1)?.name;\n const context = `${component ? `In ${component}` : `In ${file}`}, the ${name} of a <${tag}>.`;\n const message = inSyntax(ctx.config, escapeIcu(text));\n const { key, reused } = entryFor(message, {}, [kind, surface], context, suffix);\n const replacement = `{${call}(${JSON.stringify(key)})}`;\n plan.edits.push({ start: value.start, end: value.end, text: replacement });\n plan.extractions.push({ file, ...at, key, message, reused, where: name, replacement });\n };\n\n /**\n * Makes sure the component can read the catalog, and returns the call that does: `t` from\n * `useCopy()`, or `copy.t` where the component or the module already binds a `t` of its own.\n */\n const hookFor = (fn: Node): string | undefined => {\n const chosen = hooked.get(fn.start);\n if (chosen !== undefined) return chosen;\n const taken = new Set([...topLevel, ...bindingsIn(fn)]);\n const body = code.slice(fn.body.start, fn.body.end);\n const insert = (text: string) => plan.edits.push({ start: fn.body.start + 1, end: fn.body.start + 1, text });\n const firstStatement = fn.body.body[0] as Node | undefined;\n const indent = firstStatement ? ' '.repeat(position(firstStatement.start).column - 1) : ' ';\n let call: string | undefined;\n const destructured = /\\{([^{}]*)\\}\\s*=\\s*useCopy\\(\\)/.exec(body);\n const whole = /\\b(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*useCopy\\(\\)/.exec(body);\n if (destructured !== null && /(^|[\\s,])t(\\s*[,}]|\\s*$)/.test(destructured[1]!)) {\n call = 't';\n } else if (whole !== null) {\n call = `${whole[1]}.t`;\n } else if (destructured !== null && !taken.has('t')) {\n const at = fn.body.start + destructured.index + 1;\n plan.edits.push({ start: at, end: at, text: ' t,' });\n call = 't';\n } else if (!taken.has('t')) {\n insert(`\n${indent}const { t } = useCopy();`);\n call = 't';\n } else if (!taken.has('copy')) {\n insert(`\n${indent}const copy = useCopy();`);\n call = 'copy.t';\n }\n if (call !== undefined && destructured === null && whole === null) needUseCopy = true;\n if (call !== undefined) hooked.set(fn.start, call);\n return call;\n };\n\n const visit = (node: Node, parent: Node | undefined) => {\n const isFunction = node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression';\n if (isFunction) {\n const own = componentName(node, parent);\n const isComponent = own !== undefined && /^(?:[A-Z]|use[A-Z])/.test(own);\n components.push({ fn: node, name: isComponent ? own : components.at(-1)?.name, isComponent });\n }\n if (node.type === 'JSXElement' || node.type === 'JSXFragment') {\n const name = node.type === 'JSXElement' ? elementName(node) : undefined;\n if (node.type === 'JSXElement') {\n for (const attr of node.openingElement.attributes as Node[]) {\n if (attr.type !== 'JSXAttribute') continue;\n extractAttribute(attr, node);\n // `render={() => <p>Hi</p>}` holds JSX of its own.\n if (attr.value?.type === 'JSXExpressionContainer') visit(attr.value as Node, attr);\n }\n }\n if (name === undefined || !NON_PROSE.has(name)) {\n extractChildren(node, node.children as Node[]);\n for (const child of node.children as Node[]) if (!consumed.has(child)) visit(child, node);\n }\n return;\n }\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const child of value) if (isNode(child)) visit(child, node);\n } else if (isNode(value)) {\n visit(value, node);\n }\n }\n if (isFunction) components.pop();\n };\n\n visit(program, undefined);\n plan.extractions.sort((a, b) => (a.line !== b.line ? a.line - b.line : a.column - b.column));\n if (needText || needUseCopy) importEdit(program, code, plan, [...(needText ? ['Text'] : []), ...(needUseCopy ? ['useCopy'] : [])]);\n return plan;\n}\n\n/** Adds the names to an existing `prosebook/react` import, or a new import after the last one. */\nfunction importEdit(program: Node, code: string, plan: FilePlan, wanted: string[]) {\n const imports = (program.body as Node[]).filter((s) => s.type === 'ImportDeclaration');\n const existing = imports.find((s) => s.source.value === MODULE && s.importKind !== 'type');\n if (existing) {\n const named = (existing.specifiers as Node[]).filter((s) => s.type === 'ImportSpecifier');\n const have = new Set(named.map((s) => s.local.name as string));\n const missing = wanted.filter((w) => !have.has(w));\n if (missing.length === 0) return;\n if (named.length > 0) {\n plan.edits.push({ start: named.at(-1)!.end, end: named.at(-1)!.end, text: `, ${missing.join(', ')}` });\n return;\n }\n }\n const line = `import { ${wanted.join(', ')} } from '${MODULE}';`;\n const last = imports.at(-1);\n if (last) {\n plan.edits.push({ start: last.end, end: last.end, text: `\\n${line}` });\n } else {\n const directive = /^(?:\\s*(['\"])use \\w+\\1;?\\s*\\n)*/.exec(code)?.[0] ?? '';\n plan.edits.push({ start: directive.length, end: directive.length, text: `${line}\\n${directive === '' ? '\\n' : ''}` });\n }\n}\n\n/** The spans of every expression inside JSX, which are the ones that may become placeholders. */\nfunction jsxExpressions(file: string, code: string): Span[] {\n const spans: Span[] = [];\n const walk = (node: Node) => {\n if (node.type === 'JSXExpressionContainer' && node.expression.type !== 'JSXEmptyExpression')\n spans.push({ start: node.expression.start as number, end: node.expression.end as number });\n\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const child of value) if (isNode(child)) walk(child);\n } else if (isNode(value)) {\n walk(value);\n }\n }\n };\n walk(parseSync(file, code).program);\n return spans;\n}\n\n/**\n * Plans an extraction over the files in `paths` against the current catalog. With `types` (the\n * default), the project's TypeScript says which placeholders are numbers and dates.\n */\nexport async function planExtract(\n config: ResolvedConfig,\n paths: string[],\n options: { area?: string; types?: boolean } = {},\n): Promise<ExtractPlan> {\n if (options.area !== undefined && !KEY_PATTERN.test(`${options.area}.x`))\n throw new Error(`prosebook: \"${options.area}\" is not an area: lowercase words joined by -`);\n const known = new Map<string, string>();\n if (existsSync(config.catalog)) {\n try {\n for (const m of loadCatalog(config).messages) known.set(m.key, m.text);\n } catch (e) {\n if (!(e instanceof CatalogError)) throw e;\n throw new Error(`prosebook: fix the catalog before extracting into it:\\n${e.message}`, { cause: e });\n }\n }\n const entries: NewEntry[] = [];\n const oracle = options.types === false ? undefined : await typescriptOracle(config.root, paths);\n try {\n // One file at a time: each plan sees the entries the ones before it added.\n const files: FilePlan[] = [];\n for (const path of paths) {\n const kinds = new Map<string, ValueKind>();\n if (oracle) {\n const spans = jsxExpressions(path, readFileSync(path, 'utf8'));\n (await oracle.kinds(path, spans)).forEach((kind, i) => {\n if (kind !== undefined && kind !== 'unknown') kinds.set(`${spans[i]!.start}:${spans[i]!.end}`, kind);\n });\n }\n files.push(planFile(path, { config, area: options.area ?? areaOf(path), known, entries, kinds }));\n }\n return { files, entries, types: oracle?.source ?? 'syntax' };\n } finally {\n await oracle?.close();\n }\n}\n\n/** Applies a plan: rewrites the files and appends the new entries to their area's catalog file. */\nexport function applyExtract(config: ResolvedConfig, plan: ExtractPlan): string[] {\n const written: string[] = [];\n for (const file of plan.files) {\n if (file.edits.length === 0) continue;\n let code = file.code;\n for (const edit of [...file.edits].sort((a, b) => (a.start !== b.start ? b.start - a.start : b.end - a.end)))\n code = code.slice(0, edit.start) + edit.text + code.slice(edit.end);\n\n writeFileSync(file.path, code);\n written.push(file.path);\n }\n const byArea = new Map<string, NewEntry[]>();\n for (const entry of plan.entries) byArea.set(entry.area, [...(byArea.get(entry.area) ?? []), entry]);\n for (const [area, entries] of byArea) {\n const path = join(config.catalog, `${area}.yaml`);\n // Written as YAML 1.1, which quotes `n`, `yes` and `on`: they then read the same under 1.1 and 1.2,\n // as the catalog requires.\n const blocks = entries.map((e) => {\n const body: Record<string, unknown> = {};\n if (e.kind) body.kind = e.kind;\n if (e.surface) body.surface = e.surface;\n body.context = e.context;\n if (Object.keys(e.args).length > 0) body.args = e.args;\n body[config.source] = e.message;\n return `# TODO(prosebook extract): check the key, kind and context.\\n${stringify({ [e.key]: body }, { lineWidth: 0, version: '1.1' })}`;\n });\n mkdirSync(config.catalog, { recursive: true });\n const current = existsSync(path) ? readFileSync(path, 'utf8') : '# yaml-language-server: $schema=./catalog.schema.json\\n';\n writeFileSync(path, `${current.replace(/\\n*$/, '\\n')}\\n${blocks.join('\\n')}`);\n written.push(path);\n }\n return written;\n}\n","/**\n * A word diff, for showing a translator what changed in the source since they translated it. Words,\n * runs of whitespace and single punctuation marks are the units, so an ICU brace or a period changes\n * on its own rather than taking its word with it.\n */\n\nexport interface DiffPart {\n op: 'same' | 'add' | 'del';\n text: string;\n}\n\nconst TOKEN = /\\s+|[\\p{L}\\p{N}_'’]+|[^\\s\\p{L}\\p{N}_]/gu;\n\n/** Past this many cells the table costs more than the diff is worth: show the whole change instead. */\nconst MAX_CELLS = 250_000;\n\nexport function wordDiff(before: string, after: string): DiffPart[] {\n const a = before.match(TOKEN) ?? [];\n const b = after.match(TOKEN) ?? [];\n if (a.length * b.length > MAX_CELLS) {\n const whole: DiffPart[] = [\n { op: 'del', text: before },\n { op: 'add', text: after },\n ];\n return merge(whole);\n }\n // The longest common subsequence, by suffix, so the walk below reads front to back.\n const lcs: number[][] = Array.from({ length: a.length + 1 }, () => Array.from({ length: b.length + 1 }, () => 0));\n for (let i = a.length - 1; i >= 0; i--) {\n for (let j = b.length - 1; j >= 0; j--)\n lcs[i]![j] = a[i] === b[j] ? lcs[i + 1]![j + 1]! + 1 : Math.max(lcs[i + 1]![j]!, lcs[i]![j + 1]!);\n }\n\n const parts: DiffPart[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n if (a[i] === b[j]) {\n parts.push({ op: 'same', text: a[i]! });\n i++;\n j++;\n } else if (lcs[i + 1]![j]! >= lcs[i]![j + 1]!) {\n parts.push({ op: 'del', text: a[i++]! });\n } else {\n parts.push({ op: 'add', text: b[j++]! });\n }\n }\n while (i < a.length) parts.push({ op: 'del', text: a[i++]! });\n while (j < b.length) parts.push({ op: 'add', text: b[j++]! });\n return merge(parts);\n}\n\n/**\n * Adjacent parts of one kind joined, and a space shared by two changes folded into them, so a\n * replaced phrase reads `[-old words-]{+new words+}` rather than alternating word by word.\n */\nfunction merge(parts: DiffPart[]): DiffPart[] {\n const out: DiffPart[] = [];\n for (let k = 0; k < parts.length; k++) {\n const part = parts[k]!;\n const prev = out.at(-1);\n const next = parts[k + 1];\n if (part.op === 'same' && /^\\s+$/.test(part.text) && prev && prev.op !== 'same' && next && next.op !== 'same') {\n // Whitespace between two changes belongs to both.\n out.push({ op: 'del', text: part.text }, { op: 'add', text: part.text });\n continue;\n }\n out.push({ ...part });\n }\n const joined: DiffPart[] = [];\n for (const part of out.filter((p) => p.text !== '')) {\n // Gather each stretch of changes as all its deletions, then all its additions.\n const last = joined.at(-1);\n if (last && last.op === part.op) last.text += part.text;\n else if (part.op === 'del' && last?.op === 'add' && joined.at(-2)?.op === 'del') joined.at(-2)!.text += part.text;\n else joined.push({ ...part });\n }\n return joined;\n}\n\n/** The diff as one line: `Save [-the-]{+a+} draft`, the notation of `git diff --word-diff`. */\nexport function formatDiff(parts: DiffPart[]): string {\n return parts.map((p) => (p.op === 'same' ? p.text : p.op === 'del' ? `[-${p.text}-]` : `{+${p.text}+}`)).join('');\n}\n","/**\n * `prosebook migrate`: a catalog and its translations rewritten from one syntax to the other. Each\n * message is written in the target syntax, read back, and rendered both ways over sample values, so\n * one that can't be written, or would come out different, is reported before anything changes.\n */\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { isMap, parseDocument, Scalar } from 'yaml';\n\nimport { createHelpers, flatten } from '#src/runtime/helpers.ts';\nimport type { CompiledMessages } from '#src/runtime/types.ts';\n\nimport { loadCatalog } from './catalog.ts';\nimport { compileLocale, localeExpression } from './compile.ts';\nimport type { ResolvedConfig } from './config.ts';\nimport { argsOf, tagsOf, type MessageFormatElement } from './icu.ts';\nimport { readMessage, writeMessage, type MessageFormatVersion } from './syntax.ts';\n\ninterface Located {\n key: string;\n locale: string;\n /** The file, relative to the project root. */\n file: string;\n}\n\nexport interface MigratePlan {\n to: MessageFormatVersion;\n rewrites: (Located & { before: string; after: string })[];\n /** Messages the target syntax can't say, and why. Nothing is written while there are any. */\n blocked: (Located & { reason: string })[];\n /** Messages that would render differently, with the first values that show it. */\n changed: (Located & { values: string; before: string; after: string })[];\n}\n\nexport function planMigrate(config: ResolvedConfig, to: MessageFormatVersion): MigratePlan {\n const catalog = loadCatalog(config);\n const plan: MigratePlan = { to, rewrites: [], blocked: [], changed: [] };\n for (const m of catalog.messages) {\n const versions = [\n { locale: config.source, text: m.text, ast: m.ast, file: m.file },\n ...[...m.translations].map(([locale, t]) => ({ locale, text: t.text, ast: t.ast, file: t.file })),\n ];\n for (const { locale, text, ast, file } of versions) {\n const at = { key: m.key, locale, file };\n let after: string;\n let back: MessageFormatElement[];\n try {\n after = writeMessage(to, ast, locale);\n back = readMessage(to, after, locale);\n } catch (e) {\n plan.blocked.push({ ...at, reason: (e as Error).message });\n continue;\n }\n const difference = firstDifference(ast, back, locale);\n if (difference !== undefined) plan.changed.push({ ...at, ...difference });\n if (after !== text) plan.rewrites.push({ ...at, before: text, after });\n }\n }\n return plan;\n}\n\n/** Writes the plan's rewrites into the YAML files, keeping their comments and layout. Returns the files written. */\nexport function applyMigrate(config: ResolvedConfig, plan: MigratePlan): string[] {\n if (plan.blocked.length > 0) throw new Error('prosebook: some messages have no equivalent in the target syntax; nothing was written');\n const byFile = Map.groupBy(plan.rewrites, (r) => r.file);\n for (const [file, rewrites] of byFile) {\n const path = join(config.root, file);\n // As YAML 1.1, so a new value that 1.1 would read differently, like `n`, is quoted.\n const doc = parseDocument(readFileSync(path, 'utf8'), { version: '1.1' });\n for (const r of rewrites) {\n const value = doc.createNode(r.after);\n if (r.after.includes('\\n')) value.type = Scalar.BLOCK_LITERAL;\n const entry = doc.get(r.key, true);\n if (isMap(entry)) entry.set(config.source, value);\n else doc.set(r.key, value);\n }\n writeFileSync(path, doc.toString({ lineWidth: 0 }));\n }\n return [...byFile.keys()];\n}\n\nconst NUMBERS = [0, 1, 2, 3, 5, 11, 21, 101, 1.5, 1234.5];\nconst DATE = new Date(Date.UTC(2026, 0, 5, 14, 30, 15));\n\nfunction samplesOf(type: string): unknown[] {\n if (type === 'number') return NUMBERS;\n if (type === 'Date | number') return [DATE];\n const named = [...type.matchAll(/\"((?:[^\"\\\\]|\\\\.)*)\"/g)].map((m) => JSON.parse(`\"${m[1]}\"`) as string);\n return named.length > 0 ? [...named, 'zzz'] : ['Ada'];\n}\n\n/** Every combination of sample values, or each argument varied alone where there are too many. */\nfunction* samples(a: MessageFormatElement[], b: MessageFormatElement[]): Generator<Record<string, unknown>> {\n const types = new Map<string, Set<unknown>>();\n for (const [name, type] of [...argsOf(a), ...argsOf(b)]) {\n const set = types.get(name) ?? new Set();\n for (const value of samplesOf(type)) set.add(value);\n types.set(name, set);\n }\n const tags = Object.fromEntries(\n [...new Set([...tagsOf(a), ...tagsOf(b)])].map((t) => [t, (c: unknown[]) => `<${t}>${c.join('')}</${t}>`]),\n );\n const names = [...types.keys()];\n const lists = names.map((n) => [...types.get(n)!]);\n if (lists.reduce((n, l) => n * l.length, 1) <= 1000) {\n let combos: unknown[][] = [[]];\n for (const list of lists) combos = combos.flatMap((c) => list.map((v) => [...c, v]));\n for (const combo of combos) yield { ...tags, ...Object.fromEntries(names.map((n, i) => [n, combo[i]])) };\n return;\n }\n const base = Object.fromEntries(names.map((n, i) => [n, lists[i]![0]]));\n for (const [i, n] of names.entries()) for (const value of lists[i]!) yield { ...tags, ...base, [n]: value };\n}\n\nfunction renderer(ast: MessageFormatElement[], locale: string): (values: Record<string, unknown>) => string {\n // oxlint-disable-next-line no-new-func, typescript/no-implied-eval -- evaluating our own compiled message, as the bundle would\n const messages = new Function(`return ${localeExpression(compileLocale([['m', ast]]))};`)() as CompiledMessages;\n const message = messages.m!;\n const h = createHelpers(locale);\n return (values) => (typeof message === 'string' ? message : flatten(message(values, h)).join(''));\n}\n\nfunction firstDifference(a: MessageFormatElement[], b: MessageFormatElement[], locale: string) {\n const before = renderer(a, locale);\n const after = renderer(b, locale);\n for (const values of samples(a, b)) {\n const x = before(values);\n const y = after(values);\n if (x !== y) {\n const shown = Object.entries(values)\n .filter(([, v]) => typeof v !== 'function')\n .map(([k, v]) => `${k}: ${v instanceof Date ? v.toISOString() : JSON.stringify(v)}`);\n return { values: `{ ${shown.join(', ')} }`, before: x, after: y };\n }\n }\n return undefined;\n}\n","/**\n * Findings as SARIF 2.1.0, the static-analysis format code scanning reads (GitHub's among them), so\n * `lint`, `scan`, `status` and `check` can annotate a pull request on the line the string is written.\n *\n * Paths are relative to the project root under `%SRCROOT%`, which the log maps to the root itself:\n * a project that isn't at the top of its repository still resolves to the right files.\n */\nimport { pathToFileURL } from 'node:url';\n\nexport interface SarifResult {\n /** A rule the report describes, or one of a lint plugin's. */\n rule: string;\n level: 'error' | 'warning';\n message: string;\n /** Relative to the project root, with forward slashes; none for a problem that isn't in a file. */\n file?: string;\n /** From 1; none for the file as a whole. */\n line?: number;\n column?: number;\n}\n\nexport interface SarifTool {\n name: string;\n version: string;\n informationUri: string;\n}\n\n/** Collects what a command found, then writes it as one SARIF run. */\nexport class SarifReport {\n readonly results: SarifResult[] = [];\n private readonly rules = new Map<string, string | undefined>();\n\n /** Describes a rule in one sentence; the first description given for an id stands. */\n rule(id: string, description?: string): void {\n if (this.rules.get(id) === undefined) this.rules.set(id, description);\n }\n\n add(result: SarifResult): void {\n if (!this.rules.has(result.rule)) this.rules.set(result.rule, undefined);\n this.results.push(result);\n }\n\n toJSON(root: string, tool: SarifTool): object {\n const ids = [...this.rules.keys()];\n return {\n $schema: 'https://json.schemastore.org/sarif-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n ...tool,\n rules: ids.map((id) => {\n const description = this.rules.get(id);\n return description === undefined ? { id } : { id, shortDescription: { text: description } };\n }),\n },\n },\n originalUriBaseIds: { '%SRCROOT%': { uri: pathToFileURL(root).href.replace(/\\/?$/, '/') } },\n results: this.results.map((r) => ({\n ruleId: r.rule,\n ruleIndex: ids.indexOf(r.rule),\n level: r.level,\n message: { text: r.message },\n locations: r.file === undefined ? [] : [location(r.file, r.line, r.column)],\n })),\n },\n ],\n };\n }\n}\n\nfunction location(file: string, line: number | undefined, column: number | undefined): object {\n return {\n physicalLocation: {\n artifactLocation: { uri: encodeURI(file), uriBaseId: '%SRCROOT%' },\n ...(line === undefined ? {} : { region: { startLine: line, startColumn: column ?? 1 } }),\n },\n };\n}\n"],"mappings":"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"}