@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.
- package/README.md +2 -1
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js +2 -2
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -1
- package/dist/cli/commands/init/command.js +19 -1
- package/dist/cli/commands/init/command.js.map +1 -1
- package/dist/cli/defaults.js +2 -2
- package/dist/cli/defaults.js.map +1 -1
- package/dist/cli/steps/add-inlang-check.d.ts +19 -0
- package/dist/cli/steps/add-inlang-check.js +60 -0
- package/dist/cli/steps/add-inlang-check.js.map +1 -0
- package/dist/cli/steps/add-inlang-check.test.d.ts +1 -0
- package/dist/cli/steps/add-inlang-check.test.js +88 -0
- package/dist/cli/steps/add-inlang-check.test.js.map +1 -0
- package/dist/cli/steps/agents-md-suggestion.d.ts +11 -0
- package/dist/cli/steps/agents-md-suggestion.js +19 -0
- package/dist/cli/steps/agents-md-suggestion.js.map +1 -0
- package/dist/cli/steps/agents-md-suggestion.test.d.ts +1 -0
- package/dist/cli/steps/agents-md-suggestion.test.js +36 -0
- package/dist/cli/steps/agents-md-suggestion.test.js.map +1 -0
- package/dist/cli/steps/maybe-add-machine-translation.js +3 -2
- package/dist/cli/steps/maybe-add-machine-translation.js.map +1 -1
- package/dist/cli/steps/maybe-add-sherlock.js +1 -1
- package/dist/cli/steps/maybe-add-sherlock.js.map +1 -1
- package/dist/cli/utils.d.ts +9 -0
- package/dist/cli/utils.js +15 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/compiler/compile-annotation.d.ts +48 -1
- package/dist/compiler/compile-annotation.js +238 -10
- package/dist/compiler/compile-annotation.js.map +1 -1
- package/dist/compiler/compile-bundle.d.ts +3 -2
- package/dist/compiler/compile-bundle.js +30 -1
- package/dist/compiler/compile-bundle.js.map +1 -1
- package/dist/compiler/compile-bundle.test.js +18 -18
- package/dist/compiler/compile-bundle.test.js.map +1 -1
- package/dist/compiler/compile-local-variable.d.ts +3 -0
- package/dist/compiler/compile-local-variable.js +5 -2
- package/dist/compiler/compile-local-variable.js.map +1 -1
- package/dist/compiler/compile-local-variable.test.js +44 -4
- package/dist/compiler/compile-local-variable.test.js.map +1 -1
- package/dist/compiler/compile-message.d.ts +29 -1
- package/dist/compiler/compile-message.exact-number.test.d.ts +1 -0
- package/dist/compiler/compile-message.exact-number.test.js +786 -0
- package/dist/compiler/compile-message.exact-number.test.js.map +1 -0
- package/dist/compiler/compile-message.js +162 -66
- package/dist/compiler/compile-message.js.map +1 -1
- package/dist/compiler/compile-message.locals.test.d.ts +1 -0
- package/dist/compiler/compile-message.locals.test.js +498 -0
- package/dist/compiler/compile-message.locals.test.js.map +1 -0
- package/dist/compiler/compile-message.test.js +111 -20
- package/dist/compiler/compile-message.test.js.map +1 -1
- package/dist/compiler/compile-pattern.d.ts +5 -0
- package/dist/compiler/compile-pattern.js +6 -18
- package/dist/compiler/compile-pattern.js.map +1 -1
- package/dist/compiler/compile-pattern.test.js +165 -1
- package/dist/compiler/compile-pattern.test.js.map +1 -1
- package/dist/compiler/compile-project.js +4 -1
- package/dist/compiler/compile-project.js.map +1 -1
- package/dist/compiler/compile-project.test.js +1013 -31
- package/dist/compiler/compile-project.test.js.map +1 -1
- package/dist/compiler/compile.test.js +1 -1
- package/dist/compiler/compile.test.js.map +1 -1
- package/dist/compiler/create-readme.d.ts +4 -1
- package/dist/compiler/create-readme.js +33 -125
- package/dist/compiler/create-readme.js.map +1 -1
- package/dist/compiler/emit-ts-declarations.interop.test.js +2 -2
- package/dist/compiler/emit-ts-declarations.interop.test.js.map +1 -1
- package/dist/compiler/emit-ts-declarations.test.js +4 -4
- package/dist/compiler/emit-ts-declarations.test.js.map +1 -1
- package/dist/compiler/index.d.ts +1 -1
- package/dist/compiler/index.js +1 -1
- package/dist/compiler/index.js.map +1 -1
- package/dist/compiler/input-alias.d.ts +21 -0
- package/dist/compiler/input-alias.js +42 -0
- package/dist/compiler/input-alias.js.map +1 -0
- package/dist/compiler/input-alias.test.d.ts +1 -0
- package/dist/compiler/input-alias.test.js +58 -0
- package/dist/compiler/input-alias.test.js.map +1 -0
- package/dist/compiler/message-locals.d.ts +46 -0
- package/dist/compiler/message-locals.js +129 -0
- package/dist/compiler/message-locals.js.map +1 -0
- package/dist/compiler/output-structure/locale-modules.js +7 -1
- package/dist/compiler/output-structure/locale-modules.js.map +1 -1
- package/dist/compiler/output-structure/locale-modules.test.js +35 -0
- package/dist/compiler/output-structure/locale-modules.test.js.map +1 -1
- package/dist/compiler/output-structure/message-modules.js +5 -3
- package/dist/compiler/output-structure/message-modules.js.map +1 -1
- package/dist/compiler/output-structure/message-modules.test.js +35 -0
- package/dist/compiler/output-structure/message-modules.test.js.map +1 -1
- package/dist/compiler/registry.d.ts +12 -0
- package/dist/compiler/registry.js +97 -28
- package/dist/compiler/registry.js.map +1 -1
- package/dist/compiler/runtime/create-runtime.js +24 -1
- package/dist/compiler/runtime/create-runtime.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-url.js +11 -4
- package/dist/compiler/runtime/extract-locale-from-url.js.map +1 -1
- package/dist/compiler/runtime/generate-static-localized-urls.js +5 -3
- package/dist/compiler/runtime/generate-static-localized-urls.js.map +1 -1
- package/dist/compiler/runtime/localize-url.js +25 -54
- package/dist/compiler/runtime/localize-url.js.map +1 -1
- package/dist/compiler/runtime/route-strategy.js +9 -3
- package/dist/compiler/runtime/route-strategy.js.map +1 -1
- package/dist/compiler/runtime/type.test.js +9 -0
- package/dist/compiler/runtime/type.test.js.map +1 -1
- package/dist/compiler/runtime/url-pattern-cache.d.ts +11 -0
- package/dist/compiler/runtime/url-pattern-cache.js +42 -0
- package/dist/compiler/runtime/url-pattern-cache.js.map +1 -0
- package/dist/compiler/runtime/url-pattern-index.d.ts +24 -0
- package/dist/compiler/runtime/url-pattern-index.differential.test.d.ts +1 -0
- package/dist/compiler/runtime/url-pattern-index.differential.test.js +152 -0
- package/dist/compiler/runtime/url-pattern-index.differential.test.js.map +1 -0
- package/dist/compiler/runtime/url-pattern-index.js +168 -0
- package/dist/compiler/runtime/url-pattern-index.js.map +1 -0
- package/dist/compiler/runtime/url-pattern-index.test.d.ts +1 -0
- package/dist/compiler/runtime/url-pattern-index.test.js +262 -0
- package/dist/compiler/runtime/url-pattern-index.test.js.map +1 -0
- package/dist/compiler/server/create-server-file.js +25 -1
- package/dist/compiler/server/create-server-file.js.map +1 -1
- package/dist/compiler/server/create-server-file.test.js +20 -2
- package/dist/compiler/server/create-server-file.test.js.map +1 -1
- package/dist/compiler/server/middleware.js +29 -4
- package/dist/compiler/server/middleware.js.map +1 -1
- package/dist/services/env-variables/index.js +1 -1
- package/dist/services/env-variables/index.js.map +1 -1
- 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
|
|
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} */ (${
|
|
46
|
-
${
|
|
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 =
|
|
57
|
-
|
|
58
|
-
: "";
|
|
67
|
+
const localVariablesCode = joinLocalVariables(stringLocals.code);
|
|
68
|
+
const partsLocalVariablesCode = joinLocalVariables(partsLocals.code);
|
|
59
69
|
const inputType = messageInputType;
|
|
60
|
-
|
|
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[]} */ ((${
|
|
68
|
-
${
|
|
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 {
|
|
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
|
|
97
|
+
const registryUsage = new Set();
|
|
82
98
|
const messageInputType = inputTypeAliasName ?? inputsType(inputs, matchTypes);
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
136
|
+
steps.push({
|
|
137
|
+
pattern: variant.pattern,
|
|
138
|
+
condition: conditions.join(" && "),
|
|
139
|
+
});
|
|
129
140
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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} */ (${
|
|
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} */ (
|
|
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 =
|
|
148
|
-
|
|
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
|
|
158
|
-
|
|
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
|
|
203
|
+
: `return /** @type {LocalizedString} */ (${JSON.stringify(messageBundleId(message))});`}
|
|
165
204
|
}),
|
|
166
205
|
{
|
|
167
|
-
parts: /** @type {(inputs: ${inputType}) => import('../runtime.js').MessagePart[]} */ ((${
|
|
168
|
-
${
|
|
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 {};
|