@inlang/paraglide-js 2.25.4 → 2.27.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 (124) hide show
  1. package/README.md +2 -1
  2. package/dist/bundler-plugins/per-locale-build/vite-environments.test.js +2 -2
  3. package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -1
  4. package/dist/cli/commands/init/command.js +19 -1
  5. package/dist/cli/commands/init/command.js.map +1 -1
  6. package/dist/cli/defaults.js +2 -2
  7. package/dist/cli/defaults.js.map +1 -1
  8. package/dist/cli/steps/add-inlang-check.d.ts +19 -0
  9. package/dist/cli/steps/add-inlang-check.js +60 -0
  10. package/dist/cli/steps/add-inlang-check.js.map +1 -0
  11. package/dist/cli/steps/add-inlang-check.test.d.ts +1 -0
  12. package/dist/cli/steps/add-inlang-check.test.js +88 -0
  13. package/dist/cli/steps/add-inlang-check.test.js.map +1 -0
  14. package/dist/cli/steps/agents-md-suggestion.d.ts +11 -0
  15. package/dist/cli/steps/agents-md-suggestion.js +19 -0
  16. package/dist/cli/steps/agents-md-suggestion.js.map +1 -0
  17. package/dist/cli/steps/agents-md-suggestion.test.d.ts +1 -0
  18. package/dist/cli/steps/agents-md-suggestion.test.js +36 -0
  19. package/dist/cli/steps/agents-md-suggestion.test.js.map +1 -0
  20. package/dist/cli/steps/maybe-add-machine-translation.js +3 -2
  21. package/dist/cli/steps/maybe-add-machine-translation.js.map +1 -1
  22. package/dist/cli/steps/maybe-add-sherlock.js +1 -1
  23. package/dist/cli/steps/maybe-add-sherlock.js.map +1 -1
  24. package/dist/cli/utils.d.ts +9 -0
  25. package/dist/cli/utils.js +15 -0
  26. package/dist/cli/utils.js.map +1 -1
  27. package/dist/compiler/compile-annotation.d.ts +48 -1
  28. package/dist/compiler/compile-annotation.js +238 -10
  29. package/dist/compiler/compile-annotation.js.map +1 -1
  30. package/dist/compiler/compile-bundle.d.ts +3 -2
  31. package/dist/compiler/compile-bundle.js +30 -1
  32. package/dist/compiler/compile-bundle.js.map +1 -1
  33. package/dist/compiler/compile-bundle.test.js +18 -18
  34. package/dist/compiler/compile-bundle.test.js.map +1 -1
  35. package/dist/compiler/compile-local-variable.d.ts +3 -0
  36. package/dist/compiler/compile-local-variable.js +5 -2
  37. package/dist/compiler/compile-local-variable.js.map +1 -1
  38. package/dist/compiler/compile-local-variable.test.js +44 -4
  39. package/dist/compiler/compile-local-variable.test.js.map +1 -1
  40. package/dist/compiler/compile-message.d.ts +29 -1
  41. package/dist/compiler/compile-message.exact-number.test.d.ts +1 -0
  42. package/dist/compiler/compile-message.exact-number.test.js +786 -0
  43. package/dist/compiler/compile-message.exact-number.test.js.map +1 -0
  44. package/dist/compiler/compile-message.js +162 -66
  45. package/dist/compiler/compile-message.js.map +1 -1
  46. package/dist/compiler/compile-message.locals.test.d.ts +1 -0
  47. package/dist/compiler/compile-message.locals.test.js +498 -0
  48. package/dist/compiler/compile-message.locals.test.js.map +1 -0
  49. package/dist/compiler/compile-message.test.js +111 -20
  50. package/dist/compiler/compile-message.test.js.map +1 -1
  51. package/dist/compiler/compile-pattern.d.ts +5 -0
  52. package/dist/compiler/compile-pattern.js +6 -18
  53. package/dist/compiler/compile-pattern.js.map +1 -1
  54. package/dist/compiler/compile-pattern.test.js +165 -1
  55. package/dist/compiler/compile-pattern.test.js.map +1 -1
  56. package/dist/compiler/compile-project.js +4 -1
  57. package/dist/compiler/compile-project.js.map +1 -1
  58. package/dist/compiler/compile-project.test.js +1013 -31
  59. package/dist/compiler/compile-project.test.js.map +1 -1
  60. package/dist/compiler/compile.test.js +1 -1
  61. package/dist/compiler/compile.test.js.map +1 -1
  62. package/dist/compiler/create-readme.d.ts +4 -1
  63. package/dist/compiler/create-readme.js +33 -125
  64. package/dist/compiler/create-readme.js.map +1 -1
  65. package/dist/compiler/emit-ts-declarations.interop.test.js +2 -2
  66. package/dist/compiler/emit-ts-declarations.interop.test.js.map +1 -1
  67. package/dist/compiler/emit-ts-declarations.test.js +4 -4
  68. package/dist/compiler/emit-ts-declarations.test.js.map +1 -1
  69. package/dist/compiler/index.d.ts +1 -1
  70. package/dist/compiler/index.js +1 -1
  71. package/dist/compiler/index.js.map +1 -1
  72. package/dist/compiler/input-alias.d.ts +21 -0
  73. package/dist/compiler/input-alias.js +42 -0
  74. package/dist/compiler/input-alias.js.map +1 -0
  75. package/dist/compiler/input-alias.test.d.ts +1 -0
  76. package/dist/compiler/input-alias.test.js +58 -0
  77. package/dist/compiler/input-alias.test.js.map +1 -0
  78. package/dist/compiler/message-locals.d.ts +46 -0
  79. package/dist/compiler/message-locals.js +129 -0
  80. package/dist/compiler/message-locals.js.map +1 -0
  81. package/dist/compiler/output-structure/locale-modules.js +7 -1
  82. package/dist/compiler/output-structure/locale-modules.js.map +1 -1
  83. package/dist/compiler/output-structure/locale-modules.test.js +35 -0
  84. package/dist/compiler/output-structure/locale-modules.test.js.map +1 -1
  85. package/dist/compiler/output-structure/message-modules.js +5 -3
  86. package/dist/compiler/output-structure/message-modules.js.map +1 -1
  87. package/dist/compiler/output-structure/message-modules.test.js +35 -0
  88. package/dist/compiler/output-structure/message-modules.test.js.map +1 -1
  89. package/dist/compiler/registry.d.ts +12 -0
  90. package/dist/compiler/registry.js +97 -28
  91. package/dist/compiler/registry.js.map +1 -1
  92. package/dist/compiler/runtime/create-runtime.js +24 -1
  93. package/dist/compiler/runtime/create-runtime.js.map +1 -1
  94. package/dist/compiler/runtime/extract-locale-from-url.js +11 -4
  95. package/dist/compiler/runtime/extract-locale-from-url.js.map +1 -1
  96. package/dist/compiler/runtime/generate-static-localized-urls.js +5 -3
  97. package/dist/compiler/runtime/generate-static-localized-urls.js.map +1 -1
  98. package/dist/compiler/runtime/localize-url.js +25 -54
  99. package/dist/compiler/runtime/localize-url.js.map +1 -1
  100. package/dist/compiler/runtime/route-strategy.js +9 -3
  101. package/dist/compiler/runtime/route-strategy.js.map +1 -1
  102. package/dist/compiler/runtime/type.test.js +9 -0
  103. package/dist/compiler/runtime/type.test.js.map +1 -1
  104. package/dist/compiler/runtime/url-pattern-cache.d.ts +11 -0
  105. package/dist/compiler/runtime/url-pattern-cache.js +42 -0
  106. package/dist/compiler/runtime/url-pattern-cache.js.map +1 -0
  107. package/dist/compiler/runtime/url-pattern-index.d.ts +24 -0
  108. package/dist/compiler/runtime/url-pattern-index.differential.test.d.ts +1 -0
  109. package/dist/compiler/runtime/url-pattern-index.differential.test.js +152 -0
  110. package/dist/compiler/runtime/url-pattern-index.differential.test.js.map +1 -0
  111. package/dist/compiler/runtime/url-pattern-index.js +168 -0
  112. package/dist/compiler/runtime/url-pattern-index.js.map +1 -0
  113. package/dist/compiler/runtime/url-pattern-index.test.d.ts +1 -0
  114. package/dist/compiler/runtime/url-pattern-index.test.js +262 -0
  115. package/dist/compiler/runtime/url-pattern-index.test.js.map +1 -0
  116. package/dist/compiler/server/create-server-file.js +25 -1
  117. package/dist/compiler/server/create-server-file.js.map +1 -1
  118. package/dist/compiler/server/create-server-file.test.js +20 -2
  119. package/dist/compiler/server/create-server-file.test.js.map +1 -1
  120. package/dist/compiler/server/middleware.js +29 -4
  121. package/dist/compiler/server/middleware.js.map +1 -1
  122. package/dist/services/env-variables/index.js +1 -1
  123. package/dist/services/env-variables/index.js.map +1 -1
  124. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile-message.exact-number.test.js","sourceRoot":"","sources":["../../src/compiler/compile-message.exact-number.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test } from \"vitest\";\nimport type {\n\tBundleNested,\n\tDeclaration,\n\tMatch,\n\tMessage,\n\tPattern,\n\tProjectSettings,\n\tVariant,\n} from \"@inlang/sdk\";\nimport { compileMessage } from \"./compile-message.js\";\nimport { compileBundle } from \"./compile-bundle.js\";\nimport { createRegistry } from \"./registry.js\";\nimport { toSafeModuleId } from \"./safe-module-id.js\";\n\n/**\n * Compiles a message and imports it together with an inlined registry so the\n * generated code can be executed.\n */\nasync function compileAndImport(args: {\n\tdeclarations: Declaration[];\n\tselectors: string[];\n\tlocale: string;\n\tvariants: Array<{ matches: Match[]; pattern: Pattern }>;\n}) {\n\tconst message: Message = {\n\t\tid: \"message-id\",\n\t\tbundleId: \"exact_message\",\n\t\tlocale: args.locale,\n\t\tselectors: args.selectors.map((name) => ({\n\t\t\ttype: \"variable-reference\",\n\t\t\tname,\n\t\t})),\n\t};\n\tconst variants: Variant[] = args.variants.map((variant, index) => ({\n\t\tid: String(index),\n\t\tmessageId: message.id,\n\t\t...variant,\n\t}));\n\tconst compiled = compileMessage(args.declarations, message, variants);\n\tconst source =\n\t\tcreateRegistry() +\n\t\t\"\\nexport const exact_message = \" +\n\t\tcompiled.code.replaceAll(\"registry.\", \"\");\n\tconst module = await import(\n\t\t\"data:text/javascript;base64,\" + Buffer.from(source).toString(\"base64\")\n\t);\n\treturn {\n\t\tcode: compiled.code,\n\t\tmessage: module.exact_message as (\n\t\t\tinputs: Record<string, unknown>\n\t\t) => string,\n\t};\n}\n\nconst literal = (key: string, value: string): Match => ({\n\ttype: \"literal-match\",\n\tkey,\n\tvalue,\n});\nconst catchall = (key: string): Match => ({ type: \"catchall-match\", key });\nconst text = (value: string): Pattern => [{ type: \"text\", value }];\nconst withCount = (before: string, after = \"\"): Pattern => [\n\t{ type: \"text\", value: before },\n\t{ type: \"expression\", arg: { type: \"variable-reference\", name: \"count\" } },\n\t{ type: \"text\", value: after },\n];\n\n/**\n * The shape inlang's ICU MessageFormat 1 plugin imports\n * `{count, plural, =0 {…} one {…} other {…}}` as, and the shape editors create\n * when a user adds an exact number to a plural message.\n */\nconst icuDeclarations = (): Declaration[] => [\n\t{ type: \"input-variable\", name: \"count\" },\n\t{\n\t\ttype: \"local-variable\",\n\t\tname: \"countPluralExact\",\n\t\tvalue: {\n\t\t\ttype: \"expression\",\n\t\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\t},\n\t},\n\t{\n\t\ttype: \"local-variable\",\n\t\tname: \"countPlural\",\n\t\tvalue: {\n\t\t\ttype: \"expression\",\n\t\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\t\tannotation: { type: \"function-reference\", name: \"plural\", options: [] },\n\t\t},\n\t},\n];\nconst icuSelectors = [\"countPluralExact\", \"countPlural\"];\n\n/** ICU `=N {…}` */\nconst exact = (value: string, pattern: Pattern) => ({\n\tmatches: [literal(\"countPluralExact\", value), catchall(\"countPlural\")],\n\tpattern,\n});\n/** ICU `one {…}`, `few {…}`, ... */\nconst category = (value: string, pattern: Pattern) => ({\n\tmatches: [catchall(\"countPluralExact\"), literal(\"countPlural\", value)],\n\tpattern,\n});\n/** ICU `other {…}` */\nconst other = (pattern: Pattern) => ({\n\tmatches: [catchall(\"countPluralExact\"), catchall(\"countPlural\")],\n\tpattern,\n});\n\nconst render = (\n\tmessage: (inputs: Record<string, unknown>) => string,\n\tcounts: unknown[]\n) =>\n\tObject.fromEntries(\n\t\tcounts.map((count) => [String(JSON.stringify(count)), message({ count })])\n\t);\n\nconst COUNTS = [0, 1, 2, 5, 21, \"0\"];\n\ndescribe(\"exact number matches on un-annotated local aliases (ICU =N)\", () => {\n\ttest(\"en: =0, one, other\", async () => {\n\t\tconst { message, code } = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: icuDeclarations(),\n\t\t\tselectors: icuSelectors,\n\t\t\tvariants: [\n\t\t\t\texact(\"0\", text(\"No items\")),\n\t\t\t\tcategory(\"one\", withCount(\"\", \" item\")),\n\t\t\t\tother(withCount(\"\", \" items\")),\n\t\t\t],\n\t\t});\n\n\t\texpect(code).toContain(\n\t\t\t'(countPluralExact === 0 || countPluralExact === \"0\")'\n\t\t);\n\t\texpect(render(message, COUNTS)).toEqual({\n\t\t\t\"0\": \"No items\",\n\t\t\t\"1\": \"1 item\",\n\t\t\t\"2\": \"2 items\",\n\t\t\t\"5\": \"5 items\",\n\t\t\t\"21\": \"21 items\",\n\t\t\t'\"0\"': \"No items\",\n\t\t});\n\t});\n\n\ttest(\"en: =1 wins over one and matches the string '1'\", async () => {\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: icuDeclarations(),\n\t\t\tselectors: icuSelectors,\n\t\t\tvariants: [\n\t\t\t\texact(\"0\", text(\"No items\")),\n\t\t\t\texact(\"1\", text(\"Exactly one item\")),\n\t\t\t\tcategory(\"one\", withCount(\"\", \" item\")),\n\t\t\t\tother(withCount(\"\", \" items\")),\n\t\t\t],\n\t\t});\n\n\t\texpect(render(message, [...COUNTS, \"1\"])).toEqual({\n\t\t\t\"0\": \"No items\",\n\t\t\t\"1\": \"Exactly one item\",\n\t\t\t\"2\": \"2 items\",\n\t\t\t\"5\": \"5 items\",\n\t\t\t\"21\": \"21 items\",\n\t\t\t'\"0\"': \"No items\",\n\t\t\t'\"1\"': \"Exactly one item\",\n\t\t});\n\t});\n\n\ttest(\"fr: =0 wins over one, which covers 0 in French\", async () => {\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"fr\",\n\t\t\tdeclarations: icuDeclarations(),\n\t\t\tselectors: icuSelectors,\n\t\t\tvariants: [\n\t\t\t\texact(\"0\", text(\"Aucun élément\")),\n\t\t\t\tcategory(\"one\", withCount(\"\", \" élément\")),\n\t\t\t\tother(withCount(\"\", \" éléments\")),\n\t\t\t],\n\t\t});\n\n\t\texpect(render(message, COUNTS)).toEqual({\n\t\t\t\"0\": \"Aucun élément\",\n\t\t\t\"1\": \"1 élément\",\n\t\t\t\"2\": \"2 éléments\",\n\t\t\t\"5\": \"5 éléments\",\n\t\t\t\"21\": \"21 éléments\",\n\t\t\t'\"0\"': \"Aucun élément\",\n\t\t});\n\t});\n\n\ttest(\"fr: variant preference follows selector order, not storage order\", async () => {\n\t\t// editors append the exact variant after the existing plural variants\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"fr\",\n\t\t\tdeclarations: icuDeclarations(),\n\t\t\tselectors: icuSelectors,\n\t\t\tvariants: [\n\t\t\t\tother(withCount(\"\", \" éléments\")),\n\t\t\t\tcategory(\"one\", withCount(\"\", \" élément\")),\n\t\t\t\texact(\"0\", text(\"Aucun élément\")),\n\t\t\t],\n\t\t});\n\n\t\texpect(render(message, COUNTS)).toEqual({\n\t\t\t\"0\": \"Aucun élément\",\n\t\t\t\"1\": \"1 élément\",\n\t\t\t\"2\": \"2 éléments\",\n\t\t\t\"5\": \"5 éléments\",\n\t\t\t\"21\": \"21 éléments\",\n\t\t\t'\"0\"': \"Aucun élément\",\n\t\t});\n\t});\n\n\ttest(\"ru: =0 and =1 next to one/few/many/other\", async () => {\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"ru\",\n\t\t\tdeclarations: icuDeclarations(),\n\t\t\tselectors: icuSelectors,\n\t\t\tvariants: [\n\t\t\t\texact(\"0\", text(\"Нет файлов\")),\n\t\t\t\texact(\"1\", text(\"Ровно один файл\")),\n\t\t\t\tcategory(\"one\", withCount(\"\", \" файл\")),\n\t\t\t\tcategory(\"few\", withCount(\"\", \" файла\")),\n\t\t\t\tcategory(\"many\", withCount(\"\", \" файлов\")),\n\t\t\t\tother(withCount(\"\", \" файла (other)\")),\n\t\t\t],\n\t\t});\n\n\t\texpect(render(message, COUNTS)).toEqual({\n\t\t\t\"0\": \"Нет файлов\",\n\t\t\t\"1\": \"Ровно один файл\",\n\t\t\t\"2\": \"2 файла\",\n\t\t\t\"5\": \"5 файлов\",\n\t\t\t\"21\": \"21 файл\",\n\t\t\t'\"0\"': \"Нет файлов\",\n\t\t});\n\t});\n\n\ttest(\"ja: =0 and =1 in a locale with only the other category\", async () => {\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"ja\",\n\t\t\tdeclarations: icuDeclarations(),\n\t\t\tselectors: icuSelectors,\n\t\t\tvariants: [\n\t\t\t\texact(\"0\", text(\"アイテムなし\")),\n\t\t\t\texact(\"1\", text(\"アイテム1つだけ\")),\n\t\t\t\tother(withCount(\"アイテム\", \"個\")),\n\t\t\t],\n\t\t});\n\n\t\texpect(render(message, COUNTS)).toEqual({\n\t\t\t\"0\": \"アイテムなし\",\n\t\t\t\"1\": \"アイテム1つだけ\",\n\t\t\t\"2\": \"アイテム2個\",\n\t\t\t\"5\": \"アイテム5個\",\n\t\t\t\"21\": \"アイテム21個\",\n\t\t\t'\"0\"': \"アイテムなし\",\n\t\t});\n\t});\n\n\ttest(\"exact numbers nested inside a select\", async () => {\n\t\t// {gender, select, female {{count, plural, =0 {…} one {…} other {…}}} other {…}}\n\t\tconst declarations: Declaration[] = [\n\t\t\t{ type: \"input-variable\", name: \"gender\" },\n\t\t\t...icuDeclarations(),\n\t\t];\n\t\tconst nested = (\n\t\t\tgender: Match,\n\t\t\tvariant: { matches: Match[]; pattern: Pattern }\n\t\t) => ({ ...variant, matches: [gender, ...variant.matches] });\n\t\tconst female = literal(\"gender\", \"female\");\n\t\tconst anyGender = catchall(\"gender\");\n\n\t\tfor (const locale of [\"en\", \"fr\"]) {\n\t\t\tconst { message } = await compileAndImport({\n\t\t\t\tlocale,\n\t\t\t\tdeclarations,\n\t\t\t\tselectors: [\"gender\", ...icuSelectors],\n\t\t\t\tvariants: [\n\t\t\t\t\tnested(female, exact(\"0\", text(\"She has none\"))),\n\t\t\t\t\tnested(female, category(\"one\", withCount(\"She has \", \" (one)\"))),\n\t\t\t\t\tnested(female, other(withCount(\"She has \", \" (other)\"))),\n\t\t\t\t\tnested(anyGender, exact(\"0\", text(\"They have none\"))),\n\t\t\t\t\tnested(anyGender, category(\"one\", withCount(\"They have \", \" (one)\"))),\n\t\t\t\t\tnested(anyGender, other(withCount(\"They have \", \" (other)\"))),\n\t\t\t\t],\n\t\t\t});\n\n\t\t\tconst results = (gender: string) =>\n\t\t\t\tCOUNTS.map((count) => message({ gender, count }));\n\t\t\t// =0 wins in both locales, also where French `one` covers 0\n\t\t\texpect(results(\"female\")).toEqual([\n\t\t\t\t\"She has none\",\n\t\t\t\t\"She has 1 (one)\",\n\t\t\t\t\"She has 2 (other)\",\n\t\t\t\t\"She has 5 (other)\",\n\t\t\t\t\"She has 21 (other)\",\n\t\t\t\t\"She has none\",\n\t\t\t]);\n\t\t\texpect(results(\"male\")).toEqual([\n\t\t\t\t\"They have none\",\n\t\t\t\t\"They have 1 (one)\",\n\t\t\t\t\"They have 2 (other)\",\n\t\t\t\t\"They have 5 (other)\",\n\t\t\t\t\"They have 21 (other)\",\n\t\t\t\t\"They have none\",\n\t\t\t]);\n\t\t}\n\t});\n\n\ttest(\"resolves chains of un-annotated aliases\", async () => {\n\t\tconst { message, code } = await compileAndImport({\n\t\t\tlocale: \"fr\",\n\t\t\tdeclarations: [\n\t\t\t\t{ type: \"input-variable\", name: \"count\" },\n\t\t\t\t{\n\t\t\t\t\ttype: \"local-variable\",\n\t\t\t\t\tname: \"countAlias\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"local-variable\",\n\t\t\t\t\tname: \"countAliasAlias\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\targ: { type: \"variable-reference\", name: \"countAlias\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"local-variable\",\n\t\t\t\t\tname: \"countPlural\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\t\t\t\t\tannotation: {\n\t\t\t\t\t\t\ttype: \"function-reference\",\n\t\t\t\t\t\t\tname: \"plural\",\n\t\t\t\t\t\t\toptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tselectors: [\"countAliasAlias\", \"countPlural\"],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tmatches: [catchall(\"countAliasAlias\"), literal(\"countPlural\", \"one\")],\n\t\t\t\t\tpattern: text(\"one\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmatches: [literal(\"countAliasAlias\", \"0\"), catchall(\"countPlural\")],\n\t\t\t\t\tpattern: text(\"zero\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmatches: [catchall(\"countAliasAlias\"), catchall(\"countPlural\")],\n\t\t\t\t\tpattern: text(\"other\"),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\n\t\texpect(code).toContain(\n\t\t\t'(countAliasAlias === 0 || countAliasAlias === \"0\")'\n\t\t);\n\t\texpect(COUNTS.map((count) => message({ count }))).toEqual([\n\t\t\t\"zero\",\n\t\t\t\"one\",\n\t\t\t\"other\",\n\t\t\t\"other\",\n\t\t\t\"other\",\n\t\t\t\"zero\",\n\t\t]);\n\t});\n\n\ttest(\"annotated locals and literal locals keep string matching\", async () => {\n\t\tconst { code } = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: [\n\t\t\t\t{ type: \"input-variable\", name: \"count\" },\n\t\t\t\t{\n\t\t\t\t\ttype: \"local-variable\",\n\t\t\t\t\tname: \"formatted\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\t\t\t\t\tannotation: {\n\t\t\t\t\t\t\ttype: \"function-reference\",\n\t\t\t\t\t\t\tname: \"number\",\n\t\t\t\t\t\t\toptions: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// aliases the formatted string, not the input\n\t\t\t\t\ttype: \"local-variable\",\n\t\t\t\t\tname: \"formattedAlias\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\targ: { type: \"variable-reference\", name: \"formatted\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"local-variable\",\n\t\t\t\t\tname: \"constant\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\targ: { type: \"literal\", value: \"0\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tselectors: [\"formatted\", \"formattedAlias\", \"constant\"],\n\t\t\tvariants: [\n\t\t\t\t{ matches: [literal(\"formatted\", \"0\")], pattern: text(\"a\") },\n\t\t\t\t{ matches: [literal(\"formattedAlias\", \"0\")], pattern: text(\"b\") },\n\t\t\t\t{ matches: [literal(\"constant\", \"0\")], pattern: text(\"c\") },\n\t\t\t\t{ matches: [], pattern: text(\"d\") },\n\t\t\t],\n\t\t});\n\n\t\texpect(code).toContain('if (formatted === \"0\")');\n\t\texpect(code).toContain('if (formattedAlias === \"0\")');\n\t\texpect(code).toContain('if (constant === \"0\")');\n\t});\n});\n\ndescribe(\"exact number matches on the input itself (i18next _zero import)\", () => {\n\t// i18next `key_zero`, `key_one`, `key_other` import as selectors\n\t// `count` (exact 0) and `countPlural`. `_zero` also becomes the Intl `zero`\n\t// category variant. Variants are listed in import order.\n\tconst declarations = (): Declaration[] => [\n\t\t{ type: \"input-variable\", name: \"count\" },\n\t\t{\n\t\t\ttype: \"local-variable\",\n\t\t\tname: \"countPlural\",\n\t\t\tvalue: {\n\t\t\t\ttype: \"expression\",\n\t\t\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\t\t\tannotation: { type: \"function-reference\", name: \"plural\", options: [] },\n\t\t\t},\n\t\t},\n\t];\n\tconst variants = (zero: string, one: Pattern, others: Pattern) => [\n\t\t{\n\t\t\tmatches: [catchall(\"count\"), literal(\"countPlural\", \"one\")],\n\t\t\tpattern: one,\n\t\t},\n\t\t{\n\t\t\tmatches: [catchall(\"count\"), literal(\"countPlural\", \"other\")],\n\t\t\tpattern: others,\n\t\t},\n\t\t{\n\t\t\tmatches: [literal(\"count\", \"0\"), catchall(\"countPlural\")],\n\t\t\tpattern: text(zero),\n\t\t},\n\t\t{\n\t\t\tmatches: [catchall(\"count\"), literal(\"countPlural\", \"zero\")],\n\t\t\tpattern: text(zero),\n\t\t},\n\t];\n\n\ttest(\"en\", async () => {\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: declarations(),\n\t\t\tselectors: [\"count\", \"countPlural\"],\n\t\t\tvariants: variants(\n\t\t\t\t\"No items\",\n\t\t\t\twithCount(\"\", \" item\"),\n\t\t\t\twithCount(\"\", \" items\")\n\t\t\t),\n\t\t});\n\n\t\texpect(render(message, COUNTS)).toEqual({\n\t\t\t\"0\": \"No items\",\n\t\t\t\"1\": \"1 item\",\n\t\t\t\"2\": \"2 items\",\n\t\t\t\"5\": \"5 items\",\n\t\t\t\"21\": \"21 items\",\n\t\t\t'\"0\"': \"No items\",\n\t\t});\n\t});\n\n\ttest(\"fr: exact 0 wins over one\", async () => {\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"fr\",\n\t\t\tdeclarations: declarations(),\n\t\t\tselectors: [\"count\", \"countPlural\"],\n\t\t\tvariants: variants(\n\t\t\t\t\"Aucun élément\",\n\t\t\t\twithCount(\"\", \" élément\"),\n\t\t\t\twithCount(\"\", \" éléments\")\n\t\t\t),\n\t\t});\n\n\t\texpect(render(message, COUNTS)).toEqual({\n\t\t\t\"0\": \"Aucun élément\",\n\t\t\t\"1\": \"1 élément\",\n\t\t\t\"2\": \"2 éléments\",\n\t\t\t\"5\": \"5 éléments\",\n\t\t\t\"21\": \"21 éléments\",\n\t\t\t'\"0\"': \"Aucun élément\",\n\t\t});\n\t});\n});\n\ndescribe(\"variant preference follows selector order\", () => {\n\ttest(\"literal keys win over catchalls selector by selector, not by storage order\", async () => {\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: [\n\t\t\t\t{ type: \"input-variable\", name: \"platform\" },\n\t\t\t\t{ type: \"input-variable\", name: \"gender\" },\n\t\t\t],\n\t\t\tselectors: [\"platform\", \"gender\"],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tmatches: [catchall(\"platform\"), literal(\"gender\", \"male\")],\n\t\t\t\t\tpattern: text(\"*,male\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmatches: [literal(\"platform\", \"android\"), catchall(\"gender\")],\n\t\t\t\t\tpattern: text(\"android,*\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmatches: [catchall(\"platform\"), catchall(\"gender\")],\n\t\t\t\t\tpattern: text(\"*,*\"),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\n\t\texpect(message({ platform: \"android\", gender: \"male\" })).toBe(\"android,*\");\n\t\texpect(message({ platform: \"ios\", gender: \"male\" })).toBe(\"*,male\");\n\t\texpect(message({ platform: \"ios\", gender: \"female\" })).toBe(\"*,*\");\n\t});\n\n\ttest(\"an ICU select with `other` stored first still reaches the other cases\", async () => {\n\t\t// {gender, select, other {They} female {She} male {He}}\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: [{ type: \"input-variable\", name: \"gender\" }],\n\t\t\tselectors: [\"gender\"],\n\t\t\tvariants: [\n\t\t\t\t{ matches: [catchall(\"gender\")], pattern: text(\"They\") },\n\t\t\t\t{ matches: [literal(\"gender\", \"female\")], pattern: text(\"She\") },\n\t\t\t\t{ matches: [literal(\"gender\", \"male\")], pattern: text(\"He\") },\n\t\t\t],\n\t\t});\n\n\t\texpect(message({ gender: \"female\" })).toBe(\"She\");\n\t\texpect(message({ gender: \"male\" })).toBe(\"He\");\n\t\texpect(message({ gender: \"other\" })).toBe(\"They\");\n\t});\n});\n\ndescribe(\"input match types with alias matches\", () => {\n\tconst statusBundle = (fr: Array<{ matches: Match[]; pattern: Pattern }>) => {\n\t\tconst bundle: BundleNested = {\n\t\t\tid: \"status_message\",\n\t\t\tdeclarations: [\n\t\t\t\t{ type: \"input-variable\", name: \"status\" },\n\t\t\t\t{\n\t\t\t\t\ttype: \"local-variable\",\n\t\t\t\t\tname: \"statusExact\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\t\targ: { type: \"variable-reference\", name: \"status\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\tid: \"en-id\",\n\t\t\t\t\tbundle_id: \"status_message\",\n\t\t\t\t\tlocale: \"en\",\n\t\t\t\t\tselectors: [{ type: \"variable-reference\", name: \"status\" }],\n\t\t\t\t\tvariants: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"1\",\n\t\t\t\t\t\t\tmessage_id: \"en-id\",\n\t\t\t\t\t\t\tmatches: [literal(\"status\", \"active\")],\n\t\t\t\t\t\t\tpattern: text(\"Active\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"fr-id\",\n\t\t\t\t\tbundle_id: \"status_message\",\n\t\t\t\t\tlocale: \"fr\",\n\t\t\t\t\tselectors: [{ type: \"variable-reference\", name: \"statusExact\" }],\n\t\t\t\t\tvariants: fr.map((variant, index) => ({\n\t\t\t\t\t\tid: `fr-${index}`,\n\t\t\t\t\t\tmessage_id: \"fr-id\",\n\t\t\t\t\t\t...variant,\n\t\t\t\t\t})),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\treturn compileBundle({\n\t\t\tfallbackMap: { en: \"en\", fr: \"fr\" },\n\t\t\tbundle,\n\t\t\tmessageReferenceExpression: (locale) =>\n\t\t\t\t`${toSafeModuleId(locale)}.status_message`,\n\t\t\tsettings: { locales: [\"en\", \"fr\"] } as ProjectSettings,\n\t\t}).matchTypes.get(\"status\");\n\t};\n\n\ttest(\"alias literal matches widen an input type narrowed by direct matches\", () => {\n\t\tconst info = statusBundle([\n\t\t\t{ matches: [literal(\"statusExact\", \"0\")], pattern: text(\"Zéro\") },\n\t\t]);\n\n\t\texpect(info?.literals).toEqual(new Set([\"active\", \"0\"]));\n\t\texpect(info?.hasCatchAll).toBe(false);\n\t});\n\n\ttest(\"an alias catchall widens the input type to any value\", () => {\n\t\tconst info = statusBundle([\n\t\t\t{ matches: [literal(\"statusExact\", \"0\")], pattern: text(\"Zéro\") },\n\t\t\t{ matches: [catchall(\"statusExact\")], pattern: text(\"Autre\") },\n\t\t]);\n\n\t\t// status: \"inactive\" must type-check, fr handles any status\n\t\texpect(info?.hasCatchAll).toBe(true);\n\t});\n});\n\ndescribe(\"ICU plural offset (`{count, plural, offset:1 …}`)\", () => {\n\t/**\n\t * The shape inlang's ICU MessageFormat 1 plugin imports\n\t * `{count, plural, offset:1 =0 {…} =1 {…} one {…} other {…}}` as.\n\t */\n\tconst offsetDeclarations = (offset = \"1\"): Declaration[] => [\n\t\t{ type: \"input-variable\", name: \"count\" },\n\t\t{\n\t\t\ttype: \"local-variable\",\n\t\t\tname: \"countPluralOffset1\",\n\t\t\tvalue: {\n\t\t\t\ttype: \"expression\",\n\t\t\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\t\t\tannotation: {\n\t\t\t\t\ttype: \"function-reference\",\n\t\t\t\t\tname: \"plural\",\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ name: \"offset\", value: { type: \"literal\", value: offset } },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttype: \"local-variable\",\n\t\t\tname: \"countPluralOffset1Exact\",\n\t\t\tvalue: {\n\t\t\t\ttype: \"expression\",\n\t\t\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\t\t},\n\t\t},\n\t];\n\tconst offsetSelectors = [\"countPluralOffset1Exact\", \"countPluralOffset1\"];\n\tconst exactOffset = (value: string, pattern: Pattern) => ({\n\t\tmatches: [\n\t\t\tliteral(\"countPluralOffset1Exact\", value),\n\t\t\tcatchall(\"countPluralOffset1\"),\n\t\t],\n\t\tpattern,\n\t});\n\tconst categoryOffset = (value: string, pattern: Pattern) => ({\n\t\tmatches: [\n\t\t\tcatchall(\"countPluralOffset1Exact\"),\n\t\t\tliteral(\"countPluralOffset1\", value),\n\t\t],\n\t\tpattern,\n\t});\n\tconst otherOffset = (pattern: Pattern) => ({\n\t\tmatches: [\n\t\t\tcatchall(\"countPluralOffset1Exact\"),\n\t\t\tcatchall(\"countPluralOffset1\"),\n\t\t],\n\t\tpattern,\n\t});\n\n\ttest(\"en: the category is selected on count - offset, exact matches on count\", async () => {\n\t\tconst { message, code } = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: offsetDeclarations(),\n\t\t\tselectors: offsetSelectors,\n\t\t\tvariants: [\n\t\t\t\texactOffset(\"0\", text(\"Nobody\")),\n\t\t\t\texactOffset(\"1\", text(\"Only you\")),\n\t\t\t\tcategoryOffset(\"one\", text(\"You and one other\")),\n\t\t\t\totherOffset(text(\"You and others\")),\n\t\t\t],\n\t\t});\n\n\t\t// a number, not the string \"1\"\n\t\texpect(code).toContain('registry.plural(\"en\", i?.count, { offset: 1 })');\n\t\texpect(render(message, [0, 1, 2, 3, 22, \"1\", \"2\"])).toEqual({\n\t\t\t\"0\": \"Nobody\",\n\t\t\t\"1\": \"Only you\",\n\t\t\t// 2 - 1 = 1 is \"one\"\n\t\t\t\"2\": \"You and one other\",\n\t\t\t\"3\": \"You and others\",\n\t\t\t\"22\": \"You and others\",\n\t\t\t'\"1\"': \"Only you\",\n\t\t\t'\"2\"': \"You and one other\",\n\t\t});\n\t});\n\n\ttest(\"ru: one/few/many follow count - offset\", async () => {\n\t\tconst { message } = await compileAndImport({\n\t\t\tlocale: \"ru\",\n\t\t\tdeclarations: offsetDeclarations(),\n\t\t\tselectors: offsetSelectors,\n\t\t\tvariants: [\n\t\t\t\texactOffset(\"1\", text(\"only you\")),\n\t\t\t\tcategoryOffset(\"one\", text(\"one\")),\n\t\t\t\tcategoryOffset(\"few\", text(\"few\")),\n\t\t\t\tcategoryOffset(\"many\", text(\"many\")),\n\t\t\t\totherOffset(text(\"other\")),\n\t\t\t],\n\t\t});\n\n\t\texpect(render(message, [1, 2, 3, 6, 22, 23])).toEqual({\n\t\t\t\"1\": \"only you\",\n\t\t\t\"2\": \"one\", // 1\n\t\t\t\"3\": \"few\", // 2\n\t\t\t\"6\": \"many\", // 5\n\t\t\t\"22\": \"one\", // 21\n\t\t\t\"23\": \"few\", // 22\n\t\t});\n\t});\n\n\ttest(\"an offset of 0 and no offset select the same category\", async () => {\n\t\tconst withZero = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: offsetDeclarations(\"0\"),\n\t\t\tselectors: offsetSelectors,\n\t\t\tvariants: [\n\t\t\t\tcategoryOffset(\"one\", text(\"one\")),\n\t\t\t\totherOffset(text(\"other\")),\n\t\t\t],\n\t\t});\n\n\t\texpect(render(withZero.message, [0, 1, 2])).toEqual({\n\t\t\t\"0\": \"other\",\n\t\t\t\"1\": \"one\",\n\t\t\t\"2\": \"other\",\n\t\t});\n\t});\n\n\ttest(\"a non-numeric offset fails compilation\", async () => {\n\t\tawait expect(\n\t\t\tcompileAndImport({\n\t\t\t\tlocale: \"en\",\n\t\t\t\tdeclarations: offsetDeclarations(\"one\"),\n\t\t\t\tselectors: offsetSelectors,\n\t\t\t\tvariants: [\n\t\t\t\t\tcategoryOffset(\"one\", text(\"one\")),\n\t\t\t\t\totherOffset(text(\"other\")),\n\t\t\t\t],\n\t\t\t})\n\t\t).rejects.toThrow('Invalid \"plural\" offset \"one\". Expected a number.');\n\t});\n\n\ttest(\"registry.plural subtracts the offset and ignores it otherwise\", async () => {\n\t\tconst registry = await import(\n\t\t\t\"data:text/javascript;base64,\" +\n\t\t\t\tBuffer.from(createRegistry()).toString(\"base64\")\n\t\t);\n\n\t\texpect(registry.plural(\"en\", 2, { offset: 1 })).toBe(\"one\");\n\t\texpect(registry.plural(\"en\", 1, { offset: 1 })).toBe(\"other\");\n\t\texpect(registry.plural(\"en\", 1, {})).toBe(\"one\");\n\t\texpect(registry.plural(\"en\", 1)).toBe(\"one\");\n\t\texpect(registry.plural(\"en\", 3, { type: \"ordinal\", offset: 1 })).toBe(\n\t\t\t\"two\"\n\t\t);\n\t});\n\n\tconst pound = (offset?: string): Pattern[number] => ({\n\t\ttype: \"expression\",\n\t\targ: { type: \"variable-reference\", name: \"count\" },\n\t\tannotation: {\n\t\t\ttype: \"function-reference\",\n\t\t\tname: \"icu:pound\",\n\t\t\toptions:\n\t\t\t\toffset === undefined\n\t\t\t\t\t? []\n\t\t\t\t\t: [{ name: \"offset\", value: { type: \"literal\", value: offset } }],\n\t\t},\n\t});\n\n\ttest(\"# displays count - offset, formatted like number()\", async () => {\n\t\tconst { message, code } = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: offsetDeclarations(),\n\t\t\tselectors: offsetSelectors,\n\t\t\tvariants: [\n\t\t\t\texactOffset(\"0\", text(\"Nobody\")),\n\t\t\t\texactOffset(\"1\", text(\"You\")),\n\t\t\t\tcategoryOffset(\"one\", [\n\t\t\t\t\t{ type: \"text\", value: \"You and \" },\n\t\t\t\t\tpound(\"1\"),\n\t\t\t\t\t{ type: \"text\", value: \" other\" },\n\t\t\t\t]),\n\t\t\t\totherOffset([\n\t\t\t\t\t{ type: \"text\", value: \"You and \" },\n\t\t\t\t\tpound(\"1\"),\n\t\t\t\t\t{ type: \"text\", value: \" others\" },\n\t\t\t\t]),\n\t\t\t],\n\t\t});\n\n\t\texpect(code).toContain('registry.icuPound(\"en\", i?.count, { offset: 1 })');\n\t\texpect(render(message, [0, 1, 2, 3, 1234, \"2\"])).toEqual({\n\t\t\t\"0\": \"Nobody\",\n\t\t\t\"1\": \"You\",\n\t\t\t\"2\": \"You and 1 other\",\n\t\t\t\"3\": \"You and 2 others\",\n\t\t\t\"1234\": \"You and 1,233 others\",\n\t\t\t'\"2\"': \"You and 1 other\",\n\t\t});\n\t});\n\n\ttest(\"# without an offset displays count, formatted like number()\", async () => {\n\t\tconst variants = [\n\t\t\tcategory(\"one\", [pound(), { type: \"text\", value: \" item\" }]),\n\t\t\tother([pound(), { type: \"text\", value: \" items\" }]),\n\t\t];\n\t\tconst en = await compileAndImport({\n\t\t\tlocale: \"en\",\n\t\t\tdeclarations: icuDeclarations(),\n\t\t\tselectors: icuSelectors,\n\t\t\tvariants,\n\t\t});\n\t\tconst de = await compileAndImport({\n\t\t\tlocale: \"de\",\n\t\t\tdeclarations: icuDeclarations(),\n\t\t\tselectors: icuSelectors,\n\t\t\tvariants,\n\t\t});\n\n\t\texpect(en.code).toContain('registry.icuPound(\"en\", i?.count, {})');\n\t\texpect(render(en.message, [1, 2, 1234, 1.5])).toEqual({\n\t\t\t\"1\": \"1 item\",\n\t\t\t\"2\": \"2 items\",\n\t\t\t\"1234\": \"1,234 items\",\n\t\t\t\"1.5\": \"1.5 items\",\n\t\t});\n\t\texpect(de.message({ count: 1234 })).toBe(\"1.234 items\");\n\t});\n\n\ttest(\"a non-numeric # offset fails compilation\", async () => {\n\t\tawait expect(\n\t\t\tcompileAndImport({\n\t\t\t\tlocale: \"en\",\n\t\t\t\tdeclarations: offsetDeclarations(),\n\t\t\t\tselectors: offsetSelectors,\n\t\t\t\tvariants: [otherOffset([pound(\"x\")])],\n\t\t\t})\n\t\t).rejects.toThrow('Invalid \"icu:pound\" offset \"x\". Expected a number.');\n\t});\n\n\ttest(\"registry.icuPound subtracts the offset and formats like number()\", async () => {\n\t\tconst registry = await import(\n\t\t\t\"data:text/javascript;base64,\" +\n\t\t\t\tBuffer.from(createRegistry()).toString(\"base64\")\n\t\t);\n\n\t\texpect(registry.icuPound(\"en\", 1234, { offset: 1 })).toBe(\"1,233\");\n\t\texpect(registry.icuPound(\"en\", 1234, {})).toBe(\n\t\t\tregistry.number(\"en\", 1234, {})\n\t\t);\n\t\texpect(registry.icuPound(\"en\", \"3\")).toBe(\"3\");\n\t});\n\n\ttest(\"# displays an input that is not a number as is, without the offset\", async () => {\n\t\tconst registry = await import(\n\t\t\t\"data:text/javascript;base64,\" +\n\t\t\t\tBuffer.from(createRegistry()).toString(\"base64\")\n\t\t);\n\t\tconst pound = (input: unknown) =>\n\t\t\tregistry.icuPound(\"en\", input, { offset: 1 });\n\n\t\t// numbers and numeric strings are offset and formatted\n\t\texpect(pound(1234)).toBe(\"1,233\");\n\t\texpect(pound(\"1234\")).toBe(\"1,233\");\n\t\texpect(pound(\" 3 \")).toBe(\"2\");\n\t\t// anything else is displayed like a plain {count} placeholder\n\t\texpect(pound(\"abc\")).toBe(\"abc\");\n\t\texpect(pound(\"1,234\")).toBe(\"1,234\");\n\t\texpect(pound(\"\")).toBe(\"\");\n\t\texpect(pound(undefined)).toBe(\"undefined\");\n\t\texpect(pound(null)).toBe(\"null\");\n\t\texpect(pound(true)).toBe(\"true\");\n\t\texpect(pound(Number.NaN)).toBe(\"NaN\");\n\t\texpect(pound(Infinity)).toBe(\"Infinity\");\n\t});\n});\n"]}
