prosebook 0.1.0 → 0.3.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.
Files changed (114) hide show
  1. package/README.md +311 -57
  2. package/dist/bun.d.ts +34 -0
  3. package/dist/bun.d.ts.map +1 -0
  4. package/dist/bun.js +98 -0
  5. package/dist/bun.js.map +1 -0
  6. package/dist/bundle-DboItAre.js +111 -0
  7. package/dist/bundle-DboItAre.js.map +1 -0
  8. package/dist/bundle-KD-DiiFa.d.ts +6 -0
  9. package/dist/bundle-KD-DiiFa.d.ts.map +1 -0
  10. package/dist/cli.js +51 -56
  11. package/dist/cli.js.map +1 -1
  12. package/dist/compile-xF3F4oIp.d.ts +16 -0
  13. package/dist/compile-xF3F4oIp.d.ts.map +1 -0
  14. package/dist/{config-CxVMn19f.js → config-BPSmoYel.js} +82 -196
  15. package/dist/config-BPSmoYel.js.map +1 -0
  16. package/dist/{config-CF7HziDa.d.ts → config-DdMkKt_N.d.ts} +85 -7
  17. package/dist/config-DdMkKt_N.d.ts.map +1 -0
  18. package/dist/config.d.ts +2 -2
  19. package/dist/config.js +1 -1
  20. package/dist/{copy-DXnzXsJa.d.ts → copy-B3V_QRkT.d.ts} +20 -7
  21. package/dist/copy-B3V_QRkT.d.ts.map +1 -0
  22. package/dist/copy-Bo_FIoLy.js +154 -0
  23. package/dist/copy-Bo_FIoLy.js.map +1 -0
  24. package/dist/endpoints-CnUfCkIk.js +96 -0
  25. package/dist/endpoints-CnUfCkIk.js.map +1 -0
  26. package/dist/generate-9pR3i5Bj.js +5173 -0
  27. package/dist/generate-9pR3i5Bj.js.map +1 -0
  28. package/dist/helpers-BWGcD0kS.js +96 -0
  29. package/dist/helpers-BWGcD0kS.js.map +1 -0
  30. package/dist/icu-Dej0mNsF.js +218 -0
  31. package/dist/icu-Dej0mNsF.js.map +1 -0
  32. package/dist/index.d.ts +12 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -188
  35. package/dist/inspector.d.ts +4 -1
  36. package/dist/inspector.d.ts.map +1 -1
  37. package/dist/inspector.js +7 -2
  38. package/dist/inspector.js.map +1 -1
  39. package/dist/locale-DpQA1pqH.js +70 -0
  40. package/dist/locale-DpQA1pqH.js.map +1 -0
  41. package/dist/next-loader.d.ts +11 -0
  42. package/dist/next-loader.d.ts.map +1 -0
  43. package/dist/next-loader.js +17 -0
  44. package/dist/next-loader.js.map +1 -0
  45. package/dist/next.d.ts +30 -0
  46. package/dist/next.d.ts.map +1 -0
  47. package/dist/next.js +160 -0
  48. package/dist/next.js.map +1 -0
  49. package/dist/react/index.d.ts +3 -3
  50. package/dist/react/index.d.ts.map +1 -1
  51. package/dist/react/index.js.map +1 -1
  52. package/dist/react/server.d.ts +20 -0
  53. package/dist/react/server.d.ts.map +1 -0
  54. package/dist/react/server.js +34 -0
  55. package/dist/react/server.js.map +1 -0
  56. package/dist/{sarif-PkPvsB07.js → sarif-CWyTAQ0y.js} +103 -87
  57. package/dist/sarif-CWyTAQ0y.js.map +1 -0
  58. package/dist/scan-Bx0_yDSi.js +387 -0
  59. package/dist/scan-Bx0_yDSi.js.map +1 -0
  60. package/dist/tools.d.ts +83 -64
  61. package/dist/tools.d.ts.map +1 -1
  62. package/dist/tools.js +5 -4
  63. package/dist/vite.d.ts +14 -4
  64. package/dist/vite.d.ts.map +1 -1
  65. package/dist/vite.js +60 -114
  66. package/dist/vite.js.map +1 -1
  67. package/package.json +37 -4
  68. package/src/bun.ts +132 -0
  69. package/src/cli.ts +60 -58
  70. package/src/index.ts +1 -1
  71. package/src/inspector.ts +8 -3
  72. package/src/next-loader.ts +16 -0
  73. package/src/next.ts +188 -0
  74. package/src/react/index.tsx +6 -6
  75. package/src/react/server.ts +37 -0
  76. package/src/runtime/copy.ts +22 -3
  77. package/src/runtime/helpers.ts +54 -18
  78. package/src/runtime/locale.ts +19 -0
  79. package/src/runtime/types.ts +21 -6
  80. package/src/tools/bundle.ts +131 -0
  81. package/src/tools/catalog.ts +2 -2
  82. package/src/tools/compile.ts +61 -13
  83. package/src/tools/config.ts +58 -3
  84. package/src/tools/endpoints.ts +121 -0
  85. package/src/tools/entry.ts +77 -0
  86. package/src/tools/generate.ts +32 -32
  87. package/src/tools/icu.ts +93 -8
  88. package/src/tools/index.ts +20 -4
  89. package/src/tools/lint.ts +49 -12
  90. package/src/tools/lock.ts +7 -0
  91. package/src/tools/mf1.ts +21 -7
  92. package/src/tools/mf2.ts +249 -57
  93. package/src/tools/migrate.ts +3 -2
  94. package/src/tools/native/emit.ts +87 -0
  95. package/src/tools/native/index.ts +36 -0
  96. package/src/tools/native/kotlin.ts +269 -0
  97. package/src/tools/native/model.ts +280 -0
  98. package/src/tools/native/number.ts +210 -0
  99. package/src/tools/native/plurals.ts +103 -0
  100. package/src/tools/native/rust.ts +367 -0
  101. package/src/tools/native/swift.ts +326 -0
  102. package/src/tools/scan.ts +134 -4
  103. package/src/tools/syntax.ts +3 -3
  104. package/src/tools/todo.ts +118 -0
  105. package/src/vite.ts +74 -116
  106. package/dist/config-CF7HziDa.d.ts.map +0 -1
  107. package/dist/config-CxVMn19f.js.map +0 -1
  108. package/dist/copy-DXnzXsJa.d.ts.map +0 -1
  109. package/dist/helpers-BPuPGjQP.js +0 -61
  110. package/dist/helpers-BPuPGjQP.js.map +0 -1
  111. package/dist/index.js.map +0 -1
  112. package/dist/sarif-PkPvsB07.js.map +0 -1
  113. package/dist/scan-B0tZ7y-D.js +0 -2447
  114. package/dist/scan-B0tZ7y-D.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-9pR3i5Bj.js","names":["print","numberStyle","resolve","parseMessage","readEntry","parseYaml","parse","KEYWORDS","ident","lit","argName","doc","expr","value","member","formatConst","NUMBER","PLURAL","TYPE","KEYWORDS","ident","lit","argName","doc","expr","value","formatConst","NUMBER","PLURAL","doc","TYPE"],"sources":["../src/tools/mf1.ts","../src/tools/mf2.ts","../src/tools/syntax.ts","../src/tools/catalog.ts","../src/tools/entry.ts","../src/tools/diff.ts","../src/tools/lock.ts","../src/tools/native/emit.ts","../src/tools/native/kotlin.ts","../src/tools/native/number.ts","../node_modules/.bun/cldr-core@48.2.0/node_modules/cldr-core/supplemental/ordinals.json","../node_modules/.bun/cldr-core@48.2.0/node_modules/cldr-core/supplemental/plurals.json","../src/tools/native/plurals.ts","../src/tools/native/model.ts","../src/tools/native/rust.ts","../src/tools/native/swift.ts","../src/tools/native/index.ts","../src/tools/pseudo.ts","../src/tools/generate.ts"],"sourcesContent":["/**\n * The element tree written as MF1 (ICU MessageFormat) text, for `migrate`. A tree read from MF2 holds\n * `Intl` options where MF1 holds skeletons, so each is written as the skeleton that parses back to the\n * same options, or as the named style MF2's function was mapped from; where neither exists the\n * message is reported rather than changed.\n */\nimport { isDateElement, isNumberElement, isTimeElement, parse, TYPE } from '@formatjs/icu-messageformat-parser';\nimport type { DateElement, DateTimeSkeleton, NumberElement, NumberSkeleton, TimeElement } from '@formatjs/icu-messageformat-parser';\n\nimport { selectionOf, type MessageFormatElement } from './icu.ts';\nimport type { Mf2DateSkeleton, Mf2Function, Mf2NumberSkeleton } from './mf2.ts';\n\ntype Element = MessageFormatElement;\n\nexport function toMf1(ast: Element[]): string {\n return print(native(ast, undefined), false);\n}\n\nconst CATEGORY_ORDER = ['zero', 'one', 'two', 'few', 'many', 'other'];\n\n/**\n * Printed as a person would write it: `{n, plural, =0 {…} one {…} other {…}}`, exact arms first and\n * `other` last. (formatjs's printer packs and reorders arms.)\n */\nfunction print(elements: Element[], inPlural: boolean): string {\n return elements\n .map((el, i) => {\n switch (el.type) {\n case TYPE.literal:\n return escape(el.value, inPlural, elements[i + 1] === undefined);\n case TYPE.argument:\n return `{${el.value}}`;\n case TYPE.number:\n case TYPE.date:\n case TYPE.time: {\n const kind = el.type === TYPE.number ? 'number' : el.type === TYPE.date ? 'date' : 'time';\n const style = el.style;\n if (style === null || style === undefined) return `{${el.value}, ${kind}}`;\n if (typeof style === 'string') return `{${el.value}, ${kind}, ${style}}`;\n const skeleton = 'tokens' in style ? style.tokens.map((t) => [t.stem, ...t.options].join('/')).join(' ') : style.pattern;\n return `{${el.value}, ${kind}, ::${skeleton}}`;\n }\n case TYPE.pound:\n return '#';\n case TYPE.tag:\n return `<${el.value}>${print(el.children, inPlural)}</${el.value}>`;\n case TYPE.select:\n case TYPE.plural: {\n const arms = Object.entries(el.options);\n const rank = (arm: string) => (arm.startsWith('=') ? -1 : arm === 'other' ? 99 : Math.max(0, CATEGORY_ORDER.indexOf(arm)));\n if (el.type === TYPE.plural)\n arms.sort(([a], [b]) => (rank(a) !== rank(b) ? rank(a) - rank(b) : Number(a.slice(1)) - Number(b.slice(1))));\n else arms.sort(([a], [b]) => (a === 'other' ? 1 : 0) - (b === 'other' ? 1 : 0));\n const head = el.type === TYPE.select ? 'select' : el.pluralType === 'ordinal' ? 'selectordinal' : 'plural';\n const offset = el.type === TYPE.plural && el.offset !== 0 ? ` offset:${el.offset}` : '';\n const body = arms.map(([arm, o]) => `${arm} {${print(o.value, el.type === TYPE.plural)}}`).join(' ');\n return `{${el.value}, ${head},${offset} ${body}}`;\n }\n default:\n return '';\n }\n })\n .join('');\n}\n\n/**\n * Literal text, quoted where ICU would read it as syntax. An apostrophe starts a quote only before a\n * special character, so one before ordinary text (`don't`) stays single.\n */\nfunction escape(text: string, inPlural: boolean, last: boolean): string {\n const special = (c: string | undefined) => c === '{' || c === '}' || c === '<' || (inPlural && c === '#');\n let out = '';\n for (let i = 0; i < text.length; i++) {\n const c = text[i]!;\n if (special(c)) out += `'${c}'`;\n // Before the next placeholder or tag, a trailing apostrophe would quote its brace.\n else if (c === \"'\") out += special(text[i + 1]) || text[i + 1] === \"'\" || (!last && i === text.length - 1) ? \"''\" : \"'\";\n else out += c;\n }\n return out;\n}\n\n/** The tree with MF2 styles replaced by MF1 ones, and `#` where a plural prints its own value. */\nfunction native(elements: Element[], plural: { value: string; offset: number } | undefined): Element[] {\n return elements.map((el): Element => {\n if (isNumberElement(el)) {\n if (plural?.offset === 0 && el.value === plural.value && plainNumber(el)) return { type: TYPE.pound };\n return { ...el, style: numberStyle(el) };\n }\n if (isDateElement(el) || isTimeElement(el)) return dateElement(el);\n if (el.type === TYPE.plural) {\n // Digit options and `:integer`'s rounding change only which arm some values reach, which\n // `migrate` reports when it renders both; an argument's option MF1 can't say at all.\n const args = Object.keys(selectionOf(el)?.args ?? {});\n if (args.length > 0) throw new Error(`{${el.value}} is selected with ${args.join(', ')} from an argument, which MF1 can't say`);\n const inner = { value: el.value, offset: el.offset };\n return { ...el, options: Object.fromEntries(Object.entries(el.options).map(([k, o]) => [k, { value: native(o.value, inner) }])) };\n }\n // formatjs reads `#` as text inside a select, even one inside a plural.\n if (el.type === TYPE.select)\n return { ...el, options: Object.fromEntries(Object.entries(el.options).map(([k, o]) => [k, { value: native(o.value, undefined) }])) };\n if (el.type === TYPE.tag) return { ...el, children: native(el.children, plural) };\n return el;\n });\n}\n\nfunction plainNumber(el: NumberElement): boolean {\n const style = el.style;\n if (style === null || style === undefined) return true;\n const mf2 = 'mf2' in Object(style) ? (style as Mf2NumberSkeleton) : undefined;\n return mf2 !== undefined && mf2.args === undefined && Object.keys(mf2.parsedOptions).length === 0;\n}\n\nfunction same(a: object, b: object): boolean {\n const norm = (o: object) =>\n JSON.stringify(\n Object.entries(o)\n .filter(([, v]) => v !== undefined)\n .sort(([x], [y]) => x.localeCompare(y)),\n );\n return norm(a) === norm(b);\n}\n\nfunction numberStyle(el: NumberElement): NumberElement['style'] {\n const style = el.style;\n if (style === null || style === undefined || typeof style === 'string' || !('mf2' in style)) return style;\n refuseArgs(el.value, style as Mf2NumberSkeleton);\n const options = (style as Mf2NumberSkeleton).parsedOptions as Record<string, unknown>;\n if (Object.keys(options).length === 0) return null;\n if (same(options, { maximumFractionDigits: 0 })) return 'integer';\n if (same(options, { style: 'percent' })) return 'percent';\n const skeleton = numberSkeleton(options);\n const parsed = skeleton === undefined ? undefined : skeletonStyle(`{n, number, ::${skeleton}}`);\n // `unit-width-*` sets both displays; `Intl` reads only the one its style uses.\n const relevant = (o: Record<string, unknown>) => {\n const { currencyDisplay, unitDisplay, ...rest } = o;\n return { ...rest, ...(o.style === 'currency' ? { currencyDisplay } : {}), ...(o.style === 'unit' ? { unitDisplay } : {}) };\n };\n if (parsed === undefined || !same(relevant(parsed.parsedOptions as Record<string, unknown>), relevant(options)))\n throw new Error(`{${el.value} ${mf2Text((style as Mf2NumberSkeleton).mf2)}} formats in a way no MF1 skeleton says`);\n return parsed as NumberSkeleton;\n}\n\nfunction skeletonStyle(source: string): NumberSkeleton | DateTimeSkeleton | undefined {\n try {\n const el = parse(source, { shouldParseSkeletons: true })[0];\n return el !== undefined && 'style' in el && typeof el.style === 'object' && el.style !== null ? el.style : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** The ICU number skeleton for `Intl` options, as far as formatjs reads skeletons back. */\nfunction numberSkeleton(o: Record<string, unknown>): string | undefined {\n const tokens: string[] = [];\n if (o.style === 'percent') tokens.push('percent');\n if (o.style === 'currency') tokens.push(`currency/${String(o.currency)}`);\n if (o.style === 'unit') tokens.push(`unit/${String(o.unit)}`);\n const width =\n o.style === 'currency'\n ? { narrowSymbol: 'unit-width-narrow', code: 'unit-width-short', name: 'unit-width-full-name' }[String(o.currencyDisplay)]\n : o.style === 'unit'\n ? { narrow: 'unit-width-narrow', short: 'unit-width-short', long: 'unit-width-full-name' }[String(o.unitDisplay)]\n : undefined;\n if (width !== undefined) tokens.push(width);\n if (o.currencySign === 'accounting') tokens.push('sign-accounting');\n const sign = { always: 'sign-always', exceptZero: 'sign-except-zero', never: 'sign-never' }[String(o.signDisplay)];\n if (sign !== undefined) tokens.push(sign);\n if (o.useGrouping === false) tokens.push('group-off');\n if (typeof o.minimumIntegerDigits === 'number') tokens.push(`integer-width/*${'0'.repeat(o.minimumIntegerDigits)}`);\n\n const minF = o.minimumFractionDigits as number | undefined;\n const maxF = o.maximumFractionDigits as number | undefined;\n let fraction: string | undefined;\n if (minF !== undefined && maxF !== undefined) fraction = `.${'0'.repeat(minF)}${'#'.repeat(maxF - minF)}`;\n else if (maxF !== undefined) fraction = maxF === 0 ? '.' : `.${'#'.repeat(maxF)}`;\n else if (minF !== undefined) fraction = `.${'0'.repeat(minF)}*`;\n const minS = o.minimumSignificantDigits as number | undefined;\n const maxS = o.maximumSignificantDigits as number | undefined;\n let significant: string | undefined;\n if (minS !== undefined && maxS !== undefined) significant = `${'@'.repeat(minS)}${'#'.repeat(maxS - minS)}`;\n else if (maxS !== undefined) significant = `@${'#'.repeat(maxS - 1)}`;\n else if (minS !== undefined) significant = `${'@'.repeat(minS)}+`;\n if (significant !== undefined)\n significant += o.roundingPriority === 'morePrecision' ? 'r' : o.roundingPriority === 'lessPrecision' ? 's' : '';\n if (fraction !== undefined)\n tokens.push(fraction + (o.trailingZeroDisplay === 'stripIfInteger' ? '/w' : significant !== undefined ? `/${significant}` : ''));\n else if (significant !== undefined) tokens.push(significant);\n\n const mode = {\n floor: 'rounding-mode-floor',\n ceil: 'rounding-mode-ceiling',\n trunc: 'rounding-mode-down',\n expand: 'rounding-mode-up',\n halfEven: 'rounding-mode-half-even',\n halfTrunc: 'rounding-mode-half-down',\n halfExpand: 'rounding-mode-half-up',\n }[String(o.roundingMode)];\n if (mode !== undefined) tokens.push(mode);\n return tokens.length > 0 ? tokens.join(' ') : undefined;\n}\n\n/** MF2 date and time functions as the MF1 named style they were mapped from (see `dateFunction` in mf2.ts). */\nconst NAMED: Record<string, readonly [TYPE.date | TYPE.time, string]> = {\n 'date length=short': [TYPE.date, 'short'],\n date: [TYPE.date, 'medium'],\n 'date length=long': [TYPE.date, 'long'],\n 'date fields=year-month-day-weekday length=long': [TYPE.date, 'full'],\n time: [TYPE.time, 'short'],\n 'time precision=second': [TYPE.time, 'medium'],\n 'time precision=second timeZoneStyle=short': [TYPE.time, 'long'],\n 'time precision=second timeZoneStyle=long': [TYPE.time, 'full'],\n};\n\nfunction dateElement(el: DateElement | TimeElement): Element {\n const style = el.style;\n if (typeof style !== 'object' || style === null || !('mf2' in style)) return el;\n refuseArgs(el.value, style as Mf2DateSkeleton);\n const fn = (style as Mf2DateSkeleton).mf2;\n const named = NAMED[mf2Text(fn, true).slice(1)];\n if (named !== undefined) return { type: named[0], value: el.value, style: named[1] };\n const skeleton = dateSkeleton(style.parsedOptions);\n const parsed = skeleton === undefined ? undefined : skeletonStyle(`{d, date, ::${skeleton}}`);\n if (parsed === undefined || !same(parsed.parsedOptions, style.parsedOptions))\n throw new Error(`{${el.value} ${mf2Text(fn)}} formats in a way no MF1 date skeleton says: use :date or :time with a length`);\n return { type: TYPE.date, value: el.value, style: parsed as DateTimeSkeleton };\n}\n\nfunction dateSkeleton(o: Intl.DateTimeFormatOptions): string | undefined {\n if (o.hour !== undefined || o.timeZone !== undefined || o.calendar !== undefined || o.hour12 !== undefined) return undefined;\n const letters: Record<string, Record<string, string>> = {\n weekday: { short: 'EEE', long: 'EEEE', narrow: 'EEEEE' },\n year: { numeric: 'y', '2-digit': 'yy' },\n month: { numeric: 'M', '2-digit': 'MM', short: 'MMM', long: 'MMMM', narrow: 'MMMMM' },\n day: { numeric: 'd', '2-digit': 'dd' },\n };\n let out = '';\n for (const [field, forms] of Object.entries(letters)) {\n const value = o[field as keyof Intl.DateTimeFormatOptions];\n if (value === undefined) continue;\n const letter = forms[String(value)];\n if (letter === undefined) return undefined;\n out += letter;\n }\n return out === '' ? undefined : out;\n}\n\n/** A skeleton names every option, so one an argument gives has no MF1 spelling. */\nfunction refuseArgs(name: string, style: Mf2NumberSkeleton | Mf2DateSkeleton): void {\n if (style.args === undefined) return;\n throw new Error(\n `{${name} ${mf2Text(style.mf2)}} takes an option from an argument, which MF1 can't: write the option's value in the message`,\n );\n}\n\nfunction mf2Text(fn: Mf2Function, sortOptions = false): string {\n const options = [...Object.entries(fn.options), ...Object.entries(fn.args ?? {}).map(([k, v]) => [k, `$${v}`] as const)];\n if (sortOptions) options.sort(([a], [b]) => a.localeCompare(b));\n return [`:${fn.name}`, ...options.map(([k, v]) => `${k}=${v}`)].join(' ');\n}\n","/**\n * Unicode MessageFormat 2, read into the element tree MF1 messages parse to, so the compiler, the\n * types, the lint and the pseudo-locale treat both syntaxes alike; and written back from that tree,\n * for `extract` and `migrate`.\n *\n * The tree holds what a message does, not how it was written. `.input {$n :number}` becomes a number\n * element at each `{$n}`, and `.match` becomes plural and select elements, one level per selector,\n * built so the runtime's ICU-style selection picks the variant MF2's would (see `matchTree`). Literal\n * option values are resolved here into `Intl` options, so the runtime is the same for both. An option\n * an argument gives (`currency=$code`, of those in `FROM_ARGUMENT`) rides on the style as the `Intl`\n * option it sets, which the compiled message passes beside the hoisted ones.\n */\nimport { SKELETON_TYPE, TYPE } from '@formatjs/icu-messageformat-parser';\nimport type {\n DateElement,\n DateTimeSkeleton,\n NumberElement,\n NumberSkeleton,\n PluralElement,\n PluralOrSelectOption,\n SelectElement,\n TimeElement,\n} from '@formatjs/icu-messageformat-parser';\nimport { MessageSyntaxError, parseMessage, stringifyMessage, validate, type Model } from 'messageformat';\n\nimport { selectionOf, walk, type MessageFormatElement, type OptionArgs, type Placeholder, type Selection } from './icu.ts';\n\ntype Element = MessageFormatElement;\n\n/** A function as written: `:number minimumFractionDigits=2`. Kept on the styles it produces, to write back. */\nexport interface Mf2Function {\n name: string;\n options: Record<string, string>;\n /** Options given by an argument, as `currency=$code`: the option's name to the argument's. */\n args?: Record<string, string>;\n /** `u:dir`: the direction the value is written in, which picks the mark isolating it. */\n dir?: 'ltr' | 'rtl' | 'auto';\n}\n\ntype Value = { kind: 'literal'; value: string; fn?: Mf2Function } | { kind: 'variable'; name: string; fn?: Mf2Function; offset: number };\n\ntype Scope = Map<string, Value>;\n\ninterface Selector {\n name: string;\n kind: 'plural' | 'ordinal' | 'exact' | 'string';\n offset: number;\n /** For a number selected on other than as a bare `:number`. */\n selection?: Selection;\n}\n\n/** The `Intl.NumberFormat` options `Intl.PluralRules` takes too, which change a number's category. */\nconst PLURAL_OPTIONS = new Set([\n 'minimumIntegerDigits',\n 'minimumFractionDigits',\n 'maximumFractionDigits',\n 'minimumSignificantDigits',\n 'maximumSignificantDigits',\n 'roundingIncrement',\n 'roundingMode',\n 'roundingPriority',\n 'trailingZeroDisplay',\n]);\n\nexport const NUMBER_LITERAL = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][-+]?\\d+)?$/;\nconst CATEGORIES = new Set(['zero', 'one', 'two', 'few', 'many', 'other']);\nconst NAME = /^[\\p{L}_][\\p{L}\\p{N}_.-]*$/u;\n\nconst DIGITS = [\n 'minimumIntegerDigits',\n 'minimumFractionDigits',\n 'maximumFractionDigits',\n 'minimumSignificantDigits',\n 'maximumSignificantDigits',\n 'roundingIncrement',\n];\nconst ROUNDING = ['trailingZeroDisplay', 'roundingPriority', 'roundingMode'];\nconst SIGNIFICANT = ['minimumSignificantDigits', 'maximumSignificantDigits'];\n\n/** The options each default function takes, from the MF2 spec. */\nconst OPTIONS: Record<string, readonly string[]> = {\n string: [],\n number: ['select', 'signDisplay', 'useGrouping', ...DIGITS, ...ROUNDING],\n integer: ['select', 'signDisplay', 'useGrouping', 'minimumIntegerDigits', 'maximumSignificantDigits'],\n currency: [\n 'currency',\n 'currencySign',\n 'currencyDisplay',\n 'useGrouping',\n 'minimumIntegerDigits',\n 'fractionDigits',\n ...SIGNIFICANT,\n ...ROUNDING,\n 'roundingIncrement',\n ],\n percent: ['signDisplay', 'useGrouping', 'minimumFractionDigits', 'maximumFractionDigits', ...SIGNIFICANT, ...ROUNDING],\n unit: ['unit', 'unitDisplay', 'signDisplay', 'useGrouping', ...DIGITS, ...ROUNDING],\n offset: ['add', 'subtract'],\n date: ['fields', 'length', 'calendar', 'timeZone'],\n time: ['precision', 'timeZoneStyle', 'hour12', 'calendar', 'timeZone'],\n datetime: ['dateFields', 'dateLength', 'timePrecision', 'timeZoneStyle', 'hour12', 'calendar', 'timeZone'],\n};\n\n/** Options whose values are a fixed set, checked here because MF2's names differ from `Intl`'s. */\nconst DATE_FIELDS = ['weekday', 'day-weekday', 'month-day', 'month-day-weekday', 'year-month-day', 'year-month-day-weekday'];\nconst ENUMS: Record<string, readonly string[]> = {\n select: ['plural', 'ordinal', 'exact'],\n useGrouping: ['auto', 'always', 'never', 'min2'],\n currencyDisplay: ['narrowSymbol', 'symbol', 'name', 'code'],\n fields: DATE_FIELDS,\n dateFields: DATE_FIELDS,\n length: ['long', 'medium', 'short'],\n dateLength: ['long', 'medium', 'short'],\n precision: ['hour', 'minute', 'second'],\n timePrecision: ['hour', 'minute', 'second'],\n timeZoneStyle: ['long', 'short'],\n hour12: ['true', 'false'],\n};\n\nconst oneOf = (values: readonly string[]) => values.map((v) => JSON.stringify(v)).join(' | ');\n\n/**\n * Options an argument may give, with the `Intl` options each sets and the argument's type. These pass\n * to `Intl` as they are, so the runtime merges them in; the rest change what the formatter is (a\n * date's fields, how a number selects) and are settled when the message compiles.\n */\nconst FROM_ARGUMENT: Record<string, { intl: readonly string[]; type: string }> = {\n currency: { intl: ['currency'], type: 'string' },\n currencyDisplay: { intl: ['currencyDisplay'], type: oneOf(ENUMS.currencyDisplay!) },\n currencySign: { intl: ['currencySign'], type: oneOf(['standard', 'accounting']) },\n unit: { intl: ['unit'], type: 'string' },\n unitDisplay: { intl: ['unitDisplay'], type: oneOf(['long', 'short', 'narrow']) },\n signDisplay: { intl: ['signDisplay'], type: oneOf(['auto', 'always', 'exceptZero', 'negative', 'never']) },\n fractionDigits: { intl: ['minimumFractionDigits', 'maximumFractionDigits'], type: 'number' },\n ...Object.fromEntries(DIGITS.filter((d) => d !== 'roundingIncrement').map((d) => [d, { intl: [d], type: 'number' }])),\n timeZone: { intl: ['timeZone'], type: 'string' },\n calendar: { intl: ['calendar'], type: 'string' },\n};\n\n/** Options an operand's function doesn't pass on to these, per the spec. */\nconst DISCARDED: Record<string, readonly string[]> = {\n integer: ['minimumFractionDigits', 'maximumFractionDigits', 'minimumSignificantDigits'],\n percent: ['minimumIntegerDigits', 'roundingIncrement', 'select'],\n};\n\nconst NUMERIC = new Set(['number', 'integer', 'currency', 'percent', 'unit']);\nconst TEMPORAL = new Set(['date', 'time', 'datetime']);\n\nconst family = (name: string) => (NUMERIC.has(name) ? 'number' : TEMPORAL.has(name) ? 'date' : name);\n\nconst HINTS: Record<string, string> = {\n 'missing-selector-annotation': 'a .match variable needs a function that selects, declared first: .input {$count :number}',\n 'missing-fallback': 'a .match needs a variant whose keys are all *',\n 'key-mismatch': 'each variant has one key per .match variable',\n 'duplicate-variant': 'two variants have the same keys',\n 'duplicate-declaration': 'a variable is declared twice, or declared after a use',\n 'duplicate-option-name': 'an option is given twice',\n 'duplicate-attribute': 'an attribute is given twice',\n 'bad-escape': 'only \\\\\\\\, \\\\{, \\\\} and \\\\| are escapes',\n 'bad-input-expression': '.input takes a variable: .input {$count :number}',\n 'extra-content': 'something follows the end of the message: a message with .match ends with its last variant',\n 'empty-token': 'a name or value is missing',\n};\n\n/** Thrown from `validate`'s callback, which reports a data-model error without throwing. */\nclass ModelError extends Error {\n readonly type: string;\n constructor(type: string) {\n super(type);\n this.type = type;\n }\n}\n\nfunction syntaxProblem(text: string, e: unknown): string {\n const type = e instanceof MessageSyntaxError || e instanceof ModelError ? e.type : undefined;\n const hint = type === undefined ? undefined : HINTS[type];\n let where = '';\n if (e instanceof MessageSyntaxError) {\n const before = text.slice(0, e.start).split('\\n');\n const near = text.slice(e.start, e.start + 16).split('\\n')[0];\n where = ` at line ${before.length}, column ${before.at(-1)!.length + 1}${near ? ` (near \"${near}\")` : ''}`;\n }\n const reason = hint ?? (e instanceof Error ? e.message.replace(/ at \\d+$/, '') : String(e));\n return `is not valid MessageFormat 2${where}: ${reason}`;\n}\n\n/** An MF2 message as the element tree. Throws, with the fix, where it can't be read or compiled. */\nexport function parseMf2(text: string, locale: string, isolate: Isolate = 'rtl'): Element[] {\n const reading: Reading = { locale, isolate, dir: directionOf(locale) };\n let message: Model.Message;\n try {\n message = parseMessage(text);\n validate(message, (type) => {\n throw new ModelError(type);\n });\n } catch (e) {\n throw new Error(syntaxProblem(text, e), { cause: e });\n }\n const scope: Scope = new Map();\n for (const declaration of message.declarations)\n // `.input` reads the argument itself; a `.local` can build on what is declared before it. The\n // options of either can name what is declared before them.\n scope.set(declaration.name, resolve(declaration.value, declaration.type === 'input' ? new Map() : scope, scope));\n\n if (message.type === 'message') return pattern(message.pattern, scope, reading);\n const selectors = message.selectors.map((s) => selectorOf(s.name, scope));\n const candidates = message.variants.map((variant) => {\n const keys = variant.keys.map((k) => (k.type === '*' ? null : k.value));\n keys.forEach((key, i) => checkKey(selectors[i]!, key, message.selectors[i]!.name));\n return { keys, prefs: [], value: pattern(variant.value, scope, reading) };\n });\n return matchTree(selectors, candidates, 0, locale);\n}\n\n/**\n * When a placeholder is isolated from the text around it, so a value written the other way can't\n * reorder it: `'rtl'` in a locale not known to run left to right, or where `u:dir` asks; `'always'`\n * also for every value of unknown direction (a string), as the spec's default strategy has it.\n */\nexport type Isolate = 'rtl' | 'always' | false;\n\ntype Direction = 'ltr' | 'rtl' | 'auto';\n\ninterface Reading {\n locale: string;\n isolate: Isolate;\n /** The locale's direction, which the message's is. */\n dir: Direction;\n}\n\n// The scripts CLDR writes right to left, as the `messageformat` package lists them.\nconst RTL_SCRIPTS = new Set(['Adlm', 'Arab', 'Hebr', 'Mand', 'Nkoo', 'Rohg', 'Syrc', 'Thaa']);\nconst [LRI, RLI, FSI, PDI] = ['\\u2066', '\\u2067', '\\u2068', '\\u2069'];\n\nfunction directionOf(locale: string): Direction {\n try {\n const script = new Intl.Locale(locale).maximize().script;\n return script === undefined ? 'auto' : RTL_SCRIPTS.has(script) ? 'rtl' : 'ltr';\n } catch {\n return 'auto';\n }\n}\n\n/** The fallback a placeholder shows, and the marks isolating it where `isolate` and `u:dir` ask. */\nfunction placeholderFor(name: string, fn: Mf2Function | undefined, r: Reading): Placeholder {\n const fallback = `{$${name}}`;\n if (r.isolate === false) return { fallback };\n // A number or date is written as the locale writes; a string's direction is its own.\n const dir = fn?.dir ?? (fn === undefined || fn.name === 'string' ? 'auto' : r.dir);\n const isolate = r.dir !== 'ltr' || (dir !== 'ltr' && (r.isolate === 'always' || fn?.dir !== undefined));\n if (!isolate) return { fallback };\n return { fallback, isolate: [dir === 'ltr' ? LRI : dir === 'rtl' ? RLI : FSI, PDI] };\n}\n\nfunction functionOf(ref: Model.FunctionRef, scope: Scope): Mf2Function {\n const allowed = OPTIONS[ref.name];\n if (allowed === undefined) {\n const known = Object.keys(OPTIONS).map((n) => `:${n}`);\n throw new Error(`:${ref.name} is not a function prosebook knows: ${known.join(', ')}`);\n }\n const options: Record<string, string> = {};\n const args: Record<string, string> = {};\n let dir: Mf2Function['dir'];\n for (const [key, value] of Object.entries(ref.options ?? {})) {\n // `u:id` names a part of the formatted output, which this runtime doesn't hand out.\n if (key === 'u:id') continue;\n if (key === 'u:dir') {\n const dirs = ['ltr', 'rtl', 'auto', 'inherit'];\n if (value.type !== 'literal' || !dirs.includes(value.value))\n throw new Error(`:${ref.name} u:dir is one of ${dirs.join(', ')}, written in the message`);\n // `inherit` is the direction it would have had anyway.\n if (value.value !== 'inherit') dir = value.value as Mf2Function['dir'];\n continue;\n }\n if (!allowed.includes(key))\n throw new Error(`:${ref.name} has no option \"${key}\"${allowed.length > 0 ? `: ${allowed.join(', ')}` : ''}`);\n const literal = value.type === 'literal' ? value.value : optionArg(ref.name, key, value.name, scope);\n if (typeof literal !== 'string') {\n args[key] = literal.arg;\n continue;\n }\n const values = ENUMS[key];\n if (values !== undefined && !values.includes(literal))\n throw new Error(`:${ref.name} ${key}=${literal} is not a value it takes: ${values.join(', ')}`);\n if (DIGITS.includes(key) && !/^\\d+$/.test(literal)) throw new Error(`:${ref.name} ${key}=${literal} is not a whole number`);\n options[key] = literal;\n }\n if (ref.name === 'unit' && ref.options?.usage !== undefined)\n throw new Error(\":unit usage converts between units, which `Intl` can't do: convert the value before passing it\");\n if (options.timeZone === 'input') throw new Error(`:${ref.name} timeZone=input needs a zoned value, which a JavaScript Date isn't`);\n if (ref.name === 'offset') {\n const given = ['add', 'subtract'].filter((k) => options[k] !== undefined);\n if (given.length !== 1 || !/^\\d+$/.test(options[given[0]!]!))\n throw new Error(':offset takes one of add or subtract, as a whole number: {$count :offset subtract=1}');\n }\n return { name: ref.name, options, ...(Object.keys(args).length > 0 && { args }), ...(dir && { dir }) };\n}\n\n/**\n * The argument an option names, or the literal a `.local` it names holds. A variable declared with a\n * function of its own is refused: what it would give the option is its formatted text.\n */\nfunction optionArg(fn: string, key: string, name: string, scope: Scope): string | { arg: string } {\n const bound = scope.get(name);\n const plain = bound?.fn === undefined || bound.fn.name === 'string';\n if (bound?.kind === 'literal' && plain) return bound.value;\n if (FROM_ARGUMENT[key] === undefined) {\n const which = Object.keys(FROM_ARGUMENT).filter((k) => OPTIONS[fn]!.includes(k));\n const can = which.length > 0 ? `: of :${fn}'s, only ${which.join(', ')} can` : '';\n throw new Error(`:${fn} ${key}=$${name}: ${key} is settled as the message compiles, so write its value in the message${can}`);\n }\n if (bound === undefined) return { arg: name };\n if (bound.kind === 'variable' && plain && bound.offset === 0) return { arg: bound.name };\n throw new Error(`:${fn} ${key}=$${name}: $${name} is formatted, so it can't give an option: name the argument itself`);\n}\n\nfunction resolve(expr: Model.Expression, scope: Scope, optionScope = scope): Value {\n const fn = expr.functionRef === undefined ? undefined : functionOf(expr.functionRef, optionScope);\n if (expr.arg === undefined) throw new Error(`{:${fn!.name}} has nothing to format: give it a value, {$value :${fn!.name}}`);\n const base: Value =\n expr.arg.type === 'literal'\n ? { kind: 'literal', value: expr.arg.value }\n : (scope.get(expr.arg.name) ?? { kind: 'variable', name: expr.arg.name, offset: 0 });\n const value = apply(base, fn);\n if (value.fn !== undefined) checkNamed(value.fn);\n return value;\n}\n\n/**\n * A currency or a unit named, on the function or on the one its operand was declared with: after\n * `.input {$price :currency currency=EUR}`, `{$price :currency fractionDigits=0}` is still in euros.\n */\nfunction checkNamed(fn: Mf2Function): void {\n const given = (key: string) => fn.options[key] !== undefined || fn.args?.[key] !== undefined;\n if (fn.name === 'currency' && !given('currency'))\n throw new Error(':currency needs its currency named: {$price :currency currency=EUR}, or currency=$code to take it from an argument');\n if (fn.name === 'unit' && !given('unit')) throw new Error(':unit needs its unit named: {$distance :unit unit=kilometer}');\n}\n\n/** `fn` applied to a value that may already carry one: options carry over within a family, as the spec has it. */\nfunction apply(base: Value, fn: Mf2Function | undefined): Value {\n if (fn === undefined) return base;\n if (fn.name === 'offset') {\n const by = Number(fn.options.subtract ?? 0) - Number(fn.options.add ?? 0);\n const numeric = base.fn ?? { name: 'number', options: {} };\n if (base.kind === 'literal') return { ...base, value: String(Number(literalNumber(base.value)) - by), fn: numeric };\n return { ...base, offset: base.offset + by, fn: numeric };\n }\n if (base.fn === undefined || family(base.fn.name) !== family(fn.name)) return { ...base, fn };\n const inherited = { ...base.fn.options };\n const inheritedArgs = { ...base.fn.args };\n for (const key of DISCARDED[fn.name] ?? []) {\n delete inherited[key];\n delete inheritedArgs[key];\n }\n // An option given again replaces the one inherited, whether either is a literal or an argument.\n for (const key of Object.keys(fn.options)) delete inheritedArgs[key];\n for (const key of Object.keys(fn.args ?? {})) delete inherited[key];\n const args = { ...inheritedArgs, ...fn.args };\n const options = { ...inherited, ...fn.options };\n return { ...base, fn: { name: fn.name, options, ...(Object.keys(args).length > 0 && { args }), ...(fn.dir && { dir: fn.dir }) } };\n}\n\nfunction literalNumber(value: string): string {\n if (!NUMBER_LITERAL.test(value)) throw new Error(`|${value}| is not a number: write it as one, like 42 or 1.5`);\n return value;\n}\n\nfunction selectorOf(name: string, scope: Scope): Selector {\n const value = scope.get(name);\n // `validate` has refused a selector declared without a function.\n if (value === undefined || value.fn === undefined) throw new Error(`.match $${name} needs a function: .input {$${name} :number}`);\n if (value.kind === 'literal')\n throw new Error(`.match $${name} selects on a literal, which always picks the same variant: use that variant's text`);\n const { fn } = value;\n if (fn.name === 'string') return { name: value.name, kind: 'string', offset: 0 };\n if (fn.name === 'number' || fn.name === 'integer' || fn.name === 'percent') {\n const kind = (fn.options.select ?? 'plural') as Selector['kind'];\n return { name: value.name, kind, offset: value.offset, ...selectionWith(fn) };\n }\n throw new Error(`.match $${name} selects with :${fn.name}, which prosebook can't select on: use :number, :integer, :percent or :string`);\n}\n\n/**\n * What a number is selected with beyond its kind, as the spec has it: its category as formatted\n * (`1.0` is `other` in English), `:integer` on the value rounded, `:percent` on it times 100. None\n * for a bare `:number`, which selects as MF1 does.\n */\nfunction selectionWith(fn: Mf2Function): { selection?: Selection } {\n const pick = <T>(from: Record<string, T>) => Object.fromEntries(Object.entries(from).filter(([k]) => PLURAL_OPTIONS.has(k)));\n const options = pick(intlNumber(fn) as Record<string, unknown>) as Intl.PluralRulesOptions;\n const args = pick(optionArgs(fn).args ?? {});\n const value = fn.name === 'integer' ? 'round' : fn.name === 'percent' ? 'percent' : undefined;\n const plain = Object.keys(options).length === 0 && Object.keys(args).length === 0 && value === undefined;\n // `select=exact` is kept too, so it is written back.\n if (plain && fn.options.select !== 'exact') return {};\n return { selection: { fn, options, ...(Object.keys(args).length > 0 && { args }), ...(value && { value }) } };\n}\n\nfunction checkKey(selector: Selector, key: string | null, name: string): void {\n if (key === null) return;\n if (selector.kind === 'string') {\n // The runtime's select falls back to its `other` arm, so a key named `other` would catch everything.\n if (key === 'other') throw new Error(`.match $${name} has a key \"other\", which can't be told from *: name it something else`);\n return;\n }\n if (NUMBER_LITERAL.test(key)) {\n if (String(Number(key)) !== key) throw new Error(`.match $${name} has the key ${key}: write it as ${Number(key)}, as values print`);\n return;\n }\n if (selector.kind === 'exact') throw new Error(`.match $${name} selects exactly, so its keys are numbers, not \"${key}\"`);\n if (!CATEGORIES.has(key))\n throw new Error(`.match $${name} has the key \"${key}\": a number key is a number or one of ${[...CATEGORIES].join(', ')}`);\n}\n\ninterface Candidate {\n keys: (string | null)[];\n /** How well each key so far matched: lower is better, as the spec ranks them. */\n prefs: number[];\n value: Element[];\n}\n\n/**\n * `.match` as nested plural and select elements. MF2 picks, among the variants whose every key\n * matches, the one whose keys match best, the first selector deciding first; an exact number beats\n * a plural category, which beats `*`. The runtime picks an arm per selector instead, so each arm\n * here holds every variant that can still match a value reaching it, and the leaf takes the best.\n * An exact arm `=1` holds the variants keyed `one` as well, since 1 is also in that category: which\n * category is the locale's, which is why this runs per locale.\n */\nfunction matchTree(selectors: Selector[], candidates: Candidate[], i: number, locale: string): Element[] {\n // Never empty: `validate` requires a variant whose keys are all `*`.\n if (i === selectors.length) return candidates.reduce((a, b) => (compare(b.prefs, a.prefs) < 0 ? b : a)).value;\n const s = selectors[i]!;\n const keys = [...new Set(candidates.map((c) => c.keys[i]).filter((k): k is string => k !== null && k !== undefined))];\n const options: Record<string, PluralOrSelectOption> = {};\n const arm = (name: string, preference: (key: string | null) => number | undefined) => {\n const next = candidates.flatMap((c) => {\n const p = preference(c.keys[i]!);\n return p === undefined ? [] : [{ ...c, prefs: [...c.prefs, p] }];\n });\n options[name] = { value: matchTree(selectors, next, i + 1, locale) };\n };\n\n if (s.kind === 'string') {\n for (const k of keys) arm(k, (key) => (key === k ? 0 : key === null ? 1 : undefined));\n arm('other', (key) => (key === null ? 1 : undefined));\n return [{ type: TYPE.select, value: s.name, options }];\n }\n const rules = new Intl.PluralRules(locale, { ...s.selection?.options, type: s.kind === 'ordinal' ? 'ordinal' : 'cardinal' });\n for (const k of keys.filter((key) => NUMBER_LITERAL.test(key))) {\n const category = s.kind === 'exact' ? undefined : rules.select(Number(k));\n // The runtime compares the value before its offset; the key is the value after it.\n arm(`=${Number(k) + s.offset}`, (key) => (key === k ? 0 : key === category ? 1 : key === null ? 2 : undefined));\n }\n if (s.kind !== 'exact') {\n // With a key named `other`, an arm for every category, so that the catch-all arm is reached only\n // by values whose category is `other`.\n const categories: string[] = keys.includes('other') ? rules.resolvedOptions().pluralCategories : keys.filter((k) => CATEGORIES.has(k));\n for (const c of categories) arm(c, (key) => (key === c ? 1 : key === null ? 2 : undefined));\n }\n if (!('other' in options)) arm('other', (key) => (key === null ? 2 : undefined));\n const pluralType = s.kind === 'ordinal' ? 'ordinal' : 'cardinal';\n return [{ type: TYPE.plural, value: s.name, offset: s.offset, pluralType, options, ...(s.selection && { selection: s.selection }) }];\n}\n\nfunction compare(a: number[], b: number[]): number {\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return a[i]! - b[i]!;\n return 0;\n}\n\nfunction pattern(parts: Model.Pattern, scope: Scope, r: Reading): Element[] {\n const root: Element[] = [];\n const open: { name: string; children: Element[] }[] = [];\n const push = (el: Element) => {\n const into = open.at(-1)?.children ?? root;\n const last = into.at(-1);\n if (el.type === TYPE.literal && last?.type === TYPE.literal) last.value += el.value;\n else into.push(el);\n };\n for (const part of parts) {\n if (typeof part === 'string') {\n push({ type: TYPE.literal, value: part });\n } else if (part.type === 'expression') {\n push(element(resolve(part, scope), r));\n } else if (part.kind === 'close') {\n const top = open.pop();\n if (top?.name !== part.name) {\n throw new Error(\n top\n ? `{/${part.name}} closes {#${top.name}}: close tags in the order they opened`\n : `{/${part.name}} closes nothing: open it with {#${part.name}}`,\n );\n }\n push({ type: TYPE.tag, value: top.name, children: top.children });\n } else {\n const options = Object.keys(part.options ?? {}).filter((k) => k !== 'u:id');\n if (options.length > 0)\n throw new Error(`{#${part.name}} has options (${options.join(', ')}): tags take none here, so give them to its function`);\n if (part.kind === 'open') open.push({ name: part.name, children: [] });\n else push({ type: TYPE.tag, value: part.name, children: [] });\n }\n }\n if (open.length > 0) throw new Error(`{#${open.at(-1)!.name}} is never closed: end it with {/${open.at(-1)!.name}}`);\n return root;\n}\n\nfunction element(value: Value, r: Reading): Element {\n if (value.kind === 'literal') return { type: TYPE.literal, value: formatLiteral(value, r.locale) };\n const { name, fn, offset } = value;\n const placeholder = placeholderFor(name, fn, r);\n // A value less its offset is what `#` prints inside a plural, so a plural with only `other` prints it.\n if (offset !== 0) {\n const pound = { type: TYPE.pound, placeholder } as Element;\n return { type: TYPE.plural, value: name, offset, pluralType: 'cardinal', options: { other: { value: [pound] } } };\n }\n if (fn === undefined || fn.name === 'string')\n return { type: TYPE.argument, value: name, placeholder, ...(fn?.dir && { dir: fn.dir }) } as Element;\n if (NUMERIC.has(fn.name)) return { type: TYPE.number, value: name, style: numberStyle(fn), placeholder } as Element;\n return { type: TYPE.date, value: name, style: dateStyle(fn), placeholder } as Element;\n}\n\n/** A literal with a function is the same in every render, so it is formatted now. */\nfunction formatLiteral(value: Extract<Value, { kind: 'literal' }>, locale: string): string {\n const { fn } = value;\n if (fn === undefined || fn.name === 'string') return value.value;\n const [option, arg] = Object.entries(fn.args ?? {})[0] ?? [];\n if (option !== undefined) {\n const why = 'a literal is formatted as the message compiles, so its options are literals too';\n throw new Error(`|${value.value}| :${fn.name} ${option}=$${arg}: ${why}`);\n }\n if (NUMERIC.has(fn.name)) return new Intl.NumberFormat(locale, intlNumber(fn)).format(Number(literalNumber(value.value)));\n const date = new Date(value.value);\n if (Number.isNaN(date.getTime())) throw new Error(`|${value.value}| is not a date: write it as an ISO 8601 date, like 2026-01-05`);\n return new Intl.DateTimeFormat(locale, intlDate(fn)).format(date);\n}\n\nexport type Mf2NumberSkeleton = NumberSkeleton & { mf2: Mf2Function; args?: OptionArgs };\nexport type Mf2DateSkeleton = DateTimeSkeleton & { mf2: Mf2Function; args?: OptionArgs };\n\nfunction numberStyle(fn: Mf2Function): Mf2NumberSkeleton {\n const parsedOptions = intlNumber(fn) as NumberSkeleton['parsedOptions'];\n return { type: SKELETON_TYPE.number, tokens: [], parsedOptions, mf2: fn, ...optionArgs(fn) };\n}\n\nfunction dateStyle(fn: Mf2Function): Mf2DateSkeleton {\n return { type: SKELETON_TYPE.dateTime, pattern: '', parsedOptions: intlDate(fn), mf2: fn, ...optionArgs(fn) };\n}\n\n/** The function's options given by arguments, as the `Intl` options the runtime merges in. */\nfunction optionArgs(fn: Mf2Function): { args?: OptionArgs } {\n if (fn.args === undefined) return {};\n const args: OptionArgs = {};\n for (const [key, arg] of Object.entries(fn.args))\n for (const intl of FROM_ARGUMENT[key]!.intl) args[intl] = { arg, type: FROM_ARGUMENT[key]!.type };\n return { args };\n}\n\n/** The `Intl.NumberFormat` options a numeric function formats with. */\nexport function intlNumber(fn: Mf2Function): Intl.NumberFormatOptions {\n const allowed = OPTIONS[fn.name] ?? [];\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fn.options)) {\n if (!allowed.includes(key) || key === 'select') continue;\n if (key === 'useGrouping') {\n out.useGrouping = value === 'never' ? false : value;\n } else if (key === 'fractionDigits') {\n if (value !== 'auto') out.minimumFractionDigits = out.maximumFractionDigits = Number(value);\n } else if (DIGITS.includes(key)) {\n out[key] = Number(value);\n } else {\n out[key] = value;\n }\n }\n if (fn.name === 'integer') out.maximumFractionDigits = 0;\n if (fn.name === 'percent' || fn.name === 'currency' || fn.name === 'unit') out.style = fn.name;\n return out;\n}\n\n/**\n * The `Intl.DateTimeFormat` options a date or time function formats with. MF2's date and time\n * functions are still a draft; this follows the spec's semantic options as the `messageformat`\n * package does, so a message reads the same in both.\n */\nexport function intlDate(fn: Mf2Function): Intl.DateTimeFormatOptions {\n const o = fn.options;\n const out: Intl.DateTimeFormatOptions = {};\n if (o.calendar !== undefined) out.calendar = o.calendar;\n if (fn.name !== 'date' && o.hour12 !== undefined) out.hour12 = o.hour12 === 'true';\n if (o.timeZone !== undefined) out.timeZone = o.timeZone;\n if (fn.name !== 'time') {\n const fields = new Set((o[fn.name === 'date' ? 'fields' : 'dateFields'] ?? 'year-month-day').split('-'));\n const length = o[fn.name === 'date' ? 'length' : 'dateLength'];\n if (fields.has('year')) out.year = 'numeric';\n if (fields.has('month')) out.month = length === 'long' ? 'long' : length === 'short' ? 'numeric' : 'short';\n if (fields.has('day')) out.day = 'numeric';\n if (fields.has('weekday')) out.weekday = length === 'long' ? 'long' : 'short';\n }\n if (fn.name !== 'date') {\n const precision = o[fn.name === 'time' ? 'precision' : 'timePrecision'];\n out.hour = 'numeric';\n if (precision !== 'hour') out.minute = 'numeric';\n if (precision === 'second') out.second = 'numeric';\n if (o.timeZoneStyle !== undefined) out.timeZoneName = o.timeZoneStyle as 'long' | 'short';\n }\n return out;\n}\n\n// Writing MF2 ////////////////////////////////////////////////////////////////////////////////////////\n\ninterface Found {\n /** The argument a plural or select reads. */\n arg: string;\n /** The variable `.match` names: the argument, or a local less the offset. */\n variable: string;\n kind: 'plural' | 'ordinal' | 'string';\n offset: number;\n /** MF2 keys, in order of appearance; `*` is implied. */\n keys: string[];\n /** The function it was selected with, read from MF2; a bare `:number` where none is kept. */\n fn?: Mf2Function;\n}\n\n/** A message tree as MF2 text. Throws, saying what has no MF2 equivalent, where it can't be written. */\nexport function toMf2(ast: Element[], locale: string): string {\n const found = selectorsOf(ast);\n if (found.length === 0) {\n const pattern = toPattern(ast, { choice: new Map(), variables: new Map(), numeric: new Set(), locale });\n return stringifyMessage({ type: 'message', declarations: [], pattern });\n }\n\n const declarations: Model.Declaration[] = [];\n for (const s of found) {\n const fn: Model.FunctionRef =\n s.kind === 'string'\n ? functionRef('string')\n : s.fn !== undefined\n ? written(s.fn)\n : functionRef('number', s.kind === 'ordinal' ? { select: 'ordinal' } : {});\n declarations.push({ type: 'input', name: s.arg, value: { type: 'expression', arg: variable(s.arg), functionRef: fn } });\n if (s.offset !== 0) {\n declarations.push({\n type: 'local',\n name: s.variable,\n value: { type: 'expression', arg: variable(s.arg), functionRef: functionRef('offset', { subtract: String(s.offset) }) },\n });\n }\n }\n\n // Every combination of keys, `*` last, rendered by picking each plural's and select's arm.\n let combos: (string | null)[][] = [[]];\n for (const s of found) combos = combos.flatMap((c) => [...s.keys, null].map((k) => [...c, k]));\n const variables = new Map(found.map((s) => [s.arg, s.variable]));\n // Under a selector declared with more than a bare `:number`, a placeholder spells out its own.\n const numeric = new Set(found.filter((s) => s.kind !== 'string' && s.fn === undefined).map((s) => s.arg));\n const render = (keys: (string | null)[]) =>\n toPattern(ast, { choice: new Map(found.map((s, i) => [s.arg, keys[i]!])), variables, numeric, locale });\n const variants = combos.map((keys) => ({ keys, pattern: render(keys), text: '' }));\n for (const v of variants) v.text = JSON.stringify(v.pattern);\n const kept = prune(variants, found, locale);\n\n return stringifyMessage({\n type: 'select',\n declarations,\n selectors: found.map((s) => variable(s.variable)),\n variants: kept.map((v) => ({\n keys: v.keys.map((k): Model.Literal | Model.CatchallKey => (k === null ? { type: '*' } : { type: 'literal', value: k })),\n value: v.pattern,\n })),\n });\n}\n\nfunction selectorsOf(ast: Element[]): Found[] {\n const found = new Map<string, Found>();\n const names = new Set<string>();\n walk(ast, (el) => {\n if ('value' in el && typeof el.value === 'string' && el.type !== TYPE.literal) names.add(el.value);\n });\n walk(ast, (el) => {\n if (el.type !== TYPE.plural && el.type !== TYPE.select) return;\n const kind = el.type === TYPE.select ? 'string' : el.pluralType === 'ordinal' ? 'ordinal' : 'plural';\n const offset = el.type === TYPE.plural ? el.offset : 0;\n let s = found.get(el.value);\n if (s === undefined) {\n checkName(el.value);\n let local = `${el.value}_minus_${offset}`;\n while (names.has(local)) local += '_';\n const fn = selectionOf(el)?.fn;\n s = { arg: el.value, variable: offset === 0 ? el.value : local, kind, offset, keys: [], ...(fn && { fn }) };\n found.set(el.value, s);\n } else if (s.kind !== kind || s.offset !== offset) {\n throw new Error(\n `{${el.value}} is selected on in two ways (${s.kind}, ${kind}${offset !== s.offset ? ', with different offsets' : ''}), which one .match can't say: make them the same`,\n );\n }\n for (const arm of Object.keys(el.options)) {\n if (arm === 'other') continue;\n const key = el.type === TYPE.plural && arm.startsWith('=') ? String(Number(arm.slice(1)) - offset) : arm;\n if (!s.keys.includes(key)) s.keys.push(key);\n }\n });\n return [...found.values()];\n}\n\n/**\n * The variants a reader needs: one that renders like the variant it would fall back to is dropped,\n * as long as every combination of values still lands on a variant rendering what it should.\n */\nfunction prune<V extends { keys: (string | null)[]; text: string }>(variants: V[], found: Found[], locale: string): V[] {\n const rules = found.map((s) =>\n s.kind === 'string' ? undefined : new Intl.PluralRules(locale, { type: s.kind === 'ordinal' ? 'ordinal' : 'cardinal' }),\n );\n const preference = (i: number, key: string | null, value: string | null): number | undefined => {\n if (key === null) return 2;\n if (value === null) return undefined;\n if (key === value) return NUMBER_LITERAL.test(key) || rules[i] === undefined ? 0 : 1;\n if (rules[i] !== undefined && NUMBER_LITERAL.test(value) && rules[i].select(Number(value)) === key) return 1;\n return undefined;\n };\n const pick = (kept: V[], values: (string | null)[]) => {\n let best: { v: V; prefs: number[] } | undefined;\n for (const v of kept) {\n const prefs = values.map((value, i) => preference(i, v.keys[i]!, value));\n if (prefs.some((p) => p === undefined)) continue;\n if (best === undefined || compare(prefs as number[], best.prefs) < 0) best = { v, prefs: prefs as number[] };\n }\n return best?.v;\n };\n let kept = [...variants];\n const specificFirst = [...variants].sort((a, b) => b.keys.filter((k) => k !== null).length - a.keys.filter((k) => k !== null).length);\n for (const candidate of specificFirst) {\n if (candidate.keys.every((k) => k === null)) continue;\n const without = kept.filter((v) => v !== candidate);\n if (variants.every((v) => pick(without, v.keys)?.text === v.text)) kept = without;\n }\n return kept;\n}\n\ninterface Writing {\n /** The key each selected argument takes in the variant being written. */\n choice: Map<string, string | null>;\n /** The variable `.match` names for each selected argument. */\n variables: Map<string, string>;\n /** Arguments declared `.input {$n :number}`, whose plain `{$n}` already formats as a number. */\n numeric: Set<string>;\n locale: string;\n}\n\nfunction toPattern(elements: Element[], w: Writing, pound?: string): Model.Pattern {\n const out: Model.Pattern = [];\n const text = (value: string) => {\n const last = out.at(-1);\n if (typeof last === 'string') out[out.length - 1] = last + value;\n else if (value !== '') out.push(value);\n };\n for (const el of elements) {\n switch (el.type) {\n case TYPE.literal:\n text(el.value);\n break;\n case TYPE.argument: {\n checkName(el.value);\n const dir = (el as { dir?: Mf2Function['dir'] }).dir;\n out.push({\n type: 'expression',\n arg: variable(el.value),\n ...(dir && { functionRef: written({ name: 'string', options: {}, dir }) }),\n });\n break;\n }\n case TYPE.number: {\n checkName(el.value);\n const fn = numberFunction(el);\n const declared = w.numeric.has(el.value) && fn.name === 'number' && fn.options === undefined;\n out.push(\n declared ? { type: 'expression', arg: variable(el.value) } : { type: 'expression', arg: variable(el.value), functionRef: fn },\n );\n break;\n }\n case TYPE.date:\n case TYPE.time:\n checkName(el.value);\n out.push({ type: 'expression', arg: variable(el.value), functionRef: dateFunction(el) });\n break;\n case TYPE.pound:\n out.push({ type: 'expression', arg: variable(pound ?? '') });\n break;\n case TYPE.plural:\n case TYPE.select: {\n const arm = armFor(el, w.choice.get(el.value) ?? null, w.locale);\n const own = w.variables.get(el.value) ?? el.value;\n for (const part of toPattern(arm, w, el.type === TYPE.plural ? own : pound)) {\n if (typeof part === 'string') text(part);\n else out.push(part);\n }\n break;\n }\n case TYPE.tag:\n checkName(el.value);\n out.push({ type: 'markup', kind: 'open', name: el.value });\n for (const part of toPattern(el.children, w, pound)) {\n if (typeof part === 'string') text(part);\n else out.push(part);\n }\n out.push({ type: 'markup', kind: 'close', name: el.value });\n break;\n }\n }\n return out;\n}\n\nfunction armFor(el: PluralElement | SelectElement, key: string | null, locale: string): Element[] {\n const other = el.options.other!.value;\n if (key === null) return other;\n if (el.type === TYPE.plural && NUMBER_LITERAL.test(key)) {\n const exact = el.options[`=${Number(key) + el.offset}`];\n if (exact !== undefined) return exact.value;\n const category = new Intl.PluralRules(locale, { type: el.pluralType }).select(Number(key));\n return el.options[category]?.value ?? other;\n }\n return el.options[key]?.value ?? other;\n}\n\nfunction checkName(name: string): void {\n if (!NAME.test(name)) throw new Error(`\"${name}\" can't be a MessageFormat 2 name: start it with a letter`);\n}\n\nfunction variable(name: string): Model.VariableRef {\n return { type: 'variable', name };\n}\n\nfunction functionRef(name: string, options: Record<string, string> = {}, args: Record<string, string> = {}): Model.FunctionRef {\n const entries: [string, Model.Literal | Model.VariableRef][] = [\n ...Object.entries(options).map(([k, v]): [string, Model.Literal] => [k, { type: 'literal', value: v }]),\n ...Object.entries(args).map(([k, v]): [string, Model.VariableRef] => [k, variable(v)]),\n ];\n if (entries.length === 0) return { type: 'function', name };\n return { type: 'function', name, options: Object.fromEntries(entries) };\n}\n\nfunction written(fn: Mf2Function): Model.FunctionRef {\n return functionRef(fn.name, { ...fn.options, ...(fn.dir && { 'u:dir': fn.dir }) }, fn.args);\n}\n\nfunction numberFunction(el: NumberElement): Model.FunctionRef {\n const style = el.style;\n if (style === null || style === undefined) return functionRef('number');\n if (typeof style === 'string') {\n if (style === 'integer' || style === 'percent') return functionRef(style);\n throw new Error(`{${el.value}, number, ${style}} has no MessageFormat 2 equivalent`);\n }\n if ('mf2' in style) return written((style as Mf2NumberSkeleton).mf2);\n const {\n style: kind,\n currency,\n currencyDisplay,\n currencySign,\n unit,\n unitDisplay,\n ...rest\n } = style.parsedOptions as Record<string, string | number | boolean | undefined>;\n const name = kind === 'percent' || kind === 'currency' || kind === 'unit' ? kind : 'number';\n const options: Record<string, string> = {};\n const own = name === 'currency' ? { currency, currencyDisplay, currencySign } : name === 'unit' ? { unit, unitDisplay } : {};\n for (const [key, value] of Object.entries(own)) if (value !== undefined) options[key] = String(value);\n if (name === 'currency' && rest.minimumFractionDigits !== undefined && rest.minimumFractionDigits === rest.maximumFractionDigits) {\n options.fractionDigits = String(rest.minimumFractionDigits);\n delete rest.minimumFractionDigits;\n delete rest.maximumFractionDigits;\n }\n for (const [key, value] of Object.entries(rest)) {\n if (value === undefined) continue;\n if (key === 'useGrouping') options.useGrouping = value === false ? 'never' : String(value);\n else if (OPTIONS[name]!.includes(key) && key !== 'select') options[key] = String(value);\n else throw new Error(`{${el.value}}'s ${key}: ${String(value)} has no MessageFormat 2 equivalent`);\n }\n return functionRef(name, options);\n}\n\n/**\n * The MF2 function for a date or time element. MF1's named styles have no exact counterpart, so they\n * map to the nearest; `migrate` renders both and reports any that come out different.\n */\nfunction dateFunction(el: DateElement | TimeElement): Model.FunctionRef {\n const style = el.style;\n if (typeof style === 'object' && style !== null && 'mf2' in style) return written((style as Mf2DateSkeleton).mf2);\n if (el.type === TYPE.time && (style === null || style === undefined || typeof style === 'string')) {\n const time: Record<string, Record<string, string>> = {\n short: {},\n medium: { precision: 'second' },\n long: { precision: 'second', timeZoneStyle: 'short' },\n full: { precision: 'second', timeZoneStyle: 'long' },\n };\n return functionRef('time', time[style ?? 'short'] ?? {});\n }\n if (style === null || style === undefined || typeof style === 'string') {\n const date: Record<string, Record<string, string>> = {\n // MF1's default is `Intl`'s: numeric year, month and day.\n default: { length: 'short' },\n short: { length: 'short' },\n medium: {},\n long: { length: 'long' },\n full: { fields: 'year-month-day-weekday', length: 'long' },\n };\n return functionRef('date', date[style ?? 'default'] ?? {});\n }\n const { calendar, timeZone, hour12, ...fields } = style.parsedOptions;\n const overrides: Record<string, string> = {};\n if (calendar !== undefined) overrides.calendar = calendar;\n if (timeZone !== undefined) overrides.timeZone = timeZone;\n if (hour12 !== undefined) overrides.hour12 = String(hour12);\n const wanted = JSON.stringify(sorted(fields));\n for (const candidate of dateCandidates()) {\n const { calendar: _c, timeZone: _t, hour12: _h, ...got } = intlDate(candidate);\n if (JSON.stringify(sorted(got)) === wanted) return functionRef(candidate.name, { ...candidate.options, ...overrides });\n }\n throw new Error(`{${el.value}}'s date skeleton \"${style.pattern}\" has no MessageFormat 2 equivalent: use a named style`);\n}\n\nfunction sorted(o: object): [string, unknown][] {\n return Object.entries(o)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b));\n}\n\nfunction* dateCandidates(): Generator<Mf2Function> {\n const lengths = [undefined, 'long', 'short'];\n const precisions = [undefined, 'hour', 'second'];\n const zones = [undefined, 'long', 'short'];\n const defined = (o: Record<string, string | undefined>) =>\n Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined)) as Record<string, string>;\n // Defaults first, so the shortest spelling wins.\n const fieldsList = [undefined, ...DATE_FIELDS.filter((f) => f !== 'year-month-day')];\n const dates = fieldsList.flatMap((fields) => lengths.map((length) => ({ fields, length })));\n const times = precisions.flatMap((precision) => zones.map((timeZoneStyle) => ({ precision, timeZoneStyle })));\n for (const d of dates) yield { name: 'date', options: defined(d) };\n for (const t of times) yield { name: 'time', options: defined(t) };\n for (const d of dates) {\n for (const t of times) {\n const options = { dateFields: d.fields, dateLength: d.length, timePrecision: t.precision, timeZoneStyle: t.timeZoneStyle };\n yield { name: 'datetime', options: defined(options) };\n }\n }\n}\n","/**\n * The two syntaxes a catalog can be written in, behind one pair of calls: read a message into the\n * element tree, and write a tree back out. Everything past reading works on the tree alone.\n */\nimport { parseMessage, type MessageFormatElement } from './icu.ts';\nimport { toMf1 } from './mf1.ts';\nimport { parseMf2, toMf2, type Isolate } from './mf2.ts';\n\nexport type MessageFormatVersion = 1 | 2;\n\nexport const SYNTAX_NAME: Record<MessageFormatVersion, string> = { 1: 'ICU MessageFormat', 2: 'MessageFormat 2' };\n\n/**\n * A message as the element tree. MF2 is read per locale: which variants a value can reach depends\n * on the locale's plural rules (see `matchTree` in mf2.ts).\n */\nexport function readMessage(version: MessageFormatVersion, text: string, locale: string, isolate?: Isolate): MessageFormatElement[] {\n return version === 2 ? parseMf2(text, locale, isolate) : parseMessage(text);\n}\n\n/** A tree as text in the given syntax. Throws, saying what the syntax can't express, where it can't. */\nexport function writeMessage(version: MessageFormatVersion, ast: MessageFormatElement[], locale: string): string {\n return version === 2 ? toMf2(ast, locale) : toMf1(ast);\n}\n","/**\n * Reads the catalog and its translations into one checked model.\n *\n * Every message is parsed as ICU here rather than at runtime, which is what lets the generator hand\n * TypeScript exact argument types, compile messages to plain functions, and fail the build where a\n * translation's placeholders drifted from the source instead of dropping a value off the screen.\n */\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, relative, resolve } from 'node:path';\n\nimport { isMap, isScalar, LineCounter, parseDocument, parse as parseYaml, Scalar } from 'yaml';\n\nimport type { ResolvedConfig } from './config.ts';\nimport { argsOf, formatProblems, formatsOf, staticLiteral, tagsOf, type MessageFormatElement } from './icu.ts';\nimport { readMessage } from './syntax.ts';\n\nexport interface Translation {\n text: string;\n ast: MessageFormatElement[];\n file: string;\n}\n\nexport interface Message {\n key: string;\n /** The first segment of the key, which names its file. */\n area: string;\n file: string;\n kind?: string;\n surface?: string;\n /** One sentence telling a translator where the string appears. */\n context?: string;\n /** What each placeholder holds, keyed by argument name. */\n argDocs: Map<string, string>;\n /** Completes something beside it rather than standing as a sentence, so sentence rules do not apply. */\n fragment: boolean;\n /** Lint rules the entry is exempt from, each with the reason. */\n allow: Map<string, string>;\n /** A change someone asked for, left for whoever edits the entry next, and deleted once it is made. */\n comment?: string;\n /** Asked to go: the entry, its translations and the code that reads it. */\n remove: boolean;\n /** The source message, in ICU MessageFormat. */\n text: string;\n ast: MessageFormatElement[];\n /** Argument name to TypeScript type. */\n args: Map<string, string>;\n /** How each formatted argument is styled, for the doc comment at the call site. */\n argFormats: Map<string, string>;\n tags: string[];\n /** Translations by locale. */\n translations: Map<string, Translation>;\n}\n\nexport interface Problem {\n severity: 'error' | 'warn';\n /** Relative to the project root; none for a problem that isn't in a file. */\n file?: string;\n /** The entry it is about, in `file`; none for the file as a whole. */\n key?: string;\n message: string;\n}\n\n/** `file key`, as the CLI names where a problem is. */\nexport function whereOf(problem: Problem): string {\n return [problem.file, problem.key].filter((s) => s !== undefined).join(' ');\n}\n\nexport interface Catalog {\n messages: Message[];\n /** The translated locales found under `locales`, without the source. */\n locales: string[];\n problems: Problem[];\n}\n\nexport class CatalogError extends Error {\n readonly problems: Problem[];\n\n constructor(problems: Problem[]) {\n super(`the catalog has ${problems.length} problem(s):\\n ${problems.map((p) => `${whereOf(p)}: ${p.message}`).join('\\n ')}`);\n this.problems = problems;\n }\n}\n\n/**\n * A key is dotted lowercase, two segments at least, and its first segment names the file it lives\n * in. Keys are read at every call site, so they say what the string is for: `cart.checkout.title`.\n */\nexport const KEY_PATTERN = /^[a-z0-9]+(?:[-_][a-z0-9]+)*(?:\\.[a-z0-9]+(?:[-_][a-z0-9]+)*)+$/;\n\nconst FIELDS = new Set(['kind', 'surface', 'context', 'args', 'fragment', 'allow', 'comment', 'remove']);\n\n/**\n * Loads and checks the catalog. Throws a `CatalogError` when anything is an error; warnings ride along.\n * `unsaved` holds file contents by absolute path to read in place of what is on disk, so an edit can be\n * checked before it is written; a translation file in it that isn't on disk yet is read too.\n */\nexport function loadCatalog(config: ResolvedConfig, unsaved?: ReadonlyMap<string, string>): Catalog {\n const read = (path: string) => unsaved?.get(resolve(path)) ?? readFileSync(path, 'utf8');\n const problems: Problem[] = [];\n const error = (message: string, file?: string, key?: string) => problems.push({ severity: 'error', file, key, message });\n const byKey = new Map<string, Message>();\n const rel = (path: string) => relative(config.root, path).replaceAll('\\\\', '/');\n\n if (!existsSync(config.catalog)) {\n error('no catalog folder here: run `prosebook init`, or set `catalog` in the config', rel(config.catalog));\n throw new CatalogError(problems);\n }\n\n for (const file of yamlFiles(config.catalog)) {\n const area = file.slice(0, -'.yaml'.length);\n const path = join(config.catalog, file);\n const at = rel(path);\n for (const [key, value] of Object.entries(readEntries(read(path), (m) => error(m, at)))) {\n if (!KEY_PATTERN.test(key)) {\n error('a key is dotted lowercase with two segments at least: `area.thing`', at, key);\n continue;\n }\n if (key.slice(0, key.indexOf('.')) !== area) {\n error(`a key in ${file} starts with \"${area}.\"`, at, key);\n continue;\n }\n if (byKey.has(key)) {\n error('duplicate key', at, key);\n continue;\n }\n const message = readEntry(key, area, at, value, config, (m) => error(m, at, key));\n if (!message) continue;\n byKey.set(key, message);\n // Asked of whoever edits next, often an agent, which finds them among the warnings of every run.\n const warn = (m: string) => problems.push({ severity: 'warn', file: at, key, message: m });\n if (message.remove) warn('marked for removal: delete the entry, its translations and the code that reads it');\n if (message.comment !== undefined) warn(`a comment to act on, then delete: ${message.comment}`);\n }\n }\n\n const created = [...(unsaved?.keys() ?? [])].filter((path) => !existsSync(path));\n const locales = readLocales(config, byKey, problems, rel, read, created);\n if (problems.some((p) => p.severity === 'error')) throw new CatalogError(problems);\n return { messages: [...byKey.values()].sort((a, b) => (a.key < b.key ? -1 : 1)), locales, problems };\n}\n\nfunction readEntry(\n key: string,\n area: string,\n file: string,\n value: unknown,\n config: ResolvedConfig,\n error: (message: string) => void,\n): Message | undefined {\n // `key: message` is the shorthand for an entry with nothing to say about itself.\n const entry = (typeof value === 'string' ? { [config.source]: value } : value) as Record<string, unknown> | null;\n if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) {\n error(`an entry is a message, or a mapping holding \\`${config.source}\\` and what the string is`);\n return undefined;\n }\n let ok = true;\n const fail = (message: string) => {\n error(message);\n ok = false;\n };\n for (const field of Object.keys(entry))\n if (!FIELDS.has(field) && field !== config.source) fail(`\"${field}\" is not a field: ${[...FIELDS, config.source].join(', ')}`);\n\n const text = entry[config.source];\n if (typeof text !== 'string' || text === '') {\n fail(`${config.source} is the message, and it is missing`);\n return undefined;\n }\n for (const field of config.require) if (entry[field] === undefined) fail(`${field} is required (\\`require\\` in the config)`);\n\n const kind = optionalString(entry, 'kind', fail);\n if (kind !== undefined && !(kind in config.kinds)) fail(`kind is one of ${Object.keys(config.kinds).join(', ')}`);\n const surface = optionalString(entry, 'surface', fail);\n if (surface !== undefined && !(surface in config.surfaces)) fail(`surface is one of ${Object.keys(config.surfaces).join(', ')}`);\n const context = optionalString(entry, 'context', fail);\n if (entry.fragment !== undefined && typeof entry.fragment !== 'boolean') fail('fragment is true or false');\n const comment = optionalString(entry, 'comment', fail);\n if (entry.remove !== undefined && typeof entry.remove !== 'boolean') fail('remove is true or false');\n\n let ast: MessageFormatElement[];\n try {\n ast = readMessage(config.messageFormat, text, config.source, config.isolate);\n } catch (e) {\n fail(syntaxError(config, text, e));\n return undefined;\n }\n for (const problem of formatProblems(ast)) fail(problem);\n const args = argsOf(ast, (name) => fail(`\"${name}\" is used as two different types`));\n const argDocs = stringMap(entry, 'args', fail);\n // An undocumented placeholder is fine unless context is required; a doc for an argument that no\n // longer exists is always stale.\n if (config.require.includes('context'))\n for (const name of args.keys()) if (!argDocs.has(name)) fail(`args.${name} is missing: say what the placeholder holds`);\n\n for (const name of argDocs.keys()) if (!args.has(name)) fail(`args.${name} is not an argument of this message`);\n\n if (!ok) return undefined;\n return {\n key,\n area,\n file,\n kind,\n surface,\n context,\n argDocs,\n fragment: entry.fragment === true,\n allow: stringMap(entry, 'allow', fail),\n comment,\n remove: entry.remove === true,\n text,\n ast,\n args,\n argFormats: formatsOf(ast),\n tags: tagsOf(ast),\n translations: new Map(),\n };\n}\n\nfunction readLocales(\n config: ResolvedConfig,\n byKey: Map<string, Message>,\n problems: Problem[],\n rel: (p: string) => string,\n read: (path: string) => string,\n created: string[],\n): string[] {\n if (!existsSync(config.locales)) return [];\n const files = new Map<string, string[]>();\n for (const name of readdirSync(config.locales).sort()) {\n const path = join(config.locales, name);\n const isDir = statSync(path).isDirectory();\n if (!isDir && !name.endsWith('.yaml')) continue;\n const locale = isDir ? name : name.slice(0, -'.yaml'.length);\n const found = isDir ? yamlFiles(path).map((f) => join(path, f)) : [path];\n files.set(locale, [...(files.get(locale) ?? []), ...found]);\n }\n // A translation file an edit would create, read as if it were there already.\n for (const path of created) {\n const inside = relative(config.locales, path).replaceAll('\\\\', '/');\n if (inside.startsWith('..') || !inside.endsWith('.yaml')) continue;\n const [first = '', second] = inside.split('/');\n const locale = second === undefined ? first.slice(0, -'.yaml'.length) : first;\n files.set(locale, [...(files.get(locale) ?? []), path]);\n }\n files.delete(config.source);\n\n for (const [locale, paths] of files) {\n for (const path of paths) {\n const file = rel(path);\n const error = (message: string, key?: string) => problems.push({ severity: 'error', file, key, message });\n for (const [key, value] of Object.entries(readEntries(read(path), error))) {\n const message = byKey.get(key);\n if (message === undefined) {\n problems.push({ severity: 'warn', file, key, message: 'no such key in the catalog, so this translation is unused' });\n continue;\n }\n if (typeof value !== 'string' || value === '') {\n error('a translation is the message, as a string', key);\n continue;\n }\n let ast: MessageFormatElement[];\n try {\n ast = readMessage(config.messageFormat, value, locale, config.isolate);\n } catch (e) {\n error(syntaxError(config, value, e), key);\n continue;\n }\n const drift = driftFrom(message, ast);\n if (drift !== undefined) {\n error(drift, key);\n continue;\n }\n for (const problem of formatProblems(ast)) error(problem, key);\n message.translations.set(locale, { text: value, ast, file });\n }\n }\n }\n return [...files.keys()];\n}\n\n/** How a translation's placeholders or tags differ from the source, or nothing. */\nfunction driftFrom(message: Message, ast: MessageFormatElement[]): string | undefined {\n const args = argsOf(ast);\n const missing = [...message.args.keys()].filter((a) => !args.has(a));\n const extra = [...args.keys()].filter((a) => !message.args.has(a));\n const retyped = [...args]\n .filter(([a, type]) => message.args.has(a) && message.args.get(a) !== type && !type.includes('string &'))\n .map(([a]) => a);\n const tags = tagsOf(ast);\n const parts = [\n missing.length > 0 ? `missing {${missing.join('}, {')}}` : '',\n extra.length > 0 ? `unknown {${extra.join('}, {')}}` : '',\n retyped.length > 0 ? `{${retyped.join('}, {')}} used as another type` : '',\n tags.join() === message.tags.join()\n ? ''\n : `tags are <${tags.join('>, <') || 'none'}>, the source has <${message.tags.join('>, <') || 'none'}>`,\n ].filter(Boolean);\n return parts.length > 0 ? `differs from the source: ${parts.join('; ')}` : undefined;\n}\n\nfunction syntaxError(config: ResolvedConfig, text: string, e: unknown): string {\n // MF2's reader words its own problems; see mf2.ts.\n if (config.messageFormat === 2) return (e as Error).message;\n return icuError(text, e);\n}\n\nfunction icuError(text: string, e: unknown): string {\n const hyphenated = /select\\s*,/.test(text) ? /[,{]\\s*([a-z0-9]+(?:-[a-z0-9]+)+)\\s*\\{/.exec(text) : null;\n if (hyphenated) return `names a select arm \"${hyphenated[1]}\": an arm's name takes no hyphen, so write it with an underscore`;\n const reason = (e as Error).message;\n if (/TAG/.test(reason)) return `is not valid ICU (${reason}): a literal < is written '<'`;\n return `is not valid ICU MessageFormat: ${reason}`;\n}\n\nfunction yamlFiles(dir: string): string[] {\n return readdirSync(dir)\n .filter((f) => f.endsWith('.yaml'))\n .sort();\n}\n\n/**\n * The file's entries. YAML 1.1 and 1.2 disagree about bare scalars: 1.1 reads `n`, `on` and `yes` as\n * booleans and `12:30` as a number. Translation tools are often 1.1, so a file that reads differently\n * under each fails here, naming the value to quote, rather than corrupting quietly in the next tool.\n */\nfunction readEntries(text: string, error: (message: string) => void): Record<string, unknown> {\n let raw: unknown;\n try {\n raw = parseYaml(text);\n } catch (e) {\n error(`is not valid YAML: ${(e as Error).message}`);\n return {};\n }\n if (raw === null || raw === undefined) return {};\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n error('a catalog file is a mapping of key to entry');\n return {};\n }\n try {\n const found = divergence(raw, parseYaml(text, { version: '1.1' }), '');\n if (found !== undefined) error(found);\n } catch (e) {\n error(`does not parse as YAML 1.1, which another tool may well be: ${(e as Error).message}`);\n }\n return raw as Record<string, unknown>;\n}\n\nfunction divergence(a: unknown, b: unknown, path: string): string | undefined {\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n if (Object.is(a, b)) return undefined;\n return `${path} reads as ${JSON.stringify(a)} under YAML 1.2 and ${JSON.stringify(b)} under YAML 1.1: quote it`;\n }\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n for (const key of new Set([...Object.keys(left), ...Object.keys(right)])) {\n const here = path === '' ? key : `${path}.${key}`;\n if (key in left !== key in right) return `${here} is a key under YAML ${key in left ? '1.2' : '1.1'} only: quote it`;\n const found = divergence(left[key], right[key], here);\n if (found !== undefined) return found;\n }\n return undefined;\n}\n\nfunction optionalString(entry: Record<string, unknown>, field: string, fail: (m: string) => void): string | undefined {\n const value = entry[field];\n if (value === undefined) return undefined;\n if (typeof value !== 'string' || value.trim() === '') {\n fail(`${field} is a non-empty string`);\n return undefined;\n }\n return value.trim();\n}\n\nfunction stringMap(entry: Record<string, unknown>, field: string, fail: (m: string) => void): Map<string, string> {\n const out = new Map<string, string>();\n const value = entry[field];\n if (value === undefined) return out;\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n fail(`${field} is a mapping of name to sentence`);\n return out;\n }\n for (const [name, said] of Object.entries(value)) {\n if (typeof said !== 'string' || said.trim() === '') fail(`${field}.${name} is a sentence`);\n else out.set(name, said.trim());\n }\n return out;\n}\n\nexport interface EntryLocation {\n /** Absolute. */\n file: string;\n /** From 1. */\n line: number;\n /** From 1. */\n column: number;\n}\n\n/**\n * Where a message's entry is written: its translation in `locale` when there is one, else the catalog.\n * Read from the file as it is now, so an entry moved since the catalog was loaded is still found.\n */\nexport function entryLocation(config: ResolvedConfig, message: Message, locale?: string): EntryLocation {\n const file = (locale === undefined ? undefined : message.translations.get(locale)?.file) ?? message.file;\n return { file: join(config.root, file), ...entryLocator(config.root)(file, message.key) };\n}\n\n/**\n * Finds a key's line and column in a catalog or translation file, given relative to `root`. Each file\n * is read once, so a report that places many entries parses each file once. A key it can't find, or no\n * key, is the top of the file.\n *\n * Given an `offset` into the message (under `field`, in an entry that is a mapping), it is that\n * character, when the value is written in the file as it reads up to there: plain, or quoted on one\n * line with nothing escaped before it. Otherwise it is the key.\n */\nexport function entryLocator(root: string): (file: string, key?: string, offset?: number, field?: string) => Omit<EntryLocation, 'file'> {\n const read = new Map<string, { doc: ReturnType<typeof parseDocument>; lines: LineCounter; source: string }>();\n return (file, key, offset, field) => {\n let parsed = read.get(file);\n if (parsed === undefined) {\n const path = join(root, file);\n const lines = new LineCounter();\n const source = existsSync(path) ? readFileSync(path, 'utf8') : '';\n parsed = { doc: parseDocument(source, { lineCounter: lines }), lines, source };\n read.set(file, parsed);\n }\n const { doc, lines, source } = parsed;\n const pair =\n key !== undefined && isMap(doc.contents) ? doc.contents.items.find((p) => isScalar(p.key) && p.key.value === key) : undefined;\n const value = isMap(pair?.value) && field !== undefined ? pair.value.get(field, true) : pair?.value;\n if (offset !== undefined && isScalar(value) && typeof value.value === 'string' && value.range) {\n const quoted = value.type === Scalar.QUOTE_DOUBLE || value.type === Scalar.QUOTE_SINGLE;\n const content = value.range[0] + (quoted ? 1 : 0);\n if (source.slice(content, content + offset) === value.value.slice(0, offset)) {\n const { line, col } = lines.linePos(content + offset);\n return { line, column: col };\n }\n }\n const start = isScalar(pair?.key) ? pair.key.range?.[0] : undefined;\n if (start === undefined) return { line: 1, column: 1 };\n const { line, col } = lines.linePos(start);\n return { line, column: col };\n };\n}\n\n/** The source message as a reader sees it with no placeholders filled: for docs and reports. */\nexport function previewOf(message: Message): string {\n return staticLiteral(message.ast) ?? message.text;\n}\n","/**\n * One entry as the dev inspector's dialog edits it, in every locale: as fields, or as the YAML written\n * in its files.\n *\n * An edit is checked as the whole catalog, with the edited files read from memory, before anything is\n * written: a save that would break the build comes back as problems instead, and the dev server never\n * sees it. Fields are written into the parsed document, so comments, order and quoting elsewhere in the\n * file stay as they were; YAML replaces the entry's text as typed. A translation left empty is no\n * translation: one that was there is removed, and the locale falls back.\n */\nimport { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve } from 'node:path';\n\nimport { isMap, isScalar, parseDocument, Scalar, type Document, type YAMLMap } from 'yaml';\n\nimport { CatalogError, loadCatalog, type Catalog, type Message, type Problem } from './catalog.ts';\nimport type { ResolvedConfig } from './config.ts';\nimport { applyEdits, lint, type Edit, type Finding } from './lint.ts';\n\nexport interface EntryFields {\n /** The source message. */\n message: string;\n /** By locale. Empty or missing is no translation, so the locale falls back. */\n translations: Record<string, string>;\n context: string;\n kind: string;\n surface: string;\n fragment: boolean;\n /** What each placeholder holds, by name. */\n args: Record<string, string>;\n /** A change asked of whoever edits next; empty is none. */\n comment: string;\n /** Asks for the entry to go, with the code that reads it. */\n remove: boolean;\n}\n\nexport interface EntryYaml {\n /** The entry in the catalog, from its key to the end of its value. */\n catalog: string;\n /** By locale, the entry in that locale's file. Empty is no translation. */\n translations?: Record<string, string>;\n}\n\nexport interface EntryView {\n key: string;\n /** The source locale. */\n source: string;\n /** Every translated locale, the source aside. */\n locales: string[];\n /** Relative to the project root. A locale without the entry names the file it would go in. */\n files: { catalog: string; translations: Record<string, string> };\n /** With every locale in `translations`, empty where it has none. */\n fields: EntryFields;\n yaml: Required<EntryYaml>;\n /** The source message's placeholders. */\n argNames: string[];\n kinds: string[];\n surfaces: string[];\n /** What lint says of the entry as it stands, in every locale. */\n findings: EntryFinding[];\n}\n\nexport interface EntryFinding extends Finding {\n /** The locale's text with this finding fixed, so the page can make the fix without lint's code. */\n fixed?: string;\n}\n\nexport type EntryEdit = { fields: EntryFields } | { yaml: EntryYaml };\n\n/** The entry for `key`, with its translation in every locale. */\nexport function readEntry(config: ResolvedConfig, key: string): EntryView {\n return viewOf(config, loadCatalog(config), key, new Map());\n}\n\n/**\n * Applies an edit and checks the catalog with it. With `write`, a clean edit is written; without, it\n * only comes back as the view, which is how the dialog turns fields into YAML and back.\n */\nexport function editEntry(config: ResolvedConfig, key: string, edit: EntryEdit, write: boolean): { view?: EntryView; problems: Problem[] } {\n const current = viewOf(config, loadCatalog(config), key, new Map());\n const unsaved = new Map<string, string>();\n const text = (file: string) => contentOf(config, file, unsaved);\n const put = (file: string, content: string) => unsaved.set(resolve(config.root, file), content);\n // Locales the edit gives a translation, which the checked catalog must then have.\n const translated: string[] = [];\n\n if ('yaml' in edit) {\n put(current.files.catalog, withSnippet(text(current.files.catalog), key, edit.yaml.catalog));\n for (const locale of current.locales) {\n const yaml = edit.yaml.translations?.[locale]?.trim() ?? current.yaml.translations[locale]!;\n if (yaml !== '') translated.push(locale);\n if (yaml === current.yaml.translations[locale]) continue;\n put(current.files.translations[locale]!, withSnippet(text(current.files.translations[locale]!), key, yaml));\n }\n } else {\n put(current.files.catalog, withFields(text(current.files.catalog), key, edit.fields, config.source));\n for (const locale of current.locales) {\n const next = edit.fields.translations[locale] ?? '';\n if (next.trim() !== '') translated.push(locale);\n if (next === current.fields.translations[locale]) continue;\n put(current.files.translations[locale]!, withTranslation(text(current.files.translations[locale]!), key, next));\n }\n }\n\n let catalog: Catalog;\n try {\n catalog = loadCatalog(config, unsaved);\n } catch (e) {\n if (!(e instanceof CatalogError)) throw e;\n return { problems: e.problems.filter((p) => p.severity === 'error') };\n }\n const message = catalog.messages.find((m) => m.key === key);\n const renamed = [\n ...(message === undefined ? [current.files.catalog] : []),\n ...translated.filter((l) => message?.translations.has(l) !== true).map((l) => current.files.translations[l]!),\n ];\n if (renamed.length > 0) {\n const problem = `the entry is still ${key}: rename a key in the code and the catalog together`;\n return { problems: renamed.map((file) => ({ severity: 'error', file, key, message: problem })) };\n }\n\n if (write) {\n for (const [path, content] of unsaved) {\n if (existsSync(path) && readFileSync(path, 'utf8') === content) continue;\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content);\n }\n }\n return { view: viewOf(config, catalog, key, unsaved), problems: [] };\n}\n\n/**\n * Makes the edits that lint's findings carry, each message in its own file, and writes them only if\n * the catalog they make loads clean: the problems come back instead, and nothing is written.\n */\nexport function applyFixes(config: ResolvedConfig, catalog: Catalog, findings: Finding[]): { fixed: number; problems: Problem[] } {\n const unsaved = new Map<string, string>();\n const entries = new Map<string, { file: string; key: string; locale: string; edits: Edit[]; count: number }>();\n for (const f of findings) {\n if (f.fix === undefined) continue;\n const id = `${f.locale}\\u0000${f.key}`;\n const entry = entries.get(id) ?? { file: f.file, key: f.key, locale: f.locale, edits: [], count: 0 };\n entry.edits.push(...f.fix);\n entry.count += 1;\n entries.set(id, entry);\n }\n let fixed = 0;\n for (const { file, key, locale, edits, count } of entries.values()) {\n const message = catalog.messages.find((m) => m.key === key);\n const written = locale === config.source ? message?.text : message?.translations.get(locale)?.text;\n if (written === undefined) continue;\n const next = applyEdits(written, edits);\n if (next === written) continue;\n const content = contentOf(config, file, unsaved);\n unsaved.set(\n resolve(config.root, file),\n locale === config.source ? withMessage(content, key, next, config.source) : withTranslation(content, key, next),\n );\n fixed += count;\n }\n try {\n loadCatalog(config, unsaved);\n } catch (e) {\n if (!(e instanceof CatalogError)) throw e;\n return { fixed: 0, problems: e.problems.filter((p) => p.severity === 'error') };\n }\n for (const [path, content] of unsaved) writeFileSync(path, content);\n return { fixed, problems: [] };\n}\n\nexport interface Imported {\n /** Keys whose translation was written. */\n written: string[];\n /** Keys given back as they were: each still holds, so a stale one can be accepted. */\n unchanged: string[];\n /** What was left out, and why. The rest was written regardless. */\n problems: Problem[];\n}\n\n/**\n * Translations into `locale` from `prosebook todo`'s YAML filled in, by a person or a model, each\n * written to the file its locale and area put it in. Text around a fenced block is left aside, as a\n * model's reply has it, and an empty value is one left for later. An entry that would break the\n * catalog is left out with its problem, so a reply with one bad entry still lands the others.\n */\nexport function importTranslations(config: ResolvedConfig, locale: string, reply: string): Imported {\n const failed = (message: string, key?: string): Problem => ({ severity: 'error', key, message });\n if (locale === config.source)\n return { written: [], unchanged: [], problems: [failed(`${locale} is the source: import takes translations`)] };\n const fenced = [...reply.matchAll(/^```[^\\n]*\\n([\\s\\S]*?)^```/gm)].map((m) => m[1]);\n const doc = parseDocument(fenced.length > 0 ? fenced.join('\\n') : reply);\n if (doc.errors.length > 0 || !(isMap(doc.contents) || doc.contents === null)) {\n const why = doc.errors[0]?.message.split('\\n', 1)[0] ?? 'it is not a mapping';\n return {\n written: [],\n unchanged: [],\n problems: [failed(`the reply isn't YAML of \\`key: translation\\` (${why}): fix it, or ask for one YAML block`)],\n };\n }\n\n const catalog = loadCatalog(config);\n const problems: Problem[] = [];\n const unchanged: string[] = [];\n const pending = new Map<string, { file: string; text: string }>();\n for (const pair of isMap(doc.contents) ? doc.contents.items : []) {\n const key = isScalar(pair.key) ? String(pair.key.value) : String(pair.key);\n const message = catalog.messages.find((m) => m.key === key);\n if (message === undefined) {\n problems.push(failed('no entry has this key: translate only the keys `prosebook todo` printed', key));\n continue;\n }\n const value = isScalar(pair.value) ? pair.value.value : pair.value;\n if (value === null || value === '') continue;\n if (typeof value !== 'string' && typeof value !== 'number') {\n problems.push(failed('the translation is not text: give the message as one string', key));\n continue;\n }\n const text = String(value);\n if (text === message.translations.get(locale)?.text) unchanged.push(key);\n else pending.set(key, { file: translationFile(config, message, locale), text });\n }\n\n // An entry whose own file reports it is left out, until what is left loads clean. A problem\n // anywhere else means the catalog was broken before the reply, so nothing is written.\n for (;;) {\n const unsaved = new Map<string, string>();\n for (const [key, { file, text }] of pending)\n unsaved.set(resolve(config.root, file), withTranslation(contentOf(config, file, unsaved), key, text));\n try {\n loadCatalog(config, unsaved);\n } catch (e) {\n if (!(e instanceof CatalogError)) throw e;\n const errors = e.problems.filter((p) => p.severity === 'error');\n const own = errors.filter((p) => p.key !== undefined && pending.get(p.key)?.file === p.file);\n if (own.length === 0) return { written: [], unchanged: [], problems: [...problems, ...errors] };\n for (const p of own) if (p.key !== undefined) pending.delete(p.key);\n problems.push(...own);\n continue;\n }\n for (const [path, content] of unsaved) {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content);\n }\n return { written: [...pending.keys()], unchanged, problems };\n }\n}\n\n/** A file as the edit has it, as it is on disk, or empty when it is still to be made. */\nfunction contentOf(config: ResolvedConfig, file: string, unsaved: Map<string, string>): string {\n const path = resolve(config.root, file);\n return unsaved.get(path) ?? (existsSync(path) ? readFileSync(path, 'utf8') : '');\n}\n\n/** The file a translation goes in: beside the locale's others, in its folder or its one file. */\nfunction translationFile(config: ResolvedConfig, message: Message, locale: string): string {\n const existing = message.translations.get(locale)?.file;\n if (existing !== undefined) return existing;\n const folder = join(config.locales, locale);\n const path = existsSync(folder) && statSync(folder).isDirectory() ? join(folder, `${message.area}.yaml`) : `${folder}.yaml`;\n return relative(config.root, path).replaceAll('\\\\', '/');\n}\n\nfunction viewOf(config: ResolvedConfig, catalog: Catalog, key: string, unsaved: Map<string, string>): EntryView {\n const message = catalog.messages.find((m) => m.key === key);\n if (message === undefined) throw new Error(`no entry for \"${key}\" in the catalog: has it been renamed since the page loaded?`);\n const files = Object.fromEntries(catalog.locales.map((l) => [l, translationFile(config, message, l)]));\n return {\n key,\n source: config.source,\n locales: catalog.locales,\n files: { catalog: message.file, translations: files },\n fields: {\n message: message.text,\n translations: Object.fromEntries(catalog.locales.map((l) => [l, message.translations.get(l)?.text ?? ''])),\n context: message.context ?? '',\n kind: message.kind ?? '',\n surface: message.surface ?? '',\n fragment: message.fragment,\n args: Object.fromEntries(message.argDocs),\n comment: message.comment ?? '',\n remove: message.remove,\n },\n yaml: {\n catalog: snippetOf(contentOf(config, message.file, unsaved), key)?.text ?? '',\n translations: Object.fromEntries(catalog.locales.map((l) => [l, snippetOf(contentOf(config, files[l]!, unsaved), key)?.text ?? ''])),\n },\n argNames: [...message.args.keys()],\n kinds: Object.keys(config.kinds),\n surfaces: Object.keys(config.surfaces),\n findings: lint([message], config).map((f) => {\n const written = f.locale === config.source ? message.text : message.translations.get(f.locale)?.text;\n return f.fix === undefined || written === undefined ? f : { ...f, fixed: applyEdits(written, f.fix) };\n }),\n };\n}\n\n/** Where an entry is written: from the start of its key's line to the end of its value. */\nfunction snippetOf(file: string, key: string): { start: number; end: number; text: string } | undefined {\n const doc = parseDocument(file);\n if (!isMap(doc.contents)) return undefined;\n const pair = doc.contents.items.find((p) => isScalar(p.key) && p.key.value === key);\n const keyStart = isScalar(pair?.key) ? pair.key.range?.[0] : undefined;\n const valueEnd = (pair?.value as { range?: [number, number, number] } | null | undefined)?.range?.[1];\n if (keyStart === undefined || valueEnd === undefined) return undefined;\n const start = file.lastIndexOf('\\n', keyStart - 1) + 1;\n // The last value in a file runs to its final newline; the snippet stops at the text.\n const end = start + file.slice(start, valueEnd).trimEnd().length;\n return { start, end, text: file.slice(start, end) };\n}\n\n/** The file with the entry's text replaced, removed when `yaml` is empty, or added at the end. */\nfunction withSnippet(file: string, key: string, yaml: string): string {\n const text = yaml.replace(/\\n+$/, '');\n const at = snippetOf(file, key);\n if (at !== undefined) {\n if (text.trim() === '') return file.slice(0, at.start) + file.slice(at.end).replace(/^\\n/, '');\n return file.slice(0, at.start) + text + file.slice(at.end);\n }\n if (text.trim() === '') return file;\n return file.trim() === '' ? `${text}\\n` : `${file.replace(/\\n*$/, '\\n')}${text}\\n`;\n}\n\n// As YAML 1.1, so a new value that 1.1 would read differently, like `n`, is quoted (as in migrate.ts).\n// An empty file starts as a plain mapping: under 1.1 a key set on nothing makes an `!!omap`.\nfunction parse(file: string): Document {\n const doc: Document = parseDocument(file, { version: '1.1' });\n if (doc.contents === null) doc.contents = doc.createNode({});\n return doc;\n}\n// New values quoted the way catalogs are; values already there keep how they were quoted.\nconst print = (doc: Document) => doc.toString({ lineWidth: 0, singleQuote: true });\n\n/** A value written where one was, keeping how it was quoted; text over several lines as a block. */\nfunction setValue(doc: Document, map: YAMLMap, name: string, value: unknown): void {\n const node = map.get(name, true);\n if (isScalar(node) && typeof value === 'string') {\n node.value = value;\n if (value.includes('\\n')) node.type = Scalar.BLOCK_LITERAL;\n return;\n }\n map.set(name, doc.createNode(value));\n}\n\nfunction withFields(file: string, key: string, fields: EntryFields, source: string): string {\n const doc = parse(file);\n let entry = doc.get(key, true);\n // `key: message` gains a mapping once it has anything to say about itself.\n if (!isMap(entry)) {\n entry = doc.createNode({ [source]: fields.message });\n doc.set(key, entry);\n }\n const map = entry as YAMLMap;\n const args = Object.fromEntries(Object.entries(fields.args).filter(([, v]) => v.trim() !== ''));\n const wanted: [string, unknown][] = [\n ['kind', fields.kind.trim() || undefined],\n ['surface', fields.surface.trim() || undefined],\n ['context', fields.context.trim() || undefined],\n ['args', Object.keys(args).length > 0 ? args : undefined],\n ['fragment', fields.fragment || undefined],\n ['comment', fields.comment.trim() || undefined],\n ['remove', fields.remove || undefined],\n ];\n for (const [name, value] of wanted) {\n if (value === undefined) {\n map.delete(name);\n continue;\n }\n if (map.has(name)) {\n setValue(doc, map, name, value);\n continue;\n }\n // A field the entry didn't have goes before the message, where the others are.\n const at = map.items.findIndex((p) => isScalar(p.key) && p.key.value === source);\n map.items.splice(at === -1 ? map.items.length : at, 0, doc.createPair(name, value));\n }\n setValue(doc, map, source, fields.message);\n return print(doc);\n}\n\n/** The source message replaced, and nothing else: a `key: message` entry stays one. */\nfunction withMessage(file: string, key: string, message: string, source: string): string {\n const doc = parse(file);\n const entry = doc.get(key, true);\n if (!isMap(entry)) return withTranslation(file, key, message);\n setValue(doc, entry, source, message);\n return print(doc);\n}\n\nfunction withTranslation(file: string, key: string, translation: string): string {\n const doc = parse(file);\n const node = doc.get(key, true);\n if (translation.trim() === '') {\n doc.delete(key);\n } else if (isScalar(node)) {\n node.value = translation;\n if (translation.includes('\\n')) node.type = Scalar.BLOCK_LITERAL;\n } else {\n doc.set(key, translation);\n }\n // A file left with nothing in it reads as no translations, not as `{}`.\n return isMap(doc.contents) && doc.contents.items.length === 0 ? '' : print(doc);\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 * Stale translations: a translation made from source text that has since changed.\n *\n * The lock records, per translation, a hash of the source it was made from and a hash of the\n * translation itself. Editing the translation re-anchors it to the current source; editing only\n * the source leaves the old anchor in place, which is what marks it stale. Nobody has to remember\n * to flag anything: `prosebook status` lists what is stale, and `prosebook accept` re-anchors a\n * translation that was still right.\n *\n * The lock also keeps the text behind each anchor, once per distinct text, so a stale translation\n * can show its translator what changed rather than only what the source says now.\n */\nimport { createHash } from 'node:crypto';\nimport { existsSync, readFileSync } from 'node:fs';\n\nimport type { Catalog } from './catalog.ts';\nimport { formatDiff, wordDiff } from './diff.ts';\n\nexport interface Lock {\n version: 2;\n /** Source text by hash: every text some translation is anchored to. */\n sources: Record<string, string>;\n /** Per locale, per key: `<source hash>:<translation hash>`. */\n translations: Record<string, Record<string, string>>;\n}\n\nexport function hash(text: string): string {\n return createHash('sha256').update(text).digest('hex').slice(0, 10);\n}\n\nexport function emptyLock(): Lock {\n return { version: 2, sources: {}, translations: {} };\n}\n\n/** The lock at `path`. A version 1 lock, which held only the translations, reads with no source texts. */\nexport function readLock(path: string): Lock {\n if (!existsSync(path)) return emptyLock();\n const raw = JSON.parse(readFileSync(path, 'utf8')) as Partial<Lock> | Record<string, Record<string, string>>;\n if ((raw as Partial<Lock>).version === 2) return { ...emptyLock(), ...(raw as Partial<Lock>) };\n return { version: 2, sources: {}, translations: raw as Record<string, Record<string, string>> };\n}\n\nconst sortedEntries = <T>(record: Record<string, T>) => Object.fromEntries(Object.entries(record).sort(([a], [b]) => (a < b ? -1 : 1)));\n\nexport function serializeLock(lock: Lock): string {\n const translations = Object.fromEntries(\n Object.keys(lock.translations)\n .sort()\n .map((locale) => [locale, sortedEntries(lock.translations[locale]!)]),\n );\n return `${JSON.stringify({ version: 2, sources: sortedEntries(lock.sources), translations }, null, 2)}\\n`;\n}\n\nexport interface StaleTranslation {\n /** The source the translation was made from, where the lock recorded it. */\n was: string | undefined;\n /** The source now. */\n now: string;\n /** The translation, made from `was`. */\n translation: string;\n}\n\n/** What changed in the source of a stale translation, as a word diff, or why that isn't known. */\nexport function changeOf(stale: StaleTranslation): string {\n if (stale.was === undefined) return \"the earlier text isn't recorded (the lock predates prosebook 0.2)\";\n return formatDiff(wordDiff(stale.was, stale.now)).replaceAll('\\n', ' ');\n}\n\nexport interface Reconciled {\n lock: Lock;\n /** Per locale, per key: the translations made from a source that has changed since. */\n stale: Map<string, Map<string, StaleTranslation>>;\n}\n\n/**\n * The lock brought up to date with the catalog, and what is stale. `accept` re-anchors the given\n * translations (per locale, keys, or `true` for all of them) to the current source.\n */\nexport function reconcile(catalog: Catalog, previous: Lock, accept: Map<string, Set<string> | true> = new Map()): Reconciled {\n const lock = emptyLock();\n const stale = new Map<string, Map<string, StaleTranslation>>();\n for (const message of catalog.messages) {\n const source = hash(message.text);\n for (const [locale, translation] of message.translations) {\n const text = hash(translation.text);\n const [anchor, recorded] = (previous.translations[locale]?.[message.key] ?? '').split(':');\n const accepted = accept.get(locale);\n const reanchor =\n anchor === undefined || anchor === '' || recorded !== text || accepted === true || accepted?.has(message.key) === true;\n const kept = reanchor ? source : anchor;\n (lock.translations[locale] ??= {})[message.key] = `${kept}:${text}`;\n const keptText = kept === source ? message.text : previous.sources[kept];\n if (keptText !== undefined) lock.sources[kept] = keptText;\n if (!reanchor && anchor !== source) {\n let keys = stale.get(locale);\n if (keys === undefined) stale.set(locale, (keys = new Map()));\n keys.set(message.key, { was: keptText, now: message.text, translation: translation.text });\n }\n }\n }\n return { lock, stale };\n}\n","/**\n * What every native writer shares: words to identifiers, numbers and strings to literals, and the\n * names a file can't give two things.\n */\nimport type { Condition, Operand } from './plurals.ts';\n\n/** Words from an identifier written any way: `userName`, `user-name` and `user_name` are user, name. */\nexport function wordsOf(name: string): string[] {\n return name\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((w) => w.toLowerCase());\n}\n\nconst capital = (w: string) => w.charAt(0).toUpperCase() + w.slice(1);\n\nexport const snake = (words: string[]) => words.join('_');\nexport const pascal = (words: string[]) => words.map(capital).join('');\nexport const camel = (words: string[]) => words.map((w, i) => (i === 0 ? w : capital(w))).join('');\nexport const upper = (words: string[]) => words.join('_').toUpperCase();\n\n/** An identifier can't start with a digit, so `404.title` is `_404Title`. */\nexport function leading(name: string): string {\n return /^[0-9]/.test(name) ? `_${name}` : name;\n}\n\n/** A double literal every target reads as one: `0.0`, `1.5`, `1e21`. */\nexport function float(value: number): string {\n const s = String(value).replace('e+', 'e');\n return /[.e]/.test(s) ? s : `${s}.0`;\n}\n\n/** Characters that print nothing, or look like a space, written as escapes so the code shows them. */\nconst INVISIBLE = /[\\u{a0}\\u{61c}\\u{180e}\\u{2000}-\\u{200f}\\u{2028}-\\u{202f}\\u{205f}-\\u{206f}\\u{feff}]/gu;\n\n/** Text for a doc comment, with what prints nothing written as `\\u{…}`: Rust refuses direction marks there. */\nexport function docText(line: string): string {\n return line.replace(INVISIBLE, (c) => `\\\\u{${c.charCodeAt(0).toString(16)}}`);\n}\n\n/** A string literal: JSON's escapes, `\\u{…}` where the target writes them so (Rust, Swift), and `$` escaped in Kotlin. */\nexport function stringLiteral(value: string, language: 'rust' | 'swift' | 'kotlin'): string {\n const json = JSON.stringify(value).replace(INVISIBLE, (c) => `\\\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`);\n if (language === 'kotlin') return json.replaceAll('$', '\\\\$');\n return json.replace(/\\\\u([0-9a-f]{4})/g, (_, hex: string) => `\\\\u{${hex.replace(/^0+/, '')}}`);\n}\n\n/**\n * A plural condition as an expression over operands `o`: `field(op)` reads one, `mod` takes a\n * remainder, `within` tests a range as CLDR does (integers only). `&&`, `||` and `!` are every\n * target's.\n */\nexport function conditionCode(\n condition: Condition,\n code: {\n field: (op: Operand) => string;\n mod: (value: string, by: string) => string;\n within: (value: string, from: string, to: string) => string;\n },\n): string {\n const ors = condition.map((and) =>\n and\n .map((r) => {\n const value = r.mod === undefined ? code.field(r.operand) : code.mod(code.field(r.operand), float(r.mod));\n if (r.ranges.length === 1 && r.ranges[0]![0] === r.ranges[0]![1])\n return `${value} ${r.negated ? '!=' : '=='} ${float(r.ranges[0]![0])}`;\n const any = r.ranges\n .map(([from, to]) => (from === to ? `${value} == ${float(from)}` : code.within(value, float(from), float(to))))\n .join(' || ');\n return r.negated ? `!(${any})` : r.ranges.length > 1 ? `(${any})` : any;\n })\n .join(' && '),\n );\n return ors.length > 1 ? ors.map((o) => (o.includes(' && ') ? `(${o})` : o)).join(' || ') : ors[0]!;\n}\n\n/** Fails with the keys whose names meet, or meet a name the file already has. */\nexport function checkNames(language: string, named: [key: string, name: string][], taken: string[]): void {\n const seen = new Map<string, string>(taken.map((t) => [t, 'a name the file already has']));\n for (const [key, name] of named) {\n const other = seen.get(name);\n if (other !== undefined)\n throw new Error(`${language}: ${key} is named ${name}, as ${other} is: rename one, or change the target's keys`);\n seen.set(name, key);\n }\n}\n","/**\n * The model as a Kotlin file: an enum class of locales with a property or function per message, and\n * a file-private object holding what formats them. For the JVM and Android.\n */\nimport type { NativeTarget } from '#src/tools/config.ts';\nimport { camel, checkNames, conditionCode, float, leading, stringLiteral, upper, wordsOf } from './emit.ts';\nimport type { NativeMessage, NativeModel, Part } from './model.ts';\nimport type { NumberSpec } from './number.ts';\n\nconst KEYWORDS = new Set(\n 'as break class continue do else false for fun if in interface is null object package return super this throw true try typealias typeof val var when while'.split(\n ' ',\n ),\n);\n\nconst ident = (name: string) => (KEYWORDS.has(name) ? `\\`${name}\\`` : name);\nconst lit = (value: string) => stringLiteral(value, 'kotlin');\nconst entry = (tag: string) => leading(upper(wordsOf(tag)));\nconst argName = (name: string) => ident(leading(camel(wordsOf(name))));\n\nfunction doc(lines: string[], indent: string): string {\n const safe = lines.map((l) => l.replaceAll('*/', '*\\\\/'));\n return `${indent}/**\\n${safe.map((l) => (l === '' ? `${indent} *` : `${indent} * ${l}`)).join('\\n')}\\n${indent} */\\n`;\n}\n\n/** The parts as an expression of type `String`, with `rt` the runtime object. */\nfunction expr(parts: Part[], indent: string, rt: string): string {\n if (parts.length === 0) return '\"\"';\n return parts.map((p) => (p.type === 'text' ? lit(p.value) : value(p, indent, rt))).join(' + ');\n}\n\nfunction value(part: Exclude<Part, { type: 'text' }>, indent: string, rt: string): string {\n const inner = `${indent} `;\n if (part.type === 'string') return argName(part.arg);\n if (part.type === 'number') {\n const of = part.offset === 0 ? argName(part.arg) : `${argName(part.arg)} - ${float(part.offset)}`;\n return `${rt}.number(${of}, ${rt}.F${part.format}, ${lit(part.fallback)})`;\n }\n if (part.type === 'select') {\n const arms = part.arms.map((a) => `${inner}${lit(a.key)} -> ${expr(a.parts, inner, rt)}\\n`).join('');\n return `when (${argName(part.arg)}) {\\n${arms}${inner}else -> ${expr(part.other, inner, rt)}\\n${indent}}`;\n }\n // A plural, the one kind left. With only `other`, there is nothing to select on.\n if (part.arms.length + part.exact.length === 0) return expr(part.other, indent, rt);\n const arg = argName(part.arg);\n const on = part.on === 'round' ? `${rt}.round(${arg})` : part.on === 'percent' ? `${arg} * 100.0` : arg;\n const { minFrac, maxFrac } = part.rounding;\n const exact = part.exact.map((e) => `${float(e.value)} to ${lit(`=${e.value}`)}`).join(', ');\n const arms = [...part.exact.map((e) => ({ key: `=${e.value}`, parts: e.parts })), ...part.arms]\n .map((a) => `${inner}${lit(a.key)} -> ${expr(a.parts, inner, rt)}\\n`)\n .join('');\n const pick = `${rt}.plural(${on}, ${float(part.offset)}, listOf(${exact}), ${rt}::r${part.rules}, ${minFrac}, ${maxFrac})`;\n return `when (${pick}) {\\n${arms}${inner}else -> ${expr(part.other, inner, rt)}\\n${indent}}`;\n}\n\nfunction member(m: NativeMessage, name: string, rt: string): string {\n const branches = m.bodies.map((b) => ` ${b.locales.map(entry).join(', ')} -> ${expr(b.parts, ' ', rt)}\\n`).join('');\n const argDocs = m.args.filter((a) => a.doc !== undefined).map((a) => `@param ${argName(a.name)} ${a.doc}`);\n const head = doc(argDocs.length > 0 ? [...m.doc, '', ...argDocs] : m.doc, ' ');\n const body = `when (this) {\\n${branches} }`;\n if (m.args.length === 0) return `${head} val ${name}: String\\n get() = ${body}\\n`;\n const params = m.args.map((a) => `${argName(a.name)}: ${a.type === 'number' ? 'Number' : 'String'}`).join(', ');\n const numbers = m.args\n .filter((a) => a.type === 'number')\n .map((a) => ` val ${argName(a.name)} = ${argName(a.name)}.toDouble()\\n`)\n .join('');\n return `${head} fun ${name}(${params}): String {\\n${numbers} return ${body}\\n }\\n`;\n}\n\nfunction formatConst(spec: NumberSpec, i: number): string {\n const affix = ([prefix, suffix]: readonly [string, string]) => `${lit(prefix)} to ${lit(suffix)}`;\n const fields = [\n spec.minInt,\n spec.minFrac,\n spec.maxFrac,\n spec.shift,\n spec.grouping.primary,\n spec.grouping.secondary,\n spec.grouping.min,\n lit(spec.decimal),\n lit(spec.group),\n spec.digits === undefined ? 'null' : `listOf(${spec.digits.map(lit).join(', ')})`,\n affix(spec.positive),\n affix(spec.negative),\n affix(spec.zero),\n affix(spec.negativeZero),\n lit(spec.infinity),\n lit(spec.negativeInfinity),\n ];\n return ` val F${i} = Format(\\n${fields.map((f) => ` ${f}`).join(',\\n')},\\n )\\n`;\n}\n\nconst NUMBER = `\n /** A number format, taken apart when the file was generated. */\n class Format(\n val minInt: Int,\n val minFrac: Int,\n val maxFrac: Int,\n val shift: Int,\n val primary: Int,\n val secondary: Int,\n val minGroup: Int,\n val decimal: String,\n val group: String,\n val digits: List<String>?,\n val positive: Pair<String, String>,\n val negative: Pair<String, String>,\n val zero: Pair<String, String>,\n val negativeZero: Pair<String, String>,\n val infinity: String,\n val negativeInfinity: String,\n )\n\n /** \\`value\\` as \\`format\\` writes it, or \\`fallback\\` where it isn't a number. */\n fun number(value: Double, format: Format, fallback: String): String {\n if (value.isNaN()) return fallback\n if (value.isInfinite()) return if (value > 0) format.infinity else format.negativeInfinity\n val (written, frac) = digits(Math.abs(value), format.shift, format.minFrac, format.maxFrac)\n val zero = (written + frac).all { it == '0' }\n val negative = value.toRawBits() < 0\n val (prefix, suffix) = if (zero) (if (negative) format.negativeZero else format.zero) else (if (negative) format.negative else format.positive)\n val int = written.padStart(maxOf(format.minInt, 1), '0')\n val grouped = format.minGroup > 0 && int.length >= format.primary + format.minGroup\n val out = StringBuilder(prefix)\n for ((i, digit) in int.withIndex()) {\n val left = int.length - i\n if (grouped && i > 0 && (left == format.primary || (left > format.primary && (left - format.primary) % format.secondary == 0))) {\n out.append(format.group)\n }\n out.append(shown(digit, format))\n }\n if (frac.isNotEmpty()) {\n out.append(format.decimal)\n for (digit in frac) out.append(shown(digit, format))\n }\n return out.append(suffix).toString()\n }\n\n private fun shown(digit: Char, format: Format): String = format.digits?.get(digit - '0') ?: digit.toString()\n\n /**\n * The shortest digits that read back as \\`value\\`, as \\`Intl\\` rounds them: moved \\`shift\\` places\n * right, rounded half away from zero to \\`max\\` fraction digits, and trailing zeros cut to \\`min\\`.\n */\n fun digits(value: Double, shift: Int, min: Int, max: Int): Pair<String, String> {\n // \\`toString\\` writes the shortest digits that read back, with an exponent past a size.\n val plain = java.math.BigDecimal(value.toString()).toPlainString()\n val int = plain.substringBefore('.')\n val all = (int + plain.substringAfter('.', \"\")).map { it - '0' }.toMutableList()\n var point = int.length + shift\n while (all.size <= point + max) all.add(0)\n val next = all[point + max]\n while (all.size > point + max) all.removeAt(all.size - 1)\n if (next >= 5) {\n var at = all.size - 1\n while (at >= 0 && all[at] == 9) all[at--] = 0\n if (at < 0) {\n all.add(0, 1)\n point += 1\n } else {\n all[at] += 1\n }\n }\n val frac = all.subList(point, all.size).toMutableList()\n while (frac.size > min && frac.last() == 0) frac.removeAt(frac.size - 1)\n return all.subList(0, point).dropWhile { it == 0 }.joinToString(\"\") to frac.joinToString(\"\")\n }\n`;\n\nconst PLURAL = `\n /** CLDR's plural operands of a number as written. */\n class Operands(val n: Double, val i: Double, val v: Double, val w: Double, val f: Double, val t: Double, val c: Double, val e: Double)\n\n /** The arm a plural takes: the \\`=N\\` that \\`value\\` equals, else the category of \\`value\\` less \\`offset\\`. */\n fun plural(value: Double, offset: Double, exact: List<Pair<Double, String>>, rules: (Operands) -> String, min: Int, max: Int): String =\n exact.firstOrNull { it.first == value }?.second ?: category(rules, value - offset, min, max)\n\n /** The category \\`rules\\` give \\`value\\`, rounded to between \\`min\\` and \\`max\\` fraction digits. */\n private fun category(rules: (Operands) -> String, value: Double, min: Int, max: Int): String {\n if (!value.isFinite()) return \"other\"\n val (written, frac) = digits(Math.abs(value), 0, min, max)\n val int = written.ifEmpty { \"0\" }\n val trimmed = frac.trimEnd('0')\n val read = { s: String -> s.toDoubleOrNull() ?: 0.0 }\n return rules(\n Operands(\n n = read(if (frac.isEmpty()) int else \"$int.$frac\"),\n i = read(int),\n v = frac.length.toDouble(),\n w = trimmed.length.toDouble(),\n f = read(frac),\n t = read(trimmed),\n c = 0.0,\n e = 0.0,\n ),\n )\n }\n\n /** An integer in the range, as CLDR's ranges hold. */\n private fun within(value: Double, from: Double, to: Double): Boolean = value % 1.0 == 0.0 && value >= from && value <= to\n\n /** \\`Math.round\\`: half up, toward positive infinity. */\n fun round(value: Double): Double {\n val floor = Math.floor(value)\n return if (value - floor >= 0.5) floor + 1 else floor\n }\n`;\n\nexport function kotlinFile(model: NativeModel, target: NativeTarget & { name: string }, banner: string): string {\n const name = target.name;\n const rt = `${name}Runtime`;\n const names = model.messages.map((m): [string, string] => [m.key, ident(leading(camel(m.words)))]);\n checkNames('kotlin', names, ['tag', 'name', 'ordinal', 'entries', 'negotiate', 'SOURCE']);\n const entries = model.locales\n .map((l) => ` /** \\`${l}\\`${l === model.source ? ', the source' : ''}. */\\n ${entry(l)}(${lit(l)})`)\n .join(',\\n');\n const members = model.messages.map((m, i) => member(m, names[i]![1], rt)).join('\\n');\n const rules = model.rules\n .map(({ name: rule, rules }, i) => {\n const checks = rules.map(\n ([category, condition]) =>\n ` if (${conditionCode(condition, { field: (op) => `o.${op}`, mod: (v, by) => `${v} % ${by}`, within: (v, from, to) => `within(${v}, ${from}, ${to})` })}) return ${lit(category)}\\n`,\n );\n return ` /** ${rule} */\\n fun r${i}(o: Operands): String {\\n${checks.join('')} return \"other\"\\n }\\n`;\n })\n .join('\\n');\n const runtime =\n model.formats.length + model.rules.length === 0\n ? ''\n : `\n/** What formats the messages, generated with them. */\nprivate object ${rt} {${NUMBER}${model.rules.length > 0 ? PLURAL : ''}\n${model.formats.map(formatConst).join('\\n')}${rules === '' ? '' : `\\n${rules}`}}\n`;\n\n return `${banner}\n@file:Suppress(\"unused\", \"NAME_SHADOWING\", \"KotlinConstantConditions\", \"ConvertTwoComparisonsToRangeCheck\")\n${target.package === undefined ? '' : `\\npackage ${target.package}\\n`}\n/** A locale the catalog is written or translated in, and its messages. */\nenum class ${name}(val tag: String) {\n${entries};\n\n${members}\n companion object {\n /** The locale the catalog is written in, which every message falls back to. */\n val SOURCE: ${name} = ${entry(model.source)}\n\n /**\n * The best locale for what was asked, most preferred first: each tag tries an exact match, then\n * its parents (\\`pt-BR\\` finds \\`pt\\`), then any locale of its language. The source if none is.\n */\n fun negotiate(requested: List<String>): ${name} {\n fun language(tag: String) = tag.substringBefore('-').lowercase()\n for (want in requested) {\n var tag = want\n while (true) {\n entries.firstOrNull { it.tag.equals(tag, ignoreCase = true) }?.let { return it }\n val cut = tag.lastIndexOf('-')\n if (cut < 0) break\n tag = tag.substring(0, cut)\n }\n entries.firstOrNull { language(it.tag) == language(want) }?.let { return it }\n }\n return SOURCE\n }\n }\n}\n${runtime}`;\n}\n","/**\n * A number format taken apart at build time, so native code can put it back together with no\n * formatter of its own: the digits to round to, the symbols, how integers group, and the text around\n * the number for each sign. Read from `Intl.NumberFormat` and checked against it before any code is\n * written, so a native target says what the browser says, or the build says why it can't.\n */\n\n/** The text before and after the number. */\nexport type Affix = readonly [prefix: string, suffix: string];\n\nexport interface NumberSpec {\n minInt: number;\n minFrac: number;\n maxFrac: number;\n /** How far the decimal point moves right before rounding: 2 for a percent. */\n shift: number;\n /** Integer digits grouped from the right, `primary` then `secondary` at a time, once there are `primary + min` of them; `min` 0 never groups. */\n grouping: { primary: number; secondary: number; min: number };\n decimal: string;\n group: string;\n /** The numbering system's digits, 0 to 9, where it isn't ASCII's. */\n digits?: string[];\n positive: Affix;\n negative: Affix;\n /** A value that rounds to zero, by its sign. */\n zero: Affix;\n negativeZero: Affix;\n nan: string;\n infinity: string;\n negativeInfinity: string;\n}\n\n/** The plural operands' digits: rounded as `Intl.PluralRules` rounds before it selects. */\nexport interface Rounding {\n minFrac: number;\n maxFrac: number;\n}\n\nconst NUMBER_PARTS = new Set(['integer', 'group', 'decimal', 'fraction']);\n\n/** Values the spec must format as `Intl` does: signs, zeros, ties, grouping thresholds, every plural form a unit could take. */\nconst SAMPLES = [\n 0,\n -0,\n 1,\n -1,\n 2,\n 3,\n 5,\n 11,\n 21,\n 0.5,\n 1.5,\n 2.5,\n -2.5,\n 0.125,\n 0.0001,\n -0.0001,\n 0.07,\n 1.005,\n 12.345,\n 999.9999,\n 1000,\n 10000,\n 100000,\n 1234.5678,\n -1234.5678,\n 1e6,\n 123456789.987,\n 1e21,\n NaN,\n Infinity,\n -Infinity,\n];\n\nfunction affixOf(parts: Intl.NumberFormatPart[]): Affix {\n const first = parts.findIndex((p) => NUMBER_PARTS.has(p.type));\n const last = parts.findLastIndex((p) => NUMBER_PARTS.has(p.type));\n const text = (from: number, to: number) =>\n parts\n .slice(from, to)\n .map((p) => p.value)\n .join('');\n return [text(0, first), text(last + 1, parts.length)];\n}\n\nfunction partOf(parts: Intl.NumberFormatPart[], type: string): string | undefined {\n return parts.find((p) => p.type === type)?.value;\n}\n\n/**\n * What a format with `options` takes in `locale`. Throws a sentence saying what a native target\n * can't reproduce, which the caller puts in front of a fix.\n */\nexport function numberSpec(locale: string, options: Intl.NumberFormatOptions = {}): NumberSpec {\n const format = new Intl.NumberFormat(locale, options);\n const resolved = format.resolvedOptions();\n if (resolved.notation !== 'standard') throw new Error(`${resolved.notation} notation reads the size of the number at runtime`);\n if (resolved.minimumSignificantDigits !== undefined) throw new Error('significant digits round by the size of the number');\n if (resolved.roundingIncrement !== 1 || resolved.roundingMode !== 'halfExpand')\n throw new Error('it rounds other than half away from zero');\n if (resolved.trailingZeroDisplay !== 'auto') throw new Error('it drops trailing zeros by value');\n\n const at = (more: Intl.NumberFormatOptions) => new Intl.NumberFormat(locale, { ...options, ...more });\n const whole = at({ minimumFractionDigits: 0, maximumFractionDigits: 0 });\n const integers = whole\n .formatToParts(1234567891234)\n .filter((p) => p.type === 'integer')\n .map((p) => p.value.length);\n const grouped = (digits: number) =>\n whole.formatToParts(10 ** (digits - 1 - (resolved.style === 'percent' ? 2 : 0))).some((p) => p.type === 'group');\n const primary = integers.at(-1) ?? 3;\n const secondary = integers.length > 2 ? integers.at(-2)! : primary;\n const min = integers.length < 2 ? 0 : ([1, 2, 3, 4].find((m) => grouped(primary + m)) ?? 0);\n\n const native = new Intl.NumberFormat(locale, { numberingSystem: resolved.numberingSystem, useGrouping: false });\n const digits = Array.from({ length: 10 }, (_, d) => native.format(d));\n const spec: NumberSpec = {\n minInt: resolved.minimumIntegerDigits,\n minFrac: resolved.minimumFractionDigits ?? 0,\n maxFrac: resolved.maximumFractionDigits ?? 0,\n shift: resolved.style === 'percent' ? 2 : 0,\n grouping: { primary, secondary, min },\n decimal: partOf(at({ minimumFractionDigits: 1, maximumFractionDigits: 1 }).formatToParts(1.5), 'decimal') ?? '.',\n group: partOf(whole.formatToParts(1234567891234), 'group') ?? ',',\n ...(digits.join('') !== '0123456789' && { digits }),\n positive: affixOf(format.formatToParts(1)),\n negative: affixOf(format.formatToParts(-1)),\n zero: affixOf(format.formatToParts(0)),\n negativeZero: affixOf(format.formatToParts(-0)),\n nan: format.format(NaN),\n infinity: format.format(Infinity),\n negativeInfinity: format.format(-Infinity),\n };\n for (const sample of SAMPLES) {\n const expected = format.format(sample);\n const actual = formatNumber(spec, sample);\n if (actual !== expected) throw new Error(`it writes ${sample} as \"${expected}\", which native code would write as \"${actual}\"`);\n }\n return spec;\n}\n\n/** How `Intl.PluralRules` rounds before it selects, with `options` (MF2's selector options) in `locale`. */\nexport function roundingOf(locale: string, options: Intl.PluralRulesOptions = {}): Rounding {\n const resolved = new Intl.PluralRules(locale, options).resolvedOptions();\n if (resolved.minimumSignificantDigits !== undefined) throw new Error('significant digits select by the size of the number');\n return { minFrac: resolved.minimumFractionDigits ?? 0, maxFrac: resolved.maximumFractionDigits ?? 3 };\n}\n\n/**\n * The digits of a finite, non-negative double as the shortest decimal that reads back as it, which\n * is what `Intl` rounds: 1.005 is 1.00499… in binary, and still rounds to 1.01. Every target's\n * shortest form (`String()` here) may use an exponent, which moves the point.\n */\nexport function shortestDigits(value: number): { int: string; frac: string } {\n const [mantissa = '', exponent = '0'] = String(value).split('e');\n const [int = '', frac = ''] = mantissa.split('.');\n const point = int.length + Number(exponent);\n const all = int + frac;\n if (point <= 0) return { int: '0', frac: '0'.repeat(-point) + all };\n return { int: all.slice(0, point).padEnd(point, '0'), frac: all.slice(point) };\n}\n\n/**\n * Exact digits moved `shift` places right, rounded half away from zero to `maxFrac`, with trailing\n * zeros cut down to `minFrac`. The algorithm every target writes out; keep them in step.\n */\nexport function roundDigits(int: string, frac: string, shift: number, minFrac: number, maxFrac: number): { int: string; frac: string } {\n const padded = frac.padEnd(shift, '0');\n const whole = int + padded.slice(0, shift);\n const rest = padded.slice(shift);\n const kept = (whole + rest.slice(0, maxFrac).padEnd(maxFrac, '0')).split('').map(Number);\n if ((rest[maxFrac] ?? '0') >= '5') {\n let at = kept.length - 1;\n while (at >= 0 && kept[at] === 9) kept[at--] = 0;\n if (at < 0) kept.unshift(1);\n else kept[at]!++;\n }\n const all = kept.join('');\n let outFrac = all.slice(all.length - maxFrac);\n while (outFrac.length > minFrac && outFrac.endsWith('0')) outFrac = outFrac.slice(0, -1);\n return { int: all.slice(0, all.length - maxFrac).replace(/^0+/, ''), frac: outFrac };\n}\n\nfunction groupDigits(int: string, { primary, secondary, min }: NumberSpec['grouping'], separator: string): string {\n if (min === 0 || int.length < primary + min) return int;\n const groups = [int.slice(-primary)];\n let rest = int.slice(0, -primary);\n while (rest.length > secondary) {\n groups.unshift(rest.slice(-secondary));\n rest = rest.slice(0, -secondary);\n }\n groups.unshift(rest);\n return groups.join(separator);\n}\n\n/** `value` as the spec writes it: the reference for the code each target generates. */\nexport function formatNumber(spec: NumberSpec, value: number): string {\n if (Number.isNaN(value)) return spec.nan;\n if (!Number.isFinite(value)) return value > 0 ? spec.infinity : spec.negativeInfinity;\n const shortest = shortestDigits(Math.abs(value));\n const { int, frac } = roundDigits(shortest.int, shortest.frac, spec.shift, spec.minFrac, spec.maxFrac);\n const negative = value < 0 || Object.is(value, -0);\n const zero = /^0*$/.test(int + frac);\n const [prefix, suffix] = zero ? (negative ? spec.negativeZero : spec.zero) : negative ? spec.negative : spec.positive;\n const shown =\n groupDigits(int.padStart(Math.max(spec.minInt, 1), '0'), spec.grouping, spec.group) + (frac === '' ? '' : spec.decimal + frac);\n const digits = spec.digits;\n return prefix + (digits === undefined ? shown : shown.replace(/[0-9]/g, (d) => digits[Number(d)]!)) + suffix;\n}\n","","","/**\n * CLDR's plural rules, read into conditions a native target writes as code. Swift, the JVM and Rust\n * have no plural rules of their own that every platform carries, so each generated file brings the\n * rules of the locales it formats, from the same CLDR data `Intl.PluralRules` is built on.\n */\nimport ordinals from 'cldr-core/supplemental/ordinals.json' with { type: 'json' };\nimport cardinals from 'cldr-core/supplemental/plurals.json' with { type: 'json' };\n\n/** CLDR's operands: `n` the absolute value, `i` its integer digits, `v`/`w` the count of fraction digits with and without trailing zeros, `f`/`t` those digits, `c`/`e` the compact exponent. */\nexport type Operand = 'n' | 'i' | 'v' | 'w' | 'f' | 't' | 'c' | 'e';\n\n/** `i % 10 = 2..4, 7`: the operand, less its modulus, in (or with `negated`, not in) the ranges. A single value is a range of one. */\nexport interface Relation {\n operand: Operand;\n mod?: number;\n negated: boolean;\n ranges: (readonly [number, number])[];\n}\n\n/** Relations joined by `and`, those joined by `or`. */\nexport type Condition = Relation[][];\n\n/** A locale's categories in CLDR's order, each with its condition. `other` holds wherever none does, so it has none. */\nexport type PluralRules = (readonly [category: string, Condition])[];\n\nexport type Operands = Record<Operand, number>;\n\ntype RuleData = Record<string, Record<string, string>>;\n\nconst DATA = {\n cardinal: cardinals.supplemental['plurals-type-cardinal'] as RuleData,\n ordinal: ordinals.supplemental['plurals-type-ordinal'] as RuleData,\n};\n\n/**\n * The rules for `locale`, found as `Intl.PluralRules` finds its locale, then by its parents\n * (`pt-PT`, then `pt`), so the generated code picks the category the browser would.\n */\nexport function pluralRules(locale: string, type: 'cardinal' | 'ordinal'): PluralRules {\n const data = DATA[type];\n let tag = new Intl.PluralRules(locale, { type }).resolvedOptions().locale;\n while (!(tag in data) && tag.includes('-')) tag = tag.slice(0, tag.lastIndexOf('-'));\n const rules = data[tag] ?? data['root'] ?? {};\n return Object.entries(rules).flatMap(([name, rule]) => {\n const category = name.slice('pluralRule-count-'.length);\n return category === 'other' ? [] : [[category, parseCondition(rule.split('@', 1)[0]!)] as const];\n });\n}\n\n/** `v = 0 and i % 10 = 1 or n = 0..1`, its samples already cut. */\nexport function parseCondition(source: string): Condition {\n return source\n .trim()\n .split(/\\s+or\\s+/)\n .map((and) => and.split(/\\s+and\\s+/).map(parseRelation));\n}\n\nfunction parseRelation(source: string): Relation {\n const match = /^([nivwftce])\\s*(?:%\\s*(\\d+))?\\s*(!?=)\\s*(.+)$/.exec(source.trim());\n if (match === null) throw new Error(`prosebook: a CLDR plural rule it can't read: \"${source}\"`);\n const [, operand, mod, op, list] = match;\n return {\n operand: operand as Operand,\n ...(mod !== undefined && { mod: Number(mod) }),\n negated: op === '!=',\n ranges: list!.split(',').map((range) => {\n const [from, to = from] = range.trim().split('..');\n return [Number(from), Number(to)] as const;\n }),\n };\n}\n\n/** A range of one is an equality; a wider range holds integers only, as CLDR's `in` does. */\nexport function inRange(value: number, [from, to]: readonly [number, number]): boolean {\n return from === to ? value === from : Number.isInteger(value) && value >= from && value <= to;\n}\n\nfunction holds(relation: Relation, operands: Operands): boolean {\n const raw = operands[relation.operand];\n const value = relation.mod === undefined ? raw : raw % relation.mod;\n return relation.ranges.some((range) => inRange(value, range)) !== relation.negated;\n}\n\n/** The category `rules` give, as the generated code picks it. */\nexport function categoryOf(rules: PluralRules, operands: Operands): string {\n for (const [category, condition] of rules) if (condition.some((and) => and.every((r) => holds(r, operands)))) return category;\n return 'other';\n}\n\n/** The operands of a number written with `int` and `frac` digits, as CLDR reads them. */\nexport function operandsOf(int: string, frac: string): Operands {\n const trimmed = frac.replace(/0+$/, '');\n return {\n n: Number(`${int}.${frac || '0'}`),\n i: Number(int),\n v: frac.length,\n w: trimmed.length,\n f: Number(frac || '0'),\n t: Number(trimmed || '0'),\n c: 0,\n e: 0,\n };\n}\n","/**\n * The catalog as a native target writes it, before any language: per message, its arguments and one\n * tree per locale it renders in, with every fallback resolved here, so the generated code has no\n * lookup to do. Number formats and plural rules are read from `Intl` and CLDR once, and numbered.\n */\nimport { isDateElement, isNumberElement, isTimeElement } from '@formatjs/icu-messageformat-parser';\n\nimport { chainOf } from '#src/runtime/locale.ts';\nimport type { Catalog, Message, Problem } from '#src/tools/catalog.ts';\nimport type { Entry } from '#src/tools/compile.ts';\nimport type { NativeTarget } from '#src/tools/config.ts';\nimport { numberOptions, optionArgsOf, placeholderOf, selectionOf, TYPE, type MessageFormatElement } from '#src/tools/icu.ts';\nimport { docText } from './emit.ts';\nimport { numberSpec, roundingOf, type NumberSpec, type Rounding } from './number.ts';\nimport { pluralRules, type PluralRules } from './plurals.ts';\n\nexport type Part =\n | { type: 'text'; value: string }\n | { type: 'string'; arg: string }\n /** The argument less `offset`, in format `format`; `fallback` where it isn't a number. */\n | { type: 'number'; arg: string; offset: number; format: number; fallback: string }\n | { type: 'select'; arg: string; arms: Arm[]; other: Part[] }\n | {\n type: 'plural';\n arg: string;\n /** What it selects on: the value, rounded as `Math.round` does (MF2's `:integer`), or as a percent. */\n on: 'value' | 'round' | 'percent';\n offset: number;\n /** `=N` arms, matched on the value before its offset. */\n exact: { value: number; parts: Part[] }[];\n rules: number;\n rounding: Rounding;\n arms: Arm[];\n other: Part[];\n };\n\nexport interface Arm {\n key: string;\n parts: Part[];\n}\n\nexport interface NativeMessage {\n key: string;\n /** The key less the prefix that took it in, as words: `tray.quit-app` is tray, quit, app. */\n words: string[];\n /** The source text, its context, and what's asked of it. */\n doc: string[];\n args: { name: string; type: 'string' | 'number'; doc?: string }[];\n /** A tree per locale that renders it its own way; every locale is in one. */\n bodies: { locales: string[]; parts: Part[] }[];\n}\n\nexport interface NativeModel {\n /** Every locale, the source first. */\n locales: string[];\n source: string;\n messages: NativeMessage[];\n formats: NumberSpec[];\n rules: { name: string; rules: PluralRules }[];\n}\n\n/** Whether a target takes `key`, and the prefix that took it in (longest first), which its name leaves out. */\nfunction prefixOf(target: NativeTarget, key: string): string | undefined {\n if (target.keys === undefined) return '';\n return [...target.keys].sort((a, b) => b.length - a.length).find((p) => key.startsWith(`${p}.`));\n}\n\n/** Values a file declares once each, numbered by what they hold, so locales that format alike share one. */\nclass Numbered<T> {\n readonly list: T[] = [];\n private readonly byJson = new Map<string, number>();\n\n add(value: T, json = JSON.stringify(value)): number {\n let at = this.byJson.get(json);\n if (at === undefined) {\n this.byJson.set(json, (at = this.list.length));\n this.list.push(value);\n }\n return at;\n }\n}\n\n/** The model of what `target` takes from the catalog, with a problem for every message it can't render. */\nexport function nativeModel(\n target: NativeTarget,\n catalog: Catalog,\n locales: string[],\n entries: Map<string, Entry[]>,\n): { model: NativeModel; problems: Problem[] } {\n const source = locales[0]!;\n const asts = new Map([...entries].map(([locale, list]) => [locale, new Map(list)]));\n const formats = new Numbered<NumberSpec>();\n const rules = new Numbered<{ name: string; rules: PluralRules }>();\n const problems: Problem[] = [];\n const messages: NativeMessage[] = [];\n\n for (const m of catalog.messages) {\n const prefix = prefixOf(target, m.key);\n if (prefix === undefined) continue;\n const words = m.key\n .slice(prefix === '' ? 0 : prefix.length + 1)\n .split(/[.\\-_]/)\n .filter(Boolean);\n const bodies = new Map<string, { locales: string[]; parts: Part[] }>();\n let failed = false;\n for (const locale of locales) {\n const found = chainOf(locale, locales, source).find((l) => asts.get(l)?.has(m.key));\n if (found === undefined) continue;\n const body = bodies.get(found);\n if (body !== undefined) {\n body.locales.push(locale);\n continue;\n }\n try {\n bodies.set(found, { locales: [locale], parts: parts(asts.get(found)!.get(m.key)!, found, formats, rules, null) });\n } catch (e) {\n failed = true;\n problems.push({\n severity: 'error',\n file: fileOf(m, found, source),\n key: m.key,\n message: `${target.language}: ${(e as Error).message}`,\n });\n }\n }\n if (failed) continue;\n messages.push({\n key: m.key,\n words,\n doc: docOf(m),\n args: [...m.args].map(([name, type]) => ({\n name,\n type: type === 'number' ? 'number' : 'string',\n doc: m.argDocs.has(name) ? docText(m.argDocs.get(name)!) : undefined,\n })),\n bodies: [...bodies.values()],\n });\n }\n return { model: { locales, source, messages, formats: formats.list, rules: rules.list }, problems };\n}\n\nfunction fileOf(m: Message, locale: string, source: string): string {\n return locale === source ? m.file : (m.translations.get(locale)?.file ?? m.file);\n}\n\nfunction docOf(m: Message): string[] {\n const lines = (m.text.length > 400 ? `${m.text.slice(0, 397)}...` : m.text).split('\\n');\n if (m.context) lines.push('', m.context);\n if (m.remove) lines.push('', 'Marked for removal in the catalog.');\n if (m.comment) lines.push('', `Comment: ${m.comment}`);\n return lines.map(docText);\n}\n\nconst LEAVE_OUT = \"or leave the key out of this target's `keys`\";\n\n/** Specs by locale and options, kept across runs: taking a format apart checks it against `Intl` dozens of times. */\nconst SPECS = new Map<string, NumberSpec | Error>();\n\nfunction format(formats: Numbered<NumberSpec>, locale: string, options: Intl.NumberFormatOptions | undefined): number {\n const key = JSON.stringify([locale, options ?? {}]);\n let spec = SPECS.get(key);\n if (spec === undefined) {\n try {\n spec = numberSpec(locale, options);\n } catch (e) {\n spec = new Error(`native code can't format this number in ${locale}: ${(e as Error).message}. Format it another way, ${LEAVE_OUT}`, {\n cause: e,\n });\n }\n SPECS.set(key, spec);\n }\n if (spec instanceof Error) throw spec;\n return formats.add(spec);\n}\n\ntype Pound = { arg: string; offset: number } | null;\n\nfunction parts(\n elements: MessageFormatElement[],\n locale: string,\n formats: Numbered<NumberSpec>,\n rules: Numbered<{ name: string; rules: PluralRules }>,\n pound: Pound,\n): Part[] {\n const out: Part[] = [];\n const text = (value: string) => {\n const last = out.at(-1);\n if (last?.type === 'text') last.value += value;\n else if (value !== '') out.push({ type: 'text', value });\n };\n const placed = (el: MessageFormatElement, name: string, part: Part) => {\n const { isolate } = placeholderOf(el, name);\n if (isolate !== undefined) text(isolate[0]);\n out.push(part);\n if (isolate !== undefined) text(isolate[1]);\n };\n const arms = (options: Record<string, { value: MessageFormatElement[] }>, own: Pound) =>\n Object.entries(options).map(([key, option]) => ({ key, parts: parts(option.value, locale, formats, rules, own) }));\n\n for (const el of elements) {\n if (Object.keys(optionArgsOf(el) ?? {}).length > 0) {\n throw new Error(\n `{${'value' in el ? el.value : ''}} takes a formatting option from an argument: native code formats with options the message fixes, ${LEAVE_OUT}`,\n );\n }\n if (isDateElement(el) || isTimeElement(el)) {\n throw new Error(\n `{${el.value}} is a date, which native code doesn't format: pass it formatted, as a plain {${el.value}}, ${LEAVE_OUT}`,\n );\n }\n if (isNumberElement(el)) {\n const fallback = placeholderOf(el, el.value).fallback;\n placed(el, el.value, { type: 'number', arg: el.value, offset: 0, format: format(formats, locale, numberOptions(el)), fallback });\n continue;\n }\n switch (el.type) {\n case TYPE.literal:\n text(el.value);\n break;\n case TYPE.argument:\n placed(el, el.value, { type: 'string', arg: el.value });\n break;\n case TYPE.pound:\n if (pound === null) {\n text('#');\n break;\n }\n placed(el, pound.arg, {\n type: 'number',\n arg: pound.arg,\n offset: pound.offset,\n format: format(formats, locale, undefined),\n fallback: placeholderOf(el, pound.arg).fallback,\n });\n break;\n case TYPE.select: {\n const all = arms(el.options, pound);\n out.push({\n type: 'select',\n arg: el.value,\n arms: all.filter((a) => a.key !== 'other'),\n other: all.find((a) => a.key === 'other')!.parts,\n });\n break;\n }\n case TYPE.plural: {\n const selection = selectionOf(el);\n const type = el.pluralType === 'ordinal' ? 'ordinal' : 'cardinal';\n const all = arms(el.options, { arg: el.value, offset: el.offset });\n let rounding: Rounding;\n try {\n rounding = roundingOf(locale, { ...selection?.options, type });\n } catch (e) {\n throw new Error(`{${el.value}} can't select in native code: ${(e as Error).message}, ${LEAVE_OUT}`, { cause: e });\n }\n const found = pluralRules(locale, type);\n out.push({\n type: 'plural',\n arg: el.value,\n on: selection?.value ?? 'value',\n offset: el.offset,\n // Matched as the runtime does, by the value's own `String()`, so `=1.50` never matches.\n exact: all\n .filter((a) => a.key.startsWith('=') && String(Number(a.key.slice(1))) === a.key.slice(1))\n .map((a) => ({ value: Number(a.key.slice(1)), parts: a.parts })),\n rules: rules.add({ name: `${type}, as ${locale} has them`, rules: found }, JSON.stringify(found)),\n rounding,\n arms: all.filter((a) => !a.key.startsWith('=') && a.key !== 'other'),\n other: all.find((a) => a.key === 'other')!.parts,\n });\n break;\n }\n case TYPE.tag:\n throw new Error(`<${el.value}> is a tag, and native code writes plain text: say it without the tag, ${LEAVE_OUT}`);\n default:\n throw new Error(`prosebook: no native writer for ICU element type ${(el as MessageFormatElement).type}`);\n }\n }\n return out;\n}\n","/**\n * The model as a Rust module: an enum of locales with a method per message, and what formats them in\n * a private `rt` module, so no argument a message names can shadow it.\n */\nimport type { NativeTarget } from '#src/tools/config.ts';\nimport { checkNames, conditionCode, float, leading, pascal, snake, stringLiteral, wordsOf } from './emit.ts';\nimport type { NativeMessage, NativeModel, Part } from './model.ts';\nimport type { NumberSpec } from './number.ts';\n\nconst KEYWORDS = new Set(\n 'as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait true type unsafe use where while abstract become box do final macro override priv try typeof unsized virtual yield gen'.split(\n ' ',\n ),\n);\n\nconst ident = (name: string) => (KEYWORDS.has(name) ? `${name}_` : name);\nconst lit = (value: string) => stringLiteral(value, 'rust');\nconst variant = (tag: string) => pascal(wordsOf(tag));\nconst argName = (name: string) => ident(leading(snake(wordsOf(name))));\n\nfunction doc(lines: string[], indent: string): string {\n return lines.map((l) => (l === '' ? `${indent}///\\n` : `${indent}/// ${l}\\n`)).join('');\n}\n\n/** The parts as an expression of type `String`. */\nfunction expr(parts: Part[], indent: string): string {\n if (parts.length === 0) return 'String::new()';\n const [only] = parts;\n if (parts.length === 1 && only !== undefined) {\n if (only.type === 'text') return `String::from(${lit(only.value)})`;\n return only.type === 'string' ? `${argName(only.arg)}.to_string()` : value(only, indent);\n }\n let format = '';\n const args: string[] = [];\n for (const part of parts) {\n if (part.type === 'text') {\n format += part.value.replaceAll('{', '{{').replaceAll('}', '}}');\n continue;\n }\n format += '{}';\n args.push(value(part, indent));\n }\n return `format!(${[lit(format), ...args].join(', ')})`;\n}\n\nfunction value(part: Exclude<Part, { type: 'text' }>, indent: string): string {\n const inner = `${indent} `;\n if (part.type === 'string') return argName(part.arg);\n if (part.type === 'number') {\n const of = part.offset === 0 ? argName(part.arg) : `${argName(part.arg)} - ${float(part.offset)}`;\n return `rt::number(${of}, &rt::F${part.format}, ${lit(part.fallback)})`;\n }\n if (part.type === 'select') {\n const arms = part.arms.map((a) => `${inner}${lit(a.key)} => ${expr(a.parts, inner)},\\n`).join('');\n return `match ${argName(part.arg)} {\\n${arms}${inner}_ => ${expr(part.other, inner)},\\n${indent}}`;\n }\n // A plural, the one kind left. With only `other`, there is nothing to select on.\n if (part.arms.length + part.exact.length === 0) return expr(part.other, indent);\n const arg = argName(part.arg);\n const on = part.on === 'round' ? `rt::round(${arg})` : part.on === 'percent' ? `${arg} * 100.0` : arg;\n const { minFrac, maxFrac } = part.rounding;\n const exact = part.exact.map((e) => `(${float(e.value)}, ${lit(`=${e.value}`)})`).join(', ');\n const arms = [...part.exact.map((e) => ({ key: `=${e.value}`, parts: e.parts })), ...part.arms]\n .map((a) => `${inner}${lit(a.key)} => ${expr(a.parts, inner)},\\n`)\n .join('');\n const pick = `rt::plural(${on}, ${float(part.offset)}, &[${exact}], rt::R${part.rules}, ${minFrac}, ${maxFrac})`;\n return `match ${pick} {\\n${arms}${inner}_ => ${expr(part.other, inner)},\\n${indent}}`;\n}\n\nfunction method(m: NativeMessage, name: string, enumName: string): string {\n const head = doc(m.doc, ' ');\n const arms = (render: (parts: Part[]) => string) =>\n m.bodies.map((b) => ` ${b.locales.map((l) => `${enumName}::${variant(l)}`).join(' | ')} => ${render(b.parts)},\\n`).join('');\n const isStatic = m.bodies.every((b) => b.parts.every((p) => p.type === 'text'));\n if (isStatic && m.args.length === 0)\n return `${head} pub fn ${name}(self) -> &'static str {\\n match self {\\n${arms((parts) => lit(parts[0]?.type === 'text' ? parts[0].value : ''))} }\\n }\\n`;\n const params = m.args.map((a) => `, ${argName(a.name)}: ${a.type === 'number' ? 'impl Number' : '&str'}`).join('');\n const argDocs = m.args.filter((a) => a.doc !== undefined).map((a) => `* \\`${argName(a.name)}\\`: ${a.doc}`);\n const docs = argDocs.length > 0 ? `${head} ///\\n${doc(argDocs, ' ')}` : head;\n const numbers = m.args\n .filter((a) => a.type === 'number')\n .map((a) => ` let ${argName(a.name)} = ${argName(a.name)}.as_f64();\\n`)\n .join('');\n return `${docs} pub fn ${name}(self${params}) -> String {\\n${numbers} match self {\\n${arms((parts) => expr(parts, ' '))} }\\n }\\n`;\n}\n\nfunction formatConst(spec: NumberSpec, i: number): string {\n const affix = ([prefix, suffix]: readonly [string, string]) => `(${lit(prefix)}, ${lit(suffix)})`;\n const fields = [\n `min_int: ${spec.minInt}`,\n `min_frac: ${spec.minFrac}`,\n `max_frac: ${spec.maxFrac}`,\n `shift: ${spec.shift}`,\n `primary: ${spec.grouping.primary}`,\n `secondary: ${spec.grouping.secondary}`,\n `min_group: ${spec.grouping.min}`,\n `decimal: ${lit(spec.decimal)}`,\n `group: ${lit(spec.group)}`,\n `digits: ${spec.digits === undefined ? 'None' : `Some([${spec.digits.map(lit).join(', ')}])`}`,\n `positive: ${affix(spec.positive)}`,\n `negative: ${affix(spec.negative)}`,\n `zero: ${affix(spec.zero)}`,\n `negative_zero: ${affix(spec.negativeZero)}`,\n `infinity: ${lit(spec.infinity)}`,\n `negative_infinity: ${lit(spec.negativeInfinity)}`,\n ];\n return ` pub const F${i}: Format = Format {\\n${fields.map((f) => ` ${f},\\n`).join('')} };\\n`;\n}\n\nconst NUMBER = `\n /// A number format, taken apart when the file was generated.\n pub struct Format {\n pub min_int: usize,\n pub min_frac: usize,\n pub max_frac: usize,\n pub shift: usize,\n pub primary: usize,\n pub secondary: usize,\n pub min_group: usize,\n pub decimal: &'static str,\n pub group: &'static str,\n pub digits: Option<[&'static str; 10]>,\n pub positive: (&'static str, &'static str),\n pub negative: (&'static str, &'static str),\n pub zero: (&'static str, &'static str),\n pub negative_zero: (&'static str, &'static str),\n pub infinity: &'static str,\n pub negative_infinity: &'static str,\n }\n\n /// \\`value\\` as \\`format\\` writes it, or \\`fallback\\` where it isn't a number.\n pub fn number(value: f64, format: &Format, fallback: &str) -> String {\n if value.is_nan() {\n return fallback.to_string();\n }\n if value.is_infinite() {\n return (if value > 0.0 { format.infinity } else { format.negative_infinity }).to_string();\n }\n let (mut int, frac) = digits(value.abs(), format.shift, format.min_frac, format.max_frac);\n let zero = int.bytes().chain(frac.bytes()).all(|b| b == b'0');\n let (prefix, suffix) = match (zero, value.is_sign_negative()) {\n (true, true) => format.negative_zero,\n (true, false) => format.zero,\n (false, true) => format.negative,\n (false, false) => format.positive,\n };\n while int.len() < format.min_int.max(1) {\n int.insert(0, '0');\n }\n let grouped = format.min_group > 0 && int.len() >= format.primary + format.min_group;\n let mut out = String::from(prefix);\n for (i, digit) in int.bytes().enumerate() {\n let left = int.len() - i;\n if grouped && i > 0 && (left == format.primary || (left > format.primary && (left - format.primary) % format.secondary == 0)) {\n out.push_str(format.group);\n }\n push_digit(&mut out, digit, format);\n }\n if !frac.is_empty() {\n out.push_str(format.decimal);\n for digit in frac.bytes() {\n push_digit(&mut out, digit, format);\n }\n }\n out.push_str(suffix);\n out\n }\n\n fn push_digit(out: &mut String, digit: u8, format: &Format) {\n match format.digits {\n Some(digits) => out.push_str(digits[(digit - b'0') as usize]),\n None => out.push(digit as char),\n }\n }\n\n /// The shortest digits that read back as \\`value\\`, as \\`Intl\\` rounds them: moved \\`shift\\` places\n /// right, rounded half away from zero to \\`max\\` fraction digits, and trailing zeros cut to \\`min\\`.\n pub fn digits(value: f64, shift: usize, min: usize, max: usize) -> (String, String) {\n // Display writes the shortest digits that read back, and never an exponent.\n let shortest = value.to_string();\n let (int, frac) = shortest.split_once('.').unwrap_or((&shortest, \"\"));\n let mut all: Vec<u8> = int.bytes().map(|b| b - b'0').collect();\n let mut rest = frac.bytes().map(|b| b - b'0');\n let mut point = all.len() + shift;\n for _ in 0..shift + max {\n all.push(rest.next().unwrap_or(0));\n }\n if rest.next().unwrap_or(0) >= 5 {\n let mut at = all.len();\n loop {\n if at == 0 {\n all.insert(0, 1);\n point += 1;\n break;\n }\n at -= 1;\n if all[at] == 9 {\n all[at] = 0;\n } else {\n all[at] += 1;\n break;\n }\n }\n }\n let mut frac = all.split_off(point);\n while frac.len() > min && frac.last() == Some(&0) {\n frac.pop();\n }\n let first = all.iter().position(|&d| d != 0).unwrap_or(all.len());\n let text = |d: &[u8]| d.iter().map(|&d| (b'0' + d) as char).collect::<String>();\n (text(&all[first..]), text(&frac))\n }\n`;\n\nconst PLURAL = `\n /// CLDR's plural operands of a number as written.\n pub struct Operands {\n pub n: f64,\n pub i: f64,\n pub v: f64,\n pub w: f64,\n pub f: f64,\n pub t: f64,\n pub c: f64,\n pub e: f64,\n }\n\n /// The arm a plural takes: the \\`=N\\` that \\`value\\` equals, else the category of \\`value\\` less \\`offset\\`.\n pub fn plural(\n value: f64,\n offset: f64,\n exact: &[(f64, &'static str)],\n rules: fn(&Operands) -> &'static str,\n min: usize,\n max: usize,\n ) -> &'static str {\n match exact.iter().find(|(n, _)| *n == value) {\n Some(&(_, arm)) => arm,\n None => category(rules, value - offset, min, max),\n }\n }\n\n /// The category \\`rules\\` give \\`value\\`, rounded to between \\`min\\` and \\`max\\` fraction digits.\n fn category(rules: fn(&Operands) -> &'static str, value: f64, min: usize, max: usize) -> &'static str {\n if !value.is_finite() {\n return \"other\";\n }\n let (int, frac) = digits(value.abs(), 0, min, max);\n let int = if int.is_empty() { String::from(\"0\") } else { int };\n let trimmed = frac.trim_end_matches('0');\n let read = |s: &str| if s.is_empty() { 0.0 } else { s.parse().unwrap_or(0.0) };\n rules(&Operands {\n n: if frac.is_empty() { read(&int) } else { read(&format!(\"{}.{}\", int, frac)) },\n i: read(&int),\n v: frac.len() as f64,\n w: trimmed.len() as f64,\n f: read(&frac),\n t: read(trimmed),\n c: 0.0,\n e: 0.0,\n })\n }\n\n /// An integer in the range, as CLDR's ranges hold.\n fn within(value: f64, from: f64, to: f64) -> bool {\n value.fract() == 0.0 && value >= from && value <= to\n }\n\n /// \\`Math.round\\`: half up, toward positive infinity.\n pub fn round(value: f64) -> f64 {\n let floor = value.floor();\n if value - floor >= 0.5 { floor + 1.0 } else { floor }\n }\n`;\n\nconst NUMBER_TRAIT = `\n/// A number a message formats: any of Rust's integers or floats.\npub trait Number: Copy {\n fn as_f64(self) -> f64;\n}\n\nmacro_rules! number {\n ($($t:ty),*) => {$(\n impl Number for $t {\n fn as_f64(self) -> f64 {\n self as f64\n }\n }\n )*};\n}\n\nnumber!(i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64);\n`;\n\nexport function rustModule(model: NativeModel, target: NativeTarget & { name: string }, banner: string): string {\n const name = target.name;\n const names = model.messages.map((m): [string, string] => [m.key, ident(leading(snake(m.words)))]);\n checkNames('rust', names, ['tag', 'negotiate']);\n const variants = model.locales.map((l) => ` /// \\`${l}\\`${l === model.source ? ', the source' : ''}.\\n ${variant(l)},\\n`).join('');\n const tags = model.locales.map((l) => ` ${name}::${variant(l)} => ${lit(l)},\\n`).join('');\n const methods = model.messages.map((m, i) => method(m, names[i]![1], name)).join('\\n');\n const usesNumbers = model.messages.some((m) => m.args.some((a) => a.type === 'number'));\n const rules = model.rules\n .map(({ name: rule, rules }, i) => {\n const checks = rules.map(\n ([category, condition]) =>\n ` if ${conditionCode(condition, { field: (op) => `o.${op}`, mod: (v, by) => `${v} % ${by}`, within: (v, from, to) => `within(${v}, ${from}, ${to})` })} {\\n return ${lit(category)};\\n }\\n`,\n );\n return ` /// ${rule}\\n pub fn R${i}(${rules.length > 0 ? 'o' : '_o'}: &Operands) -> &'static str {\\n${checks.join('')} \"other\"\\n }\\n`;\n })\n .join('\\n');\n const runtime =\n model.formats.length + model.rules.length === 0\n ? ''\n : `\n/// What formats the messages, generated with them.\nmod rt {${NUMBER}${model.rules.length > 0 ? PLURAL : ''}\n${model.formats.map(formatConst).join('\\n')}${rules === '' ? '' : `\\n${rules}`}}\n`;\n\n return `${banner}\n#![allow(dead_code, non_snake_case, clippy::all)]\n${usesNumbers ? NUMBER_TRAIT : ''}\n/// A locale the catalog is written or translated in, and its messages.\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]\npub enum ${name} {\n${variants}}\n\nimpl ${name} {\n /// Every locale, the source first.\n pub const ALL: [${name}; ${model.locales.length}] = [${model.locales.map((l) => `${name}::${variant(l)}`).join(', ')}];\n\n /// The locale the catalog is written in, which every message falls back to.\n pub const SOURCE: ${name} = ${name}::${variant(model.source)};\n\n /// The locale's BCP 47 tag.\n pub fn tag(self) -> &'static str {\n match self {\n${tags} }\n }\n\n /// The best locale for what was asked, most preferred first: each tag tries an exact match, then\n /// its parents (\\`pt-BR\\` finds \\`pt\\`), then any locale of its language. The source if none is.\n pub fn negotiate<S: AsRef<str>>(requested: &[S]) -> ${name} {\n let language = |tag: &str| tag.split('-').next().unwrap_or(\"\").to_ascii_lowercase();\n for want in requested {\n let want = want.as_ref();\n let mut tag = want;\n loop {\n if let Some(found) = Self::ALL.iter().find(|l| l.tag().eq_ignore_ascii_case(tag)) {\n return *found;\n }\n match tag.rfind('-') {\n Some(cut) => tag = &tag[..cut],\n None => break,\n }\n }\n if let Some(found) = Self::ALL.iter().find(|l| language(l.tag()) == language(want)) {\n return *found;\n }\n }\n Self::SOURCE\n }\n\n${methods}}\n${runtime}`;\n}\n","/**\n * The model as a Swift file: a `String`-backed enum of locales with a property or method per\n * message, and a file-private enum holding what formats them.\n */\nimport type { NativeTarget } from '#src/tools/config.ts';\nimport { camel, checkNames, conditionCode, float, leading, stringLiteral, wordsOf } from './emit.ts';\nimport type { NativeMessage, NativeModel, Part } from './model.ts';\nimport type { NumberSpec } from './number.ts';\n\nconst KEYWORDS = new Set(\n 'associatedtype class deinit enum extension fileprivate func import init inout internal let open operator private precedencegroup protocol public rethrows static struct subscript typealias var break case catch continue default defer do else fallthrough for guard if in repeat return throw switch where while Any as await false is nil self Self super throws true try'.split(\n ' ',\n ),\n);\n\nconst ident = (name: string) => (KEYWORDS.has(name) ? `\\`${name}\\`` : name);\nconst lit = (value: string) => stringLiteral(value, 'swift');\nconst caseName = (tag: string) => ident(leading(camel(wordsOf(tag))));\nconst argName = (name: string) => ident(leading(camel(wordsOf(name))));\n\nfunction doc(lines: string[], indent: string): string {\n return lines.map((l) => (l === '' ? `${indent}///\\n` : `${indent}/// ${l}\\n`)).join('');\n}\n\n/** The parts as an expression of type `String`, with `rt` the runtime enum. */\nfunction expr(parts: Part[], indent: string, rt: string): string {\n if (parts.length === 0) return '\"\"';\n const values = parts.map((p) => (p.type === 'text' ? lit(p.value) : value(p, indent, rt)));\n return values.length === 1 ? values[0]! : `[${values.join(', ')}].joined()`;\n}\n\nfunction value(part: Exclude<Part, { type: 'text' }>, indent: string, rt: string): string {\n const inner = `${indent} `;\n if (part.type === 'string') return argName(part.arg);\n if (part.type === 'number') {\n const of = part.offset === 0 ? argName(part.arg) : `${argName(part.arg)} - ${float(part.offset)}`;\n return `${rt}.number(${of}, ${rt}.f${part.format}, ${lit(part.fallback)})`;\n }\n if (part.type === 'select') {\n const arms = part.arms.map((a) => `${inner}case ${lit(a.key)}: return ${expr(a.parts, inner, rt)}\\n`).join('');\n return `{ () -> String in\\n${inner}switch ${argName(part.arg)} {\\n${arms}${inner}default: return ${expr(part.other, inner, rt)}\\n${inner}}\\n${indent}}()`;\n }\n // A plural, the one kind left. With only `other`, there is nothing to select on.\n if (part.arms.length + part.exact.length === 0) return expr(part.other, indent, rt);\n const arg = argName(part.arg);\n const on = part.on === 'round' ? `${rt}.round(${arg})` : part.on === 'percent' ? `${arg} * 100.0` : arg;\n const { minFrac, maxFrac } = part.rounding;\n const exact = part.exact.map((e) => `(${float(e.value)}, ${lit(`=${e.value}`)})`).join(', ');\n const arms = [...part.exact.map((e) => ({ key: `=${e.value}`, parts: e.parts })), ...part.arms]\n .map((a) => `${inner}case ${lit(a.key)}: return ${expr(a.parts, inner, rt)}\\n`)\n .join('');\n const pick = `${rt}.plural(${on}, ${float(part.offset)}, [${exact}], ${rt}.r${part.rules}, ${minFrac}, ${maxFrac})`;\n return `{ () -> String in\\n${inner}switch ${pick} {\\n${arms}${inner}default: return ${expr(part.other, inner, rt)}\\n${inner}}\\n${indent}}()`;\n}\n\n/** The protocol a number argument takes, and the property that reads it as a `Double`. */\ninterface NumberProtocol {\n type: string;\n value: string;\n}\n\nfunction member(m: NativeMessage, name: string, rt: string, number: NumberProtocol): string {\n const cases = (render: (parts: Part[]) => string) =>\n m.bodies.map((b) => ` case ${b.locales.map((l) => `.${caseName(l)}`).join(', ')}: return ${render(b.parts)}\\n`).join('');\n const argDocs = m.args.filter((a) => a.doc !== undefined).map((a) => `- ${argName(a.name)}: ${a.doc}`);\n const head = doc(argDocs.length > 0 ? [...m.doc, '', ...argDocs] : m.doc, ' ');\n const body = ` switch self {\\n${cases((parts) => expr(parts, ' ', rt))} }\\n`;\n if (m.args.length === 0) return `${head} public var ${name}: String {\\n${body} }\\n`;\n const params = m.args.map((a) => `${argName(a.name)}: ${a.type === 'number' ? `some ${number.type}` : 'String'}`).join(', ');\n const numbers = m.args\n .filter((a) => a.type === 'number')\n .map((a) => ` let ${argName(a.name)} = ${argName(a.name)}.${number.value}\\n`)\n .join('');\n return `${head} public func ${name}(${params}) -> String {\\n${numbers}${body} }\\n`;\n}\n\nfunction formatConst(spec: NumberSpec, i: number): string {\n const affix = ([prefix, suffix]: readonly [string, string]) => `(${lit(prefix)}, ${lit(suffix)})`;\n const fields = [\n `minInt: ${spec.minInt}`,\n `minFrac: ${spec.minFrac}`,\n `maxFrac: ${spec.maxFrac}`,\n `shift: ${spec.shift}`,\n `primary: ${spec.grouping.primary}`,\n `secondary: ${spec.grouping.secondary}`,\n `minGroup: ${spec.grouping.min}`,\n `decimal: ${lit(spec.decimal)}`,\n `group: ${lit(spec.group)}`,\n `digits: ${spec.digits === undefined ? 'nil' : `[${spec.digits.map(lit).join(', ')}]`}`,\n `positive: ${affix(spec.positive)}`,\n `negative: ${affix(spec.negative)}`,\n `zero: ${affix(spec.zero)}`,\n `negativeZero: ${affix(spec.negativeZero)}`,\n `infinity: ${lit(spec.infinity)}`,\n `negativeInfinity: ${lit(spec.negativeInfinity)}`,\n ];\n return ` static let f${i} = Format(\\n${fields.map((f) => ` ${f}`).join(',\\n')}\\n )\\n`;\n}\n\nconst NUMBER = `\n /// A number format, taken apart when the file was generated.\n struct Format {\n let minInt: Int\n let minFrac: Int\n let maxFrac: Int\n let shift: Int\n let primary: Int\n let secondary: Int\n let minGroup: Int\n let decimal: String\n let group: String\n let digits: [String]?\n let positive: (String, String)\n let negative: (String, String)\n let zero: (String, String)\n let negativeZero: (String, String)\n let infinity: String\n let negativeInfinity: String\n }\n\n /// \\`value\\` as \\`format\\` writes it, or \\`fallback\\` where it isn't a number.\n static func number(_ value: Double, _ format: Format, _ fallback: String) -> String {\n if value.isNaN { return fallback }\n if value.isInfinite { return value > 0 ? format.infinity : format.negativeInfinity }\n let (written, frac) = digits(abs(value), format.shift, format.minFrac, format.maxFrac)\n var int = written\n let zero = (written + frac).allSatisfy { $0 == \"0\" }\n let negative = value.sign == .minus\n let (prefix, suffix) = zero ? (negative ? format.negativeZero : format.zero) : (negative ? format.negative : format.positive)\n while int.count < max(format.minInt, 1) { int = \"0\" + int }\n let grouped = format.minGroup > 0 && int.count >= format.primary + format.minGroup\n var out = prefix\n for (i, digit) in int.enumerated() {\n let left = int.count - i\n if grouped && i > 0 && (left == format.primary || (left > format.primary && (left - format.primary) % format.secondary == 0)) {\n out += format.group\n }\n out += shown(digit, format)\n }\n if !frac.isEmpty {\n out += format.decimal\n for digit in frac { out += shown(digit, format) }\n }\n return out + suffix\n }\n\n private static func shown(_ digit: Character, _ format: Format) -> String {\n guard let digits = format.digits, let ascii = digit.asciiValue else { return String(digit) }\n return digits[Int(ascii - 48)]\n }\n\n /// The shortest digits that read back as \\`value\\`, as \\`Intl\\` rounds them: moved \\`shift\\` places\n /// right, rounded half away from zero to \\`max\\` fraction digits, and trailing zeros cut to \\`min\\`.\n static func digits(_ value: Double, _ shift: Int, _ min: Int, _ max: Int) -> (String, String) {\n // \\`description\\` writes the shortest digits that read back, with an exponent past a size.\n let written = value.description.split(separator: \"e\", maxSplits: 1).map(String.init)\n let exponent = written.count > 1 ? Int(written[1]) ?? 0 : 0\n let pieces = written[0].split(separator: \".\", maxSplits: 1, omittingEmptySubsequences: false).map(String.init)\n var all = (pieces[0] + (pieces.count > 1 ? pieces[1] : \"\")).compactMap { $0.wholeNumberValue }\n var point = pieces[0].count + exponent + shift\n if point < 0 {\n all = Array(repeating: 0, count: -point) + all\n point = 0\n }\n while all.count <= point + max { all.append(0) }\n let next = all[point + max]\n all = Array(all.prefix(point + max))\n if next >= 5 {\n var at = all.count - 1\n while at >= 0 && all[at] == 9 {\n all[at] = 0\n at -= 1\n }\n if at < 0 {\n all.insert(1, at: 0)\n point += 1\n } else {\n all[at] += 1\n }\n }\n var frac = Array(all[point...])\n while frac.count > min && frac.last == 0 { frac.removeLast() }\n let int = all[..<point].drop(while: { $0 == 0 })\n return (int.map(String.init).joined(), frac.map(String.init).joined())\n }\n`;\n\nconst PLURAL = `\n /// CLDR's plural operands of a number as written.\n struct Operands {\n let n: Double\n let i: Double\n let v: Double\n let w: Double\n let f: Double\n let t: Double\n let c: Double\n let e: Double\n }\n\n /// The arm a plural takes: the \\`=N\\` that \\`value\\` equals, else the category of \\`value\\` less \\`offset\\`.\n static func plural(\n _ value: Double, _ offset: Double, _ exact: [(Double, String)], _ rules: (Operands) -> String, _ min: Int, _ max: Int\n ) -> String {\n exact.first(where: { $0.0 == value })?.1 ?? category(rules, value - offset, min, max)\n }\n\n /// The category \\`rules\\` give \\`value\\`, rounded to between \\`min\\` and \\`max\\` fraction digits.\n private static func category(_ rules: (Operands) -> String, _ value: Double, _ min: Int, _ max: Int) -> String {\n guard value.isFinite else { return \"other\" }\n let (written, frac) = digits(abs(value), 0, min, max)\n let int = written.isEmpty ? \"0\" : written\n var trimmed = Substring(frac)\n while trimmed.last == \"0\" { trimmed.removeLast() }\n let read = { (s: String) in Double(s) ?? 0 }\n return rules(Operands(\n n: read(frac.isEmpty ? int : int + \".\" + frac),\n i: read(int),\n v: Double(frac.count),\n w: Double(trimmed.count),\n f: read(frac),\n t: read(String(trimmed)),\n c: 0,\n e: 0\n ))\n }\n\n /// An integer in the range, as CLDR's ranges hold.\n private static func within(_ value: Double, _ from: Double, _ to: Double) -> Bool {\n value.truncatingRemainder(dividingBy: 1) == 0 && value >= from && value <= to\n }\n\n /// \\`Math.round\\`: half up, toward positive infinity.\n static func round(_ value: Double) -> Double {\n let floor = value.rounded(.down)\n return value - floor >= 0.5 ? floor + 1 : floor\n }\n`;\n\nconst NUMBER_TYPES = [\n 'Int',\n 'Int8',\n 'Int16',\n 'Int32',\n 'Int64',\n 'UInt',\n 'UInt8',\n 'UInt16',\n 'UInt32',\n 'UInt64',\n 'Double',\n 'Float',\n 'CGFloat',\n];\n\nexport function swiftFile(model: NativeModel, target: NativeTarget & { name: string }, banner: string): string {\n const name = target.name;\n const rt = `${name}Runtime`;\n const names = model.messages.map((m): [string, string] => [m.key, ident(leading(camel(m.words)))]);\n checkNames('swift', names, ['tag', 'source', 'negotiate', 'rawValue', 'allCases', 'hashValue']);\n const cases = model.locales\n .map((l) => ` /// \\`${l}\\`${l === model.source ? ', the source' : ''}.\\n case ${caseName(l)} = ${lit(l)}\\n`)\n .join('');\n // Named after the type, so two generated files in one module don't both add a property to `Int`.\n const number = { type: `${name}Number`, value: `${name.charAt(0).toLowerCase()}${name.slice(1)}Value` };\n const members = model.messages.map((m, i) => member(m, names[i]![1], rt, number)).join('\\n');\n const usesNumbers = model.messages.some((m) => m.args.some((a) => a.type === 'number'));\n const numberProtocol = !usesNumbers\n ? ''\n : `\n/// A number a message formats: any of Swift's integers or floats.\npublic protocol ${number.type} {\n var ${number.value}: Double { get }\n}\n\n${NUMBER_TYPES.map((t) => `extension ${t}: ${number.type} { public var ${number.value}: Double { Double(self) } }`).join('\\n')}\n`;\n const rules = model.rules\n .map(({ name: rule, rules }, i) => {\n const checks = rules.map(\n ([category, condition]) =>\n ` if ${conditionCode(condition, { field: (op) => `o.${op}`, mod: (v, by) => `${v}.truncatingRemainder(dividingBy: ${by})`, within: (v, from, to) => `within(${v}, ${from}, ${to})` })} { return ${lit(category)} }\\n`,\n );\n return ` /// ${rule}\\n static func r${i}(_ o: Operands) -> String {\\n${checks.join('')} return \"other\"\\n }\\n`;\n })\n .join('\\n');\n const runtime =\n model.formats.length + model.rules.length === 0\n ? ''\n : `\n/// What formats the messages, generated with them.\nprivate enum ${rt} {${NUMBER}${model.rules.length > 0 ? PLURAL : ''}\n${model.formats.map(formatConst).join('\\n')}${rules === '' ? '' : `\\n${rules}`}}\n`;\n\n return `${banner}\nimport Foundation\n${numberProtocol}\n/// A locale the catalog is written or translated in, and its messages.\npublic enum ${name}: String, CaseIterable, Sendable {\n${cases}\n /// The locale the catalog is written in, which every message falls back to.\n public static let source: ${name} = .${caseName(model.source)}\n\n /// The locale's BCP 47 tag.\n public var tag: String { rawValue }\n\n /// The best locale for what was asked, most preferred first: each tag tries an exact match, then\n /// its parents (\\`pt-BR\\` finds \\`pt\\`), then any locale of its language. The source if none is.\n public static func negotiate(_ requested: [String]) -> ${name} {\n let language = { (tag: String) in tag.split(separator: \"-\").first.map { $0.lowercased() } ?? \"\" }\n for want in requested {\n var tag = want\n while true {\n if let found = allCases.first(where: { $0.tag.lowercased() == tag.lowercased() }) { return found }\n guard let cut = tag.lastIndex(of: \"-\") else { break }\n tag = String(tag[..<cut])\n }\n if let found = allCases.first(where: { language($0.tag) == language(want) }) { return found }\n }\n return source\n }\n\n${members}}\n${runtime}`;\n}\n","/**\n * The native files `generate` writes beside the TypeScript, one per target in the config's `native`.\n * A message a target can't render fails the build with the reason, as a translation that drifted does.\n */\nimport { CatalogError, type Catalog, type Problem } from '#src/tools/catalog.ts';\nimport type { Entry } from '#src/tools/compile.ts';\nimport type { ResolvedConfig } from '#src/tools/config.ts';\nimport { kotlinFile } from './kotlin.ts';\nimport { nativeModel } from './model.ts';\nimport { rustModule } from './rust.ts';\nimport { swiftFile } from './swift.ts';\n\nconst WRITERS = { rust: rustModule, swift: swiftFile, kotlin: kotlinFile };\n\nexport function nativeFiles(\n config: ResolvedConfig,\n catalog: Catalog,\n locales: string[],\n entries: Map<string, Entry[]>,\n banner: string,\n): Map<string, string> {\n const files = new Map<string, string>();\n const problems: Problem[] = [];\n for (const target of config.native) {\n const { model, problems: found } = nativeModel(target, catalog, locales, entries);\n problems.push(...found);\n if (found.length > 0) continue;\n try {\n files.set(target.out, WRITERS[target.language](model, target, banner));\n } catch (e) {\n problems.push({ severity: 'error', message: (e as Error).message });\n }\n }\n if (problems.length > 0) throw new CatalogError(problems);\n return files;\n}\n","/**\n * Pseudo-localization: the source with every letter accented, vowels doubled for the length a\n * translation usually adds, and brackets around the whole. A screen in the pseudo-locale shows at a\n * glance which text is hardcoded (it is plain), which is clipped (a bracket is missing), and which\n * splices fragments together (brackets inside brackets).\n */\nimport { TYPE, type MessageFormatElement } from './icu.ts';\n\nconst PLAIN = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst ACCENTED = Array.from('áƀçðéƒĝĥíĵķļɱñóþǫŕšţúṽŵẋýžÁƁÇÐÉƑĜĤÍĴĶĻṀÑÓÞǪŔŠŢÚṼŴẊÝŽ');\n\nexport function pseudoText(text: string): string {\n return text.replace(/[A-Za-z]/g, (c) => {\n const accented = ACCENTED[PLAIN.indexOf(c)]!;\n return /[aeiou]/i.test(c) ? accented.repeat(2) : accented;\n });\n}\n\nfunction transform(elements: MessageFormatElement[]): MessageFormatElement[] {\n return elements.map((el) => {\n if (el.type === TYPE.literal) return { ...el, value: pseudoText(el.value) };\n if (el.type === TYPE.tag) return { ...el, children: transform(el.children) };\n if (el.type === TYPE.select || el.type === TYPE.plural) {\n const options = Object.fromEntries(Object.entries(el.options).map(([arm, o]) => [arm, { ...o, value: transform(o.value) }]));\n return { ...el, options };\n }\n return el;\n });\n}\n\nexport function pseudoAst(ast: MessageFormatElement[]): MessageFormatElement[] {\n const out: MessageFormatElement[] = [];\n // Adjacent literals are joined, so a message with no placeholders still compiles to a plain string.\n for (const el of [{ type: TYPE.literal, value: '⟦' }, ...transform(ast), { type: TYPE.literal, value: '⟧' }] as MessageFormatElement[]) {\n const last = out.at(-1);\n if (el.type === TYPE.literal && last?.type === TYPE.literal) out[out.length - 1] = { ...last, value: last.value + el.value };\n else out.push(el);\n }\n return out;\n}\n","/**\n * Turns the catalog into the modules an app imports.\n *\n * Generated rather than loaded so that a missing key, a misspelled key or a missing argument is a type\n * error, and so the runtime needs neither a YAML nor an ICU parser. The index carries each key's source\n * text and context as a doc comment, so hovering a key at its call site shows what the screen says.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative } from 'node:path';\n\nimport { loadCatalog, type Catalog, type Message } from './catalog.ts';\nimport { compileLocale, localeModule, type Entry } from './compile.ts';\nimport type { ResolvedConfig } from './config.ts';\nimport { readLock, reconcile, serializeLock, type Lock, type StaleTranslation } from './lock.ts';\nimport { nativeFiles } from './native/index.ts';\nimport { pseudoAst } from './pseudo.ts';\nimport { SYNTAX_NAME } from './syntax.ts';\n\nconst quote = (s: string) => JSON.stringify(s);\nconst prop = (name: string) => (/^[A-Za-z_$][\\w$]*$/.test(name) ? name : quote(name));\n\nfunction banner(config: ResolvedConfig): string {\n const from = relative(config.root, config.catalog).replaceAll('\\\\', '/');\n return `// Generated by prosebook from ${from}. Do not edit: change the catalog and run \\`prosebook generate\\`.`;\n}\n\n/** Every locale the app can switch to, in order: the source, the translations, the pseudo-locale. */\nexport function localesOf(catalog: Catalog, config: ResolvedConfig): string[] {\n return [config.source, ...catalog.locales, ...(config.pseudo !== false ? [config.pseudo] : [])];\n}\n\n/** Per locale, the messages its module holds. A translated locale holds only what it translates. */\nexport function localeEntries(\n catalog: Catalog,\n config: ResolvedConfig,\n stale: Map<string, Map<string, StaleTranslation>>,\n): Map<string, Entry[]> {\n const out = new Map<string, Entry[]>();\n out.set(\n config.source,\n catalog.messages.map((m) => [m.key, m.ast]),\n );\n for (const locale of catalog.locales) {\n const skip = config.stale === 'fallback' ? stale.get(locale) : undefined;\n out.set(\n locale,\n catalog.messages.flatMap((m): Entry[] => {\n const t = m.translations.get(locale);\n return t === undefined || skip?.has(m.key) === true ? [] : [[m.key, t.ast]];\n }),\n );\n }\n if (config.pseudo !== false) {\n out.set(\n config.pseudo,\n catalog.messages.map((m) => [m.key, pseudoAst(m.ast)]),\n );\n }\n return out;\n}\n\nfunction doc(lines: string[], indent: string): string {\n const safe = lines.map((l) => l.replaceAll('*/', '*\\\\/'));\n if (safe.length === 1) return `${indent}/** ${safe[0]} */\\n`;\n return `${indent}/**\\n${safe.map((l) => (l === '' ? `${indent} *` : `${indent} * ${l}`)).join('\\n')}\\n${indent} */\\n`;\n}\n\n/** A doc written as a phrase (`the person's name`) reads as a sentence in a doc comment. */\nfunction sentence(text: string): string {\n const capital = text.charAt(0).toUpperCase() + text.slice(1);\n return /[.!?]$/.test(capital) ? capital : `${capital}.`;\n}\n\nfunction shapeOf(m: Message): string {\n const tags = m.tags.length > 0 ? m.tags.map(quote).join(' | ') : 'never';\n if (m.args.size === 0) return `{ args: {}; tags: ${tags} }`;\n const fields = [...m.args].map(([name, type]) => {\n const held = m.argDocs.get(name);\n const said = [\n held === undefined ? undefined : sentence(held),\n m.argFormats.has(name) ? `Formatted as ${m.argFormats.get(name)}.` : undefined,\n ].filter(Boolean);\n return `${said.length > 0 ? doc([said.join(' ')], ' ') : ''} readonly ${prop(name)}: ${type};`;\n });\n return `{\\n args: {\\n${fields.join('\\n')}\\n };\\n tags: ${tags};\\n }`;\n}\n\nfunction typesBlock(catalog: Catalog, locales: string[]): string {\n const rows = catalog.messages.map((m) => {\n // An MF2 message with variants spans lines; each is a line of the doc comment.\n const lines = (m.text.length > 400 ? `${m.text.slice(0, 397)}...` : m.text).split('\\n');\n if (m.context) lines.push('', m.context);\n if (m.remove) lines.push('', 'Marked for removal in the catalog.');\n if (m.comment) lines.push('', `Comment: ${m.comment}`);\n return `${doc(lines, ' ')} ${quote(m.key)}: ${shapeOf(m)};`;\n });\n return [\n `export type Locale = ${locales.map(quote).join(' | ')};`,\n '',\n '/** Every message in the catalog: the arguments it takes and the tags it wraps text in. */',\n `export type Messages = {\\n${rows.join('\\n')}\\n};`,\n ].join('\\n');\n}\n\nconst REGISTER = `declare module 'prosebook' {\n interface Register {\n messages: Messages;\n locale: Locale;\n }\n}`;\n\nfunction catalogLiteral(config: ResolvedConfig, locales: string[], ext: string): { imports: string[]; literal: string } {\n const eager = locales.filter((l) => l === config.source || config.bundled.includes(l));\n const lazy = locales.filter((l) => !eager.includes(l));\n const ident = (l: string) => `m_${l.replace(/\\W/g, '_')}`;\n return {\n imports: eager.map((l) => `import ${ident(l)} from './${l}${ext}';`),\n literal: [\n '{',\n ` source: ${quote(config.source)},`,\n ` locales: [${locales.map(quote).join(', ')}],`,\n ` messages: { ${eager.map((l) => `${prop(l)}: ${ident(l)}`).join(', ')} },`,\n ` loaders: { ${lazy.map((l) => `${prop(l)}: () => import('./${l}${ext}')`).join(', ')} },`,\n '}',\n ].join('\\n'),\n };\n}\n\n/** The JSON Schema an editor reads to complete and explain catalog entries. */\nexport function catalogSchema(config: ResolvedConfig): object {\n // The shorthand satisfies no required field, so it's offered only where none is.\n const shorthand = { type: 'string', description: `The message, in ${SYNTAX_NAME[config.messageFormat]}, with nothing said about it.` };\n const entry = {\n type: 'object',\n required: [config.source, ...config.require],\n additionalProperties: false,\n properties: {\n [config.source]: { type: 'string', description: `The message, in ${SYNTAX_NAME[config.messageFormat]}.` },\n kind: {\n description: 'What sort of string it is.',\n oneOf: Object.entries(config.kinds).map(([k, r]) => ({ const: k, description: r.doc })),\n },\n surface: {\n description: 'Where the string sits.',\n oneOf: Object.entries(config.surfaces).map(([k, d]) => ({ const: k, description: d })),\n },\n context: { type: 'string', description: 'One sentence telling a translator where the string appears and what it answers to.' },\n args: { type: 'object', description: 'What each placeholder holds.', additionalProperties: { type: 'string' } },\n fragment: { type: 'boolean', description: 'Completes something beside it rather than standing as a sentence.' },\n comment: { type: 'string', description: 'A change asked of whoever edits the entry next. Make it, then delete the comment.' },\n remove: { type: 'boolean', description: 'Asks for the entry to go: delete it, its translations and the code that reads it.' },\n allow: {\n type: 'object',\n description: 'Lint rules this entry is exempt from, each with the reason.',\n propertyNames: { enum: Object.keys(config.lint.rules) },\n additionalProperties: { type: 'string' },\n },\n },\n };\n return {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'prosebook catalog',\n description: 'Generated by `prosebook generate` from the config. Do not edit.',\n type: 'object',\n propertyNames: { pattern: '^[a-z0-9]+(?:[-_][a-z0-9]+)*(?:\\\\.[a-z0-9]+(?:[-_][a-z0-9]+)*)+$' },\n additionalProperties: config.require.length === 0 ? { oneOf: [shorthand, entry] } : entry,\n };\n}\n\nexport interface Generated {\n catalog: Catalog;\n /** Absolute path to content. */\n files: Map<string, string>;\n lock: Lock;\n stale: Map<string, Map<string, StaleTranslation>>;\n entries: Map<string, Entry[]>;\n}\n\n/** Everything `generate` writes, in memory. */\nexport function render(config: ResolvedConfig, accept?: Map<string, Set<string> | true>): Generated {\n const catalog = loadCatalog(config);\n const { lock, stale } = reconcile(catalog, readLock(config.lock), accept);\n const locales = localesOf(catalog, config);\n const entries = localeEntries(catalog, config, stale);\n const ts = config.language === 'ts';\n const head = banner(config);\n const files = new Map<string, string>();\n\n for (const [locale, list] of entries)\n files.set(join(config.out, `${locale}.${ts ? 'ts' : 'js'}`), localeModule(compileLocale(list), head, ts));\n\n const { imports, literal } = catalogLiteral(config, locales, config.importExtension);\n const types = typesBlock(catalog, locales);\n if (ts) {\n files.set(\n join(config.out, 'index.ts'),\n [\n head,\n \"import { defineCatalog } from 'prosebook';\",\n ...imports,\n '',\n types,\n '',\n `export const catalog = defineCatalog<Messages, Locale>(${literal});`,\n '',\n REGISTER,\n '',\n ].join('\\n'),\n );\n } else {\n files.set(\n join(config.out, 'index.js'),\n [head, \"import { defineCatalog } from 'prosebook';\", ...imports, '', `export const catalog = defineCatalog(${literal});`, ''].join(\n '\\n',\n ),\n );\n files.set(\n join(config.out, 'index.d.ts'),\n [\n head,\n \"import type { Catalog } from 'prosebook';\",\n '',\n types,\n '',\n 'export declare const catalog: Catalog<Messages, Locale>;',\n '',\n REGISTER,\n '',\n ].join('\\n'),\n );\n }\n\n for (const [path, content] of nativeFiles(config, catalog, locales, entries, head)) files.set(path, content);\n files.set(join(config.catalog, 'catalog.schema.json'), `${JSON.stringify(catalogSchema(config), null, 2)}\\n`);\n if (Object.keys(lock.translations).length > 0 || existsSync(config.lock)) files.set(config.lock, serializeLock(lock));\n return { catalog, files, lock, stale, entries };\n}\n\n/** Writes what changed. With `check`, writes nothing and returns what would have changed. */\nexport function writeFiles(files: Map<string, string>, check = false): string[] {\n const changed: string[] = [];\n for (const [path, content] of files) {\n const current = existsSync(path) ? readFileSync(path, 'utf8') : undefined;\n if (current === content) continue;\n changed.push(path);\n if (check) continue;\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content);\n }\n return changed;\n}\n\nexport function generate(\n config: ResolvedConfig,\n options: { check?: boolean; accept?: Map<string, Set<string> | true> } = {},\n): Generated & { changed: string[] } {\n const generated = render(config, options.accept);\n return { ...generated, changed: writeFiles(generated.files, options.check) };\n}\n"],"ignoreList":[10,11],"mappings":"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"}