prosebook 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +357 -26
  2. package/dist/bind-BIZNv8nU.js +62 -0
  3. package/dist/bind-BIZNv8nU.js.map +1 -0
  4. package/dist/bind-ZS86jHXk.d.ts +31 -0
  5. package/dist/bind-ZS86jHXk.d.ts.map +1 -0
  6. package/dist/bun.d.ts +12 -3
  7. package/dist/bun.d.ts.map +1 -1
  8. package/dist/bun.js +77 -26
  9. package/dist/bun.js.map +1 -1
  10. package/dist/{bundle-KD-DiiFa.d.ts → bundle-CLHY_97D.d.ts} +3 -3
  11. package/dist/bundle-CLHY_97D.d.ts.map +1 -0
  12. package/dist/bundle-Ut6Y2X6N.js +217 -0
  13. package/dist/bundle-Ut6Y2X6N.js.map +1 -0
  14. package/dist/cli.js +55 -12
  15. package/dist/cli.js.map +1 -1
  16. package/dist/{config-BPSmoYel.js → config-7T4hX_f7.js} +13 -5
  17. package/dist/{config-BPSmoYel.js.map → config-7T4hX_f7.js.map} +1 -1
  18. package/dist/{config-DdMkKt_N.d.ts → config-CzaJJQ60.d.ts} +19 -5
  19. package/dist/{config-DdMkKt_N.d.ts.map → config-CzaJJQ60.d.ts.map} +1 -1
  20. package/dist/config.d.ts +1 -1
  21. package/dist/config.js +1 -1
  22. package/dist/{copy-B3V_QRkT.d.ts → copy-BXn0aYQn.d.ts} +37 -3
  23. package/dist/copy-BXn0aYQn.d.ts.map +1 -0
  24. package/dist/copy-Bv6S-Hr2.js +235 -0
  25. package/dist/copy-Bv6S-Hr2.js.map +1 -0
  26. package/dist/endpoints-Dhgowovz.js +217 -0
  27. package/dist/endpoints-Dhgowovz.js.map +1 -0
  28. package/dist/generate-1BeQAd1O.d.ts +72 -0
  29. package/dist/generate-1BeQAd1O.d.ts.map +1 -0
  30. package/dist/{generate-9pR3i5Bj.js → generate-CKv86Iki.js} +1724 -627
  31. package/dist/generate-CKv86Iki.js.map +1 -0
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +2 -2
  34. package/dist/next-loader.d.ts +9 -2
  35. package/dist/next-loader.d.ts.map +1 -1
  36. package/dist/next-loader.js +12 -3
  37. package/dist/next-loader.js.map +1 -1
  38. package/dist/next.d.ts +11 -3
  39. package/dist/next.d.ts.map +1 -1
  40. package/dist/next.js +94 -21
  41. package/dist/next.js.map +1 -1
  42. package/dist/preact/index.d.ts +34 -0
  43. package/dist/preact/index.d.ts.map +1 -0
  44. package/dist/preact/index.js +72 -0
  45. package/dist/preact/index.js.map +1 -0
  46. package/dist/react/index.d.ts +5 -14
  47. package/dist/react/index.d.ts.map +1 -1
  48. package/dist/react/index.js +9 -33
  49. package/dist/react/index.js.map +1 -1
  50. package/dist/react/server.d.ts +1 -1
  51. package/dist/react/server.js +1 -1
  52. package/dist/{sarif-CWyTAQ0y.js → sarif-BnwYC78_.js} +8 -98
  53. package/dist/sarif-BnwYC78_.js.map +1 -0
  54. package/dist/{scan-Bx0_yDSi.js → scan-C0ap4Mpp.js} +145 -20
  55. package/dist/scan-C0ap4Mpp.js.map +1 -0
  56. package/dist/solid/index.d.ts +29 -0
  57. package/dist/solid/index.d.ts.map +1 -0
  58. package/dist/solid/index.js +48 -0
  59. package/dist/solid/index.js.map +1 -0
  60. package/dist/svelte/Text.svelte +13 -0
  61. package/dist/svelte/Text.svelte.d.ts +20 -0
  62. package/dist/svelte/index.d.ts +31 -0
  63. package/dist/svelte/index.d.ts.map +1 -0
  64. package/dist/svelte/index.js +35 -0
  65. package/dist/svelte/index.js.map +1 -0
  66. package/dist/tools.d.ts +44 -65
  67. package/dist/tools.d.ts.map +1 -1
  68. package/dist/tools.js +5 -5
  69. package/dist/vite.d.ts +13 -3
  70. package/dist/vite.d.ts.map +1 -1
  71. package/dist/vite.js +82 -25
  72. package/dist/vite.js.map +1 -1
  73. package/dist/vue/index.d.ts +43 -0
  74. package/dist/vue/index.d.ts.map +1 -0
  75. package/dist/vue/index.js +76 -0
  76. package/dist/vue/index.js.map +1 -0
  77. package/package.json +63 -7
  78. package/src/bun.ts +77 -20
  79. package/src/cli.ts +62 -8
  80. package/src/index.ts +1 -1
  81. package/src/next-loader.ts +17 -5
  82. package/src/next.ts +120 -16
  83. package/src/preact/index.ts +91 -0
  84. package/src/react/index.tsx +12 -42
  85. package/src/runtime/bind.ts +96 -0
  86. package/src/runtime/copy.ts +148 -24
  87. package/src/solid/index.ts +67 -0
  88. package/src/svelte/Text.svelte +13 -0
  89. package/src/svelte/Text.svelte.d.ts +20 -0
  90. package/src/svelte/index.ts +65 -0
  91. package/src/tools/bundle.ts +143 -2
  92. package/src/tools/catalog.ts +10 -1
  93. package/src/tools/chunks.ts +142 -0
  94. package/src/tools/config.ts +25 -7
  95. package/src/tools/entry.ts +19 -20
  96. package/src/tools/exchange.ts +275 -0
  97. package/src/tools/extract.ts +2 -2
  98. package/src/tools/generate.ts +7 -1
  99. package/src/tools/index.ts +2 -1
  100. package/src/tools/native/android.ts +186 -0
  101. package/src/tools/native/apple.ts +201 -0
  102. package/src/tools/native/date.ts +219 -0
  103. package/src/tools/native/index.ts +17 -5
  104. package/src/tools/native/kotlin.ts +47 -6
  105. package/src/tools/native/model.ts +67 -29
  106. package/src/tools/native/printf.ts +137 -0
  107. package/src/tools/native/rust.ts +86 -5
  108. package/src/tools/native/swift.ts +62 -6
  109. package/src/tools/scan.ts +146 -25
  110. package/src/tools/todo.ts +6 -1
  111. package/src/vite.ts +121 -28
  112. package/src/vue/index.ts +117 -0
  113. package/dist/bundle-DboItAre.js +0 -111
  114. package/dist/bundle-DboItAre.js.map +0 -1
  115. package/dist/bundle-KD-DiiFa.d.ts.map +0 -1
  116. package/dist/compile-xF3F4oIp.d.ts +0 -16
  117. package/dist/compile-xF3F4oIp.d.ts.map +0 -1
  118. package/dist/copy-B3V_QRkT.d.ts.map +0 -1
  119. package/dist/copy-Bo_FIoLy.js +0 -154
  120. package/dist/copy-Bo_FIoLy.js.map +0 -1
  121. package/dist/endpoints-CnUfCkIk.js +0 -96
  122. package/dist/endpoints-CnUfCkIk.js.map +0 -1
  123. package/dist/generate-9pR3i5Bj.js.map +0 -1
  124. package/dist/sarif-CWyTAQ0y.js.map +0 -1
  125. package/dist/scan-Bx0_yDSi.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-CKv86Iki.js","names":["print","escape","numberStyle","resolve","parseMessage","FIELDS","readEntry","parseYaml","TYPE","escape","ENTITIES","parse","SAMPLES","TYPE","TYPE","KEYWORDS","escape","value","PRINTF","PLURALS","TYPE","TYPE","KEYWORDS","ident","lit","argName","doc","expr","value","member","formatConst","dateFn","DATE","NUMBER","PLURAL","KEYWORDS","ident","lit","argName","doc","expr","value","formatConst","dateFn","DATE","NUMBER","PLURAL","doc","TYPE"],"sources":["../src/tools/mf1.ts","../src/tools/mf2.ts","../src/tools/syntax.ts","../src/tools/catalog.ts","../src/tools/diff.ts","../src/tools/lock.ts","../src/tools/todo.ts","../src/tools/exchange.ts","../src/tools/entry.ts","../src/tools/native/emit.ts","../src/tools/native/date.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/printf.ts","../src/tools/native/android.ts","../src/tools/native/apple.ts","../src/tools/native/kotlin.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\n/** The first line of a catalog file: the YAML language server finds the schema `generate` writes only through it. */\nexport const SCHEMA_LINE = '# yaml-language-server: $schema=./catalog.schema.json';\n\n/** `text` opening with the schema line, unless it opens with a schema line of its own already. */\nexport function withSchemaLine(text: string): string {\n if (text.startsWith('# yaml-language-server:')) return text;\n return `${SCHEMA_LINE}${text.includes('\\r\\n') ? '\\r\\n' : '\\n'}${text}`;\n}\n\nexport function 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 * 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 * `prosebook todo`: a locale's missing and stale entries, each with what a translator needs above it,\n * as the YAML to fill in. `prosebook import` reads it back filled.\n *\n * With `prompt`, it leads with what a model must be told to reply in that form. prosebook writes the\n * prompt and checks the reply; which model answers it, and how, is left to whoever runs it.\n */\nimport { stringify } from 'yaml';\n\nimport type { Catalog, Message } from './catalog.ts';\nimport type { ResolvedConfig } from './config.ts';\nimport { TYPE, walk } from './icu.ts';\nimport { changeOf, type StaleTranslation } from './lock.ts';\nimport { SYNTAX_NAME } from './syntax.ts';\n\nexport interface Todo {\n /** How many entries want a translation. */\n count: number;\n /** The entries as YAML, by area, with the prompt first when one was asked for. */\n text: string;\n}\n\nexport function todoOf(\n config: ResolvedConfig,\n catalog: Catalog,\n stale: ReadonlyMap<string, StaleTranslation>,\n locale: string,\n prompt = false,\n): Todo {\n const wanted = todoMessages(catalog, stale, locale);\n if (wanted.length === 0) return { count: 0, text: `# ${locale} is complete` };\n const byArea = new Map<string, string[]>();\n for (const m of wanted) {\n const lines = byArea.get(m.area) ?? [];\n lines.push('');\n if (m.context) lines.push(`# ${m.context}`);\n const what = [m.kind && `kind: ${m.kind}`, m.surface && `surface: ${m.surface}`].filter(Boolean).join(', ');\n if (what) lines.push(`# ${what}`);\n for (const [arg, said] of m.argDocs) lines.push(`# {${arg}}: ${said}`);\n lines.push(`# ${config.source}: ${m.text.replaceAll('\\n', ' ')}`);\n const change = stale.get(m.key);\n if (change !== undefined) lines.push(`# stale, the source changed: ${changeOf(change)}`);\n lines.push(stringify({ [m.key]: m.translations.get(locale)?.text ?? '' }, { lineWidth: 0 }).trimEnd());\n byArea.set(m.area, lines);\n }\n const entries = [...byArea].map(([area, lines]) => `\\n# ── ${area}.yaml ──\\n${lines.join('\\n')}`).join('\\n');\n const count = wanted.length;\n if (prompt) {\n const head = promptFor(\n config,\n wanted,\n locale,\n wanted.some((m) => stale.has(m.key)),\n );\n return { count, text: `${head}\\n${entries.trimStart()}\\n\\`\\`\\`` };\n }\n const head = `# prosebook todo: ${count} entr${count === 1 ? 'y' : 'ies'} for ${locale}. Fill them in, then \\`prosebook import ${locale} <this file>\\`.`;\n return { count, text: `${head}\\n${entries}` };\n}\n\n/** The entries a locale wants a translation of: those it lacks, and those gone stale. */\nexport function todoMessages(catalog: Catalog, stale: ReadonlyMap<string, StaleTranslation>, locale: string): Message[] {\n return catalog.messages.filter((m) => !m.translations.has(locale) || stale.has(m.key));\n}\n\nfunction promptFor(config: ResolvedConfig, wanted: Message[], locale: string, anyStale: boolean): string {\n const mf2 = config.messageFormat === 2;\n const [target, source] = [nameOf(locale), nameOf(config.source)];\n const plurals = { cardinal: false, ordinal: false };\n for (const m of wanted) {\n walk(m.ast, (el) => {\n if (el.type === TYPE.plural) plurals[el.pluralType === 'ordinal' ? 'ordinal' : 'cardinal'] = true;\n });\n }\n const categories = (type: Intl.PluralRuleType) => {\n const forms = new Intl.PluralRules(locale, { type }).resolvedOptions().pluralCategories;\n return forms.length === 1 ? `only the form ${forms[0]}` : `the forms ${new Intl.ListFormat('en').format(forms)}`;\n };\n const exact = mf2 ? '`0`' : '`=0`';\n\n const rules = [\n mf2\n ? `Each message is in MessageFormat 2. Keep every {$placeholder}, every markup tag ({#b}…{/b}) around the same words, and every .input, .local and .match line; translate the text, not the names.`\n : `Each message is in ICU MessageFormat. Keep every {placeholder}, and every <tag> around the same words; translate the text inside plural and select arms, not the arm or argument names.`,\n plurals.cardinal &&\n `A plural in ${target} takes ${categories('cardinal')}: give each its own ${mf2 ? 'variant' : 'arm'}, and keep exact ones such as ${exact} where the ${source} has them.`,\n plurals.ordinal && `An ordinal in ${target} takes ${categories('ordinal')}.`,\n 'The comments above an entry say where it appears, what kind of string it is, and what each placeholder holds. Hold each to its kind, as described below: a button stays as short as the source.',\n anyStale &&\n 'An entry marked stale has a translation made from an earlier source. The diff shows what changed in the source ({+added+}, [-removed-]): change the translation only as much as that needs, and give it back unchanged if it still holds.',\n 'Quote a value in single quotes when it starts with { or holds \": \", as YAML needs, and double any single quote inside it.',\n ].filter((r): r is string => typeof r === 'string');\n\n const kinds = new Set(wanted.flatMap((m) => (m.kind === undefined ? [] : [m.kind])));\n const surfaces = new Set(wanted.flatMap((m) => (m.surface === undefined ? [] : [m.surface])));\n const legend = [\n ...(kinds.size > 0 ? ['', 'Kinds of string:'] : []),\n ...[...kinds].map((k) => `- ${k}: ${config.kinds[k]?.doc ?? ''}`),\n ...(surfaces.size > 0 ? ['', 'Surfaces:'] : []),\n ...[...surfaces].map((s) => `- ${s}: ${config.surfaces[s] ?? ''}`),\n ];\n\n return [\n `Translate the entries below from ${source} (${config.source}) into ${target} (${locale}). They are the text of an app's interface.`,\n '',\n 'Reply with one YAML code block holding every key below, each with its translation as the value, and nothing else in the block.',\n '',\n ...rules.map((r) => `- ${r}`),\n ...legend,\n '',\n `The entries, in ${SYNTAX_NAME[config.messageFormat]}:`,\n '',\n '```yaml',\n ].join('\\n');\n}\n\nfunction nameOf(locale: string): string {\n try {\n return new Intl.DisplayNames(['en'], { type: 'language' }).of(locale) ?? locale;\n } catch {\n return locale;\n }\n}\n","/**\n * `prosebook export`: a locale's entries as XLIFF 2.0 or JSON, for translation tools, and the reader\n * `prosebook import` takes every format back through, todo's YAML and a model's reply included.\n *\n * Messages travel as their ICU or MF2 text, not as XLIFF's inline codes: a plural or a select has no\n * inline form, and the tools that take these files read ICU. A unit carries its source as exported, so\n * a translation of a source that has changed since is refused rather than written as current.\n */\nimport { isMap, isScalar, parseDocument, type YAMLMap } from 'yaml';\n\nimport type { Catalog, Message } from './catalog.ts';\nimport type { ResolvedConfig } from './config.ts';\nimport { changeOf, type StaleTranslation } from './lock.ts';\nimport { todoMessages } from './todo.ts';\n\nexport type ExchangeFormat = 'xliff' | 'json';\n\nexport interface Exported {\n /** How many entries the file holds. */\n count: number;\n text: string;\n}\n\n/**\n * The entries `todo` would list for `locale`, or every one with `all`, as a file a translation tool\n * reads. The source locale exports every entry, untranslated, for a tool to take as its source.\n */\nexport function exportOf(\n config: ResolvedConfig,\n catalog: Catalog,\n stale: ReadonlyMap<string, StaleTranslation>,\n locale: string,\n format: ExchangeFormat,\n all = false,\n): Exported {\n const isSource = locale === config.source;\n const messages = all || isSource ? catalog.messages : todoMessages(catalog, stale, locale);\n if (messages.length === 0) return { count: 0, text: '' };\n const textOf = (m: Message) => (isSource ? m.text : m.translations.get(locale)?.text);\n if (format === 'json') {\n const json = JSON.stringify(Object.fromEntries(messages.map((m) => [m.key, textOf(m) ?? ''])), null, 2);\n return { count: messages.length, text: `${json}\\n` };\n }\n\n const byArea = new Map<string, Message[]>();\n for (const m of messages) byArea.set(m.area, [...(byArea.get(m.area) ?? []), m]);\n const lines = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n `<xliff xmlns=\"urn:oasis:names:tc:xliff:document:2.0\" version=\"2.0\" srcLang=\"${escape(config.source)}\"${isSource ? '' : ` trgLang=\"${escape(locale)}\"`}>`,\n ];\n for (const [area, list] of byArea) {\n // Newlines and runs of spaces in a message are its own, which a tool may not normalize away.\n lines.push(` <file id=\"${escape(area)}\" original=\"${escape(list[0]!.file)}\" xml:space=\"preserve\">`);\n for (const m of list) {\n lines.push(` <unit id=\"${m.key}\">`);\n const notes = [\n ['context', m.context],\n ['kind', m.kind],\n ['surface', m.surface],\n ...[...m.argDocs].map(([arg, said]) => ['placeholder', `{${arg}}: ${said}`]),\n ['stale', isSource || !stale.has(m.key) ? undefined : `the source changed: ${changeOf(stale.get(m.key)!)}`],\n ].filter((n): n is [string, string] => n[1] !== undefined);\n if (notes.length > 0) {\n lines.push(' <notes>');\n for (const [category, text] of notes) lines.push(` <note category=\"${category}\">${escape(text)}</note>`);\n lines.push(' </notes>');\n }\n const target = textOf(m);\n // A stale translation goes out as `initial`: given back as `translated`, someone looked at it.\n const state = isSource ? '' : ` state=\"${target === undefined || stale.has(m.key) ? 'initial' : 'translated'}\"`;\n lines.push(` <segment${state}>`, ` <source>${escape(m.text)}</source>`);\n if (!isSource && target !== undefined) lines.push(` <target>${escape(target)}</target>`);\n lines.push(' </segment>', ' </unit>');\n }\n lines.push(' </file>');\n }\n lines.push('</xliff>');\n return { count: messages.length, text: `${lines.join('\\n')}\\n` };\n}\n\n/** A translation as a file gives it back, before it is checked against the catalog. */\nexport interface Returned {\n key: string;\n /** Null or empty is left for later. Anything but text or a number is refused. */\n value: unknown;\n /** Someone looked at it, so one given back unchanged still holds. A YAML or JSON reply always has. */\n checked: boolean;\n /** The source it was made from, where the file says. */\n source?: string;\n /** Why the file's entry can't be read, which leaves it out. */\n problem?: string;\n}\n\n/**\n * The translations in a file `import` was given: XLIFF 2.0 when it starts as XML, otherwise YAML,\n * which reads JSON too. Text around fenced blocks is left aside, as a model's reply has it. A nested\n * mapping, as some tools write JSON, joins its keys with dots.\n */\nexport function readReturned(text: string, locale: string, source: string): { returned: Returned[] } | { problem: string } {\n if (text.trimStart().startsWith('<')) return readXliff(text, locale, source);\n const fenced = [...text.matchAll(/^```[^\\n]*\\n([\\s\\S]*?)^```/gm)].map((m) => m[1]);\n const doc = parseDocument(fenced.length > 0 ? fenced.join('\\n') : text);\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 { problem: `the reply isn't YAML or JSON of \\`key: translation\\` (${why}): fix it, or ask for one YAML block` };\n }\n const returned: Returned[] = [];\n const flatten = (map: YAMLMap, prefix: string) => {\n for (const pair of map.items) {\n const key = prefix + (isScalar(pair.key) ? String(pair.key.value) : String(pair.key));\n if (isMap(pair.value)) flatten(pair.value, `${key}.`);\n else returned.push({ key, value: isScalar(pair.value) ? pair.value.value : pair.value, checked: true });\n }\n };\n if (isMap(doc.contents)) flatten(doc.contents, '');\n return { returned };\n}\n\nfunction readXliff(text: string, locale: string, source: string): { returned: Returned[] } | { problem: string } {\n let root: XmlElement;\n try {\n root = parseXml(text);\n } catch (e) {\n return { problem: `the file isn't XML (${messageOf(e)}): give it back as the tool exported it` };\n }\n if (root.name !== 'xliff') return { problem: `the file is <${root.name}>, not XLIFF: export it from the tool as XLIFF 2.0` };\n if (!root.attrs.version?.startsWith('2.'))\n return { problem: `the file is XLIFF ${root.attrs.version ?? 'of no version'}: export it from the tool as XLIFF 2.0` };\n const { srcLang, trgLang } = root.attrs;\n if (srcLang !== undefined && srcLang.toLowerCase() !== source.toLowerCase())\n return { problem: `the file translates from ${srcLang}, and the source is ${source}: export it again from prosebook` };\n if (trgLang === undefined)\n return { problem: `the file names no trgLang: give it the ${locale} translations, or set trgLang=\"${locale}\"` };\n if (trgLang.toLowerCase() !== locale.toLowerCase())\n return { problem: `the file translates into ${trgLang}, not ${locale}: import it as ${trgLang}` };\n\n const returned: Returned[] = [];\n const units = (el: XmlElement): XmlElement[] =>\n elements(el).flatMap((child) =>\n child.name === 'unit' ? [child] : child.name === 'file' || child.name === 'group' ? units(child) : [],\n );\n for (const unit of units(root)) {\n const key = unit.attrs.id ?? '';\n // A tool may split a unit into sentences: its text is every part's in order, what lies between them included.\n const parts = elements(unit).filter((el) => el.name === 'segment' || el.name === 'ignorable');\n const segments = parts.filter((el) => el.name === 'segment');\n const sourceOf = (el: XmlElement) => elements(el).find((c) => c.name === 'source');\n const targetOf = (el: XmlElement) => elements(el).find((c) => c.name === 'target');\n try {\n const unitSource = parts.map((p) => textOf(sourceOf(p))).join('');\n const translated = segments.filter((s) => targetOf(s) !== undefined).length;\n if (translated === 0) {\n returned.push({ key, value: null, checked: false, source: unitSource });\n continue;\n }\n if (translated < segments.length)\n throw new Error(`${translated} of its ${segments.length} segments are translated: translate the rest`);\n const value = parts.map((p) => textOf(targetOf(p) ?? sourceOf(p))).join('');\n // XLIFF's default state is `initial`: nobody has looked at it yet.\n const checked = segments.every((s) => (s.attrs.state ?? 'initial') !== 'initial');\n returned.push({ key, value, checked, source: unitSource });\n } catch (e) {\n returned.push({ key, value: null, checked: false, problem: messageOf(e) });\n }\n }\n return { returned };\n}\n\n/** The text of a <source> or <target>, refusing XLIFF's inline codes, which prosebook never writes. */\nfunction textOf(el: XmlElement | undefined): string {\n if (el === undefined) return '';\n return el.children\n .map((child) => {\n if (typeof child === 'string') return child;\n // <cp> holds a character XML can't.\n if (child.name === 'cp' && child.attrs.hex !== undefined) return String.fromCodePoint(Number.parseInt(child.attrs.hex, 16));\n throw new Error(`the ${el.name} holds an inline <${child.name}>: have the tool keep placeholders as the text they were exported as`);\n })\n .join('');\n}\n\nconst messageOf = (e: unknown) => (e instanceof Error ? e.message : String(e));\n\nconst escape = (s: string) => s.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('\"', '&quot;');\n\ninterface XmlElement {\n /** Without its namespace prefix. */\n name: string;\n attrs: Record<string, string>;\n children: (XmlElement | string)[];\n}\n\nconst elements = (el: XmlElement) => el.children.filter((c): c is XmlElement => typeof c !== 'string');\n\nconst ENTITIES: Record<string, string> = { amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\" };\n\nfunction decode(s: string, at: number): string {\n return s.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z]+);/gi, (_, ref: string) => {\n if (ref.startsWith('#x') || ref.startsWith('#X')) return String.fromCodePoint(Number.parseInt(ref.slice(2), 16));\n if (ref.startsWith('#')) return String.fromCodePoint(Number.parseInt(ref.slice(1), 10));\n const char = ENTITIES[ref];\n if (char === undefined) throw new Error(`&${ref}; near offset ${at} is no XML entity`);\n return char;\n });\n}\n\n/**\n * Just enough XML for XLIFF: elements, attributes, text, CDATA and character references. Comments,\n * processing instructions and a doctype are skipped; no DTD is read, so no entity of one is known.\n */\nfunction parseXml(text: string): XmlElement {\n const document: XmlElement = { name: '', attrs: {}, children: [] };\n const open: XmlElement[] = [document];\n let i = 0;\n const skip = (from: string, to: string) => {\n const end = text.indexOf(to, i + from.length);\n if (end === -1) throw new Error(`${from} at offset ${i} never ends`);\n const body = text.slice(i + from.length, end);\n i = end + to.length;\n return body;\n };\n while (i < text.length) {\n const lt = text.indexOf('<', i);\n const parent = open.at(-1)!;\n if (lt !== i) {\n const end = lt === -1 ? text.length : lt;\n if (open.length > 1) parent.children.push(decode(text.slice(i, end), i));\n else if (text.slice(i, end).trim() !== '') throw new Error(`text at offset ${i} is outside the root element`);\n i = end;\n continue;\n }\n if (text.startsWith('<!--', i)) {\n skip('<!--', '-->');\n continue;\n }\n if (text.startsWith('<?', i)) {\n skip('<?', '?>');\n continue;\n }\n if (text.startsWith('<![CDATA[', i)) {\n parent.children.push(skip('<![CDATA[', ']]>'));\n continue;\n }\n if (text.startsWith('<!', i)) {\n skip('<!', '>');\n continue;\n }\n if (text.startsWith('</', i)) {\n const at = i;\n const name = localName(skip('</', '>').trim());\n if (open.length === 1 || parent.name !== name) throw new Error(`</${name}> at offset ${at} closes nothing open`);\n open.pop();\n continue;\n }\n TAG.lastIndex = i;\n const tag = TAG.exec(text);\n if (tag === null) throw new Error(`the tag at offset ${i} is malformed`);\n const attrs: Record<string, string> = {};\n for (const [, name, double, single] of tag[2]!.matchAll(/([^\\s=]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g))\n attrs[localName(name!)] = decode(double ?? single ?? '', i);\n const el: XmlElement = { name: localName(tag[1]!), attrs, children: [] };\n if (open.length === 1 && document.children.length > 0) throw new Error(`a second root element at offset ${i}`);\n parent.children.push(el);\n if (tag[3] !== '/') open.push(el);\n i += tag[0].length;\n }\n if (open.length > 1) throw new Error(`<${open.at(-1)!.name}> is never closed`);\n const root = elements(document)[0];\n if (root === undefined) throw new Error('there is no element');\n return root;\n}\n\nconst TAG = /<([^\\s/>]+)((?:\\s+[^\\s=/>]+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'))*)\\s*(\\/?)>/y;\n\nconst localName = (name: string) => name.slice(name.indexOf(':') + 1);\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 { readReturned } from './exchange.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, or from\n * a translation tool's XLIFF or JSON (`readReturned`), each written to the file its locale and area\n * put it in. An empty value is one left for later. An entry that would break the catalog is left out\n * 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 read = readReturned(reply, locale, config.source);\n if ('problem' in read) return { written: [], unchanged: [], problems: [failed(read.problem)] };\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 { key, value, checked, source, problem } of read.returned) {\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` or `export` gave out', key));\n continue;\n }\n if (problem !== undefined) {\n problems.push(failed(problem, key));\n continue;\n }\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 if (source !== undefined && source !== message.text) {\n problems.push(failed(`the source has changed since it was exported, to \"${message.text}\": export it again`, key));\n continue;\n }\n const text = String(value);\n if (text !== message.translations.get(locale)?.text) pending.set(key, { file: translationFile(config, message, locale), text });\n else if (checked) unchanged.push(key);\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 * 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 * A date format taken apart at build time, as `number.ts` takes numbers apart: the text between the\n * fields, how each field is written (a number, padded or not, or a name from a table), and the\n * locale's digits. Read from `Intl.DateTimeFormat` and checked against it on dates that cover every\n * month, weekday and hour before any code is written, so native code says what the browser says, or\n * the build says why it can't.\n *\n * Native code reads the fields of the date as the clock shows them in its time zone, and only the\n * Gregorian calendar: a format that names a time zone, or counts in another calendar, is refused.\n */\n\n/** A part of a formatted date. */\nexport type DatePiece =\n | { type: 'text'; value: string }\n /** The field as a number, padded with zeros to `pad` digits. `year2` is the year's last two digits. */\n | { type: 'number'; field: 'year' | 'year2' | 'month' | 'day' | 'minute' | 'second'; pad: number }\n /** The hour on the locale's clock: 1 to 12 (`h12`), 0 to 11 (`h11`), 0 to 23 (`h23`) or 1 to 24 (`h24`). */\n | { type: 'hour'; cycle: HourCycle; pad: number }\n /**\n * The field as a name from `names`: a month's January first, a weekday's Sunday first, and the day\n * period's before noon, then after, or one for each hour of the day.\n */\n | { type: 'name'; field: 'month' | 'weekday' | 'dayPeriod'; names: string[] };\n\nexport type HourCycle = 'h11' | 'h12' | 'h23' | 'h24';\n\nexport interface DateSpec {\n pieces: DatePiece[];\n /** The numbering system's digits, 0 to 9, where it isn't ASCII's. */\n digits?: string[];\n}\n\n/** A date as the clock shows it. */\nexport interface DateFields {\n year: number;\n /** 1 to 12. */\n month: number;\n day: number;\n hour: number;\n minute: number;\n second: number;\n /** 0 is Sunday. */\n weekday: number;\n}\n\n/** Dates the spec must format as `Intl` does: every month and weekday, midnight, noon and the hours around them, and two-digit years. */\nconst SAMPLES: number[] = [\n Date.UTC(2001, 0, 5, 1, 2, 3),\n Date.UTC(2001, 10, 25, 13, 42, 53),\n Date.UTC(1999, 11, 31, 23, 59, 59),\n Date.UTC(2000, 1, 29, 0, 0, 0),\n Date.UTC(2024, 6, 4, 12, 0, 0),\n Date.UTC(2024, 6, 4, 12, 30, 5),\n Date.UTC(1970, 0, 1, 0, 0, 0),\n Date.UTC(2099, 8, 9, 9, 9, 9),\n Date.UTC(2010, 4, 15, 18, 45, 0),\n Date.UTC(2026, 2, 10, 6, 15, 30),\n Date.UTC(2005, 9, 31, 21, 7, 41),\n ...Array.from({ length: 12 }, (_, m) => Date.UTC(2023, m, 1 + m * 2, m * 2, m * 5, m * 4)),\n ...Array.from({ length: 24 }, (_, h) => Date.UTC(2022, 3, 3 + (h % 7), h, 30, 0)),\n];\n\n/** The fields of a date in UTC, which the spec is checked in. */\nexport function fieldsOf(date: number): DateFields {\n const d = new Date(date);\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n weekday: d.getUTCDay(),\n };\n}\n\nconst HOUR_CYCLES = new Set<string>(['h11', 'h12', 'h23', 'h24']);\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 dateSpec(locale: string, options: Intl.DateTimeFormatOptions = {}): DateSpec {\n if (options.timeZone !== undefined) throw new Error(`it names the time zone ${options.timeZone}, which native code can't look up`);\n const format = new Intl.DateTimeFormat(locale, { ...options, timeZone: 'UTC' });\n const resolved = format.resolvedOptions();\n if (resolved.calendar !== 'gregory' && resolved.calendar !== 'iso8601') throw new Error(`it counts in the ${resolved.calendar} calendar`);\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 ascii = (text: string) => text.replace(/./gu, (c) => (digits.includes(c) ? String(digits.indexOf(c)) : c));\n /** The text `type` takes at `date`, in ASCII digits. */\n const partAt = (date: number, type: string) => ascii(format.formatToParts(date).find((p) => p.type === type)?.value ?? '');\n const isNumber = (text: string) => /^[0-9]+$/.test(text);\n const padOf = (date: number, type: string) => (partAt(date, type).startsWith('0') ? 2 : 1);\n\n const pieces: DatePiece[] = [];\n for (const part of format.formatToParts(SAMPLES[1])) {\n switch (part.type) {\n case 'literal':\n pieces.push({ type: 'text', value: part.value });\n break;\n case 'year':\n pieces.push(ascii(part.value) === '01' ? { type: 'number', field: 'year2', pad: 2 } : { type: 'number', field: 'year', pad: 1 });\n break;\n case 'month': {\n const names = Array.from(\n { length: 12 },\n (_, m) => format.formatToParts(Date.UTC(2023, m, 15, 12)).find((p) => p.type === 'month')!.value,\n );\n if (names.every((name) => isNumber(ascii(name))))\n pieces.push({ type: 'number', field: 'month', pad: padOf(Date.UTC(2023, 0, 15, 12), 'month') });\n else pieces.push({ type: 'name', field: 'month', names });\n break;\n }\n case 'day':\n pieces.push({ type: 'number', field: 'day', pad: padOf(Date.UTC(2023, 0, 5, 12), 'day') });\n break;\n case 'weekday':\n // 2023-01-01 is a Sunday.\n pieces.push({\n type: 'name',\n field: 'weekday',\n names: Array.from(\n { length: 7 },\n (_, d) => format.formatToParts(Date.UTC(2023, 0, 1 + d, 12)).find((p) => p.type === 'weekday')!.value,\n ),\n });\n break;\n case 'hour': {\n const cycle = resolved.hourCycle;\n if (cycle === undefined || !HOUR_CYCLES.has(cycle)) throw new Error('its hours follow no clock native code knows');\n pieces.push({ type: 'hour', cycle, pad: padOf(Date.UTC(2023, 0, 5, 1), 'hour') });\n break;\n }\n case 'minute':\n case 'second':\n pieces.push({ type: 'number', field: part.type, pad: padOf(Date.UTC(2023, 0, 5, 1, 5, 5), part.type) });\n break;\n case 'dayPeriod': {\n const byHour = Array.from(\n { length: 24 },\n (_, hour) => format.formatToParts(Date.UTC(2023, 0, 5, hour, 30)).find((p) => p.type === 'dayPeriod')!.value,\n );\n // Before noon and after, or a period by the hour (`zh-TW`'s 晚上, English's \"at night\").\n const halves = byHour.every((name, hour) => name === byHour[hour < 12 ? 0 : 12]);\n pieces.push({ type: 'name', field: 'dayPeriod', names: halves ? [byHour[0]!, byHour[12]!] : byHour });\n break;\n }\n case 'era':\n case 'fractionalSecond':\n case 'timeZoneName':\n case 'unknown':\n // A calendar's own parts, such as `relatedYear`, which the calendar check has already refused.\n default:\n throw new Error(`it writes the ${part.type as string}, which native code can't`);\n }\n }\n const spec: DateSpec = { pieces, ...(digits.join('') !== '0123456789' && { digits }) };\n for (const sample of SAMPLES) {\n const expected = format.format(sample);\n const actual = formatDate(spec, fieldsOf(sample));\n if (actual !== expected)\n throw new Error(`it writes ${new Date(sample).toISOString()} as \"${expected}\", which native code would write as \"${actual}\"`);\n }\n return spec;\n}\n\n/** The hour as a clock with `cycle` shows it. */\nexport function hourOn(cycle: HourCycle, hour: number): number {\n if (cycle === 'h23') return hour;\n if (cycle === 'h24') return hour === 0 ? 24 : hour;\n if (cycle === 'h11') return hour % 12;\n return ((hour + 11) % 12) + 1;\n}\n\n/** A date field as a target reads it, an integer expression. */\nexport type FieldAccess = (field: keyof DateFields) => string;\n\n/**\n * A piece's number, or a name piece's index into its names, as an expression in the integer\n * arithmetic Rust, Swift and Kotlin share. Keep in step with `formatDate`.\n */\nexport function pieceExpr(piece: Exclude<DatePiece, { type: 'text' }>, at: FieldAccess): string {\n if (piece.type === 'hour') {\n const hour = at('hour');\n if (piece.cycle === 'h23') return hour;\n if (piece.cycle === 'h24') return `(${hour} + 23) % 24 + 1`;\n return piece.cycle === 'h11' ? `${hour} % 12` : `(${hour} + 11) % 12 + 1`;\n }\n if (piece.type === 'number') return piece.field === 'year2' ? `(${at('year')} % 100 + 100) % 100` : at(piece.field);\n if (piece.field === 'month') return `${at('month')} - 1`;\n if (piece.field === 'weekday') return at('weekday');\n return piece.names.length === 24 ? at('hour') : `${at('hour')} / 12`;\n}\n\n/** Which of a name piece's `count` names `date` takes. */\nfunction nameIndex(field: 'month' | 'weekday' | 'dayPeriod', count: number, date: DateFields): number {\n if (field === 'month') return date.month - 1;\n if (field === 'weekday') return date.weekday;\n return count === 24 ? date.hour : date.hour < 12 ? 0 : 1;\n}\n\n/** `date` as the spec writes it: the reference for the code each target generates. */\nexport function formatDate(spec: DateSpec, date: DateFields): string {\n const digits = spec.digits;\n const number = (value: number, pad: number) => {\n const text = String(value).padStart(pad, '0');\n return digits === undefined ? text : text.replace(/[0-9]/g, (d) => digits[Number(d)]!);\n };\n return spec.pieces\n .map((piece) => {\n if (piece.type === 'text') return piece.value;\n if (piece.type === 'hour') return number(hourOn(piece.cycle, date.hour), piece.pad);\n if (piece.type === 'number') return number(piece.field === 'year2' ? ((date.year % 100) + 100) % 100 : date[piece.field], piece.pad);\n return piece.names[nameIndex(piece.field, piece.names.length, date)]!;\n })\n .join('');\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 { dateOptions, numberOptions, optionArgsOf, placeholderOf, selectionOf, TYPE, type MessageFormatElement } from '#src/tools/icu.ts';\nimport { dateSpec, type DateSpec } from './date.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 /** The argument, a date, in date format `format`. */\n | { type: 'date'; arg: string; format: number }\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' | 'date'; 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 dates: DateSpec[];\n rules: { name: string; rules: PluralRules }[];\n}\n\n/**\n * The words a target names `key` by, less the prefix that took it in (longest first): `tray.quit-app`\n * is quit, app under `['tray']`. Nothing when the target doesn't take the key.\n */\nexport function wordsFor(target: NativeTarget, key: string): string[] | undefined {\n return restOf(target, key)\n ?.split(/[.\\-_]/)\n .filter(Boolean);\n}\n\n/** `key` less the prefix that took it in, as written: `tray.quit-app` is `quit-app` under `['tray']`. */\nexport function restOf(target: NativeTarget, key: string): string | undefined {\n const prefix = target.keys === undefined ? '' : [...target.keys].sort((a, b) => b.length - a.length).find((p) => key.startsWith(`${p}.`));\n if (prefix === undefined) return undefined;\n return key.slice(prefix === '' ? 0 : prefix.length + 1);\n}\n\n/** The locale whose text `locale` shows for `key`: its own, else the first down its fallback chain that has it. */\nexport function foundIn(key: string, locale: string, locales: string[], asts: Map<string, Map<string, MessageFormatElement[]>>) {\n return chainOf(locale, locales, locales[0]!).find((l) => asts.get(l)?.has(key));\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 dates = new Numbered<DateSpec>();\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 words = wordsFor(target, m.key);\n if (words === undefined) continue;\n const bodies = new Map<string, { locales: string[]; parts: Part[] }>();\n let failed = false;\n for (const locale of locales) {\n const found = foundIn(m.key, locale, locales, asts);\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, dates, 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' : type === 'Date | number' ? 'date' : '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, dates: dates.list, rules: rules.list }, problems };\n}\n\nexport function 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\nexport const 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\n/** What a file declares, numbered as the messages use it. */\ninterface Declared {\n formats: Numbered<NumberSpec>;\n dates: Numbered<DateSpec>;\n rules: Numbered<{ name: string; rules: PluralRules }>;\n}\n\n/** Date specs as `SPECS` keeps number specs. */\nconst DATE_SPECS = new Map<string, DateSpec | Error>();\n\nfunction date(dates: Numbered<DateSpec>, locale: string, options: Intl.DateTimeFormatOptions | undefined): number {\n const key = JSON.stringify([locale, options ?? {}]);\n let spec = DATE_SPECS.get(key);\n if (spec === undefined) {\n try {\n spec = dateSpec(locale, options);\n } catch (e) {\n spec = new Error(`native code can't format this date in ${locale}: ${(e as Error).message}. Format it another way, ${LEAVE_OUT}`, {\n cause: e,\n });\n }\n DATE_SPECS.set(key, spec);\n }\n if (spec instanceof Error) throw spec;\n return dates.add(spec);\n}\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(elements: MessageFormatElement[], locale: string, declared: Declared, pound: Pound): Part[] {\n const { formats, dates, rules } = declared;\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, declared, 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 placed(el, el.value, { type: 'date', arg: el.value, format: date(dates, locale, dateOptions(el)) });\n continue;\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 * Messages as printf-style format strings, for the targets whose platform fills values in itself:\n * Android's resources and Apple's `.strings` and `.stringsdict` files. Text and plain `{name}` placeholders, as `%N$s`\n * with N the argument's place in the message's arguments, so a translation can put them in another\n * order; anything `Intl` would format fails with the fix.\n */\nimport { isDateElement, isNumberElement, isTimeElement } from '@formatjs/icu-messageformat-parser';\n\nimport type { PluralElement } from '@formatjs/icu-messageformat-parser';\nimport type { Message } from '#src/tools/catalog.ts';\n\nimport { numberOptions, placeholderOf, selectionOf, TYPE, type MessageFormatElement } from '#src/tools/icu.ts';\nimport { docText } from './emit.ts';\nimport { LEAVE_OUT } from './model.ts';\n\nexport interface Printf {\n /** Who fills values in, and with what, as problems name them: `Android`, `String.format`. */\n platform: string;\n formatter: string;\n /** What holds the text, as problems name it: `Android resources`. */\n holder: string;\n /** A string argument's conversion: `s`, or `@` for Apple's objects. */\n string: string;\n /** A count's conversion: `d`, or `lld` for Apple's 64-bit `Int`. */\n count: string;\n /** Text as the file holds it; `formatted` when the string has arguments, so `%` must be doubled. */\n escape: (text: string, formatted: boolean) => string;\n /** The problem with a plural the target can't hold where it is. */\n plural: (name: string) => string;\n}\n\n/** The context and what each argument holds, on one line, for the comment above an entry. */\nexport function noteOf(m: Message): string {\n const lines = [\n m.context,\n ...[...m.args.keys()].map((a) => (m.argDocs.has(a) ? `${a}: ${m.argDocs.get(a)!.replace(/\\.$/, '')}.` : undefined)),\n ];\n return docText(lines.filter((l) => l !== undefined && l !== '').join(' '));\n}\n\n/** What a plural's arms may hold as its count: `#`, or the count as a plain `:number` or `:integer`. */\nfunction isCount(el: MessageFormatElement, count: string): boolean {\n if (el.type === TYPE.pound) return true;\n if (!isNumberElement(el) || el.value !== count) return false;\n const options = Object.entries(numberOptions(el) ?? {});\n return options.length === 0 || (options.length === 1 && options[0]![0] === 'maximumFractionDigits' && options[0]![1] === 0);\n}\n\n/** What a platform's plurals are called in problems, and what they can't hold. */\nexport interface PluralHolder {\n /** `Android`, as in \"Android selects on the count as an integer\". */\n platform: string;\n /** `Android's <plurals>`. */\n plurals: string;\n /** Why an `=N` arm has no place, after \"have none for one number\". */\n exact: string;\n}\n\n/**\n * Throws, with the fix, where a plural asks for more than a platform's plurals pick on: one count,\n * as an integer, by its cardinal category.\n */\nexport function checkPlural(plural: PluralElement, holder: PluralHolder): void {\n const named = `{${plural.value}}`;\n if (plural.pluralType === 'ordinal') {\n throw new Error(\n `${named} is an ordinal, and ${holder.plurals} are cardinal only: write a key per case and pick one in code, ${LEAVE_OUT}`,\n );\n }\n if (plural.offset !== 0)\n throw new Error(`${named} has an offset, which ${holder.plurals} don't: count without it, and say the rest in each arm, ${LEAVE_OUT}`);\n\n const selection = selectionOf(plural);\n if (selection !== undefined && (selection.fn.name !== 'integer' || Object.keys(selection.fn.options).length > 0)) {\n throw new Error(\n `${named} selects with :${selection.fn.name} and its options, and ${holder.platform} selects on the count as an integer: select with a bare :number or :integer, ${LEAVE_OUT}`,\n );\n }\n const exact = Object.keys(plural.options).filter((k) => k.startsWith('='));\n if (exact.length > 0) {\n throw new Error(\n `${named} has the arm ${exact.join(', ')}, and ${holder.plurals} have none for one number${holder.exact}: say it in a category's arm, or write a key for it and pick that in code, ${LEAVE_OUT}`,\n );\n }\n}\n\n/** `elements` as a format string over `args`; inside a plural, its `count` is `%N$d` (or `lld`). */\nexport function formatString(elements: MessageFormatElement[], args: string[], printf: Printf, count?: string): string {\n const formatted = args.length > 0;\n const place = (el: MessageFormatElement, name: string, conversion: string) => {\n const at = args.indexOf(name);\n if (at < 0) throw new Error(`{${name}} is not an argument of this message: say it in the source text too`);\n const { isolate } = placeholderOf(el, name);\n const spec = `%${at + 1}$${conversion}`;\n return isolate === undefined ? spec : `${printf.escape(isolate[0], formatted)}${spec}${printf.escape(isolate[1], formatted)}`;\n };\n let out = '';\n for (const el of elements) {\n if (count !== undefined && isCount(el, count)) {\n out += place(el, count, printf.count);\n continue;\n }\n if (isDateElement(el) || isTimeElement(el)) {\n throw new Error(\n `{${el.value}} is a date, which ${printf.holder} don't format: pass it formatted, as a plain {${el.value}}, ${LEAVE_OUT}`,\n );\n }\n if (isNumberElement(el)) {\n throw new Error(\n `{${el.value}} is a formatted number, and ${printf.platform} fills values in with ${printf.formatter}, not Intl: pass it formatted, as a plain {${el.value}}, ${LEAVE_OUT}`,\n );\n }\n switch (el.type) {\n case TYPE.literal:\n out += printf.escape(el.value, formatted);\n break;\n case TYPE.argument:\n out += place(el, el.value, printf.string);\n break;\n case TYPE.pound:\n // Outside a plural, `#` is text.\n out += '#';\n break;\n case TYPE.select:\n throw new Error(\n `{${el.value}} is a select, which ${printf.holder} can't hold: write a key per case and pick one in code, ${LEAVE_OUT}`,\n );\n case TYPE.plural:\n throw new Error(printf.plural(el.value));\n case TYPE.tag:\n throw new Error(`<${el.value}> is a tag, and ${printf.holder} here hold plain text: say it without the tag, ${LEAVE_OUT}`);\n default:\n throw new Error(`prosebook: no ${printf.platform} writer for ICU element type ${(el as MessageFormatElement).type}`);\n }\n }\n return out;\n}\n","/**\n * The catalog as Android string resources: `values/<name>.xml` for the source and\n * `values-<qualifier>/<name>.xml` for every other locale, each holding what that locale shows, every\n * fallback resolved. An app with the Kotlin target still needs these: its manifest, shortcuts and\n * other XML resources name strings as `@string/…`, which only a resource answers.\n *\n * Android fills values in with `String.format` and picks a plural's arm itself, from its own CLDR\n * rules, so this takes a narrower subset than the other targets, written straight from the ICU tree:\n * text, plain `{name}` placeholders, and one cardinal plural, with the text around it in each arm.\n */\nimport { join } from 'node:path';\n\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 { TYPE, type MessageFormatElement } from '#src/tools/icu.ts';\nimport { checkNames, leading, snake } from './emit.ts';\nimport { fileOf, foundIn, LEAVE_OUT, wordsFor } from './model.ts';\nimport { checkPlural, formatString, noteOf, type PluralHolder, type Printf } from './printf.ts';\n\nconst KEYWORDS = new Set(\n 'abstract assert boolean break byte case catch char class const continue default do double else enum extends false final finally float for goto if implements import instanceof int interface long native new null package private protected public return short static strictfp super switch synchronized this throw throws transient true try void volatile while'.split(\n ' ',\n ),\n);\n\n/**\n * A locale as Android's resource qualifier: `de`, `pt-rBR`, and BCP 47's own form, `b+sr+Latn`,\n * past what the old form holds (a script, a numeric region, a variant).\n */\nexport function qualifierOf(locale: string): string {\n const [language = '', ...rest] = locale.split(/[-_]/);\n const subtags = [\n language.toLowerCase(),\n ...rest.map((s) =>\n s.length === 4 && /^[a-z]+$/i.test(s)\n ? s.charAt(0).toUpperCase() + s.slice(1).toLowerCase()\n : s.length === 2\n ? s.toUpperCase()\n : s.toLowerCase(),\n ),\n ];\n const old = /^[a-z]{2,3}$/.test(subtags[0]!) && (rest.length === 0 || (rest.length === 1 && /^[A-Z]{2}$/.test(subtags[1]!)));\n if (!old) return `b+${subtags.join('+')}`;\n return rest.length === 0 ? subtags[0]! : `${subtags[0]}-r${subtags[1]}`;\n}\n\n/** Whitespace as aapt2 reads it: collapsed to one space, and trimmed at the ends, outside double quotes. */\nconst LOOSE = /^[ \\t\\n\\v\\f\\r]|[ \\t\\n\\v\\f\\r]$|[ \\t\\n\\v\\f\\r]{2}/;\n\n/**\n * Text as a resource holds it: XML's escapes, then Android's (`\\`, `'`, `\"`, a newline or a tab).\n * In a string that is formatted, `%` is doubled, so `String.format` writes one.\n */\nfunction escape(text: string, formatted: boolean): string {\n const out = text\n .replaceAll('\\\\', '\\\\\\\\')\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll(\"'\", \"\\\\'\")\n .replaceAll('\"', '\\\\\"')\n .replaceAll('\\n', '\\\\n')\n .replaceAll('\\t', '\\\\t');\n return formatted ? out.replaceAll('%', '%%') : out;\n}\n\n/**\n * A whole value: a leading `@` or `?` escaped, since either would make it a reference, and the value\n * quoted where its spaces would otherwise be collapsed or trimmed.\n */\nfunction value(written: string): string {\n const out = /^[@?]/.test(written) ? `\\\\${written}` : written;\n return LOOSE.test(out) ? `\"${out}\"` : out;\n}\n\nconst PRINTF: Printf = {\n platform: 'Android',\n formatter: 'String.format',\n holder: 'Android resources',\n string: 's',\n count: 'd',\n escape,\n plural: (name) =>\n `{${name}} is a second plural in the message, and Android's <plurals> picks on one count: split it into a key per count, ${LEAVE_OUT}`,\n};\n\nconst PLURALS: PluralHolder = {\n platform: 'Android',\n plurals: \"Android's <plurals>\",\n exact: ' (its zero is a category, which most languages never pick)',\n};\n\n/**\n * A message as `<string>`, or `<plurals>` when it holds a plural. Android's picks between whole\n * messages, so the text around the plural goes into each arm: the pseudo-locale's brackets, or a\n * sentence the plural ends.\n */\nfunction resource(name: string, ast: MessageFormatElement[], args: string[]): string {\n const at = ast.findIndex((el) => el.type === TYPE.plural);\n const plural = ast[at];\n if (plural?.type !== TYPE.plural) {\n const written = formatString(ast, args, PRINTF);\n // Unformatted, `%` is written as it is, which aapt2 refuses where it reads as two placeholders.\n const raw = args.length === 0 && written.includes('%') ? ' formatted=\"false\"' : '';\n return ` <string name=\"${name}\"${raw}>${value(written)}</string>`;\n }\n const [before, after] = [ast.slice(0, at), ast.slice(at + 1)];\n checkPlural(plural, PLURALS);\n const items = Object.entries(plural.options).map(\n ([category, option]) =>\n ` <item quantity=\"${category}\">${value(formatString([...before, ...option.value, ...after], args, PRINTF, plural.value))}</item>`,\n );\n return ` <plurals name=\"${name}\">\\n${items.join('\\n')}\\n </plurals>`;\n}\n\n/** The context and what each argument holds, as the comment above an entry. */\nfunction comment(m: Message): string {\n const said = noteOf(m);\n // `--` ends a comment early, so XML refuses it inside one.\n return said === '' ? '' : ` <!-- ${said.replace(/-{2,}/g, '-')} -->\\n`;\n}\n\n/** The files `target` writes, by path, or a problem for every message it can't hold. */\nexport function androidResources(\n target: NativeTarget & { name: string },\n catalog: Catalog,\n locales: string[],\n entries: Map<string, Entry[]>,\n banner: string,\n): { files: Map<string, string>; problems: Problem[] } {\n const source = locales[0]!;\n const asts = new Map([...entries].map(([locale, list]) => [locale, new Map(list)]));\n const taken = catalog.messages.flatMap((m) => {\n const words = wordsFor(target, m.key);\n return words === undefined ? [] : [{ m, name: leading(snake(words)) }];\n });\n checkNames(\n 'android',\n taken.map(({ m, name }) => [m.key, name]),\n [],\n );\n const problems = taken\n .filter((t) => KEYWORDS.has(t.name))\n .map(({ m, name }): Problem => ({\n severity: 'error',\n file: m.file,\n key: m.key,\n message: `android: ${m.key} is named ${name}, which Java keeps for itself: rename it`,\n }));\n\n const bodies = new Map<string, string[]>(locales.map((l) => [l, []]));\n const failed = new Set<string>();\n for (const { m, name } of taken) {\n const args = [...m.args.keys()];\n const written = new Map<string, string>();\n for (const locale of locales) {\n const found = foundIn(m.key, locale, locales, asts);\n if (failed.has(m.key)) break;\n if (found === undefined) continue;\n let entry = written.get(found);\n if (entry === undefined) {\n try {\n entry = `${comment(m)}${resource(name, asts.get(found)!.get(m.key)!, args)}`;\n } catch (e) {\n failed.add(m.key);\n problems.push({ severity: 'error', file: fileOf(m, found, source), key: m.key, message: `android: ${(e as Error).message}` });\n continue;\n }\n written.set(found, entry);\n }\n bodies.get(locale)!.push(entry);\n }\n }\n\n const head = `<!-- ${banner.replace(/^\\/\\/ /, '')} -->`;\n const files = new Map(\n locales.map((locale) => {\n const folder = locale === source ? 'values' : `values-${qualifierOf(locale)}`;\n const body = bodies.get(locale)!.join('\\n');\n const xml = `<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n${head}\\n<resources>\\n${body}${body === '' ? '' : '\\n'}</resources>\\n`;\n return [join(target.out, folder, `${target.name}.xml`), xml];\n }),\n );\n return { files, problems };\n}\n","/**\n * The catalog as Apple `.strings` tables: `<locale>.lproj/<name>.strings` per locale, each holding\n * what that locale shows, every fallback resolved. Plain `.strings` and not a String Catalog, which\n * only Xcode compiles: an app bundled by other tools copies these into its `Resources` as they are.\n *\n * The Swift target covers what code shows; these are for what the system reads from a bundle. With\n * `plist`, the table is `InfoPlist`: the permission prompts and names in that Info.plist, an entry\n * per key it has, which its own text must match in the source locale.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\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 { staticLiteral, TYPE, type MessageFormatElement } from '#src/tools/icu.ts';\nimport { checkNames } from './emit.ts';\nimport { fileOf, foundIn, LEAVE_OUT, restOf, wordsFor } from './model.ts';\nimport { checkPlural, formatString, noteOf, type PluralHolder, type Printf } from './printf.ts';\n\n/** Text inside a `.strings` file's quotes; `%` doubled where the string has arguments. */\nfunction escape(text: string, formatted: boolean): string {\n const out = text.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"').replaceAll('\\n', '\\\\n').replaceAll('\\r', '\\\\r').replaceAll('\\t', '\\\\t');\n return formatted ? out.replaceAll('%', '%%') : out;\n}\n\nconst PRINTF: Printf = {\n platform: 'Apple',\n formatter: 'String(format:)',\n holder: '.strings files',\n string: '@',\n count: 'lld',\n escape,\n // A plural at the top goes to the .stringsdict; one under a select never gets here, as the select fails first.\n plural: (name) => `{${name}} is a plural inside another, which a .strings file can't hold: say it without, ${LEAVE_OUT}`,\n};\n\nconst xml = (text: string) => text.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');\n\nconst DICT: Printf = {\n ...PRINTF,\n holder: '.stringsdict files',\n escape: (text, formatted) => (formatted ? xml(text).replaceAll('%', '%%') : xml(text)),\n plural: (name) =>\n `{${name}} is a plural inside another plural's arm, which a .stringsdict here can't hold: write a key per case and pick one in code, ${LEAVE_OUT}`,\n};\n\nconst PLURALS: PluralHolder = { platform: 'Apple', plurals: \"a .stringsdict's plurals\", exact: '' };\n\n/**\n * A message holding plurals as a `.stringsdict` entry: its format, with each plural a variable\n * (`%1$#@count@`) whose arms the system picks by the count's category, from its own CLDR rules.\n */\nfunction dictEntry(name: string, ast: MessageFormatElement[], args: string[]): string {\n const variables: string[] = [];\n const taken = new Map<string, number>();\n let format = '';\n for (const el of ast) {\n if (el.type !== TYPE.plural) {\n format += formatString([el], args, DICT);\n continue;\n }\n checkPlural(el, PLURALS);\n const base = el.value.replace(/\\W/g, '_');\n const seen = (taken.get(base) ?? 0) + 1;\n taken.set(base, seen);\n const variable = seen === 1 ? base : `${base}${seen}`;\n format += `%${args.indexOf(el.value) + 1}$#@${variable}@`;\n const arms = Object.entries(el.options).map(\n ([category, option]) =>\n ` <key>${category}</key>\\n <string>${formatString(option.value, args, DICT, el.value)}</string>\\n`,\n );\n variables.push(\n ` <key>${variable}</key>\\n <dict>\\n <key>NSStringFormatSpecTypeKey</key>\\n <string>NSStringPluralRuleType</string>\\n <key>NSStringFormatValueTypeKey</key>\\n <string>${DICT.count}</string>\\n${arms.join('')} </dict>\\n`,\n );\n }\n return ` <key>${xml(name)}</key>\\n <dict>\\n <key>NSStringLocalizedFormatKey</key>\\n <string>${format}</string>\\n${variables.join('')} </dict>\\n`;\n}\n\nconst ENTITIES: Record<string, string> = { amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\" };\n\n/** An XML plist's string values by key, read as its text is: every `<key>` followed by a `<string>`. */\nfunction plistStrings(xml: string): Map<string, string> {\n const strings = new Map<string, string>();\n for (const [, key, value] of xml.matchAll(/<key>([^<]*)<\\/key>\\s*(?:<string>([^<]*)<\\/string>|<string\\/>)/g)) {\n strings.set(\n key!,\n (value ?? '').replace(/&(amp|lt|gt|quot|apos|#x?[0-9a-f]+);/gi, (_, e: string) =>\n e.startsWith('#')\n ? String.fromCodePoint(Number.parseInt(e.slice(/x/i.test(e[1]!) ? 2 : 1), /x/i.test(e[1]!) ? 16 : 10))\n : ENTITIES[e.toLowerCase()]!,\n ),\n );\n }\n return strings;\n}\n\n/** The files `target` writes, by path, or a problem for every message it can't hold. */\nexport function appleStrings(\n target: NativeTarget & { name: string },\n root: string,\n catalog: Catalog,\n locales: string[],\n entries: Map<string, Entry[]>,\n banner: string,\n): { files: Map<string, string>; problems: Problem[] } {\n const source = locales[0]!;\n const asts = new Map([...entries].map(([locale, list]) => [locale, new Map(list)]));\n const problems: Problem[] = [];\n const error = (m: Message, message: string, file = m.file) =>\n problems.push({ severity: 'error', file, key: m.key, message: `apple: ${message}` });\n\n const plist = target.plist;\n const shown = plist === undefined ? '' : relative(root, plist).replaceAll('\\\\', '/');\n if (plist !== undefined && !existsSync(plist)) throw new Error(`apple: ${shown} is missing: name the Info.plist the table translates`);\n const strings = plist === undefined ? undefined : plistStrings(readFileSync(plist, 'utf8'));\n const byLower = new Map([...(strings?.keys() ?? [])].map((k) => [k.toLowerCase(), k]));\n\n // Under `plist`, a key's words spell the plist key, which catalog keys can't hold as written.\n const taken = catalog.messages.flatMap((m) => {\n const rest = restOf(target, m.key);\n if (rest === undefined) return [];\n if (strings === undefined) return [{ m, name: rest }];\n const name = byLower.get(wordsFor(target, m.key)!.join('').toLowerCase());\n if (name === undefined) {\n error(\n m,\n `${m.key} names no string in ${shown}: spell one of its keys, as ns-camera-usage-description is NSCameraUsageDescription, or add it there`,\n );\n return [];\n }\n return [{ m, name }];\n });\n checkNames(\n 'apple',\n taken.map(({ m, name }) => [m.key, name]),\n [],\n );\n\n for (const { m, name } of taken) {\n if (strings === undefined) continue;\n if (m.args.size > 0) {\n error(m, `${name} is shown as it is written, with nothing filled in: say it without {${[...m.args.keys()].join('}, {')}}`);\n continue;\n }\n // The plist's own text shows where no .lproj matches, so it can't be left to say something else.\n const text = staticLiteral(asts.get(source)?.get(m.key) ?? []);\n if (text !== undefined && text !== strings.get(name))\n error(m, `${shown} says ${JSON.stringify(strings.get(name))} for ${name}: make it ${JSON.stringify(text)}, as the catalog says`);\n }\n\n const lines = new Map<string, string[]>(locales.map((l) => [l, []]));\n const dicts = new Map<string, string[]>(locales.map((l) => [l, []]));\n const failed = new Set(problems.map((p) => p.key));\n for (const { m, name } of taken) {\n if (failed.has(m.key)) continue;\n const args = [...m.args.keys()];\n const note = noteOf(m);\n const head = note === '' ? '' : `/* ${note.replaceAll('*/', '* /')} */\\n`;\n const comment = note === '' ? '' : ` <!-- ${note.replace(/-{2,}/g, '-')} -->\\n`;\n const written = new Map<string, { dict: boolean; entry: string }>();\n for (const locale of locales) {\n const found = foundIn(m.key, locale, locales, asts);\n if (found === undefined) continue;\n let entry = written.get(found);\n if (entry === undefined) {\n const ast = asts.get(found)!.get(m.key)!;\n const dict = ast.some((el) => el.type === TYPE.plural);\n try {\n entry = dict\n ? { dict, entry: `${comment}${dictEntry(name, ast, args)}` }\n : { dict, entry: `${head}\"${escape(name, false)}\" = \"${formatString(ast, args, PRINTF)}\";\\n` };\n } catch (e) {\n error(m, (e as Error).message, fileOf(m, found, source));\n break;\n }\n written.set(found, entry);\n }\n (entry.dict ? dicts : lines).get(locale)!.push(entry.entry);\n }\n }\n\n const said = banner.replace(/^\\/\\/ /, '');\n const files = new Map(\n locales.map((locale) => [\n join(target.out, `${locale}.lproj`, `${target.name}.strings`),\n [`/* ${said} */\\n`, ...lines.get(locale)!].join('\\n'),\n ]),\n );\n // The system looks a key up in the .stringsdict of the table's name first, so a plural lands there.\n if ([...dicts.values()].some((d) => d.length > 0)) {\n for (const locale of locales) {\n const body = dicts.get(locale)!.join('');\n files.set(\n join(target.out, `${locale}.lproj`, `${target.name}.stringsdict`),\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\\n<!-- ${said.replace(/-{2,}/g, '-')} -->\\n<plist version=\"1.0\">\\n<dict>\\n${body}</dict>\\n</plist>\\n`,\n );\n }\n }\n return { files, problems };\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 { pieceExpr, type DateSpec } from './date.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 === 'date') return `${rt}.d${part.format}(${argName(part.arg)})`;\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\n .map((a) => `${argName(a.name)}: ${a.type === 'number' ? 'Number' : a.type === 'date' ? 'java.time.Instant' : 'String'}`)\n .join(', ');\n const numbers = m.args\n .map((a) =>\n a.type === 'number'\n ? ` val ${argName(a.name)} = ${argName(a.name)}.toDouble()\\n`\n : a.type === 'date'\n ? ` val ${argName(a.name)} = ${argName(a.name)}.atZone(java.time.ZoneId.systemDefault())\\n`\n : '',\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 FIELDS: Record<string, string> = {\n year: 't.year',\n month: 't.monthValue',\n day: 't.dayOfMonth',\n hour: 't.hour',\n minute: 't.minute',\n second: 't.second',\n weekday: '(t.dayOfWeek.value % 7)',\n};\n\n/** A date format as a function of the date in the system's time zone. */\nfunction dateFn(spec: DateSpec, i: number): string {\n const digits = spec.digits === undefined ? 'null' : `G${i}`;\n const at = (field: string) => FIELDS[field]!;\n const lines = spec.pieces.map((piece) => {\n if (piece.type === 'text') return `append(${lit(piece.value)})`;\n if (piece.type === 'name') return `append(arrayOf(${piece.names.map(lit).join(', ')})[${pieceExpr(piece, at)}])`;\n return `append(pad(${pieceExpr(piece, at)}, ${piece.pad}, ${digits}))`;\n });\n const table = spec.digits === undefined ? '' : ` private val G${i} = arrayOf(${spec.digits.map(lit).join(', ')})\\n`;\n const body = lines.map((l) => ` ${l}\\n`).join('');\n return `${table} fun d${i}(t: java.time.ZonedDateTime): String = buildString {\\n${body} }\\n`;\n}\n\nconst DATE = `\n /** \\`value\\` written with at least \\`width\\` digits, in \\`digits\\` where the locale has its own. */\n private fun pad(value: Int, width: Int, digits: Array<String>?): String {\n val text = value.toString().padStart(width, '0')\n return if (digits == null) text else text.map { if (it in '0'..'9') digits[it - '0'] else it.toString() }.joinToString(\"\")\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 + model.dates.length === 0\n ? ''\n : `\n/** What formats the messages, generated with them. */\nprivate object ${rt} {${model.formats.length + model.rules.length > 0 ? NUMBER : ''}${model.rules.length > 0 ? PLURAL : ''}${model.dates.length > 0 ? DATE : ''}\n${[...model.formats.map(formatConst), ...model.dates.map(dateFn)].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 * 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 { pieceExpr, type DateSpec } from './date.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 === 'date') return `rt::D${part.format}(&${argName(part.arg)})`;\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\n .map((a) => `, ${argName(a.name)}: ${a.type === 'number' ? 'impl Number' : a.type === 'date' ? 'DateTime' : '&str'}`)\n .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\n/** A date format as a function of the date. */\nfunction dateFn(spec: DateSpec, i: number): string {\n const digits = spec.digits === undefined ? 'None' : `Some(G${i})`;\n const at = (field: string) => (field === 'weekday' ? 't.weekday() as i64' : `t.${field} as i64`);\n const lines = spec.pieces.map((piece) => {\n if (piece.type === 'text') return `s += ${lit(piece.value)};`;\n if (piece.type === 'name') return `s += [${piece.names.map(lit).join(', ')}][(${pieceExpr(piece, at)}) as usize];`;\n return `s += &pad(${pieceExpr(piece, at)}, ${piece.pad}, ${digits});`;\n });\n const table = spec.digits === undefined ? '' : ` const G${i}: [&str; 10] = [${spec.digits.map(lit).join(', ')}];\\n`;\n const body = lines.map((l) => ` ${l}\\n`).join('');\n return `${table} pub fn D${i}(t: &super::DateTime) -> String {\\n let mut s = String::new();\\n${body} s\\n }\\n`;\n}\n\nconst DATE = `\n /// \\`value\\` written with at least \\`width\\` digits, in \\`digits\\` where the locale has its own.\n fn pad(value: i64, width: usize, digits: Option<[&'static str; 10]>) -> String {\n let text = format!(\"{:0width$}\", value, width = width);\n match digits {\n Some(digits) => text.bytes().map(|b| if b.is_ascii_digit() { digits[(b - b'0') as usize] } else { \"-\" }).collect(),\n None => text,\n }\n }\n`;\n\nconst DATE_TIME = `\n/// A date and time as a clock shows it, in the time zone it is shown in.\n#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]\npub struct DateTime {\n pub year: i32,\n /// 1 to 12.\n pub month: u8,\n pub day: u8,\n /// 0 to 23.\n pub hour: u8,\n pub minute: u8,\n pub second: u8,\n}\n\nimpl DateTime {\n /// The time \\`seconds\\` after the Unix epoch, on a clock \\`offset\\` seconds ahead of UTC: the\n /// local time's offset where it is shown, which Rust's standard library can't look up.\n pub fn from_unix(seconds: i64, offset: i32) -> DateTime {\n let local = seconds + offset as i64;\n let (days, time) = (local.div_euclid(86_400), local.rem_euclid(86_400));\n // Howard Hinnant's civil_from_days: the Gregorian date \\`days\\` after 1970-01-01.\n let z = days + 719_468;\n let (era, doe) = (z.div_euclid(146_097), z.rem_euclid(146_097));\n let yoe = (doe - doe / 1460 + doe / 36_524 - doe / 146_096) / 365;\n let doy = doe - (365 * yoe + yoe / 4 - yoe / 100);\n let mp = (5 * doy + 2) / 153;\n let month = if mp < 10 { mp + 3 } else { mp - 9 };\n DateTime {\n year: (yoe + era * 400 + if month <= 2 { 1 } else { 0 }) as i32,\n month: month as u8,\n day: (doy - (153 * mp + 2) / 5 + 1) as u8,\n hour: (time / 3600) as u8,\n minute: (time / 60 % 60) as u8,\n second: (time % 60) as u8,\n }\n }\n\n /// The day of the week, 0 for Sunday.\n pub fn weekday(self) -> u8 {\n // days_from_civil, its inverse.\n let m = self.month as i64;\n let y = self.year as i64 - if m <= 2 { 1 } else { 0 };\n let (era, yoe) = (y.div_euclid(400), y.rem_euclid(400));\n let doy = (153 * (if m > 2 { m - 3 } else { m + 9 }) + 2) / 5 + self.day as i64 - 1;\n let days = era * 146_097 + yoe * 365 + yoe / 4 - yoe / 100 + doy - 719_468;\n (days + 4).rem_euclid(7) as u8\n }\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 usesDates = model.dates.length > 0;\n const usesFormats = model.formats.length + model.rules.length > 0;\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 !usesFormats && !usesDates\n ? ''\n : `\n/// What formats the messages, generated with them.\nmod rt {${usesFormats ? NUMBER : ''}${model.rules.length > 0 ? PLURAL : ''}${usesDates ? DATE : ''}\n${[...model.formats.map(formatConst), ...model.dates.map(dateFn)].join('\\n')}${rules === '' ? '' : `\\n${rules}`}}\n`;\n\n return `${banner}\n#![allow(dead_code, non_snake_case, clippy::all)]\n${usesNumbers ? NUMBER_TRAIT : ''}${usesDates ? DATE_TIME : ''}\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 { pieceExpr, type DateSpec } from './date.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 === 'date') return `${rt}.d${part.format}(${argName(part.arg)})`;\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\n .map((a) => `${argName(a.name)}: ${a.type === 'number' ? `some ${number.type}` : a.type === 'date' ? 'Date' : 'String'}`)\n .join(', ');\n const numbers = m.args\n .map((a) =>\n a.type === 'number'\n ? ` let ${argName(a.name)} = ${argName(a.name)}.${number.value}\\n`\n : a.type === 'date'\n ? ` let ${argName(a.name)} = ${rt}.clock(${argName(a.name)})\\n`\n : '',\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\n/** A date format as a function of the clock's fields. */\nfunction dateFn(spec: DateSpec, i: number): string {\n const digits = spec.digits === undefined ? 'nil' : `g${i}`;\n const at = (field: string) => `t.${field}`;\n const lines = spec.pieces.map((piece) => {\n if (piece.type === 'text') return `s += ${lit(piece.value)}`;\n if (piece.type === 'name') return `s += [${piece.names.map(lit).join(', ')}][${pieceExpr(piece, at)}]`;\n return `s += pad(${pieceExpr(piece, at)}, ${piece.pad}, ${digits})`;\n });\n const table = spec.digits === undefined ? '' : ` static let g${i} = [${spec.digits.map(lit).join(', ')}]\\n`;\n const body = lines.map((l) => ` ${l}\\n`).join('');\n return `${table} static func d${i}(_ t: Clock) -> String {\\n var s = \"\"\\n${body} return s\\n }\\n`;\n}\n\nconst DATE = `\n /// A date as the clock shows it in the device's time zone; \\`weekday\\` is 0 for Sunday.\n struct Clock {\n let year: Int\n let month: Int\n let day: Int\n let hour: Int\n let minute: Int\n let second: Int\n let weekday: Int\n }\n\n static func clock(_ date: Date) -> Clock {\n var calendar = Calendar(identifier: .gregorian)\n calendar.timeZone = .current\n let c = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second, .weekday], from: date)\n return Clock(\n year: c.year ?? 0, month: c.month ?? 1, day: c.day ?? 1, hour: c.hour ?? 0, minute: c.minute ?? 0,\n second: c.second ?? 0, weekday: (c.weekday ?? 1) - 1\n )\n }\n\n /// \\`value\\` written with at least \\`width\\` digits, in \\`digits\\` where the locale has its own.\n private static func pad(_ value: Int, _ width: Int, _ digits: [String]?) -> String {\n var text = String(value)\n while text.count < width { text = \"0\" + text }\n guard let digits else { return text }\n return text.map { c in c.wholeNumberValue.map { digits[$0] } ?? String(c) }.joined()\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 usesDates = model.dates.length > 0;\n const usesFormats = model.formats.length + model.rules.length > 0;\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 !usesFormats && !usesDates\n ? ''\n : `\n/// What formats the messages, generated with them.\nprivate enum ${rt} {${usesFormats ? NUMBER : ''}${model.rules.length > 0 ? PLURAL : ''}${usesDates ? DATE : ''}\n${[...model.formats.map(formatConst), ...model.dates.map(dateFn)].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 * (Android's and Apple's string resources, a file per locale). A message a target can't render\n * 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 { androidResources } from './android.ts';\nimport { appleStrings } from './apple.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 try {\n if (target.language === 'android' || target.language === 'apple') {\n const { files: written, problems: found } =\n target.language === 'android'\n ? androidResources(target, catalog, locales, entries, banner)\n : appleStrings(target, config.root, catalog, locales, entries, banner);\n problems.push(...found);\n for (const [path, content] of written) files.set(path, content);\n continue;\n }\n const { model, problems: found } = nativeModel(target, catalog, locales, entries);\n problems.push(...found);\n if (found.length > 0) continue;\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, withSchemaLine, yamlFiles, 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 // Without its schema line a catalog file has no completion, so generate adds it and --check fails there.\n for (const file of yamlFiles(config.catalog)) {\n const path = join(config.catalog, file);\n const text = readFileSync(path, 'utf8');\n if (withSchemaLine(text) !== text) files.set(path, withSchemaLine(text));\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":[12,13],"mappings":"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"}