@@ -3,6 +3,19 @@ import { inputsType } from "./jsdoc-types.js";
3
3
  import { compileLocalVariable } from "./compile-local-variable.js";
4
4
  import { renderInputMatchCondition } from "./match-literals.js";
5
5
  import { compileInputAccess } from "./variable-access.js";
6
+ import { resolveInputAlias } from "./input-alias.js";
7
+ import { patternVariableReferences, resolveMessageLocals, } from "./message-locals.js";
8
+ /**
9
+ * The bundle id of a message with either SDK version.
10
+ */
11
+ export function messageBundleId(message) {
12
+ const ids = message;
13
+ const bundleId = ids.bundle_id ?? ids.bundleId;
14
+ if (typeof bundleId !== "string") {
15
+ throw new Error(`Message ${JSON.stringify(message.id)} (locale ${JSON.stringify(message.locale)}) has no bundle id`);
16
+ }
17
+ return bundleId;
18
+ }
6
19
  /**
7
20
  * Returns the compiled message as a string
8
21
  *
@@ -24,53 +37,56 @@ function compileMessageWithOneVariant(declarations, message, variants, matchType
24
37
  }
25
38
  const hasMarkup = patternHasMarkup(variant.pattern);
26
39
  const inputs = declarations.filter((decl) => decl.type === "input-variable");
27
- const hasInputs = inputs.length > 0;
40
+ const registryUsage = new Set();
28
41
  const messageInputType = inputTypeAliasName ?? inputsType(inputs, matchTypes);
42
+ // resolve before compiling the pattern to report undeclared variables
43
+ // with the bundle id and locale
44
+ const stringLocals = compileLocalVariables(patternVariableReferences(variant.pattern, "string"), declarations, message, registryUsage);
45
+ const partsLocals = hasMarkup
46
+ ? compileLocalVariables(patternVariableReferences(variant.pattern, "parts"), declarations, message, registryUsage)
47
+ : { code: [], readsInput: false };
29
48
  const compiledPattern = compilePattern({
30
49
  pattern: variant.pattern,
31
50
  declarations,
32
51
  locale: message.locale,
52
+ registryUsage,
33
53
  });
34
- const compiledLocalVariables = [];
35
- for (const declaration of declarations) {
36
- if (declaration.type === "local-variable") {
37
- compiledLocalVariables.push(compileLocalVariable({
38
- declaration,
39
- declarations,
40
- locale: message.locale,
41
- }));
42
- }
43
- }
44
54
  if (!hasMarkup) {
45
- const code = `/** @type {(inputs: ${messageInputType}) => LocalizedString} */ (${hasInputs ? "i" : ""}) => {
46
- ${compiledLocalVariables.join("\n\t")}return /** @type {LocalizedString} */ (${compiledPattern.code})
55
+ const code = `/** @type {(inputs: ${messageInputType}) => LocalizedString} */ (${stringLocals.readsInput ? "i" : ""}) => {
56
+ ${stringLocals.code.join("\n\t")}return /** @type {LocalizedString} */ (${compiledPattern.code})
47
57
  };`;
48
- return { code, node: message };
58
+ return { code, node: message, registryFunctions: [...registryUsage] };
49
59
  }
50
60
  const compiledPartsPattern = compilePattern({
51
61
  pattern: variant.pattern,
52
62
  declarations,
53
63
  mode: "parts",
54
64
  locale: message.locale,
65
+ registryUsage,
55
66
  });
56
- const localVariablesCode = compiledLocalVariables.length
57
- ? compiledLocalVariables.join("\n\t") + "\n\t"
58
- : "";
67
+ const localVariablesCode = joinLocalVariables(stringLocals.code);
68
+ const partsLocalVariablesCode = joinLocalVariables(partsLocals.code);
59
69
  const inputType = messageInputType;
60
- const messageInput = hasInputs ? "i" : "";
70
+ // only declare the input parameter where it is read (noUnusedParameters)
71
+ const messageInput = stringLocals.readsInput ? "i" : "";
72
+ const partsMessageInput = partsLocals.readsInput ? "i" : "";
61
73
  const partsCode = `/** @type {((inputs: ${inputType}) => LocalizedString) & { parts: (inputs: ${inputType}) => import('../runtime.js').MessagePart[] }} */ (
62
74
  /* @__PURE__ */ Object.assign(
63
75
  /** @type {(inputs: ${inputType}) => LocalizedString} */ ((${messageInput}) => {
64
76
  ${localVariablesCode}return /** @type {LocalizedString} */ (${compiledPattern.code})
65
77
  }),
66
78
  {
67
- parts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${messageInput}) => {
68
- ${localVariablesCode}return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code})
79
+ parts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${partsMessageInput}) => {
80
+ ${partsLocalVariablesCode}return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code})
69
81
  })
70
82
  }
71
83
  )
72
84
  );`;
73
- return { code: partsCode, node: message };
85
+ return {
86
+ code: partsCode,
87
+ node: message,
88
+ registryFunctions: [...registryUsage],
89
+ };
74
90
  }
75
91
  function compileMessageWithMultipleVariants(declarations, message, variants, matchTypes, inputTypeAliasName) {
76
92
  if (variants.length <= 1) {
@@ -78,33 +94,20 @@ function compileMessageWithMultipleVariants(declarations, message, variants, mat
78
94
  }
79
95
  const hasMarkup = variants.some((variant) => patternHasMarkup(variant.pattern));
80
96
  const inputs = declarations.filter((decl) => decl.type === "input-variable");
81
- const hasInputs = inputs.length > 0;
97
+ const registryUsage = new Set();
82
98
  const messageInputType = inputTypeAliasName ?? inputsType(inputs, matchTypes);
83
- // TODO make sure that matchers use keys instead of indexes
84
- const compiledVariants = [];
85
- const compiledPartsVariants = [];
99
+ // The variants the function checks, in preference order. A variant without
100
+ // a condition is a catchall and returns unconditionally.
101
+ const steps = [];
102
+ // variables the match conditions read
103
+ const conditionReads = [];
86
104
  let hasCatchAll = false;
87
- for (const variant of variants) {
88
- const compiledPattern = compilePattern({
89
- pattern: variant.pattern,
90
- declarations,
91
- locale: message.locale,
92
- });
93
- const compiledPartsPattern = hasMarkup
94
- ? compilePattern({
95
- pattern: variant.pattern,
96
- declarations,
97
- mode: "parts",
98
- locale: message.locale,
99
- })
100
- : undefined;
105
+ for (const variant of sortVariantsBySelectorPreference(variants, message.selectors)) {
101
106
  const isCatchAll = variant.matches.every((match) => match.type === "catchall-match");
102
107
  if (isCatchAll) {
103
- compiledVariants.push(`return /** @type {LocalizedString} */ (${compiledPattern.code})`);
104
- if (compiledPartsPattern) {
105
- compiledPartsVariants.push(`return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code})`);
106
- }
108
+ steps.push({ pattern: variant.pattern });
107
109
  hasCatchAll = true;
110
+ continue;
108
111
  }
109
112
  const conditions = [];
110
113
  for (const match of variant.matches) {
@@ -114,39 +117,73 @@ function compileMessageWithMultipleVariants(declarations, message, variants, mat
114
117
  }
115
118
  const variableType = declarations.find((decl) => decl.name === match.key)?.type;
116
119
  if (variableType === "input-variable") {
120
+ conditionReads.push(match.key);
117
121
  conditions.push(renderInputMatchCondition(compileInputAccess(match.key), match.value));
118
122
  }
119
123
  else if (variableType === "local-variable") {
120
- conditions.push(`${match.key} === ${JSON.stringify(match.value)}`);
124
+ conditionReads.push(match.key);
125
+ // An un-annotated local that aliases an input holds the raw input
126
+ // value (e.g. ICU `=0` imports as `.local countPluralExact = {$count}`)
127
+ // and must match like the input itself, numerically for numbers.
128
+ // Annotated locals hold the function's result and match as strings.
129
+ conditions.push(resolveInputAlias(match.key, declarations) !== undefined
130
+ ? renderInputMatchCondition(match.key, match.value)
131
+ : `${match.key} === ${JSON.stringify(match.value)}`);
121
132
  }
122
133
  }
123
134
  if (conditions.length === 0)
124
135
  continue;
125
- compiledVariants.push(`if (${conditions.join(" && ")}) return /** @type {LocalizedString} */ (${compiledPattern.code});`);
126
- if (compiledPartsPattern) {
127
- compiledPartsVariants.push(`if (${conditions.join(" && ")}) return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code});`);
128
- }
136
+ steps.push({
137
+ pattern: variant.pattern,
138
+ condition: conditions.join(" && "),
139
+ });
129
140
  }
130
- const compiledLocalVariables = [];
131
- for (const declaration of declarations) {
132
- if (declaration.type === "local-variable") {
133
- compiledLocalVariables.push(compileLocalVariable({
134
- declaration,
141
+ // resolve before compiling the patterns to report undeclared variables
142
+ // with the bundle id and locale
143
+ const stringLocals = compileLocalVariables([
144
+ ...conditionReads,
145
+ ...steps.flatMap((step) => patternVariableReferences(step.pattern, "string")),
146
+ ], declarations, message, registryUsage);
147
+ const partsLocals = hasMarkup
148
+ ? compileLocalVariables([
149
+ ...conditionReads,
150
+ ...steps.flatMap((step) => patternVariableReferences(step.pattern, "parts")),
151
+ ], declarations, message, registryUsage)
152
+ : { code: [], readsInput: false };
153
+ const compiledVariants = [];
154
+ const compiledPartsVariants = [];
155
+ for (const step of steps) {
156
+ const compiledPattern = compilePattern({
157
+ pattern: step.pattern,
158
+ declarations,
159
+ locale: message.locale,
160
+ registryUsage,
161
+ });
162
+ compiledVariants.push(step.condition === undefined
163
+ ? `return /** @type {LocalizedString} */ (${compiledPattern.code})`
164
+ : `if (${step.condition}) return /** @type {LocalizedString} */ (${compiledPattern.code});`);
165
+ if (hasMarkup) {
166
+ const compiledPartsPattern = compilePattern({
167
+ pattern: step.pattern,
135
168
  declarations,
169
+ mode: "parts",
136
170
  locale: message.locale,
137
- }));
171
+ registryUsage,
172
+ });
173
+ compiledPartsVariants.push(step.condition === undefined
174
+ ? `return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code})`
175
+ : `if (${step.condition}) return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code});`);
138
176
  }
139
177
  }
140
178
  if (!hasMarkup) {
141
- const code = `/** @type {(inputs: ${messageInputType}) => LocalizedString} */ (${hasInputs ? "i" : ""}) => {${compiledLocalVariables.join("\n\t")}
179
+ const code = `/** @type {(inputs: ${messageInputType}) => LocalizedString} */ (${stringLocals.readsInput ? "i" : ""}) => {${stringLocals.code.join("\n\t")}
142
180
  ${compiledVariants.join("\n\t")}
143
- ${hasCatchAll ? "" : `return /** @type {LocalizedString} */ ("${message.bundleId}");`}
181
+ ${hasCatchAll ? "" : `return /** @type {LocalizedString} */ (${JSON.stringify(messageBundleId(message))});`}
144
182
  };`;
145
- return { code, node: message };
183
+ return { code, node: message, registryFunctions: [...registryUsage] };
146
184
  }
147
- const localVariablesCode = compiledLocalVariables.length
148
- ? compiledLocalVariables.join("\n\t") + "\n\t"
149
- : "";
185
+ const localVariablesCode = joinLocalVariables(stringLocals.code);
186
+ const partsLocalVariablesCode = joinLocalVariables(partsLocals.code);
150
187
  const stringVariantsCode = compiledVariants.length
151
188
  ? compiledVariants.join("\n\t") + "\n\t"
152
189
  : "";
@@ -154,25 +191,84 @@ function compileMessageWithMultipleVariants(declarations, message, variants, mat
154
191
  ? compiledPartsVariants.join("\n\t") + "\n\t"
155
192
  : "";
156
193
  const inputType = messageInputType;
157
- const fallbackParts = `[{ type: "text", value: ${JSON.stringify(message.bundleId)} }]`;
158
- const messageInput = hasInputs ? "i" : "";
194
+ const fallbackParts = `[{ type: "text", value: ${JSON.stringify(messageBundleId(message))} }]`;
195
+ // only declare the input parameter where it is read (noUnusedParameters)
196
+ const messageInput = stringLocals.readsInput ? "i" : "";
197
+ const partsMessageInput = partsLocals.readsInput ? "i" : "";
159
198
  const code = `/** @type {((inputs: ${inputType}) => LocalizedString) & { parts: (inputs: ${inputType}) => import('../runtime.js').MessagePart[] }} */ (
160
199
  /* @__PURE__ */ Object.assign(
161
200
  /** @type {(inputs: ${inputType}) => LocalizedString} */ ((${messageInput}) => {
162
201
  ${localVariablesCode}${stringVariantsCode}${hasCatchAll
163
202
  ? ""
164
- : `return /** @type {LocalizedString} */ (${JSON.stringify(message.bundleId)});`}
203
+ : `return /** @type {LocalizedString} */ (${JSON.stringify(messageBundleId(message))});`}
165
204
  }),
166
205
  {
167
- parts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${messageInput}) => {
168
- ${localVariablesCode}${partsVariantsCode}${hasCatchAll
206
+ parts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${partsMessageInput}) => {
207
+ ${partsLocalVariablesCode}${partsVariantsCode}${hasCatchAll
169
208
  ? ""
170
209
  : `return /** @type {import('../runtime.js').MessagePart[]} */ (${fallbackParts});`}
171
210
  })
172
211
  }
173
212
  )
174
213
  );`;
175
- return { code, node: message };
214
+ return { code, node: message, registryFunctions: [...registryUsage] };
215
+ }
216
+ /**
217
+ * Compiles the local variables a message function reads, directly or through
218
+ * other locals, in dependency order. Unread locals are left out. `readsInput`
219
+ * tells whether the function reads its inputs parameter.
220
+ */
221
+ function compileLocalVariables(reads, declarations, message, registryUsage) {
222
+ const { locals, readsInput } = resolveMessageLocals({
223
+ reads,
224
+ declarations,
225
+ bundleId: messageBundleId(message),
226
+ locale: message.locale,
227
+ });
228
+ return {
229
+ code: locals.map((declaration) => compileLocalVariable({
230
+ declaration,
231
+ declarations,
232
+ locale: message.locale,
233
+ registryUsage,
234
+ })),
235
+ readsInput,
236
+ };
237
+ }
238
+ function joinLocalVariables(compiledLocalVariables) {
239
+ return compiledLocalVariables.length
240
+ ? compiledLocalVariables.join("\n\t") + "\n\t"
241
+ : "";
242
+ }
243
+ /**
244
+ * Orders variants by key preference in selector order, as in MessageFormat 2
245
+ * variant selection: for the first selector, variants with a literal key come
246
+ * before variants with a catchall key, then the next selector breaks ties, and
247
+ * so on. Ties keep their original order.
248
+ *
249
+ * The compiled message returns the first variant whose conditions hold, so
250
+ * this makes `countPluralExact=0 × countPlural=*` win over
251
+ * `countPluralExact=* × countPlural=one` for French count 0 regardless of the
252
+ * order the variants are stored in.
253
+ */
254
+ function sortVariantsBySelectorPreference(variants, selectors) {
255
+ if (selectors.length === 0) {
256
+ return variants;
257
+ }
258
+ const rank = (variant) => selectors.map((selector) => variant.matches.some((match) => match.key === selector.name && match.type === "literal-match")
259
+ ? 0
260
+ : 1);
261
+ return variants
262
+ .map((variant, index) => ({ variant, index, rank: rank(variant) }))
263
+ .sort((left, right) => {
264
+ for (let i = 0; i < selectors.length; i++) {
265
+ const diff = left.rank[i] - right.rank[i];
266
+ if (diff !== 0)
267
+ return diff;
268
+ }
269
+ return left.index - right.index;
270
+ })
271
+ .map((entry) => entry.variant);
176
272
  }
177
273
  function patternHasMarkup(pattern) {
178
274
  return pattern.some((part) => part.type === "markup-start" ||
@@ -1 +1 @@
1
- {"version":3,"file":"compile-message.js","sourceRoot":"","sources":["../../src/compiler/compile-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Declaration, Message, Pattern, Variant } from \"@inlang/sdk\";\nimport { compilePattern } from \"./compile-pattern.js\";\nimport type { Compiled } from \"./types.js\";\nimport { inputsType, type InputMatchTypes } from \"./jsdoc-types.js\";\nimport { compileLocalVariable } from \"./compile-local-variable.js\";\nimport { renderInputMatchCondition } from \"./match-literals.js\";\nimport { compileInputAccess } from \"./variable-access.js\";\n\n/**\n * Returns the compiled message as a string\n *\n */\nexport const compileMessage = (\n\tdeclarations: Declaration[],\n\tmessage: Message,\n\tvariants: Variant[],\n\tmatchTypes?: InputMatchTypes,\n\tinputTypeAliasName?: string\n): Compiled<Message> => {\n\t// return empty string instead?\n\tif (variants.length == 0) {\n\t\tthrow new Error(\"Message must have at least one variant\");\n\t}\n\n\tconst hasMultipleVariants = variants.length > 1;\n\treturn hasMultipleVariants\n\t\t? compileMessageWithMultipleVariants(\n\t\t\t\tdeclarations,\n\t\t\t\tmessage,\n\t\t\t\tvariants,\n\t\t\t\tmatchTypes,\n\t\t\t\tinputTypeAliasName\n\t\t\t)\n\t\t: compileMessageWithOneVariant(\n\t\t\t\tdeclarations,\n\t\t\t\tmessage,\n\t\t\t\tvariants,\n\t\t\t\tmatchTypes,\n\t\t\t\tinputTypeAliasName\n\t\t\t);\n};\n\nfunction compileMessageWithOneVariant(\n\tdeclarations: Declaration[],\n\tmessage: Message,\n\tvariants: Variant[],\n\tmatchTypes?: InputMatchTypes,\n\tinputTypeAliasName?: string\n): Compiled<Message> {\n\tconst variant = variants[0];\n\tif (!variant || variants.length !== 1) {\n\t\tthrow new Error(\"Message must have exactly one variant\");\n\t}\n\n\tconst hasMarkup = patternHasMarkup(variant.pattern);\n\tconst inputs = declarations.filter((decl) => decl.type === \"input-variable\");\n\tconst hasInputs = inputs.length > 0;\n\tconst messageInputType = inputTypeAliasName ?? inputsType(inputs, matchTypes);\n\tconst compiledPattern = compilePattern({\n\t\tpattern: variant.pattern,\n\t\tdeclarations,\n\t\tlocale: message.locale,\n\t});\n\n\tconst compiledLocalVariables = [];\n\n\tfor (const declaration of declarations) {\n\t\tif (declaration.type === \"local-variable\") {\n\t\t\tcompiledLocalVariables.push(\n\t\t\t\tcompileLocalVariable({\n\t\t\t\t\tdeclaration,\n\t\t\t\t\tdeclarations,\n\t\t\t\t\tlocale: message.locale,\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\n\tif (!hasMarkup) {\n\t\tconst code = `/** @type {(inputs: ${messageInputType}) => LocalizedString} */ (${hasInputs ? \"i\" : \"\"}) => {\n\t${compiledLocalVariables.join(\"\\n\\t\")}return /** @type {LocalizedString} */ (${compiledPattern.code})\n};`;\n\n\t\treturn { code, node: message };\n\t}\n\n\tconst compiledPartsPattern = compilePattern({\n\t\tpattern: variant.pattern,\n\t\tdeclarations,\n\t\tmode: \"parts\",\n\t\tlocale: message.locale,\n\t});\n\tconst localVariablesCode = compiledLocalVariables.length\n\t\t? compiledLocalVariables.join(\"\\n\\t\") + \"\\n\\t\"\n\t\t: \"\";\n\tconst inputType = messageInputType;\n\tconst messageInput = hasInputs ? \"i\" : \"\";\n\n\tconst partsCode = `/** @type {((inputs: ${inputType}) => LocalizedString) & { parts: (inputs: ${inputType}) => import('../runtime.js').MessagePart[] }} */ (\n\t/* @__PURE__ */ Object.assign(\n\t\t/** @type {(inputs: ${inputType}) => LocalizedString} */ ((${messageInput}) => {\n\t\t\t${localVariablesCode}return /** @type {LocalizedString} */ (${compiledPattern.code})\n\t\t}),\n\t\t{\n\t\t\tparts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${messageInput}) => {\n\t\t\t\t${localVariablesCode}return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code})\n\t\t\t})\n\t\t}\n\t)\n);`;\n\n\treturn { code: partsCode, node: message };\n}\n\nfunction compileMessageWithMultipleVariants(\n\tdeclarations: Declaration[],\n\tmessage: Message,\n\tvariants: Variant[],\n\tmatchTypes?: InputMatchTypes,\n\tinputTypeAliasName?: string\n): Compiled<Message> {\n\tif (variants.length <= 1) {\n\t\tthrow new Error(\"Message must have more than one variant\");\n\t}\n\n\tconst hasMarkup = variants.some((variant) =>\n\t\tpatternHasMarkup(variant.pattern)\n\t);\n\tconst inputs = declarations.filter((decl) => decl.type === \"input-variable\");\n\tconst hasInputs = inputs.length > 0;\n\tconst messageInputType = inputTypeAliasName ?? inputsType(inputs, matchTypes);\n\n\t// TODO make sure that matchers use keys instead of indexes\n\tconst compiledVariants = [];\n\tconst compiledPartsVariants = [];\n\n\tlet hasCatchAll = false;\n\n\tfor (const variant of variants) {\n\t\tconst compiledPattern = compilePattern({\n\t\t\tpattern: variant.pattern,\n\t\t\tdeclarations,\n\t\t\tlocale: message.locale,\n\t\t});\n\t\tconst compiledPartsPattern = hasMarkup\n\t\t\t? compilePattern({\n\t\t\t\t\tpattern: variant.pattern,\n\t\t\t\t\tdeclarations,\n\t\t\t\t\tmode: \"parts\",\n\t\t\t\t\tlocale: message.locale,\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\tconst isCatchAll = variant.matches.every(\n\t\t\t(match) => match.type === \"catchall-match\"\n\t\t);\n\n\t\tif (isCatchAll) {\n\t\t\tcompiledVariants.push(\n\t\t\t\t`return /** @type {LocalizedString} */ (${compiledPattern.code})`\n\t\t\t);\n\t\t\tif (compiledPartsPattern) {\n\t\t\t\tcompiledPartsVariants.push(\n\t\t\t\t\t`return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code})`\n\t\t\t\t);\n\t\t\t}\n\t\t\thasCatchAll = true;\n\t\t}\n\n\t\tconst conditions: string[] = [];\n\n\t\tfor (const match of variant.matches) {\n\t\t\t// catch all matches are not used in the conditions\n\t\t\tif (match.type !== \"literal-match\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst variableType = declarations.find(\n\t\t\t\t(decl) => decl.name === match.key\n\t\t\t)?.type;\n\t\t\tif (variableType === \"input-variable\") {\n\t\t\t\tconditions.push(\n\t\t\t\t\trenderInputMatchCondition(compileInputAccess(match.key), match.value)\n\t\t\t\t);\n\t\t\t} else if (variableType === \"local-variable\") {\n\t\t\t\tconditions.push(`${match.key} === ${JSON.stringify(match.value)}`);\n\t\t\t}\n\t\t}\n\n\t\tif (conditions.length === 0) continue;\n\t\tcompiledVariants.push(\n\t\t\t`if (${conditions.join(\" && \")}) return /** @type {LocalizedString} */ (${compiledPattern.code});`\n\t\t);\n\t\tif (compiledPartsPattern) {\n\t\t\tcompiledPartsVariants.push(\n\t\t\t\t`if (${conditions.join(\" && \")}) return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code});`\n\t\t\t);\n\t\t}\n\t}\n\n\tconst compiledLocalVariables = [];\n\n\tfor (const declaration of declarations) {\n\t\tif (declaration.type === \"local-variable\") {\n\t\t\tcompiledLocalVariables.push(\n\t\t\t\tcompileLocalVariable({\n\t\t\t\t\tdeclaration,\n\t\t\t\t\tdeclarations,\n\t\t\t\t\tlocale: message.locale,\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\n\tif (!hasMarkup) {\n\t\tconst code = `/** @type {(inputs: ${messageInputType}) => LocalizedString} */ (${hasInputs ? \"i\" : \"\"}) => {${compiledLocalVariables.join(\"\\n\\t\")}\n\t${compiledVariants.join(\"\\n\\t\")}\n\t${hasCatchAll ? \"\" : `return /** @type {LocalizedString} */ (\"${message.bundleId}\");`}\n};`;\n\n\t\treturn { code, node: message };\n\t}\n\n\tconst localVariablesCode = compiledLocalVariables.length\n\t\t? compiledLocalVariables.join(\"\\n\\t\") + \"\\n\\t\"\n\t\t: \"\";\n\tconst stringVariantsCode = compiledVariants.length\n\t\t? compiledVariants.join(\"\\n\\t\") + \"\\n\\t\"\n\t\t: \"\";\n\tconst partsVariantsCode = compiledPartsVariants.length\n\t\t? compiledPartsVariants.join(\"\\n\\t\") + \"\\n\\t\"\n\t\t: \"\";\n\tconst inputType = messageInputType;\n\tconst fallbackParts = `[{ type: \"text\", value: ${JSON.stringify(message.bundleId)} }]`;\n\tconst messageInput = hasInputs ? \"i\" : \"\";\n\n\tconst code = `/** @type {((inputs: ${inputType}) => LocalizedString) & { parts: (inputs: ${inputType}) => import('../runtime.js').MessagePart[] }} */ (\n\t/* @__PURE__ */ Object.assign(\n\t\t/** @type {(inputs: ${inputType}) => LocalizedString} */ ((${messageInput}) => {\n\t\t\t${localVariablesCode}${stringVariantsCode}${\n\t\t\t\thasCatchAll\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: `return /** @type {LocalizedString} */ (${JSON.stringify(message.bundleId)});`\n\t\t\t}\n\t\t}),\n\t\t{\n\t\t\tparts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${messageInput}) => {\n\t\t\t\t${localVariablesCode}${partsVariantsCode}${\n\t\t\t\t\thasCatchAll\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: `return /** @type {import('../runtime.js').MessagePart[]} */ (${fallbackParts});`\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t)\n);`;\n\n\treturn { code, node: message };\n}\n\nfunction patternHasMarkup(pattern: Pattern): boolean {\n\treturn pattern.some(\n\t\t(part) =>\n\t\t\tpart.type === \"markup-start\" ||\n\t\t\tpart.type === \"markup-end\" ||\n\t\t\tpart.type === \"markup-standalone\"\n\t);\n}\n"]}
1
+ {"version":3,"file":"compile-message.js","sourceRoot":"","sources":["../../src/compiler/compile-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tDeclaration,\n\tLocalVariable,\n\tMessage,\n\tPattern,\n\tVariant,\n} from \"@inlang/sdk\";\nimport { compilePattern } from \"./compile-pattern.js\";\nimport type { Compiled } from \"./types.js\";\nimport { inputsType, type InputMatchTypes } from \"./jsdoc-types.js\";\nimport { compileLocalVariable } from \"./compile-local-variable.js\";\nimport type { RegistryUsage } from \"./compile-annotation.js\";\nimport { renderInputMatchCondition } from \"./match-literals.js\";\nimport { compileInputAccess } from \"./variable-access.js\";\nimport { resolveInputAlias } from \"./input-alias.js\";\nimport {\n\tpatternVariableReferences,\n\tresolveMessageLocals,\n} from \"./message-locals.js\";\n\n/**\n * The message fields the compiler reads.\n *\n * `selectBundleNested()` of `@inlang/sdk` 4 returns the bundle id as\n * `bundle_id` (the database column). The camelCase `bundleId` of the SDK's\n * plugin `Message` shape is accepted too.\n */\nexport type CompilableMessage = Pick<Message, \"id\" | \"locale\" | \"selectors\"> &\n\t({ bundleId: string } | { bundle_id: string });\n\n/**\n * The variant fields the compiler reads. The message id (`message_id` in\n * `@inlang/sdk` 4 rows) is not needed.\n */\nexport type CompilableVariant = Pick<Variant, \"id\" | \"matches\" | \"pattern\">;\n\n/**\n * The bundle id of a message with either SDK version.\n */\nexport function messageBundleId(message: CompilableMessage): string {\n\tconst ids = message as { bundle_id?: string; bundleId?: string };\n\tconst bundleId = ids.bundle_id ?? ids.bundleId;\n\tif (typeof bundleId !== \"string\") {\n\t\tthrow new Error(\n\t\t\t`Message ${JSON.stringify(message.id)} (locale ${JSON.stringify(message.locale)}) has no bundle id`\n\t\t);\n\t}\n\treturn bundleId;\n}\n\nexport type CompiledMessage = Compiled<CompilableMessage> & {\n\t/**\n\t * The registry functions the compiled code calls, e.g. `[\"plural\"]`.\n\t * The output imports the registry only if a message calls it.\n\t */\n\tregistryFunctions: string[];\n};\n\n/**\n * Returns the compiled message as a string\n *\n */\nexport const compileMessage = (\n\tdeclarations: Declaration[],\n\tmessage: CompilableMessage,\n\tvariants: CompilableVariant[],\n\tmatchTypes?: InputMatchTypes,\n\tinputTypeAliasName?: string\n): CompiledMessage => {\n\t// return empty string instead?\n\tif (variants.length == 0) {\n\t\tthrow new Error(\"Message must have at least one variant\");\n\t}\n\n\tconst hasMultipleVariants = variants.length > 1;\n\treturn hasMultipleVariants\n\t\t? compileMessageWithMultipleVariants(\n\t\t\t\tdeclarations,\n\t\t\t\tmessage,\n\t\t\t\tvariants,\n\t\t\t\tmatchTypes,\n\t\t\t\tinputTypeAliasName\n\t\t\t)\n\t\t: compileMessageWithOneVariant(\n\t\t\t\tdeclarations,\n\t\t\t\tmessage,\n\t\t\t\tvariants,\n\t\t\t\tmatchTypes,\n\t\t\t\tinputTypeAliasName\n\t\t\t);\n};\n\nfunction compileMessageWithOneVariant(\n\tdeclarations: Declaration[],\n\tmessage: CompilableMessage,\n\tvariants: CompilableVariant[],\n\tmatchTypes?: InputMatchTypes,\n\tinputTypeAliasName?: string\n): CompiledMessage {\n\tconst variant = variants[0];\n\tif (!variant || variants.length !== 1) {\n\t\tthrow new Error(\"Message must have exactly one variant\");\n\t}\n\n\tconst hasMarkup = patternHasMarkup(variant.pattern);\n\tconst inputs = declarations.filter((decl) => decl.type === \"input-variable\");\n\tconst registryUsage: RegistryUsage = new Set();\n\tconst messageInputType = inputTypeAliasName ?? inputsType(inputs, matchTypes);\n\t// resolve before compiling the pattern to report undeclared variables\n\t// with the bundle id and locale\n\tconst stringLocals = compileLocalVariables(\n\t\tpatternVariableReferences(variant.pattern, \"string\"),\n\t\tdeclarations,\n\t\tmessage,\n\t\tregistryUsage\n\t);\n\tconst partsLocals = hasMarkup\n\t\t? compileLocalVariables(\n\t\t\t\tpatternVariableReferences(variant.pattern, \"parts\"),\n\t\t\t\tdeclarations,\n\t\t\t\tmessage,\n\t\t\t\tregistryUsage\n\t\t\t)\n\t\t: { code: [], readsInput: false };\n\tconst compiledPattern = compilePattern({\n\t\tpattern: variant.pattern,\n\t\tdeclarations,\n\t\tlocale: message.locale,\n\t\tregistryUsage,\n\t});\n\n\tif (!hasMarkup) {\n\t\tconst code = `/** @type {(inputs: ${messageInputType}) => LocalizedString} */ (${stringLocals.readsInput ? \"i\" : \"\"}) => {\n\t${stringLocals.code.join(\"\\n\\t\")}return /** @type {LocalizedString} */ (${compiledPattern.code})\n};`;\n\n\t\treturn { code, node: message, registryFunctions: [...registryUsage] };\n\t}\n\n\tconst compiledPartsPattern = compilePattern({\n\t\tpattern: variant.pattern,\n\t\tdeclarations,\n\t\tmode: \"parts\",\n\t\tlocale: message.locale,\n\t\tregistryUsage,\n\t});\n\tconst localVariablesCode = joinLocalVariables(stringLocals.code);\n\tconst partsLocalVariablesCode = joinLocalVariables(partsLocals.code);\n\tconst inputType = messageInputType;\n\t// only declare the input parameter where it is read (noUnusedParameters)\n\tconst messageInput = stringLocals.readsInput ? \"i\" : \"\";\n\tconst partsMessageInput = partsLocals.readsInput ? \"i\" : \"\";\n\n\tconst partsCode = `/** @type {((inputs: ${inputType}) => LocalizedString) & { parts: (inputs: ${inputType}) => import('../runtime.js').MessagePart[] }} */ (\n\t/* @__PURE__ */ Object.assign(\n\t\t/** @type {(inputs: ${inputType}) => LocalizedString} */ ((${messageInput}) => {\n\t\t\t${localVariablesCode}return /** @type {LocalizedString} */ (${compiledPattern.code})\n\t\t}),\n\t\t{\n\t\t\tparts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${partsMessageInput}) => {\n\t\t\t\t${partsLocalVariablesCode}return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code})\n\t\t\t})\n\t\t}\n\t)\n);`;\n\n\treturn {\n\t\tcode: partsCode,\n\t\tnode: message,\n\t\tregistryFunctions: [...registryUsage],\n\t};\n}\n\nfunction compileMessageWithMultipleVariants(\n\tdeclarations: Declaration[],\n\tmessage: CompilableMessage,\n\tvariants: CompilableVariant[],\n\tmatchTypes?: InputMatchTypes,\n\tinputTypeAliasName?: string\n): CompiledMessage {\n\tif (variants.length <= 1) {\n\t\tthrow new Error(\"Message must have more than one variant\");\n\t}\n\n\tconst hasMarkup = variants.some((variant) =>\n\t\tpatternHasMarkup(variant.pattern)\n\t);\n\tconst inputs = declarations.filter((decl) => decl.type === \"input-variable\");\n\tconst registryUsage: RegistryUsage = new Set();\n\tconst messageInputType = inputTypeAliasName ?? inputsType(inputs, matchTypes);\n\n\t// The variants the function checks, in preference order. A variant without\n\t// a condition is a catchall and returns unconditionally.\n\tconst steps: Array<{ pattern: Pattern; condition?: string }> = [];\n\t// variables the match conditions read\n\tconst conditionReads: string[] = [];\n\n\tlet hasCatchAll = false;\n\n\tfor (const variant of sortVariantsBySelectorPreference(\n\t\tvariants,\n\t\tmessage.selectors\n\t)) {\n\t\tconst isCatchAll = variant.matches.every(\n\t\t\t(match) => match.type === \"catchall-match\"\n\t\t);\n\n\t\tif (isCatchAll) {\n\t\t\tsteps.push({ pattern: variant.pattern });\n\t\t\thasCatchAll = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst conditions: string[] = [];\n\n\t\tfor (const match of variant.matches) {\n\t\t\t// catch all matches are not used in the conditions\n\t\t\tif (match.type !== \"literal-match\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst variableType = declarations.find(\n\t\t\t\t(decl) => decl.name === match.key\n\t\t\t)?.type;\n\t\t\tif (variableType === \"input-variable\") {\n\t\t\t\tconditionReads.push(match.key);\n\t\t\t\tconditions.push(\n\t\t\t\t\trenderInputMatchCondition(compileInputAccess(match.key), match.value)\n\t\t\t\t);\n\t\t\t} else if (variableType === \"local-variable\") {\n\t\t\t\tconditionReads.push(match.key);\n\t\t\t\t// An un-annotated local that aliases an input holds the raw input\n\t\t\t\t// value (e.g. ICU `=0` imports as `.local countPluralExact = {$count}`)\n\t\t\t\t// and must match like the input itself, numerically for numbers.\n\t\t\t\t// Annotated locals hold the function's result and match as strings.\n\t\t\t\tconditions.push(\n\t\t\t\t\tresolveInputAlias(match.key, declarations) !== undefined\n\t\t\t\t\t\t? renderInputMatchCondition(match.key, match.value)\n\t\t\t\t\t\t: `${match.key} === ${JSON.stringify(match.value)}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (conditions.length === 0) continue;\n\t\tsteps.push({\n\t\t\tpattern: variant.pattern,\n\t\t\tcondition: conditions.join(\" && \"),\n\t\t});\n\t}\n\n\t// resolve before compiling the patterns to report undeclared variables\n\t// with the bundle id and locale\n\tconst stringLocals = compileLocalVariables(\n\t\t[\n\t\t\t...conditionReads,\n\t\t\t...steps.flatMap((step) =>\n\t\t\t\tpatternVariableReferences(step.pattern, \"string\")\n\t\t\t),\n\t\t],\n\t\tdeclarations,\n\t\tmessage,\n\t\tregistryUsage\n\t);\n\tconst partsLocals = hasMarkup\n\t\t? compileLocalVariables(\n\t\t\t\t[\n\t\t\t\t\t...conditionReads,\n\t\t\t\t\t...steps.flatMap((step) =>\n\t\t\t\t\t\tpatternVariableReferences(step.pattern, \"parts\")\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\tdeclarations,\n\t\t\t\tmessage,\n\t\t\t\tregistryUsage\n\t\t\t)\n\t\t: { code: [], readsInput: false };\n\n\tconst compiledVariants: string[] = [];\n\tconst compiledPartsVariants: string[] = [];\n\n\tfor (const step of steps) {\n\t\tconst compiledPattern = compilePattern({\n\t\t\tpattern: step.pattern,\n\t\t\tdeclarations,\n\t\t\tlocale: message.locale,\n\t\t\tregistryUsage,\n\t\t});\n\t\tcompiledVariants.push(\n\t\t\tstep.condition === undefined\n\t\t\t\t? `return /** @type {LocalizedString} */ (${compiledPattern.code})`\n\t\t\t\t: `if (${step.condition}) return /** @type {LocalizedString} */ (${compiledPattern.code});`\n\t\t);\n\t\tif (hasMarkup) {\n\t\t\tconst compiledPartsPattern = compilePattern({\n\t\t\t\tpattern: step.pattern,\n\t\t\t\tdeclarations,\n\t\t\t\tmode: \"parts\",\n\t\t\t\tlocale: message.locale,\n\t\t\t\tregistryUsage,\n\t\t\t});\n\t\t\tcompiledPartsVariants.push(\n\t\t\t\tstep.condition === undefined\n\t\t\t\t\t? `return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code})`\n\t\t\t\t\t: `if (${step.condition}) return /** @type {import('../runtime.js').MessagePart[]} */ (${compiledPartsPattern.code});`\n\t\t\t);\n\t\t}\n\t}\n\n\tif (!hasMarkup) {\n\t\tconst code = `/** @type {(inputs: ${messageInputType}) => LocalizedString} */ (${stringLocals.readsInput ? \"i\" : \"\"}) => {${stringLocals.code.join(\"\\n\\t\")}\n\t${compiledVariants.join(\"\\n\\t\")}\n\t${hasCatchAll ? \"\" : `return /** @type {LocalizedString} */ (${JSON.stringify(messageBundleId(message))});`}\n};`;\n\n\t\treturn { code, node: message, registryFunctions: [...registryUsage] };\n\t}\n\n\tconst localVariablesCode = joinLocalVariables(stringLocals.code);\n\tconst partsLocalVariablesCode = joinLocalVariables(partsLocals.code);\n\tconst stringVariantsCode = compiledVariants.length\n\t\t? compiledVariants.join(\"\\n\\t\") + \"\\n\\t\"\n\t\t: \"\";\n\tconst partsVariantsCode = compiledPartsVariants.length\n\t\t? compiledPartsVariants.join(\"\\n\\t\") + \"\\n\\t\"\n\t\t: \"\";\n\tconst inputType = messageInputType;\n\tconst fallbackParts = `[{ type: \"text\", value: ${JSON.stringify(messageBundleId(message))} }]`;\n\t// only declare the input parameter where it is read (noUnusedParameters)\n\tconst messageInput = stringLocals.readsInput ? \"i\" : \"\";\n\tconst partsMessageInput = partsLocals.readsInput ? \"i\" : \"\";\n\n\tconst code = `/** @type {((inputs: ${inputType}) => LocalizedString) & { parts: (inputs: ${inputType}) => import('../runtime.js').MessagePart[] }} */ (\n\t/* @__PURE__ */ Object.assign(\n\t\t/** @type {(inputs: ${inputType}) => LocalizedString} */ ((${messageInput}) => {\n\t\t\t${localVariablesCode}${stringVariantsCode}${\n\t\t\t\thasCatchAll\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: `return /** @type {LocalizedString} */ (${JSON.stringify(messageBundleId(message))});`\n\t\t\t}\n\t\t}),\n\t\t{\n\t\t\tparts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${partsMessageInput}) => {\n\t\t\t\t${partsLocalVariablesCode}${partsVariantsCode}${\n\t\t\t\t\thasCatchAll\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: `return /** @type {import('../runtime.js').MessagePart[]} */ (${fallbackParts});`\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t)\n);`;\n\n\treturn { code, node: message, registryFunctions: [...registryUsage] };\n}\n\n/**\n * Compiles the local variables a message function reads, directly or through\n * other locals, in dependency order. Unread locals are left out. `readsInput`\n * tells whether the function reads its inputs parameter.\n */\nfunction compileLocalVariables(\n\treads: string[],\n\tdeclarations: Declaration[],\n\tmessage: CompilableMessage,\n\tregistryUsage: RegistryUsage\n): { code: string[]; readsInput: boolean } {\n\tconst { locals, readsInput } = resolveMessageLocals({\n\t\treads,\n\t\tdeclarations,\n\t\tbundleId: messageBundleId(message),\n\t\tlocale: message.locale,\n\t});\n\treturn {\n\t\tcode: locals.map((declaration: LocalVariable) =>\n\t\t\tcompileLocalVariable({\n\t\t\t\tdeclaration,\n\t\t\t\tdeclarations,\n\t\t\t\tlocale: message.locale,\n\t\t\t\tregistryUsage,\n\t\t\t})\n\t\t),\n\t\treadsInput,\n\t};\n}\n\nfunction joinLocalVariables(compiledLocalVariables: string[]): string {\n\treturn compiledLocalVariables.length\n\t\t? compiledLocalVariables.join(\"\\n\\t\") + \"\\n\\t\"\n\t\t: \"\";\n}\n\n/**\n * Orders variants by key preference in selector order, as in MessageFormat 2\n * variant selection: for the first selector, variants with a literal key come\n * before variants with a catchall key, then the next selector breaks ties, and\n * so on. Ties keep their original order.\n *\n * The compiled message returns the first variant whose conditions hold, so\n * this makes `countPluralExact=0 × countPlural=*` win over\n * `countPluralExact=* × countPlural=one` for French count 0 regardless of the\n * order the variants are stored in.\n */\nfunction sortVariantsBySelectorPreference<V extends CompilableVariant>(\n\tvariants: V[],\n\tselectors: Message[\"selectors\"]\n): V[] {\n\tif (selectors.length === 0) {\n\t\treturn variants;\n\t}\n\tconst rank = (variant: CompilableVariant) =>\n\t\tselectors.map((selector) =>\n\t\t\tvariant.matches.some(\n\t\t\t\t(match) => match.key === selector.name && match.type === \"literal-match\"\n\t\t\t)\n\t\t\t\t? 0\n\t\t\t\t: 1\n\t\t);\n\treturn variants\n\t\t.map((variant, index) => ({ variant, index, rank: rank(variant) }))\n\t\t.sort((left, right) => {\n\t\t\tfor (let i = 0; i < selectors.length; i++) {\n\t\t\t\tconst diff = left.rank[i]! - right.rank[i]!;\n\t\t\t\tif (diff !== 0) return diff;\n\t\t\t}\n\t\t\treturn left.index - right.index;\n\t\t})\n\t\t.map((entry) => entry.variant);\n}\n\nfunction patternHasMarkup(pattern: Pattern): boolean {\n\treturn pattern.some(\n\t\t(part) =>\n\t\t\tpart.type === \"markup-start\" ||\n\t\t\tpart.type === \"markup-end\" ||\n\t\t\tpart.type === \"markup-standalone\"\n\t);\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};