@inlang/paraglide-js 2.29.0 → 2.29.2
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/dist/compiler/compile-bundle.js +58 -12
- package/dist/compiler/compile-bundle.js.map +1 -1
- package/dist/compiler/compile-bundle.test.js +208 -26
- package/dist/compiler/compile-bundle.test.js.map +1 -1
- package/dist/compiler/compile-lifecycle.test.js +83 -0
- package/dist/compiler/compile-lifecycle.test.js.map +1 -1
- package/dist/compiler/compile-message.d.ts +9 -0
- package/dist/compiler/compile-message.js +29 -12
- package/dist/compiler/compile-message.js.map +1 -1
- package/dist/compiler/compile-project.js +6 -1
- package/dist/compiler/compile-project.js.map +1 -1
- package/dist/compiler/compile-project.test.js +157 -0
- package/dist/compiler/compile-project.test.js.map +1 -1
- package/dist/compiler/compile.js +12 -0
- package/dist/compiler/compile.js.map +1 -1
- package/dist/compiler/compiler-options.d.ts +5 -2
- package/dist/compiler/compiler-options.js.map +1 -1
- package/dist/compiler/emit-ts-declarations.d.ts +4 -1
- package/dist/compiler/emit-ts-declarations.js +18 -11
- package/dist/compiler/emit-ts-declarations.js.map +1 -1
- package/dist/compiler/emit-ts-declarations.native.test.d.ts +1 -0
- package/dist/compiler/emit-ts-declarations.native.test.js +86 -0
- package/dist/compiler/emit-ts-declarations.native.test.js.map +1 -0
- package/dist/compiler/emit-ts-declarations.test.js +3 -0
- package/dist/compiler/emit-ts-declarations.test.js.map +1 -1
- package/dist/compiler/resolve-tsc-js-path.d.ts +6 -0
- package/dist/compiler/resolve-tsc-js-path.js +34 -1
- package/dist/compiler/resolve-tsc-js-path.js.map +1 -1
- package/dist/compiler/resolve-tsc-js-path.test.d.ts +1 -0
- package/dist/compiler/resolve-tsc-js-path.test.js +31 -0
- package/dist/compiler/resolve-tsc-js-path.test.js.map +1 -0
- package/dist/services/env-variables/index.js +1 -1
- package/dist/services/env-variables/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -22,22 +22,38 @@ export const compileBundle = (args) => {
|
|
|
22
22
|
// set the pattern for the language tag
|
|
23
23
|
compiledMessages[message.locale] = compiledMessage;
|
|
24
24
|
}
|
|
25
|
-
const
|
|
26
|
-
args.experimentalStaticLocale
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
const inlineMessages = args.inlineMessages === true &&
|
|
26
|
+
args.experimentalStaticLocale !== perLocaleBuildStaticLocaleExpression;
|
|
27
|
+
const inlinePlainTextByLocale = inlineMessages
|
|
28
|
+
? findPlainTextMessages(args.bundle)
|
|
29
|
+
: undefined;
|
|
30
|
+
const inlineCandidates = inlineMessages
|
|
31
|
+
? findInlineBodies(compiledMessages, inlinePlainTextByLocale ?? {})
|
|
32
|
+
: {};
|
|
29
33
|
const unreferencedMessageLocales = findUnreferencedMessageLocales({
|
|
30
|
-
|
|
34
|
+
inlinedLocales: [
|
|
35
|
+
...Object.keys(inlinePlainTextByLocale ?? {}),
|
|
36
|
+
...Object.keys(inlineCandidates),
|
|
37
|
+
],
|
|
31
38
|
compiledMessages,
|
|
32
39
|
fallbackMap: args.fallbackMap,
|
|
33
40
|
hasMarkup,
|
|
34
41
|
});
|
|
42
|
+
// A fallback target stays a message function that the missing-locale alias
|
|
43
|
+
// calls, so its dispatcher branch calls it too instead of repeating the body.
|
|
44
|
+
const inlineBodiesByLocale = Object.create(null);
|
|
45
|
+
for (const locale of unreferencedMessageLocales) {
|
|
46
|
+
const body = inlineCandidates[locale];
|
|
47
|
+
if (body)
|
|
48
|
+
inlineBodiesByLocale[locale] = body;
|
|
49
|
+
}
|
|
35
50
|
return {
|
|
36
51
|
bundle: compileBundleFunction({
|
|
37
52
|
bundle: args.bundle,
|
|
38
53
|
availableLocales: Object.keys(args.fallbackMap),
|
|
39
54
|
messageReferenceExpression: args.messageReferenceExpression,
|
|
40
55
|
inlinePlainTextByLocale,
|
|
56
|
+
inlineBodiesByLocale,
|
|
41
57
|
settings: args.settings,
|
|
42
58
|
matchTypes,
|
|
43
59
|
hasMarkup,
|
|
@@ -74,6 +90,20 @@ function findPlainTextMessages(bundle) {
|
|
|
74
90
|
}
|
|
75
91
|
return result;
|
|
76
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Finds the messages with inputs whose function body the dispatcher can run
|
|
95
|
+
* in place of calling the message function. Markup messages keep their `.parts`
|
|
96
|
+
* function, and messages that are plain text are returned as a string instead.
|
|
97
|
+
*/
|
|
98
|
+
function findInlineBodies(compiledMessages, inlinePlainTextByLocale) {
|
|
99
|
+
const result = Object.create(null);
|
|
100
|
+
for (const [locale, message] of Object.entries(compiledMessages)) {
|
|
101
|
+
if (message.inline && inlinePlainTextByLocale[locale] === undefined) {
|
|
102
|
+
result[locale] = message.inline;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
77
107
|
function findUnreferencedMessageLocales(args) {
|
|
78
108
|
if (args.hasMarkup)
|
|
79
109
|
return [];
|
|
@@ -94,7 +124,7 @@ function findUnreferencedMessageLocales(args) {
|
|
|
94
124
|
fallbackLocale = args.fallbackMap[fallbackLocale];
|
|
95
125
|
}
|
|
96
126
|
}
|
|
97
|
-
return
|
|
127
|
+
return args.inlinedLocales.filter((locale) => !fallbackTargets.has(locale));
|
|
98
128
|
}
|
|
99
129
|
const compileBundleFunction = (args) => {
|
|
100
130
|
const inputs = args.bundle.declarations.filter((decl) => decl.type === "input-variable");
|
|
@@ -109,7 +139,15 @@ const compileBundleFunction = (args) => {
|
|
|
109
139
|
baseLocale,
|
|
110
140
|
]
|
|
111
141
|
: args.availableLocales;
|
|
112
|
-
|
|
142
|
+
// Inlined bodies read their inputs as `i`.
|
|
143
|
+
const inputsName = Object.keys(args.inlineBodiesByLocale ?? {}).length
|
|
144
|
+
? "i"
|
|
145
|
+
: "inputs";
|
|
146
|
+
const anyBranchReadsInputs = dispatchLocales.some((locale) => {
|
|
147
|
+
if (args.inlinePlainTextByLocale?.[locale] !== undefined)
|
|
148
|
+
return false;
|
|
149
|
+
return args.inlineBodiesByLocale?.[locale]?.readsInput ?? true;
|
|
150
|
+
});
|
|
113
151
|
const inputType = args.inputTypeAliasName;
|
|
114
152
|
const localesUnion = args.availableLocales.length === 0
|
|
115
153
|
? "never"
|
|
@@ -132,7 +170,15 @@ const compileBundleFunction = (args) => {
|
|
|
132
170
|
if (inlineText !== undefined) {
|
|
133
171
|
return `${prefix}${condition}return /** @type {LocalizedString} */ (${JSON.stringify(inlineText)})`;
|
|
134
172
|
}
|
|
135
|
-
|
|
173
|
+
const inlineBody = args.inlineBodiesByLocale?.[locale];
|
|
174
|
+
if (inlineBody) {
|
|
175
|
+
const [onlyStatement] = inlineBody.statements;
|
|
176
|
+
return inlineBody.statements.length === 1 &&
|
|
177
|
+
onlyStatement?.startsWith("return ")
|
|
178
|
+
? `${prefix}${condition}${onlyStatement}`
|
|
179
|
+
: `${prefix}${condition}{\n${continuationIndent}\t${inlineBody.statements.join(`\n${continuationIndent}\t`)}\n${continuationIndent}}`;
|
|
180
|
+
}
|
|
181
|
+
return `${prefix}${condition}return ${messageRef}(${inputsName})`;
|
|
136
182
|
}
|
|
137
183
|
// A locale's message has .parts() only if its own variants have
|
|
138
184
|
// markup. Fallbacks and messages without markup are typed without
|
|
@@ -159,7 +205,7 @@ ${englishMatchTableDoc}${jsDocBundleFunctionTypes({
|
|
|
159
205
|
if (!args.experimentalMiddlewareLocaleSplitting) {
|
|
160
206
|
return "";
|
|
161
207
|
}
|
|
162
|
-
return `\n${indent}if (experimentalMiddlewareLocaleSplitting && isServer === false) {\n${indent}\treturn /** @type {any} */ (globalThis).__paraglide.ssr.${safeBundleId}(
|
|
208
|
+
return `\n${indent}if (experimentalMiddlewareLocaleSplitting && isServer === false) {\n${indent}\treturn /** @type {any} */ (globalThis).__paraglide.ssr.${safeBundleId}(${inputsName})\n${indent}}`;
|
|
163
209
|
};
|
|
164
210
|
const clientPartsMiddlewareGuard = (indent) => {
|
|
165
211
|
if (!args.experimentalMiddlewareLocaleSplitting) {
|
|
@@ -187,13 +233,13 @@ ${englishMatchTableDoc}${jsDocBundleFunctionTypes({
|
|
|
187
233
|
}
|
|
188
234
|
return `${indent}const locale = ${localeExpression}${overrideWarning}${maybeTrackMessageCall(indent)}`;
|
|
189
235
|
};
|
|
190
|
-
const keepUnusedInputsParameter = (indent) =>
|
|
191
|
-
? `\n${indent}void
|
|
236
|
+
const keepUnusedInputsParameter = (indent) => !anyBranchReadsInputs && !args.experimentalMiddlewareLocaleSplitting
|
|
237
|
+
? `\n${indent}void ${inputsName};`
|
|
192
238
|
: "";
|
|
193
239
|
let code = "";
|
|
194
240
|
if (!args.hasMarkup) {
|
|
195
241
|
code = `${commonJsDoc}
|
|
196
|
-
${isSafeBundleId ? "export " : ""}const ${safeBundleId} = /** @type {(${bundleFunctionType}) & ${messageMetadataType}} */ ((
|
|
242
|
+
${isSafeBundleId ? "export " : ""}const ${safeBundleId} = /** @type {(${bundleFunctionType}) & ${messageMetadataType}} */ ((${inputsName}${hasInputs ? "" : " = {}"}, options = {}) => {${clientMiddlewareGuard("\t")}${keepUnusedInputsParameter("\t")}
|
|
197
243
|
${localeResolutionStatement("\t")}
|
|
198
244
|
${compileLocaleReturnStatements("string", "\t")}${!isFullyTranslated
|
|
199
245
|
? `\n return /** @type {LocalizedString} */ ("${args.bundle.id}")`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-bundle.js","sourceRoot":"","sources":["../../src/compiler/compile-bundle.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAwB,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EACN,gBAAgB,EAChB,wBAAwB,GAExB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAiBrD;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAS7B,EAA8B,EAAE;IAChC,MAAM,gBAAgB,GAAoC,EAAE,CAAC;IAC7D,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,YAAY,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC5C,IAAI,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,eAAe,GAAG,cAAc,CACrC,IAAI,CAAC,MAAM,CAAC,YAAY,EACxB,OAAO,EACP,OAAO,CAAC,QAAQ,EAChB,UAAU,EACV,kBAAkB,CAClB,CAAC;QAEF,uCAAuC;QACvC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC;IACpD,CAAC;IACD,MAAM,uBAAuB,GAC5B,IAAI,CAAC,cAAc,KAAK,IAAI;QAC5B,IAAI,CAAC,wBAAwB,KAAK,oCAAoC;QACrE,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,0BAA0B,GAAG,8BAA8B,CAAC;QACjE,uBAAuB,EAAE,uBAAuB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACvE,gBAAgB;QAChB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS;KACT,CAAC,CAAC;IAEH,OAAO;QACN,MAAM,EAAE,qBAAqB,CAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YAC/C,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;YAC3D,uBAAuB;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU;YACV,SAAS;YACT,qCAAqC,EACpC,IAAI,CAAC,qCAAqC,IAAI,KAAK;YACpD,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;YACvD,kBAAkB;SAClB,CAAC;QACF,QAAQ,EAAE,gBAAgB;QAC1B,UAAU;QACV,kBAAkB;QAClB,0BAA0B;KAC1B,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,MAAoB;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAA2B,CAAC;IAE7D,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;YACxE,SAAS;QACV,CAAC;QAED,oEAAoE;QACpE,0DAA0D;QAC1D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO;aACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACvD,IAAI,CAAC,EAAE,CAAC;aACR,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,8BAA8B,CAAC,IAKvC;IACA,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE9B,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC;YAAE,SAAS;QAE3D,IAAI,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,OAAO,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,EAAE,CAAC;gBAC1D,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACpC,MAAM;YACP,CAAC;YACD,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,MAAM,CACtD,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CACxC,CAAC;AACH,CAAC;AAED,MAAM,qBAAqB,GAAG,CAAC,IAwC9B,EAAoB,EAAE;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAC7C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CACxC,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,YAAY,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IAEvD,MAAM,iBAAiB,GACtB,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC7C,MAAM,eAAe,GACpB,UAAU,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvD,CAAC,CAAC;YACA,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,UAAU,CAAC;YAClE,UAAU;SACV;QACF,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC1B,MAAM,uBAAuB,GAAG,eAAe,CAAC,KAAK,CACpD,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,MAAM,CAAC,KAAK,SAAS,CAChE,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAC1C,MAAM,YAAY,GACjB,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;QACjC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,cAAc,YAAY,IAAI,CAAC;IACnD,MAAM,mBAAmB,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;IAChF,MAAM,kBAAkB,GAAG,IAAI,mBAAmB,eAAe,WAAW,sBAAsB,CAAC;IACnG,MAAM,iBAAiB,GAAG,IAAI,mBAAmB,eAAe,WAAW,4CAA4C,CAAC;IACxH,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7E,MAAM,mBAAmB,GAAG,2CAA2C,SAAS,KAAK,WAAW,KAAK,gBAAgB,GAAG,CAAC;IAEzH,MAAM,6BAA6B,GAAG,CACrC,IAAwB,EACxB,kBAA0B,EACjB,EAAE,CACX,eAAe;SACb,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACtB,MAAM,SAAS,GACd,CAAC,iBAAiB,IAAI,KAAK,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;YACvD,CAAC,CAAC,mBAAmB,MAAM,KAAK;YAChC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,0BAA0B,CACjD,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,EAAE,CACd,CAAC;QAEF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,GAAG,MAAM,GAAG,SAAS,0CAA0C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;YACrG,CAAC;YACD,OAAO,GAAG,MAAM,GAAG,SAAS,UAAU,UAAU,UAAU,CAAC;QAC5D,CAAC;QAED,gEAAgE;QAChE,kEAAkE;QAClE,2DAA2D;QAC3D,OAAO,GAAG,MAAM,GAAG,SAAS,wCAAwC,SAAS,qDAAqD,UAAU,gDAAgD,UAAU,aAAa,CAAC;IACrN,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,cAAc,GACnB,IAAI,CAAC,wBAAwB,KAAK,oCAAoC,CAAC;IACxE,uEAAuE;IACvE,0EAA0E;IAC1E,6EAA6E;IAC7E,MAAM,oBAAoB,GAAG,cAAc;QAC1C,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE1C,MAAM,WAAW,GAAG;EACnB,oBAAoB,GAAG,wBAAwB,CAAC;QAChD,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,gBAAgB;QAC9B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,iBAAiB,EAAE,IAAI,CAAC,kBAAkB;KAC1C,CAAC;GACA,CAAC;IAEH,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAU,EAAE;QACxD,IAAI,CAAC,IAAI,CAAC,qCAAqC,EAAE,CAAC;YACjD,OAAO,EAAE,CAAC;QACX,CAAC;QAED,OAAO,KAAK,MAAM,uEAAuE,MAAM,4DAA4D,YAAY,aAAa,MAAM,GAAG,CAAC;IAC/L,CAAC,CAAC;IAEF,MAAM,0BAA0B,GAAG,CAAC,MAAc,EAAU,EAAE;QAC7D,IAAI,CAAC,IAAI,CAAC,qCAAqC,EAAE,CAAC;YACjD,OAAO,EAAE,CAAC;QACX,CAAC;QAED,OAAO,KAAK,MAAM,uEAAuE,MAAM,2EAA2E,YAAY,KAAK,MAAM,uDAAuD,MAAM,kGAAkG,MAAM,QAAQ,MAAM,qHAAqH,MAAM,GAAG,CAAC;IACpf,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAU,EAAE;QACxD,IAAI,CAAC,IAAI,CAAC,qCAAqC,EAAE,CAAC;YACjD,OAAO,EAAE,CAAC;QACX,CAAC;QAED,OAAO,KAAK,MAAM,qBAAqB,YAAY,YAAY,CAAC;IACjE,CAAC,CAAC;IAEF,MAAM,yBAAyB,GAAG,CAAC,MAAc,EAAU,EAAE;QAC5D,MAAM,gBAAgB,GAAG,cAAc;YACtC,CAAC,CAAC,GAAG,oCAAoC,mCAAmC;YAC5E,CAAC,CAAC,2DAA2D,CAAC;QAC/D,MAAM,eAAe,GAAG,cAAc;YACrC,CAAC,CAAC,KAAK,MAAM,OAAO,oCAAoC,wEAAwE,oCAAoC,mJAAmJ;YACvT,CAAC,CAAC,EAAE,CAAC;QAEN,IACC,iBAAiB;YACjB,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAClC,CAAC,IAAI,CAAC,qCAAqC,EAC1C,CAAC;YACF,OAAO,GAAG,MAAM,GAAG,gBAAgB,GAAG,eAAe,EAAE,CAAC;QACzD,CAAC;QAED,OAAO,GAAG,MAAM,kBAAkB,gBAAgB,GAAG,eAAe,GAAG,qBAAqB,CAC3F,MAAM,CACN,EAAE,CAAC;IACL,CAAC,CAAC;IACF,MAAM,yBAAyB,GAAG,CAAC,MAAc,EAAU,EAAE,CAC5D,uBAAuB,IAAI,CAAC,IAAI,CAAC,qCAAqC;QACrE,CAAC,CAAC,KAAK,MAAM,cAAc;QAC3B,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,GAAG,WAAW;EACrB,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,YAAY,kBAAkB,kBAAkB,OAAO,mBAAmB,gBAAgB,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,uBAAuB,qBAAqB,CACrM,IAAI,CACJ,GAAG,yBAAyB,CAAC,IAAI,CAAC;EACnC,yBAAyB,CAAC,IAAI,CAAC;GAC9B,6BAA6B,CAAC,QAAQ,EAAE,IAAI,CAAC,GAC9C,CAAC,iBAAiB;YACjB,CAAC,CAAC,8CAA8C,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI;YAClE,CAAC,CAAC,EACJ;IACG,CAAC;IACJ,CAAC;SAAM,CAAC;QACP,IAAI,GAAG,GAAG,WAAW;EACrB,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,YAAY,kBAAkB,kBAAkB,gBAAgB,iBAAiB,QAAQ,mBAAmB;;eAEvI,kBAAkB,gBAAgB,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,uBAAuB,qBAAqB,CAClH,QAAQ,CACR,GAAG,yBAAyB,CAAC,QAAQ,CAAC;EACvC,yBAAyB,CAAC,QAAQ,CAAC;KAChC,6BAA6B,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAClD,CAAC,iBAAiB;YACjB,CAAC,CAAC,+CAA+C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG;YAClF,CAAC,CAAC,EACJ;;;uBAGoB,iBAAiB,gBACpC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAClB,uBAAuB,0BAA0B,CAAC,UAAU,CAAC;EAC9D,yBAAyB,CAAC,UAAU,CAAC;MACjC,6BAA6B,CAAC,OAAO,EAAE,UAAU,CAAC,GACnD,CAAC,iBAAiB;YACjB,CAAC,CAAC,8FAA8F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM;YACpI,CAAC,CAAC,EACJ;;;;GAID,CAAC;IACH,CAAC;IAED,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QAC9B,IAAI,IAAI,cAAc,YAAY,QAAQ,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;IAC3F,CAAC;IAED,OAAO;QACN,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,MAAM;KACjB,CAAC;AACH,CAAC,CAAC;AAEF,SAAS,yBAAyB,CAAC,MAAoB;IACtD,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG;QACb,OAAO,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;QACvD,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;KACnD,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1C,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAC/B,CAAC;QACF,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CACjC,gBAAgB,CAAC,MAAM,GAAG,GAAG;YAC5B,CAAC,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK;YACxC,CAAC,CAAC,gBAAgB,CACnB,CAAC;QACF,KAAK,CAAC,IAAI,CACT,OAAO,CAAC,GAAG,SAAS,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,oBAAoB,CAC5B,MAAoB;IAEpB,OAAO,CACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CACnE,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC3B,OAAyC;IAEzC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,SAAS;YAClC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CACzB,OAA6D,EAC7D,GAAW;IAEX,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC/C,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACrC,OAAO,KAAK;SACV,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,YAAoB;IAC9D,OAAO,GAAG,oBAAoB,CAAC,YAAY,CAAC,QAAQ,CAAC;AACtD,CAAC;AAED,SAAS,oBAAoB,CAAC,YAAoB;IACjD,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,cAAc,GAAG,IAAI,CAAC;IAE1B,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACtC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACvB,QAAQ,IAAI,GAAG,CAAC;YAChB,cAAc,GAAG,IAAI,CAAC;YACtB,SAAS;QACV,CAAC;QAED,IAAI,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;YAC1C,QAAQ,IAAI,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,CAAC;aAAM,CAAC;YACP,QAAQ,IAAI,SAAS,CAAC;QACvB,CAAC;QACD,cAAc,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,QAAQ,GAAG,SAAS,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,QAAQ,GAAG,UAAU,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,uBAAuB,CAC/B,OAAwE;IAExE,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC;YACrB,SAAS;QACV,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACP,MAAM,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;YAChC,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAeD,SAAS,qBAAqB,CAC7B,MAAoB,EACpB,UAA2B;IAE3B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAgC,CAAC;IAChE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CACjC,MAAM,CAAC,YAAY;SACjB,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,gBAAgB,CAAC;SAC9D,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CACxC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;oBACvE,SAAS;gBACV,CAAC;gBAED,MAAM,GAAG,GAAG,0BAA0B,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;gBACrB,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAClC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACP,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,CAAC;gBAED,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;gBAChE,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SACpE,GAAG,CACH,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAClB,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAC/D,CAAC;IAEH,OAAO,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,0BAA0B,CAClC,YAA+C,EAC/C,OAAe;IAEf,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,MAAM,OAAO,GAAyB;QACrC,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,KAAK;QACpB,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,UAAU,EAAE,IAAI,GAAG,EAAE;KACrB,CAAC;IACF,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAC5B,GAAyB,EACzB,IAAoC,EACpC,kBAA+B,EAC/B,UAA2B;IAE3B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,iBAAiB,GAAG,4BAA4B,CACrD,GAAG,CAAC,OAAO,EACX,MAAM,CAAC,IAAI,CACX,CAAC;QACF,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAC1B,uBAAuB,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,EAAE,UAAU,CAAC,CACrE,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,iBAAiB,CAAC,KAAK,IAAI,CAAC,CAAC;YAC7B,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAC/B,GAAyB,EACzB,IAAoC;IAEpC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,oBAAoB,GAAG,4BAA4B,CACxD,GAAG,CAAC,UAAU,EACd,SAAS,CAAC,IAAI,CACd,CAAC;QACF,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAC7B,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAC5C,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,oBAAoB,CAAC,KAAK,IAAI,CAAC,CAAC;YAChC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAC/B,KAQI,EACJ,kBAA+B,EAC/B,UAA2B;IAE3B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,sBAAsB,CAAC;AAC/B,CAAC;AAED,SAAS,4BAA4B,CACpC,MAA2C,EAC3C,IAAY;IAEZ,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IACvE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAyB;IACrD,OAAO,cAAc,sBAAsB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,iBAAiB,sBAAsB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,eAAe,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7L,CAAC;AAED,SAAS,sBAAsB,CAC9B,MAA2C,EAC3C,eAAuB;IAEvB,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SAC7C,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SACpE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,eAAe,CAAC;QACjD,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IAChG,CAAC,CAAC,CAAC;IAEJ,OAAO,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAyB;IACpD,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC;IACf,CAAC;IACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,KAAkB;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACxC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAoB;IACnD,MAAM,UAAU,GAAG,IAAI,GAAG,CACzB,MAAM,CAAC,YAAY;QAClB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC;SACjD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAChC,CAAC;IACF,MAAM,UAAU,GAAoB,IAAI,GAAG,EAAE,CAAC;IAE9C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAU,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACpE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;oBAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,CAAC;gBACD,SAAS;YACV,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACzC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxB,SAAS;gBACV,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,2DAA2D;IAC3D,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;IAC/C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBAC3C,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACxC,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;gBAC7D,IAAI,SAAS,KAAK,SAAS;oBAAE,SAAS;gBACtC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACzB,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,MAAoB;IAC5C,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACjC,OAAO,CAAC,OAAO,CAAC,IAAI,CACnB,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,IAAI,KAAK,cAAc;QAC5B,IAAI,CAAC,IAAI,KAAK,YAAY;QAC1B,IAAI,CAAC,IAAI,KAAK,mBAAmB,CAClC,CACD,CACD,CAAC;AACH,CAAC","sourcesContent":["import type {\n\tBundle,\n\tBundleNested,\n\tMarkupStandalone,\n\tMarkupStart,\n\tProjectSettings,\n} from \"@inlang/sdk\";\nimport { compileMessage, type CompiledMessage } from \"./compile-message.js\";\nimport type { Compiled } from \"./types.js\";\nimport {\n\tinputTypeForName,\n\tjsDocBundleFunctionTypes,\n\ttype InputMatchTypes,\n} from \"./jsdoc-types.js\";\nimport { isValidIdentifier, quotePropertyKey } from \"./variable-access.js\";\nimport { toSafeModuleId } from \"./safe-module-id.js\";\nimport { escapeForDoubleQuoteString } from \"../services/codegen/escape.js\";\nimport type { CompilerOptions } from \"./compiler-options.js\";\nimport { perLocaleBuildStaticLocaleExpression } from \"./per-locale-build.js\";\nimport { resolveInputAlias } from \"./input-alias.js\";\n\nexport type CompiledBundleWithMessages = {\n\t/** The compilation result for the bundle index */\n\tbundle: Compiled<Bundle>;\n\t/** The compilation results for the languages */\n\tmessages: {\n\t\t[locale: string]: CompiledMessage;\n\t};\n\t/** Match literal types inferred from bundle variants */\n\tmatchTypes: InputMatchTypes;\n\t/** Shared typedef name for bundle input types used across emitted JSDoc */\n\tinputTypeAliasName?: string;\n\t/** Compiled message helpers with no emitted reference in message-modules. */\n\tunreferencedMessageLocales?: string[];\n};\n\n/**\n * Compiles all the messages in the bundle and returns an index-function + each compiled message\n */\nexport const compileBundle = (args: {\n\tbundle: BundleNested;\n\tfallbackMap: Record<string, string | undefined>;\n\tmessageReferenceExpression: (locale: string, bundleId: string) => string;\n\tsettings?: ProjectSettings;\n\t/** Internal layout control; locale modules keep text grouped by language. */\n\tinlineMessages?: boolean;\n\texperimentalMiddlewareLocaleSplitting?: boolean;\n\texperimentalStaticLocale?: CompilerOptions[\"experimentalStaticLocale\"];\n}): CompiledBundleWithMessages => {\n\tconst compiledMessages: Record<string, CompiledMessage> = {};\n\tconst safeBundleId = toSafeModuleId(args.bundle.id);\n\tconst inputTypeAliasName = toBundleInputTypeAliasName(safeBundleId);\n\tconst matchTypes = collectInputMatchTypes(args.bundle);\n\tconst hasMarkup = bundleHasMarkup(args.bundle);\n\n\tfor (const message of args.bundle.messages) {\n\t\tif (compiledMessages[message.locale]) {\n\t\t\tthrow new Error(`Duplicate locale: ${message.locale}`);\n\t\t}\n\n\t\tconst compiledMessage = compileMessage(\n\t\t\targs.bundle.declarations,\n\t\t\tmessage,\n\t\t\tmessage.variants,\n\t\t\tmatchTypes,\n\t\t\tinputTypeAliasName\n\t\t);\n\n\t\t// set the pattern for the language tag\n\t\tcompiledMessages[message.locale] = compiledMessage;\n\t}\n\tconst inlinePlainTextByLocale =\n\t\targs.inlineMessages !== true ||\n\t\targs.experimentalStaticLocale === perLocaleBuildStaticLocaleExpression\n\t\t\t? undefined\n\t\t\t: findPlainTextMessages(args.bundle);\n\tconst unreferencedMessageLocales = findUnreferencedMessageLocales({\n\t\tinlinePlainTextByLocale: inlinePlainTextByLocale ?? Object.create(null),\n\t\tcompiledMessages,\n\t\tfallbackMap: args.fallbackMap,\n\t\thasMarkup,\n\t});\n\n\treturn {\n\t\tbundle: compileBundleFunction({\n\t\t\tbundle: args.bundle,\n\t\t\tavailableLocales: Object.keys(args.fallbackMap),\n\t\t\tmessageReferenceExpression: args.messageReferenceExpression,\n\t\t\tinlinePlainTextByLocale,\n\t\t\tsettings: args.settings,\n\t\t\tmatchTypes,\n\t\t\thasMarkup,\n\t\t\texperimentalMiddlewareLocaleSplitting:\n\t\t\t\targs.experimentalMiddlewareLocaleSplitting ?? false,\n\t\t\texperimentalStaticLocale: args.experimentalStaticLocale,\n\t\t\tinputTypeAliasName,\n\t\t}),\n\t\tmessages: compiledMessages,\n\t\tmatchTypes,\n\t\tinputTypeAliasName,\n\t\tunreferencedMessageLocales,\n\t};\n};\n\n/**\n * Finds one-variant messages whose pattern is entirely static text. Their\n * dispatcher branch can return the string directly without retaining a\n * locale message function in the client bundle.\n */\nfunction findPlainTextMessages(bundle: BundleNested): Record<string, string> {\n\tconst result = Object.create(null) as Record<string, string>;\n\n\tfor (const message of bundle.messages) {\n\t\tif (message.variants.length !== 1) continue;\n\t\tconst variant = message.variants[0];\n\t\tif (!variant || !variant.pattern.every((part) => part.type === \"text\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// compilePattern emits static text inside a template literal, whose\n\t\t// cooked value normalizes CR and CRLF line endings to LF.\n\t\tresult[message.locale] = variant.pattern\n\t\t\t.map((part) => (part.type === \"text\" ? part.value : \"\"))\n\t\t\t.join(\"\")\n\t\t\t.replace(/\\r\\n?/g, \"\\n\");\n\t}\n\n\treturn result;\n}\n\nfunction findUnreferencedMessageLocales(args: {\n\tinlinePlainTextByLocale: Record<string, string>;\n\tcompiledMessages: Record<string, CompiledMessage>;\n\tfallbackMap: Record<string, string | undefined>;\n\thasMarkup: boolean;\n}): string[] {\n\tif (args.hasMarkup) return [];\n\n\t// Missing-locale aliases still call the first available compiled fallback\n\t// function, even when the dispatcher's own branch uses an inline string.\n\tconst fallbackTargets = new Set<string>();\n\tfor (const locale of Object.keys(args.fallbackMap)) {\n\t\tif (Object.hasOwn(args.compiledMessages, locale)) continue;\n\n\t\tlet fallbackLocale = args.fallbackMap[locale];\n\t\tconst visited = new Set([locale]);\n\t\twhile (fallbackLocale && !visited.has(fallbackLocale)) {\n\t\t\tvisited.add(fallbackLocale);\n\t\t\tif (Object.hasOwn(args.compiledMessages, fallbackLocale)) {\n\t\t\t\tfallbackTargets.add(fallbackLocale);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfallbackLocale = args.fallbackMap[fallbackLocale];\n\t\t}\n\t}\n\n\treturn Object.keys(args.inlinePlainTextByLocale).filter(\n\t\t(locale) => !fallbackTargets.has(locale)\n\t);\n}\n\nconst compileBundleFunction = (args: {\n\t/**\n\t * The bundle to compile\n\t */\n\tbundle: BundleNested;\n\t/**\n\t * The language tags which are available\n\t */\n\tavailableLocales: string[];\n\t/**\n\t * The message reference expression\n\t */\n\tmessageReferenceExpression: (locale: string, bundleId: string) => string;\n\t/** Static text messages that can be returned directly from the dispatcher. */\n\tinlinePlainTextByLocale?: Record<string, string>;\n\t/**\n\t * The project settings\n\t */\n\tsettings?: ProjectSettings;\n\t/**\n\t * Match literal types inferred from bundle variants\n\t */\n\tmatchTypes: InputMatchTypes;\n\t/**\n\t * Whether at least one variant in this bundle contains markup.\n\t */\n\thasMarkup: boolean;\n\t/**\n\t * Whether middleware locale splitting runtime hooks should be emitted.\n\t */\n\texperimentalMiddlewareLocaleSplitting: boolean;\n\t/**\n\t * Static locale expression emitted inside the message function so a\n\t * bundler can tree-shake unselected locale modules.\n\t */\n\texperimentalStaticLocale?: CompilerOptions[\"experimentalStaticLocale\"];\n\t/**\n\t * Shared typedef name for bundle input types used across emitted JSDoc.\n\t */\n\tinputTypeAliasName: string;\n}): Compiled<Bundle> => {\n\tconst inputs = args.bundle.declarations.filter(\n\t\t(decl) => decl.type === \"input-variable\"\n\t);\n\tconst hasInputs = inputs.length > 0;\n\tconst safeBundleId = toSafeModuleId(args.bundle.id);\n\n\tconst isSafeBundleId = safeBundleId === args.bundle.id;\n\n\tconst isFullyTranslated =\n\t\targs.availableLocales.length === args.settings?.locales.length;\n\tconst baseLocale = args.settings?.baseLocale;\n\tconst dispatchLocales =\n\t\tbaseLocale && args.availableLocales.includes(baseLocale)\n\t\t\t? [\n\t\t\t\t\t...args.availableLocales.filter((locale) => locale !== baseLocale),\n\t\t\t\t\tbaseLocale,\n\t\t\t\t]\n\t\t\t: args.availableLocales;\n\tconst allStringBranchesInline = dispatchLocales.every(\n\t\t(locale) => args.inlinePlainTextByLocale?.[locale] !== undefined\n\t);\n\n\tconst inputType = args.inputTypeAliasName;\n\tconst localesUnion =\n\t\targs.availableLocales.length === 0\n\t\t\t? \"never\"\n\t\t\t: args.availableLocales.map((locale) => `\"${locale}\"`).join(\" | \");\n\tconst optionsType = `{ locale?: ${localesUnion} }`;\n\tconst inputsParameterType = `${hasInputs ? \"inputs\" : \"inputs?\"}: ${inputType}`;\n\tconst bundleFunctionType = `(${inputsParameterType}, options?: ${optionsType}) => LocalizedString`;\n\tconst partsFunctionType = `(${inputsParameterType}, options?: ${optionsType}) => import('../runtime.js').MessagePart[]`;\n\tconst markupSchemaType = buildMarkupSchemaType(args.bundle, args.matchTypes);\n\tconst messageMetadataType = `import('../runtime.js').MessageMetadata<${inputType}, ${optionsType}, ${markupSchemaType}>`;\n\n\tconst compileLocaleReturnStatements = (\n\t\tmode: \"string\" | \"parts\",\n\t\tcontinuationIndent: string\n\t): string =>\n\t\tdispatchLocales\n\t\t\t.map((locale, index) => {\n\t\t\t\tconst condition =\n\t\t\t\t\t!isFullyTranslated || index < dispatchLocales.length - 1\n\t\t\t\t\t\t? `if (locale === \"${locale}\") `\n\t\t\t\t\t\t: \"\";\n\t\t\t\tconst prefix = index > 0 ? continuationIndent : \"\";\n\t\t\t\tconst messageRef = args.messageReferenceExpression(\n\t\t\t\t\tlocale,\n\t\t\t\t\targs.bundle.id\n\t\t\t\t);\n\n\t\t\t\tif (mode === \"string\") {\n\t\t\t\t\tconst inlineText = args.inlinePlainTextByLocale?.[locale];\n\t\t\t\t\tif (inlineText !== undefined) {\n\t\t\t\t\t\treturn `${prefix}${condition}return /** @type {LocalizedString} */ (${JSON.stringify(inlineText)})`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `${prefix}${condition}return ${messageRef}(inputs)`;\n\t\t\t\t}\n\n\t\t\t\t// A locale's message has .parts() only if its own variants have\n\t\t\t\t// markup. Fallbacks and messages without markup are typed without\n\t\t\t\t// it, so read it through a type that declares it optional.\n\t\t\t\treturn `${prefix}${condition}return /** @type {{ parts?: (inputs: ${inputType}) => import('../runtime.js').MessagePart[] }} */ (${messageRef}).parts?.(inputs) ?? [{ type: \"text\", value: ${messageRef}(inputs) }]`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\n\tconst perLocaleBuild =\n\t\targs.experimentalStaticLocale === perLocaleBuildStaticLocaleExpression;\n\t// A locale-specialized graph may ship source maps. Keeping the English\n\t// pattern preview in the shared dispatcher would leak base-locale message\n\t// text into every locale's map even after the English module is tree-shaken.\n\tconst englishMatchTableDoc = perLocaleBuild\n\t\t? \"\"\n\t\t: buildEnglishMatchTableDoc(args.bundle);\n\n\tconst commonJsDoc = `/**\n${englishMatchTableDoc}${jsDocBundleFunctionTypes({\n\t\tinputs,\n\t\tlocales: args.availableLocales,\n\t\tmatchTypes: args.matchTypes,\n\t\tinputTypeOverride: args.inputTypeAliasName,\n\t})}\n*/`;\n\n\tconst clientMiddlewareGuard = (indent: string): string => {\n\t\tif (!args.experimentalMiddlewareLocaleSplitting) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn `\\n${indent}if (experimentalMiddlewareLocaleSplitting && isServer === false) {\\n${indent}\\treturn /** @type {any} */ (globalThis).__paraglide.ssr.${safeBundleId}(inputs)\\n${indent}}`;\n\t};\n\n\tconst clientPartsMiddlewareGuard = (indent: string): string => {\n\t\tif (!args.experimentalMiddlewareLocaleSplitting) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn `\\n${indent}if (experimentalMiddlewareLocaleSplitting && isServer === false) {\\n${indent}\\tconst serverMessage = /** @type {any} */ (globalThis).__paraglide.ssr.${safeBundleId}\\n${indent}\\tif (typeof serverMessage.parts === \"function\") {\\n${indent}\\t\\treturn /** @type {import('../runtime.js').MessagePart[]} */ (serverMessage.parts(inputs))\\n${indent}\\t}\\n${indent}\\treturn /** @type {import('../runtime.js').MessagePart[]} */ ([{ type: \"text\", value: serverMessage(inputs) }])\\n${indent}}`;\n\t};\n\n\tconst maybeTrackMessageCall = (indent: string): string => {\n\t\tif (!args.experimentalMiddlewareLocaleSplitting) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn `\\n${indent}trackMessageCall(\"${safeBundleId}\", locale)`;\n\t};\n\n\tconst localeResolutionStatement = (indent: string): string => {\n\t\tconst localeExpression = perLocaleBuild\n\t\t\t? `${perLocaleBuildStaticLocaleExpression} ?? options.locale ?? getLocale()`\n\t\t\t: \"experimentalStaticLocale ?? options.locale ?? getLocale()\";\n\t\tconst overrideWarning = perLocaleBuild\n\t\t\t? `\\n${indent}if (${perLocaleBuildStaticLocaleExpression} !== undefined && options.locale !== undefined && options.locale !== ${perLocaleBuildStaticLocaleExpression}) console.warn(\"Paraglide: options.locale cannot override a locale-specialized client bundle; use a full document navigation to switch locales.\")`\n\t\t\t: \"\";\n\n\t\tif (\n\t\t\tisFullyTranslated &&\n\t\t\targs.availableLocales.length === 1 &&\n\t\t\t!args.experimentalMiddlewareLocaleSplitting\n\t\t) {\n\t\t\treturn `${indent}${localeExpression}${overrideWarning}`;\n\t\t}\n\n\t\treturn `${indent}const locale = ${localeExpression}${overrideWarning}${maybeTrackMessageCall(\n\t\t\tindent\n\t\t)}`;\n\t};\n\tconst keepUnusedInputsParameter = (indent: string): string =>\n\t\tallStringBranchesInline && !args.experimentalMiddlewareLocaleSplitting\n\t\t\t? `\\n${indent}void inputs;`\n\t\t\t: \"\";\n\n\tlet code = \"\";\n\n\tif (!args.hasMarkup) {\n\t\tcode = `${commonJsDoc}\n${isSafeBundleId ? \"export \" : \"\"}const ${safeBundleId} = /** @type {(${bundleFunctionType}) & ${messageMetadataType}} */ ((inputs${hasInputs ? \"\" : \" = {}\"}, options = {}) => {${clientMiddlewareGuard(\n\t\t\t\"\\t\"\n\t\t)}${keepUnusedInputsParameter(\"\\t\")}\n${localeResolutionStatement(\"\\t\")}\n\t${compileLocaleReturnStatements(\"string\", \"\\t\")}${\n\t\t!isFullyTranslated\n\t\t\t? `\\n\treturn /** @type {LocalizedString} */ (\"${args.bundle.id}\")`\n\t\t\t: \"\"\n\t}\n});`;\n\t} else {\n\t\tcode = `${commonJsDoc}\n${isSafeBundleId ? \"export \" : \"\"}const ${safeBundleId} = /** @type {(${bundleFunctionType}) & { parts: ${partsFunctionType} } & ${messageMetadataType}} */ (\n\t/* @__PURE__ */ Object.assign(\n\t\t/** @type {${bundleFunctionType}} */ ((inputs${hasInputs ? \"\" : \" = {}\"}, options = {}) => {${clientMiddlewareGuard(\n\t\t\t\"\\t\\t\\t\"\n\t\t)}${keepUnusedInputsParameter(\"\\t\\t\\t\")}\n${localeResolutionStatement(\"\\t\\t\\t\")}\n\t\t\t${compileLocaleReturnStatements(\"string\", \"\\t\\t\\t\")}${\n\t\t\t\t!isFullyTranslated\n\t\t\t\t\t? `\\n\t\t\treturn /** @type {LocalizedString} */ (${JSON.stringify(args.bundle.id)})`\n\t\t\t\t\t: \"\"\n\t\t\t}\n\t\t}),\n\t\t{\n\t\t\tparts: /** @type {${partsFunctionType}} */ ((inputs${\n\t\t\t\thasInputs ? \"\" : \" = {}\"\n\t\t\t}, options = {}) => {${clientPartsMiddlewareGuard(\"\\t\\t\\t\\t\")}\n${localeResolutionStatement(\"\\t\\t\\t\\t\")}\n\t\t\t\t${compileLocaleReturnStatements(\"parts\", \"\\t\\t\\t\\t\")}${\n\t\t\t\t\t!isFullyTranslated\n\t\t\t\t\t\t? `\\n\t\t\t\treturn /** @type {import('../runtime.js').MessagePart[]} */ ([{ type: \"text\", value: ${JSON.stringify(args.bundle.id)} }])`\n\t\t\t\t\t\t: \"\"\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t)\n);`;\n\t}\n\n\tif (isSafeBundleId === false) {\n\t\tcode += `\\nexport { ${safeBundleId} as \"${escapeForDoubleQuoteString(args.bundle.id)}\" }`;\n\t}\n\n\treturn {\n\t\tcode,\n\t\tnode: args.bundle,\n\t};\n};\n\nfunction buildEnglishMatchTableDoc(bundle: BundleNested): string {\n\tconst message = selectEnglishMessage(bundle);\n\tif (!message) {\n\t\treturn \"\";\n\t}\n\n\tconst selectorKeys = collectSelectorKeys(message);\n\tconst headerCells = [...selectorKeys, \"output\"];\n\tconst lines = [\n\t\t`* | ${headerCells.map(escapeTableCell).join(\" | \")} |`,\n\t\t`* | ${headerCells.map(() => \"---\").join(\" | \")} |`,\n\t];\n\n\tfor (const variant of message.variants) {\n\t\tconst rowValues = selectorKeys.map((key) =>\n\t\t\tgetMatchCellValue(variant, key)\n\t\t);\n\t\tconst serializedOutput = serializePatternPreview(variant.pattern);\n\t\tconst outputValue = JSON.stringify(\n\t\t\tserializedOutput.length > 160\n\t\t\t\t? `${serializedOutput.slice(0, 157)}...`\n\t\t\t\t: serializedOutput\n\t\t);\n\t\tlines.push(\n\t\t\t`* | ${[...rowValues, outputValue].map(escapeTableCell).join(\" | \")} |`\n\t\t);\n\t}\n\n\tlines.push(\"*\");\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction selectEnglishMessage(\n\tbundle: BundleNested\n): BundleNested[\"messages\"][number] | undefined {\n\treturn (\n\t\tbundle.messages.find((message) => message.locale === \"en\") ??\n\t\tbundle.messages.find((message) => message.locale.startsWith(\"en-\"))\n\t);\n}\n\nfunction collectSelectorKeys(\n\tmessage: BundleNested[\"messages\"][number]\n): string[] {\n\tconst keys: string[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const variant of message.variants) {\n\t\tfor (const match of variant.matches ?? []) {\n\t\t\tif (seen.has(match.key)) continue;\n\t\t\tseen.add(match.key);\n\t\t\tkeys.push(match.key);\n\t\t}\n\t}\n\n\treturn keys;\n}\n\nfunction getMatchCellValue(\n\tvariant: BundleNested[\"messages\"][number][\"variants\"][number],\n\tkey: string\n): string {\n\tconst match = (variant.matches ?? []).find((entry) => entry.key === key);\n\tif (!match || match.type === \"catchall-match\") {\n\t\treturn \"*\";\n\t}\n\n\treturn JSON.stringify(match.value);\n}\n\nfunction escapeTableCell(value: string): string {\n\treturn value\n\t\t.replace(/\\|/g, \"\\\\|\")\n\t\t.replace(/\\r?\\n/g, \" \")\n\t\t.replaceAll(\"*/\", \"*\\\\/\");\n}\n\nexport function toBundleInputTypeAliasName(safeBundleId: string): string {\n\treturn `${toBundleTypeBaseName(safeBundleId)}Inputs`;\n}\n\nfunction toBundleTypeBaseName(safeBundleId: string): string {\n\tlet baseName = \"\";\n\tlet capitalizeNext = true;\n\n\tfor (const character of safeBundleId) {\n\t\tif (character === \"_\") {\n\t\t\tbaseName += \"_\";\n\t\t\tcapitalizeNext = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (character >= \"a\" && character <= \"z\") {\n\t\t\tbaseName += capitalizeNext ? character.toUpperCase() : character;\n\t\t} else {\n\t\t\tbaseName += character;\n\t\t}\n\t\tcapitalizeNext = false;\n\t}\n\n\tif (!baseName) {\n\t\tbaseName = \"Message\";\n\t}\n\n\tif (!/^[A-Za-z_]/.test(baseName)) {\n\t\tbaseName = `Message${baseName}`;\n\t}\n\n\treturn baseName;\n}\n\nfunction serializePatternPreview(\n\tpattern: BundleNested[\"messages\"][number][\"variants\"][number][\"pattern\"]\n): string {\n\tlet result = \"\";\n\n\tfor (const part of pattern) {\n\t\tif (part.type === \"text\") {\n\t\t\tresult += part.value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (part.type === \"expression\") {\n\t\t\tif (part.arg.type === \"literal\") {\n\t\t\t\tresult += part.arg.value;\n\t\t\t} else {\n\t\t\t\tresult += `{${part.arg.name}}`;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result.replace(/\\s+/g, \" \").trim();\n}\n\ntype MarkupValueAccumulator = {\n\tcount: number;\n\ttypes: Set<string>;\n};\n\ntype MarkupTagAccumulator = {\n\toccurrences: number;\n\tchildrenTrue: boolean;\n\tchildrenFalse: boolean;\n\toptions: Map<string, MarkupValueAccumulator>;\n\tattributes: Map<string, MarkupValueAccumulator>;\n};\n\nfunction buildMarkupSchemaType(\n\tbundle: BundleNested,\n\tmatchTypes: InputMatchTypes\n): string {\n\tconst tagAccumulators = new Map<string, MarkupTagAccumulator>();\n\tconst inputVariableNames = new Set(\n\t\tbundle.declarations\n\t\t\t.filter((declaration) => declaration.type === \"input-variable\")\n\t\t\t.map((declaration) => declaration.name)\n\t);\n\n\tfor (const message of bundle.messages) {\n\t\tfor (const variant of message.variants) {\n\t\t\tfor (const part of variant.pattern) {\n\t\t\t\tif (part.type !== \"markup-start\" && part.type !== \"markup-standalone\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tag = ensureMarkupTagAccumulator(tagAccumulators, part.name);\n\t\t\t\ttag.occurrences += 1;\n\t\t\t\tif (part.type === \"markup-start\") {\n\t\t\t\t\ttag.childrenTrue = true;\n\t\t\t\t} else {\n\t\t\t\t\ttag.childrenFalse = true;\n\t\t\t\t}\n\n\t\t\t\tcollectMarkupOptions(tag, part, inputVariableNames, matchTypes);\n\t\t\t\tcollectMarkupAttributes(tag, part);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (tagAccumulators.size === 0) {\n\t\treturn \"{}\";\n\t}\n\n\tconst tagEntries = Array.from(tagAccumulators.entries())\n\t\t.sort(([leftName], [rightName]) => leftName.localeCompare(rightName))\n\t\t.map(\n\t\t\t([tagName, tag]) =>\n\t\t\t\t`${renderTypeObjectKey(tagName)}: ${renderMarkupTagType(tag)}`\n\t\t);\n\n\treturn `{ ${tagEntries.join(\"; \")} }`;\n}\n\nfunction ensureMarkupTagAccumulator(\n\taccumulators: Map<string, MarkupTagAccumulator>,\n\ttagName: string\n): MarkupTagAccumulator {\n\tconst existing = accumulators.get(tagName);\n\tif (existing) {\n\t\treturn existing;\n\t}\n\tconst created: MarkupTagAccumulator = {\n\t\toccurrences: 0,\n\t\tchildrenTrue: false,\n\t\tchildrenFalse: false,\n\t\toptions: new Map(),\n\t\tattributes: new Map(),\n\t};\n\taccumulators.set(tagName, created);\n\treturn created;\n}\n\nfunction collectMarkupOptions(\n\ttag: MarkupTagAccumulator,\n\tpart: MarkupStart | MarkupStandalone,\n\tinputVariableNames: Set<string>,\n\tmatchTypes: InputMatchTypes\n): void {\n\tconst seenOptions = new Set<string>();\n\n\tfor (const option of part.options ?? []) {\n\t\tconst optionAccumulator = ensureMarkupValueAccumulator(\n\t\t\ttag.options,\n\t\t\toption.name\n\t\t);\n\t\toptionAccumulator.types.add(\n\t\t\tresolveMarkupOptionType(option.value, inputVariableNames, matchTypes)\n\t\t);\n\t\tif (!seenOptions.has(option.name)) {\n\t\t\toptionAccumulator.count += 1;\n\t\t\tseenOptions.add(option.name);\n\t\t}\n\t}\n}\n\nfunction collectMarkupAttributes(\n\ttag: MarkupTagAccumulator,\n\tpart: MarkupStart | MarkupStandalone\n): void {\n\tconst seenAttributes = new Set<string>();\n\n\tfor (const attribute of part.attributes ?? []) {\n\t\tconst attributeAccumulator = ensureMarkupValueAccumulator(\n\t\t\ttag.attributes,\n\t\t\tattribute.name\n\t\t);\n\t\tattributeAccumulator.types.add(\n\t\t\tattribute.value === true ? \"true\" : \"string\"\n\t\t);\n\t\tif (!seenAttributes.has(attribute.name)) {\n\t\t\tattributeAccumulator.count += 1;\n\t\t\tseenAttributes.add(attribute.name);\n\t\t}\n\t}\n}\n\nfunction resolveMarkupOptionType(\n\tvalue:\n\t\t| {\n\t\t\t\ttype: \"literal\";\n\t\t\t\tvalue: string;\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"variable-reference\";\n\t\t\t\tname: string;\n\t\t },\n\tinputVariableNames: Set<string>,\n\tmatchTypes: InputMatchTypes\n): string {\n\tif (value.type === \"literal\") {\n\t\treturn \"string\";\n\t}\n\n\tif (inputVariableNames.has(value.name)) {\n\t\treturn inputTypeForName(value.name, matchTypes);\n\t}\n\n\treturn \"NonNullable<unknown>\";\n}\n\nfunction ensureMarkupValueAccumulator(\n\tvalues: Map<string, MarkupValueAccumulator>,\n\tname: string\n): MarkupValueAccumulator {\n\tconst existing = values.get(name);\n\tif (existing) {\n\t\treturn existing;\n\t}\n\n\tconst created: MarkupValueAccumulator = { count: 0, types: new Set() };\n\tvalues.set(name, created);\n\treturn created;\n}\n\nfunction renderMarkupTagType(tag: MarkupTagAccumulator): string {\n\treturn `{ options: ${renderMarkupObjectType(tag.options, tag.occurrences)}; attributes: ${renderMarkupObjectType(tag.attributes, tag.occurrences)}; children: ${renderChildrenType(tag)} }`;\n}\n\nfunction renderMarkupObjectType(\n\tvalues: Map<string, MarkupValueAccumulator>,\n\toccurrenceCount: number\n): string {\n\tif (values.size === 0) {\n\t\treturn \"{}\";\n\t}\n\n\tconst properties = Array.from(values.entries())\n\t\t.sort(([leftName], [rightName]) => leftName.localeCompare(rightName))\n\t\t.map(([name, value]) => {\n\t\t\tconst isOptional = value.count < occurrenceCount;\n\t\t\treturn `${renderTypeObjectKey(name)}${isOptional ? \"?\" : \"\"}: ${renderTypeUnion(value.types)}`;\n\t\t});\n\n\treturn `{ ${properties.join(\"; \")} }`;\n}\n\nfunction renderChildrenType(tag: MarkupTagAccumulator): string {\n\tif (tag.childrenTrue && tag.childrenFalse) {\n\t\treturn \"boolean\";\n\t}\n\tif (tag.childrenTrue) {\n\t\treturn \"true\";\n\t}\n\tif (tag.childrenFalse) {\n\t\treturn \"false\";\n\t}\n\treturn \"boolean\";\n}\n\nfunction renderTypeUnion(types: Set<string>): string {\n\tconst sorted = Array.from(types).sort();\n\tif (sorted.length === 0) {\n\t\treturn \"never\";\n\t}\n\tif (sorted.length === 1) {\n\t\treturn sorted[0] ?? \"never\";\n\t}\n\treturn sorted.join(\" | \");\n}\n\nfunction renderTypeObjectKey(name: string): string {\n\treturn isValidIdentifier(name) ? name : quotePropertyKey(name);\n}\n\nfunction collectInputMatchTypes(bundle: BundleNested): InputMatchTypes {\n\tconst inputNames = new Set(\n\t\tbundle.declarations\n\t\t\t?.filter((decl) => decl.type === \"input-variable\")\n\t\t\t.map((decl) => decl.name) ?? []\n\t);\n\tconst matchTypes: InputMatchTypes = new Map();\n\n\tconst ensureInfo = (name: string) => {\n\t\tconst existing = matchTypes.get(name);\n\t\tif (existing) return existing;\n\t\tconst created = { literals: new Set<string>(), hasCatchAll: false };\n\t\tmatchTypes.set(name, created);\n\t\treturn created;\n\t};\n\n\tfor (const message of bundle.messages) {\n\t\tfor (const variant of message.variants) {\n\t\t\tif (!variant.matches || variant.matches.length === 0) {\n\t\t\t\tfor (const name of inputNames) {\n\t\t\t\t\tconst info = ensureInfo(name);\n\t\t\t\t\tinfo.hasCatchAll = true;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const match of variant.matches ?? []) {\n\t\t\t\tif (!inputNames.has(match.key)) continue;\n\t\t\t\tconst info = ensureInfo(match.key);\n\t\t\t\tif (match.type === \"catchall-match\") {\n\t\t\t\t\tinfo.hasCatchAll = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (match.type === \"literal-match\") {\n\t\t\t\t\tinfo.literals.add(match.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Matches on un-annotated aliases of an input match the input value too.\n\t// Widen an input type that was narrowed by direct matches: alias literals\n\t// join the union and an alias catchall accepts any value. Inputs that are\n\t// only matched through aliases keep their unnarrowed type.\n\tconst declarations = bundle.declarations ?? [];\n\tfor (const message of bundle.messages) {\n\t\tfor (const variant of message.variants) {\n\t\t\tfor (const match of variant.matches ?? []) {\n\t\t\t\tif (inputNames.has(match.key)) continue;\n\t\t\t\tconst inputName = resolveInputAlias(match.key, declarations);\n\t\t\t\tif (inputName === undefined) continue;\n\t\t\t\tconst info = matchTypes.get(inputName);\n\t\t\t\tif (!info) continue;\n\t\t\t\tif (match.type === \"catchall-match\") {\n\t\t\t\t\tinfo.hasCatchAll = true;\n\t\t\t\t} else if (match.type === \"literal-match\") {\n\t\t\t\t\tinfo.literals.add(match.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn matchTypes;\n}\n\nfunction bundleHasMarkup(bundle: BundleNested): boolean {\n\treturn bundle.messages.some((message) =>\n\t\tmessage.variants.some((variant) =>\n\t\t\tvariant.pattern.some(\n\t\t\t\t(part) =>\n\t\t\t\t\tpart.type === \"markup-start\" ||\n\t\t\t\t\tpart.type === \"markup-end\" ||\n\t\t\t\t\tpart.type === \"markup-standalone\"\n\t\t\t)\n\t\t)\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compile-bundle.js","sourceRoot":"","sources":["../../src/compiler/compile-bundle.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tBundle,\n\tBundleNested,\n\tMarkupStandalone,\n\tMarkupStart,\n\tProjectSettings,\n} from \"@inlang/sdk\";\nimport { compileMessage, type CompiledMessage } from \"./compile-message.js\";\nimport type { Compiled } from \"./types.js\";\nimport {\n\tinputTypeForName,\n\tjsDocBundleFunctionTypes,\n\ttype InputMatchTypes,\n} from \"./jsdoc-types.js\";\nimport { isValidIdentifier, quotePropertyKey } from \"./variable-access.js\";\nimport { toSafeModuleId } from \"./safe-module-id.js\";\nimport { escapeForDoubleQuoteString } from \"../services/codegen/escape.js\";\nimport type { CompilerOptions } from \"./compiler-options.js\";\nimport { perLocaleBuildStaticLocaleExpression } from \"./per-locale-build.js\";\nimport { resolveInputAlias } from \"./input-alias.js\";\n\ntype InlineBody = NonNullable<CompiledMessage[\"inline\"]>;\n\nexport type CompiledBundleWithMessages = {\n\t/** The compilation result for the bundle index */\n\tbundle: Compiled<Bundle>;\n\t/** The compilation results for the languages */\n\tmessages: {\n\t\t[locale: string]: CompiledMessage;\n\t};\n\t/** Match literal types inferred from bundle variants */\n\tmatchTypes: InputMatchTypes;\n\t/** Shared typedef name for bundle input types used across emitted JSDoc */\n\tinputTypeAliasName?: string;\n\t/** Compiled message helpers with no emitted reference in message-modules. */\n\tunreferencedMessageLocales?: string[];\n};\n\n/**\n * Compiles all the messages in the bundle and returns an index-function + each compiled message\n */\nexport const compileBundle = (args: {\n\tbundle: BundleNested;\n\tfallbackMap: Record<string, string | undefined>;\n\tmessageReferenceExpression: (locale: string, bundleId: string) => string;\n\tsettings?: ProjectSettings;\n\t/** Internal layout control; locale modules keep text grouped by language. */\n\tinlineMessages?: boolean;\n\texperimentalMiddlewareLocaleSplitting?: boolean;\n\texperimentalStaticLocale?: CompilerOptions[\"experimentalStaticLocale\"];\n}): CompiledBundleWithMessages => {\n\tconst compiledMessages: Record<string, CompiledMessage> = {};\n\tconst safeBundleId = toSafeModuleId(args.bundle.id);\n\tconst inputTypeAliasName = toBundleInputTypeAliasName(safeBundleId);\n\tconst matchTypes = collectInputMatchTypes(args.bundle);\n\tconst hasMarkup = bundleHasMarkup(args.bundle);\n\n\tfor (const message of args.bundle.messages) {\n\t\tif (compiledMessages[message.locale]) {\n\t\t\tthrow new Error(`Duplicate locale: ${message.locale}`);\n\t\t}\n\n\t\tconst compiledMessage = compileMessage(\n\t\t\targs.bundle.declarations,\n\t\t\tmessage,\n\t\t\tmessage.variants,\n\t\t\tmatchTypes,\n\t\t\tinputTypeAliasName\n\t\t);\n\n\t\t// set the pattern for the language tag\n\t\tcompiledMessages[message.locale] = compiledMessage;\n\t}\n\tconst inlineMessages =\n\t\targs.inlineMessages === true &&\n\t\targs.experimentalStaticLocale !== perLocaleBuildStaticLocaleExpression;\n\tconst inlinePlainTextByLocale = inlineMessages\n\t\t? findPlainTextMessages(args.bundle)\n\t\t: undefined;\n\tconst inlineCandidates = inlineMessages\n\t\t? findInlineBodies(compiledMessages, inlinePlainTextByLocale ?? {})\n\t\t: {};\n\tconst unreferencedMessageLocales = findUnreferencedMessageLocales({\n\t\tinlinedLocales: [\n\t\t\t...Object.keys(inlinePlainTextByLocale ?? {}),\n\t\t\t...Object.keys(inlineCandidates),\n\t\t],\n\t\tcompiledMessages,\n\t\tfallbackMap: args.fallbackMap,\n\t\thasMarkup,\n\t});\n\t// A fallback target stays a message function that the missing-locale alias\n\t// calls, so its dispatcher branch calls it too instead of repeating the body.\n\tconst inlineBodiesByLocale = Object.create(null) as Record<\n\t\tstring,\n\t\tInlineBody\n\t>;\n\tfor (const locale of unreferencedMessageLocales) {\n\t\tconst body = inlineCandidates[locale];\n\t\tif (body) inlineBodiesByLocale[locale] = body;\n\t}\n\n\treturn {\n\t\tbundle: compileBundleFunction({\n\t\t\tbundle: args.bundle,\n\t\t\tavailableLocales: Object.keys(args.fallbackMap),\n\t\t\tmessageReferenceExpression: args.messageReferenceExpression,\n\t\t\tinlinePlainTextByLocale,\n\t\t\tinlineBodiesByLocale,\n\t\t\tsettings: args.settings,\n\t\t\tmatchTypes,\n\t\t\thasMarkup,\n\t\t\texperimentalMiddlewareLocaleSplitting:\n\t\t\t\targs.experimentalMiddlewareLocaleSplitting ?? false,\n\t\t\texperimentalStaticLocale: args.experimentalStaticLocale,\n\t\t\tinputTypeAliasName,\n\t\t}),\n\t\tmessages: compiledMessages,\n\t\tmatchTypes,\n\t\tinputTypeAliasName,\n\t\tunreferencedMessageLocales,\n\t};\n};\n\n/**\n * Finds one-variant messages whose pattern is entirely static text. Their\n * dispatcher branch can return the string directly without retaining a\n * locale message function in the client bundle.\n */\nfunction findPlainTextMessages(bundle: BundleNested): Record<string, string> {\n\tconst result = Object.create(null) as Record<string, string>;\n\n\tfor (const message of bundle.messages) {\n\t\tif (message.variants.length !== 1) continue;\n\t\tconst variant = message.variants[0];\n\t\tif (!variant || !variant.pattern.every((part) => part.type === \"text\")) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// compilePattern emits static text inside a template literal, whose\n\t\t// cooked value normalizes CR and CRLF line endings to LF.\n\t\tresult[message.locale] = variant.pattern\n\t\t\t.map((part) => (part.type === \"text\" ? part.value : \"\"))\n\t\t\t.join(\"\")\n\t\t\t.replace(/\\r\\n?/g, \"\\n\");\n\t}\n\n\treturn result;\n}\n\n/**\n * Finds the messages with inputs whose function body the dispatcher can run\n * in place of calling the message function. Markup messages keep their `.parts`\n * function, and messages that are plain text are returned as a string instead.\n */\nfunction findInlineBodies(\n\tcompiledMessages: Record<string, CompiledMessage>,\n\tinlinePlainTextByLocale: Record<string, string>\n): Record<string, InlineBody> {\n\tconst result = Object.create(null) as Record<string, InlineBody>;\n\n\tfor (const [locale, message] of Object.entries(compiledMessages)) {\n\t\tif (message.inline && inlinePlainTextByLocale[locale] === undefined) {\n\t\t\tresult[locale] = message.inline;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfunction findUnreferencedMessageLocales(args: {\n\tinlinedLocales: string[];\n\tcompiledMessages: Record<string, CompiledMessage>;\n\tfallbackMap: Record<string, string | undefined>;\n\thasMarkup: boolean;\n}): string[] {\n\tif (args.hasMarkup) return [];\n\n\t// Missing-locale aliases still call the first available compiled fallback\n\t// function, even when the dispatcher's own branch uses an inline string.\n\tconst fallbackTargets = new Set<string>();\n\tfor (const locale of Object.keys(args.fallbackMap)) {\n\t\tif (Object.hasOwn(args.compiledMessages, locale)) continue;\n\n\t\tlet fallbackLocale = args.fallbackMap[locale];\n\t\tconst visited = new Set([locale]);\n\t\twhile (fallbackLocale && !visited.has(fallbackLocale)) {\n\t\t\tvisited.add(fallbackLocale);\n\t\t\tif (Object.hasOwn(args.compiledMessages, fallbackLocale)) {\n\t\t\t\tfallbackTargets.add(fallbackLocale);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfallbackLocale = args.fallbackMap[fallbackLocale];\n\t\t}\n\t}\n\n\treturn args.inlinedLocales.filter((locale) => !fallbackTargets.has(locale));\n}\n\nconst compileBundleFunction = (args: {\n\t/**\n\t * The bundle to compile\n\t */\n\tbundle: BundleNested;\n\t/**\n\t * The language tags which are available\n\t */\n\tavailableLocales: string[];\n\t/**\n\t * The message reference expression\n\t */\n\tmessageReferenceExpression: (locale: string, bundleId: string) => string;\n\t/** Static text messages that can be returned directly from the dispatcher. */\n\tinlinePlainTextByLocale?: Record<string, string>;\n\t/** Message function bodies that the dispatcher runs in place of a call. */\n\tinlineBodiesByLocale?: Record<string, InlineBody>;\n\t/**\n\t * The project settings\n\t */\n\tsettings?: ProjectSettings;\n\t/**\n\t * Match literal types inferred from bundle variants\n\t */\n\tmatchTypes: InputMatchTypes;\n\t/**\n\t * Whether at least one variant in this bundle contains markup.\n\t */\n\thasMarkup: boolean;\n\t/**\n\t * Whether middleware locale splitting runtime hooks should be emitted.\n\t */\n\texperimentalMiddlewareLocaleSplitting: boolean;\n\t/**\n\t * Static locale expression emitted inside the message function so a\n\t * bundler can tree-shake unselected locale modules.\n\t */\n\texperimentalStaticLocale?: CompilerOptions[\"experimentalStaticLocale\"];\n\t/**\n\t * Shared typedef name for bundle input types used across emitted JSDoc.\n\t */\n\tinputTypeAliasName: string;\n}): Compiled<Bundle> => {\n\tconst inputs = args.bundle.declarations.filter(\n\t\t(decl) => decl.type === \"input-variable\"\n\t);\n\tconst hasInputs = inputs.length > 0;\n\tconst safeBundleId = toSafeModuleId(args.bundle.id);\n\n\tconst isSafeBundleId = safeBundleId === args.bundle.id;\n\n\tconst isFullyTranslated =\n\t\targs.availableLocales.length === args.settings?.locales.length;\n\tconst baseLocale = args.settings?.baseLocale;\n\tconst dispatchLocales =\n\t\tbaseLocale && args.availableLocales.includes(baseLocale)\n\t\t\t? [\n\t\t\t\t\t...args.availableLocales.filter((locale) => locale !== baseLocale),\n\t\t\t\t\tbaseLocale,\n\t\t\t\t]\n\t\t\t: args.availableLocales;\n\t// Inlined bodies read their inputs as `i`.\n\tconst inputsName = Object.keys(args.inlineBodiesByLocale ?? {}).length\n\t\t? \"i\"\n\t\t: \"inputs\";\n\tconst anyBranchReadsInputs = dispatchLocales.some((locale) => {\n\t\tif (args.inlinePlainTextByLocale?.[locale] !== undefined) return false;\n\t\treturn args.inlineBodiesByLocale?.[locale]?.readsInput ?? true;\n\t});\n\n\tconst inputType = args.inputTypeAliasName;\n\tconst localesUnion =\n\t\targs.availableLocales.length === 0\n\t\t\t? \"never\"\n\t\t\t: args.availableLocales.map((locale) => `\"${locale}\"`).join(\" | \");\n\tconst optionsType = `{ locale?: ${localesUnion} }`;\n\tconst inputsParameterType = `${hasInputs ? \"inputs\" : \"inputs?\"}: ${inputType}`;\n\tconst bundleFunctionType = `(${inputsParameterType}, options?: ${optionsType}) => LocalizedString`;\n\tconst partsFunctionType = `(${inputsParameterType}, options?: ${optionsType}) => import('../runtime.js').MessagePart[]`;\n\tconst markupSchemaType = buildMarkupSchemaType(args.bundle, args.matchTypes);\n\tconst messageMetadataType = `import('../runtime.js').MessageMetadata<${inputType}, ${optionsType}, ${markupSchemaType}>`;\n\n\tconst compileLocaleReturnStatements = (\n\t\tmode: \"string\" | \"parts\",\n\t\tcontinuationIndent: string\n\t): string =>\n\t\tdispatchLocales\n\t\t\t.map((locale, index) => {\n\t\t\t\tconst condition =\n\t\t\t\t\t!isFullyTranslated || index < dispatchLocales.length - 1\n\t\t\t\t\t\t? `if (locale === \"${locale}\") `\n\t\t\t\t\t\t: \"\";\n\t\t\t\tconst prefix = index > 0 ? continuationIndent : \"\";\n\t\t\t\tconst messageRef = args.messageReferenceExpression(\n\t\t\t\t\tlocale,\n\t\t\t\t\targs.bundle.id\n\t\t\t\t);\n\n\t\t\t\tif (mode === \"string\") {\n\t\t\t\t\tconst inlineText = args.inlinePlainTextByLocale?.[locale];\n\t\t\t\t\tif (inlineText !== undefined) {\n\t\t\t\t\t\treturn `${prefix}${condition}return /** @type {LocalizedString} */ (${JSON.stringify(inlineText)})`;\n\t\t\t\t\t}\n\t\t\t\t\tconst inlineBody = args.inlineBodiesByLocale?.[locale];\n\t\t\t\t\tif (inlineBody) {\n\t\t\t\t\t\tconst [onlyStatement] = inlineBody.statements;\n\t\t\t\t\t\treturn inlineBody.statements.length === 1 &&\n\t\t\t\t\t\t\tonlyStatement?.startsWith(\"return \")\n\t\t\t\t\t\t\t? `${prefix}${condition}${onlyStatement}`\n\t\t\t\t\t\t\t: `${prefix}${condition}{\\n${continuationIndent}\\t${inlineBody.statements.join(`\\n${continuationIndent}\\t`)}\\n${continuationIndent}}`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `${prefix}${condition}return ${messageRef}(${inputsName})`;\n\t\t\t\t}\n\n\t\t\t\t// A locale's message has .parts() only if its own variants have\n\t\t\t\t// markup. Fallbacks and messages without markup are typed without\n\t\t\t\t// it, so read it through a type that declares it optional.\n\t\t\t\treturn `${prefix}${condition}return /** @type {{ parts?: (inputs: ${inputType}) => import('../runtime.js').MessagePart[] }} */ (${messageRef}).parts?.(inputs) ?? [{ type: \"text\", value: ${messageRef}(inputs) }]`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\n\tconst perLocaleBuild =\n\t\targs.experimentalStaticLocale === perLocaleBuildStaticLocaleExpression;\n\t// A locale-specialized graph may ship source maps. Keeping the English\n\t// pattern preview in the shared dispatcher would leak base-locale message\n\t// text into every locale's map even after the English module is tree-shaken.\n\tconst englishMatchTableDoc = perLocaleBuild\n\t\t? \"\"\n\t\t: buildEnglishMatchTableDoc(args.bundle);\n\n\tconst commonJsDoc = `/**\n${englishMatchTableDoc}${jsDocBundleFunctionTypes({\n\t\tinputs,\n\t\tlocales: args.availableLocales,\n\t\tmatchTypes: args.matchTypes,\n\t\tinputTypeOverride: args.inputTypeAliasName,\n\t})}\n*/`;\n\n\tconst clientMiddlewareGuard = (indent: string): string => {\n\t\tif (!args.experimentalMiddlewareLocaleSplitting) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn `\\n${indent}if (experimentalMiddlewareLocaleSplitting && isServer === false) {\\n${indent}\\treturn /** @type {any} */ (globalThis).__paraglide.ssr.${safeBundleId}(${inputsName})\\n${indent}}`;\n\t};\n\n\tconst clientPartsMiddlewareGuard = (indent: string): string => {\n\t\tif (!args.experimentalMiddlewareLocaleSplitting) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn `\\n${indent}if (experimentalMiddlewareLocaleSplitting && isServer === false) {\\n${indent}\\tconst serverMessage = /** @type {any} */ (globalThis).__paraglide.ssr.${safeBundleId}\\n${indent}\\tif (typeof serverMessage.parts === \"function\") {\\n${indent}\\t\\treturn /** @type {import('../runtime.js').MessagePart[]} */ (serverMessage.parts(inputs))\\n${indent}\\t}\\n${indent}\\treturn /** @type {import('../runtime.js').MessagePart[]} */ ([{ type: \"text\", value: serverMessage(inputs) }])\\n${indent}}`;\n\t};\n\n\tconst maybeTrackMessageCall = (indent: string): string => {\n\t\tif (!args.experimentalMiddlewareLocaleSplitting) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn `\\n${indent}trackMessageCall(\"${safeBundleId}\", locale)`;\n\t};\n\n\tconst localeResolutionStatement = (indent: string): string => {\n\t\tconst localeExpression = perLocaleBuild\n\t\t\t? `${perLocaleBuildStaticLocaleExpression} ?? options.locale ?? getLocale()`\n\t\t\t: \"experimentalStaticLocale ?? options.locale ?? getLocale()\";\n\t\tconst overrideWarning = perLocaleBuild\n\t\t\t? `\\n${indent}if (${perLocaleBuildStaticLocaleExpression} !== undefined && options.locale !== undefined && options.locale !== ${perLocaleBuildStaticLocaleExpression}) console.warn(\"Paraglide: options.locale cannot override a locale-specialized client bundle; use a full document navigation to switch locales.\")`\n\t\t\t: \"\";\n\n\t\tif (\n\t\t\tisFullyTranslated &&\n\t\t\targs.availableLocales.length === 1 &&\n\t\t\t!args.experimentalMiddlewareLocaleSplitting\n\t\t) {\n\t\t\treturn `${indent}${localeExpression}${overrideWarning}`;\n\t\t}\n\n\t\treturn `${indent}const locale = ${localeExpression}${overrideWarning}${maybeTrackMessageCall(\n\t\t\tindent\n\t\t)}`;\n\t};\n\tconst keepUnusedInputsParameter = (indent: string): string =>\n\t\t!anyBranchReadsInputs && !args.experimentalMiddlewareLocaleSplitting\n\t\t\t? `\\n${indent}void ${inputsName};`\n\t\t\t: \"\";\n\n\tlet code = \"\";\n\n\tif (!args.hasMarkup) {\n\t\tcode = `${commonJsDoc}\n${isSafeBundleId ? \"export \" : \"\"}const ${safeBundleId} = /** @type {(${bundleFunctionType}) & ${messageMetadataType}} */ ((${inputsName}${hasInputs ? \"\" : \" = {}\"}, options = {}) => {${clientMiddlewareGuard(\n\t\t\t\"\\t\"\n\t\t)}${keepUnusedInputsParameter(\"\\t\")}\n${localeResolutionStatement(\"\\t\")}\n\t${compileLocaleReturnStatements(\"string\", \"\\t\")}${\n\t\t!isFullyTranslated\n\t\t\t? `\\n\treturn /** @type {LocalizedString} */ (\"${args.bundle.id}\")`\n\t\t\t: \"\"\n\t}\n});`;\n\t} else {\n\t\tcode = `${commonJsDoc}\n${isSafeBundleId ? \"export \" : \"\"}const ${safeBundleId} = /** @type {(${bundleFunctionType}) & { parts: ${partsFunctionType} } & ${messageMetadataType}} */ (\n\t/* @__PURE__ */ Object.assign(\n\t\t/** @type {${bundleFunctionType}} */ ((inputs${hasInputs ? \"\" : \" = {}\"}, options = {}) => {${clientMiddlewareGuard(\n\t\t\t\"\\t\\t\\t\"\n\t\t)}${keepUnusedInputsParameter(\"\\t\\t\\t\")}\n${localeResolutionStatement(\"\\t\\t\\t\")}\n\t\t\t${compileLocaleReturnStatements(\"string\", \"\\t\\t\\t\")}${\n\t\t\t\t!isFullyTranslated\n\t\t\t\t\t? `\\n\t\t\treturn /** @type {LocalizedString} */ (${JSON.stringify(args.bundle.id)})`\n\t\t\t\t\t: \"\"\n\t\t\t}\n\t\t}),\n\t\t{\n\t\t\tparts: /** @type {${partsFunctionType}} */ ((inputs${\n\t\t\t\thasInputs ? \"\" : \" = {}\"\n\t\t\t}, options = {}) => {${clientPartsMiddlewareGuard(\"\\t\\t\\t\\t\")}\n${localeResolutionStatement(\"\\t\\t\\t\\t\")}\n\t\t\t\t${compileLocaleReturnStatements(\"parts\", \"\\t\\t\\t\\t\")}${\n\t\t\t\t\t!isFullyTranslated\n\t\t\t\t\t\t? `\\n\t\t\t\treturn /** @type {import('../runtime.js').MessagePart[]} */ ([{ type: \"text\", value: ${JSON.stringify(args.bundle.id)} }])`\n\t\t\t\t\t\t: \"\"\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t)\n);`;\n\t}\n\n\tif (isSafeBundleId === false) {\n\t\tcode += `\\nexport { ${safeBundleId} as \"${escapeForDoubleQuoteString(args.bundle.id)}\" }`;\n\t}\n\n\treturn {\n\t\tcode,\n\t\tnode: args.bundle,\n\t};\n};\n\nfunction buildEnglishMatchTableDoc(bundle: BundleNested): string {\n\tconst message = selectEnglishMessage(bundle);\n\tif (!message) {\n\t\treturn \"\";\n\t}\n\n\tconst selectorKeys = collectSelectorKeys(message);\n\tconst headerCells = [...selectorKeys, \"output\"];\n\tconst lines = [\n\t\t`* | ${headerCells.map(escapeTableCell).join(\" | \")} |`,\n\t\t`* | ${headerCells.map(() => \"---\").join(\" | \")} |`,\n\t];\n\n\tfor (const variant of message.variants) {\n\t\tconst rowValues = selectorKeys.map((key) =>\n\t\t\tgetMatchCellValue(variant, key)\n\t\t);\n\t\tconst serializedOutput = serializePatternPreview(variant.pattern);\n\t\tconst outputValue = JSON.stringify(\n\t\t\tserializedOutput.length > 160\n\t\t\t\t? `${serializedOutput.slice(0, 157)}...`\n\t\t\t\t: serializedOutput\n\t\t);\n\t\tlines.push(\n\t\t\t`* | ${[...rowValues, outputValue].map(escapeTableCell).join(\" | \")} |`\n\t\t);\n\t}\n\n\tlines.push(\"*\");\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction selectEnglishMessage(\n\tbundle: BundleNested\n): BundleNested[\"messages\"][number] | undefined {\n\treturn (\n\t\tbundle.messages.find((message) => message.locale === \"en\") ??\n\t\tbundle.messages.find((message) => message.locale.startsWith(\"en-\"))\n\t);\n}\n\nfunction collectSelectorKeys(\n\tmessage: BundleNested[\"messages\"][number]\n): string[] {\n\tconst keys: string[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const variant of message.variants) {\n\t\tfor (const match of variant.matches ?? []) {\n\t\t\tif (seen.has(match.key)) continue;\n\t\t\tseen.add(match.key);\n\t\t\tkeys.push(match.key);\n\t\t}\n\t}\n\n\treturn keys;\n}\n\nfunction getMatchCellValue(\n\tvariant: BundleNested[\"messages\"][number][\"variants\"][number],\n\tkey: string\n): string {\n\tconst match = (variant.matches ?? []).find((entry) => entry.key === key);\n\tif (!match || match.type === \"catchall-match\") {\n\t\treturn \"*\";\n\t}\n\n\treturn JSON.stringify(match.value);\n}\n\nfunction escapeTableCell(value: string): string {\n\treturn value\n\t\t.replace(/\\|/g, \"\\\\|\")\n\t\t.replace(/\\r?\\n/g, \" \")\n\t\t.replaceAll(\"*/\", \"*\\\\/\");\n}\n\nexport function toBundleInputTypeAliasName(safeBundleId: string): string {\n\treturn `${toBundleTypeBaseName(safeBundleId)}Inputs`;\n}\n\nfunction toBundleTypeBaseName(safeBundleId: string): string {\n\tlet baseName = \"\";\n\tlet capitalizeNext = true;\n\n\tfor (const character of safeBundleId) {\n\t\tif (character === \"_\") {\n\t\t\tbaseName += \"_\";\n\t\t\tcapitalizeNext = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (character >= \"a\" && character <= \"z\") {\n\t\t\tbaseName += capitalizeNext ? character.toUpperCase() : character;\n\t\t} else {\n\t\t\tbaseName += character;\n\t\t}\n\t\tcapitalizeNext = false;\n\t}\n\n\tif (!baseName) {\n\t\tbaseName = \"Message\";\n\t}\n\n\tif (!/^[A-Za-z_]/.test(baseName)) {\n\t\tbaseName = `Message${baseName}`;\n\t}\n\n\treturn baseName;\n}\n\nfunction serializePatternPreview(\n\tpattern: BundleNested[\"messages\"][number][\"variants\"][number][\"pattern\"]\n): string {\n\tlet result = \"\";\n\n\tfor (const part of pattern) {\n\t\tif (part.type === \"text\") {\n\t\t\tresult += part.value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (part.type === \"expression\") {\n\t\t\tif (part.arg.type === \"literal\") {\n\t\t\t\tresult += part.arg.value;\n\t\t\t} else {\n\t\t\t\tresult += `{${part.arg.name}}`;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result.replace(/\\s+/g, \" \").trim();\n}\n\ntype MarkupValueAccumulator = {\n\tcount: number;\n\ttypes: Set<string>;\n};\n\ntype MarkupTagAccumulator = {\n\toccurrences: number;\n\tchildrenTrue: boolean;\n\tchildrenFalse: boolean;\n\toptions: Map<string, MarkupValueAccumulator>;\n\tattributes: Map<string, MarkupValueAccumulator>;\n};\n\nfunction buildMarkupSchemaType(\n\tbundle: BundleNested,\n\tmatchTypes: InputMatchTypes\n): string {\n\tconst tagAccumulators = new Map<string, MarkupTagAccumulator>();\n\tconst inputVariableNames = new Set(\n\t\tbundle.declarations\n\t\t\t.filter((declaration) => declaration.type === \"input-variable\")\n\t\t\t.map((declaration) => declaration.name)\n\t);\n\n\tfor (const message of bundle.messages) {\n\t\tfor (const variant of message.variants) {\n\t\t\tfor (const part of variant.pattern) {\n\t\t\t\tif (part.type !== \"markup-start\" && part.type !== \"markup-standalone\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tag = ensureMarkupTagAccumulator(tagAccumulators, part.name);\n\t\t\t\ttag.occurrences += 1;\n\t\t\t\tif (part.type === \"markup-start\") {\n\t\t\t\t\ttag.childrenTrue = true;\n\t\t\t\t} else {\n\t\t\t\t\ttag.childrenFalse = true;\n\t\t\t\t}\n\n\t\t\t\tcollectMarkupOptions(tag, part, inputVariableNames, matchTypes);\n\t\t\t\tcollectMarkupAttributes(tag, part);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (tagAccumulators.size === 0) {\n\t\treturn \"{}\";\n\t}\n\n\tconst tagEntries = Array.from(tagAccumulators.entries())\n\t\t.sort(([leftName], [rightName]) => leftName.localeCompare(rightName))\n\t\t.map(\n\t\t\t([tagName, tag]) =>\n\t\t\t\t`${renderTypeObjectKey(tagName)}: ${renderMarkupTagType(tag)}`\n\t\t);\n\n\treturn `{ ${tagEntries.join(\"; \")} }`;\n}\n\nfunction ensureMarkupTagAccumulator(\n\taccumulators: Map<string, MarkupTagAccumulator>,\n\ttagName: string\n): MarkupTagAccumulator {\n\tconst existing = accumulators.get(tagName);\n\tif (existing) {\n\t\treturn existing;\n\t}\n\tconst created: MarkupTagAccumulator = {\n\t\toccurrences: 0,\n\t\tchildrenTrue: false,\n\t\tchildrenFalse: false,\n\t\toptions: new Map(),\n\t\tattributes: new Map(),\n\t};\n\taccumulators.set(tagName, created);\n\treturn created;\n}\n\nfunction collectMarkupOptions(\n\ttag: MarkupTagAccumulator,\n\tpart: MarkupStart | MarkupStandalone,\n\tinputVariableNames: Set<string>,\n\tmatchTypes: InputMatchTypes\n): void {\n\tconst seenOptions = new Set<string>();\n\n\tfor (const option of part.options ?? []) {\n\t\tconst optionAccumulator = ensureMarkupValueAccumulator(\n\t\t\ttag.options,\n\t\t\toption.name\n\t\t);\n\t\toptionAccumulator.types.add(\n\t\t\tresolveMarkupOptionType(option.value, inputVariableNames, matchTypes)\n\t\t);\n\t\tif (!seenOptions.has(option.name)) {\n\t\t\toptionAccumulator.count += 1;\n\t\t\tseenOptions.add(option.name);\n\t\t}\n\t}\n}\n\nfunction collectMarkupAttributes(\n\ttag: MarkupTagAccumulator,\n\tpart: MarkupStart | MarkupStandalone\n): void {\n\tconst seenAttributes = new Set<string>();\n\n\tfor (const attribute of part.attributes ?? []) {\n\t\tconst attributeAccumulator = ensureMarkupValueAccumulator(\n\t\t\ttag.attributes,\n\t\t\tattribute.name\n\t\t);\n\t\tattributeAccumulator.types.add(\n\t\t\tattribute.value === true ? \"true\" : \"string\"\n\t\t);\n\t\tif (!seenAttributes.has(attribute.name)) {\n\t\t\tattributeAccumulator.count += 1;\n\t\t\tseenAttributes.add(attribute.name);\n\t\t}\n\t}\n}\n\nfunction resolveMarkupOptionType(\n\tvalue:\n\t\t| {\n\t\t\t\ttype: \"literal\";\n\t\t\t\tvalue: string;\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"variable-reference\";\n\t\t\t\tname: string;\n\t\t },\n\tinputVariableNames: Set<string>,\n\tmatchTypes: InputMatchTypes\n): string {\n\tif (value.type === \"literal\") {\n\t\treturn \"string\";\n\t}\n\n\tif (inputVariableNames.has(value.name)) {\n\t\treturn inputTypeForName(value.name, matchTypes);\n\t}\n\n\treturn \"NonNullable<unknown>\";\n}\n\nfunction ensureMarkupValueAccumulator(\n\tvalues: Map<string, MarkupValueAccumulator>,\n\tname: string\n): MarkupValueAccumulator {\n\tconst existing = values.get(name);\n\tif (existing) {\n\t\treturn existing;\n\t}\n\n\tconst created: MarkupValueAccumulator = { count: 0, types: new Set() };\n\tvalues.set(name, created);\n\treturn created;\n}\n\nfunction renderMarkupTagType(tag: MarkupTagAccumulator): string {\n\treturn `{ options: ${renderMarkupObjectType(tag.options, tag.occurrences)}; attributes: ${renderMarkupObjectType(tag.attributes, tag.occurrences)}; children: ${renderChildrenType(tag)} }`;\n}\n\nfunction renderMarkupObjectType(\n\tvalues: Map<string, MarkupValueAccumulator>,\n\toccurrenceCount: number\n): string {\n\tif (values.size === 0) {\n\t\treturn \"{}\";\n\t}\n\n\tconst properties = Array.from(values.entries())\n\t\t.sort(([leftName], [rightName]) => leftName.localeCompare(rightName))\n\t\t.map(([name, value]) => {\n\t\t\tconst isOptional = value.count < occurrenceCount;\n\t\t\treturn `${renderTypeObjectKey(name)}${isOptional ? \"?\" : \"\"}: ${renderTypeUnion(value.types)}`;\n\t\t});\n\n\treturn `{ ${properties.join(\"; \")} }`;\n}\n\nfunction renderChildrenType(tag: MarkupTagAccumulator): string {\n\tif (tag.childrenTrue && tag.childrenFalse) {\n\t\treturn \"boolean\";\n\t}\n\tif (tag.childrenTrue) {\n\t\treturn \"true\";\n\t}\n\tif (tag.childrenFalse) {\n\t\treturn \"false\";\n\t}\n\treturn \"boolean\";\n}\n\nfunction renderTypeUnion(types: Set<string>): string {\n\tconst sorted = Array.from(types).sort();\n\tif (sorted.length === 0) {\n\t\treturn \"never\";\n\t}\n\tif (sorted.length === 1) {\n\t\treturn sorted[0] ?? \"never\";\n\t}\n\treturn sorted.join(\" | \");\n}\n\nfunction renderTypeObjectKey(name: string): string {\n\treturn isValidIdentifier(name) ? name : quotePropertyKey(name);\n}\n\nfunction collectInputMatchTypes(bundle: BundleNested): InputMatchTypes {\n\tconst inputNames = new Set(\n\t\tbundle.declarations\n\t\t\t?.filter((decl) => decl.type === \"input-variable\")\n\t\t\t.map((decl) => decl.name) ?? []\n\t);\n\tconst matchTypes: InputMatchTypes = new Map();\n\n\tconst ensureInfo = (name: string) => {\n\t\tconst existing = matchTypes.get(name);\n\t\tif (existing) return existing;\n\t\tconst created = { literals: new Set<string>(), hasCatchAll: false };\n\t\tmatchTypes.set(name, created);\n\t\treturn created;\n\t};\n\n\tfor (const message of bundle.messages) {\n\t\tfor (const variant of message.variants) {\n\t\t\tif (!variant.matches || variant.matches.length === 0) {\n\t\t\t\tfor (const name of inputNames) {\n\t\t\t\t\tconst info = ensureInfo(name);\n\t\t\t\t\tinfo.hasCatchAll = true;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const match of variant.matches ?? []) {\n\t\t\t\tif (!inputNames.has(match.key)) continue;\n\t\t\t\tconst info = ensureInfo(match.key);\n\t\t\t\tif (match.type === \"catchall-match\") {\n\t\t\t\t\tinfo.hasCatchAll = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (match.type === \"literal-match\") {\n\t\t\t\t\tinfo.literals.add(match.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Matches on un-annotated aliases of an input match the input value too.\n\t// Widen an input type that was narrowed by direct matches: alias literals\n\t// join the union and an alias catchall accepts any value. Inputs that are\n\t// only matched through aliases keep their unnarrowed type.\n\tconst declarations = bundle.declarations ?? [];\n\tfor (const message of bundle.messages) {\n\t\tfor (const variant of message.variants) {\n\t\t\tfor (const match of variant.matches ?? []) {\n\t\t\t\tif (inputNames.has(match.key)) continue;\n\t\t\t\tconst inputName = resolveInputAlias(match.key, declarations);\n\t\t\t\tif (inputName === undefined) continue;\n\t\t\t\tconst info = matchTypes.get(inputName);\n\t\t\t\tif (!info) continue;\n\t\t\t\tif (match.type === \"catchall-match\") {\n\t\t\t\t\tinfo.hasCatchAll = true;\n\t\t\t\t} else if (match.type === \"literal-match\") {\n\t\t\t\t\tinfo.literals.add(match.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn matchTypes;\n}\n\nfunction bundleHasMarkup(bundle: BundleNested): boolean {\n\treturn bundle.messages.some((message) =>\n\t\tmessage.variants.some((variant) =>\n\t\t\tvariant.pattern.some(\n\t\t\t\t(part) =>\n\t\t\t\t\tpart.type === \"markup-start\" ||\n\t\t\t\t\tpart.type === \"markup-end\" ||\n\t\t\t\t\tpart.type === \"markup-standalone\"\n\t\t\t)\n\t\t)\n\t);\n}\n"]}
|
|
@@ -172,7 +172,7 @@ ${result.bundle.code}
|
|
|
172
172
|
expect(message({}, { locale: "de" })).toBe("Hallo");
|
|
173
173
|
expect(message({}, { locale: "fr" })).toBe(compiledText);
|
|
174
174
|
});
|
|
175
|
-
test("leaves markup
|
|
175
|
+
test("leaves markup messages on their message functions", () => {
|
|
176
176
|
const markupBundle = {
|
|
177
177
|
id: "notice",
|
|
178
178
|
declarations: [],
|
|
@@ -216,39 +216,221 @@ test("leaves markup and multi-variant messages on their message functions", () =
|
|
|
216
216
|
});
|
|
217
217
|
expect(markupResult.bundle.code).toContain("return en_notice(inputs)");
|
|
218
218
|
expect(markupResult.bundle.code).not.toContain('return /** @type {LocalizedString} */ ("Hello")');
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
219
|
+
});
|
|
220
|
+
function createBundle(id, declarations, variantsByLocale, selectors = []) {
|
|
221
|
+
return {
|
|
222
|
+
id,
|
|
223
|
+
declarations,
|
|
224
|
+
messages: Object.entries(variantsByLocale).map(([locale, variants]) => ({
|
|
225
|
+
id: `${id}-${locale}`,
|
|
226
|
+
bundle_id: id,
|
|
225
227
|
locale,
|
|
226
|
-
selectors
|
|
227
|
-
variants:
|
|
228
|
-
{
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
id: `item_count-${locale}-other`,
|
|
236
|
-
message_id: `item_count-${locale}`,
|
|
237
|
-
matches: [{ type: "catchall-match", key: "count" }],
|
|
238
|
-
pattern: [{ type: "text", value: "Some items" }],
|
|
239
|
-
},
|
|
240
|
-
],
|
|
228
|
+
selectors,
|
|
229
|
+
variants: variants.map((variant, index) => ({
|
|
230
|
+
id: `${id}-${locale}-${index}`,
|
|
231
|
+
message_id: `${id}-${locale}`,
|
|
232
|
+
matches: variant.matches ?? [],
|
|
233
|
+
pattern: variant.pattern,
|
|
234
|
+
})),
|
|
241
235
|
})),
|
|
242
236
|
};
|
|
243
|
-
|
|
237
|
+
}
|
|
238
|
+
const variable = (name) => ({
|
|
239
|
+
type: "expression",
|
|
240
|
+
arg: { type: "variable-reference", name },
|
|
241
|
+
});
|
|
242
|
+
function createInputBundle() {
|
|
243
|
+
return createBundle("welcome", [{ type: "input-variable", name: "name" }], {
|
|
244
|
+
en: [{ pattern: [{ type: "text", value: "Hello " }, variable("name")] }],
|
|
245
|
+
de: [{ pattern: [{ type: "text", value: "Hallo " }, variable("name")] }],
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Imports a compiled bundle the way message-modules output assembles it: the
|
|
250
|
+
* dispatcher plus the message functions of the locales it still references.
|
|
251
|
+
*/
|
|
252
|
+
async function importBundle(result, bundleId, prelude = "") {
|
|
253
|
+
const messageFunctions = Object.entries(result.messages)
|
|
254
|
+
.filter(([locale]) => !result.unreferencedMessageLocales?.includes(locale))
|
|
255
|
+
.map(([locale, message]) => `const ${locale}_${bundleId} = ${message.code.replace(/;\s*$/, "")};`);
|
|
256
|
+
return import("data:text/javascript;charset=utf-8," +
|
|
257
|
+
encodeURIComponent(`
|
|
258
|
+
const getLocale = () => "en";
|
|
259
|
+
const experimentalStaticLocale = undefined;
|
|
260
|
+
${prelude}
|
|
261
|
+
${messageFunctions.join("\n")}
|
|
262
|
+
${result.bundle.code}
|
|
263
|
+
`));
|
|
264
|
+
}
|
|
265
|
+
test("inlines message bodies with inputs and keeps fallback targets as functions", async () => {
|
|
266
|
+
const result = compileBundle({
|
|
244
267
|
inlineMessages: true,
|
|
245
|
-
bundle:
|
|
268
|
+
bundle: createInputBundle(),
|
|
269
|
+
// fr has no message and aliases de, so de stays a function fr can call.
|
|
270
|
+
fallbackMap: { en: undefined, de: "en", fr: "de" },
|
|
271
|
+
messageReferenceExpression: (locale) => `${locale}_welcome`,
|
|
272
|
+
settings: {
|
|
273
|
+
baseLocale: "en",
|
|
274
|
+
locales: ["en", "de", "fr"],
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
expect(result.unreferencedMessageLocales).toEqual(["en"]);
|
|
278
|
+
expect(result.bundle.code).not.toContain("en_welcome");
|
|
279
|
+
expect(result.bundle.code).toContain("fr_welcome(");
|
|
280
|
+
const module = await importBundle(result, "welcome", "const fr_welcome = (i) => de_welcome(i);");
|
|
281
|
+
expect(module.welcome({ name: "Ada" }, { locale: "en" })).toBe("Hello Ada");
|
|
282
|
+
expect(module.welcome({ name: "Ada" }, { locale: "de" })).toBe("Hallo Ada");
|
|
283
|
+
expect(module.welcome({ name: "Ada" }, { locale: "fr" })).toBe("Hallo Ada");
|
|
284
|
+
});
|
|
285
|
+
test("inlines multi-variant bodies in their own block scope", async () => {
|
|
286
|
+
const variants = (none, some) => [
|
|
287
|
+
{
|
|
288
|
+
matches: [{ type: "literal-match", key: "count", value: "0" }],
|
|
289
|
+
pattern: [{ type: "text", value: none }],
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
matches: [{ type: "catchall-match", key: "count" }],
|
|
293
|
+
pattern: [{ type: "text", value: some }],
|
|
294
|
+
},
|
|
295
|
+
];
|
|
296
|
+
const result = compileBundle({
|
|
297
|
+
inlineMessages: true,
|
|
298
|
+
bundle: createBundle("item_count", [{ type: "input-variable", name: "count" }], {
|
|
299
|
+
en: variants("No items", "Some items"),
|
|
300
|
+
de: variants("Keine Artikel", "Einige Artikel"),
|
|
301
|
+
}, [{ type: "variable-reference", name: "count" }]),
|
|
246
302
|
fallbackMap: { en: undefined, de: "en" },
|
|
247
303
|
messageReferenceExpression: (locale) => `${locale}_item_count`,
|
|
248
304
|
settings: { baseLocale: "en", locales: ["en", "de"] },
|
|
249
305
|
});
|
|
250
|
-
expect(
|
|
251
|
-
expect(
|
|
306
|
+
expect(result.unreferencedMessageLocales).toEqual(["en", "de"]);
|
|
307
|
+
expect(result.bundle.code).not.toContain("_item_count");
|
|
308
|
+
const module = await importBundle(result, "item_count");
|
|
309
|
+
expect(module.item_count({ count: 0 }, { locale: "en" })).toBe("No items");
|
|
310
|
+
expect(module.item_count({ count: 3 }, { locale: "en" })).toBe("Some items");
|
|
311
|
+
expect(module.item_count({ count: "0" }, { locale: "de" })).toBe("Keine Artikel");
|
|
312
|
+
expect(module.item_count({ count: 3 }, { locale: "de" })).toBe("Einige Artikel");
|
|
313
|
+
});
|
|
314
|
+
test("inlines locals that repeat across locales and shadow the dispatcher's locale and options", async () => {
|
|
315
|
+
// Each locale declares `locale` and `options` again, next to the
|
|
316
|
+
// dispatcher's own `locale` constant and `options` parameter.
|
|
317
|
+
const pattern = (label) => [
|
|
318
|
+
{ type: "text", value: label },
|
|
319
|
+
variable("locale"),
|
|
320
|
+
{ type: "text", value: " " },
|
|
321
|
+
variable("options"),
|
|
322
|
+
];
|
|
323
|
+
const result = compileBundle({
|
|
324
|
+
inlineMessages: true,
|
|
325
|
+
bundle: createBundle("weight", [
|
|
326
|
+
{ type: "input-variable", name: "amount" },
|
|
327
|
+
{
|
|
328
|
+
type: "local-variable",
|
|
329
|
+
name: "locale",
|
|
330
|
+
value: variable("amount"),
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
type: "local-variable",
|
|
334
|
+
name: "options",
|
|
335
|
+
value: {
|
|
336
|
+
type: "expression",
|
|
337
|
+
arg: { type: "literal", value: "kg" },
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
], {
|
|
341
|
+
en: [{ pattern: pattern("Weight: ") }],
|
|
342
|
+
de: [{ pattern: pattern("Gewicht: ") }],
|
|
343
|
+
}),
|
|
344
|
+
fallbackMap: { en: undefined, de: "en" },
|
|
345
|
+
messageReferenceExpression: (locale) => `${locale}_weight`,
|
|
346
|
+
settings: { baseLocale: "en", locales: ["en", "de"] },
|
|
347
|
+
});
|
|
348
|
+
expect(result.unreferencedMessageLocales).toEqual(["en", "de"]);
|
|
349
|
+
expect(result.bundle.code).not.toContain("_weight");
|
|
350
|
+
const module = await importBundle(result, "weight");
|
|
351
|
+
expect(module.weight({ amount: 5 }, { locale: "en" })).toBe("Weight: 5 kg");
|
|
352
|
+
expect(module.weight({ amount: 5 }, { locale: "de" })).toBe("Gewicht: 5 kg");
|
|
353
|
+
expect(module.weight({ amount: 5 })).toBe("Weight: 5 kg");
|
|
354
|
+
});
|
|
355
|
+
test("returns the bundle id from an inlined body when no variant matches", async () => {
|
|
356
|
+
const variants = (zero, one) => [
|
|
357
|
+
{
|
|
358
|
+
matches: [{ type: "literal-match", key: "count", value: "0" }],
|
|
359
|
+
pattern: [{ type: "text", value: zero }],
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
matches: [{ type: "literal-match", key: "count", value: "1" }],
|
|
363
|
+
pattern: [{ type: "text", value: one }],
|
|
364
|
+
},
|
|
365
|
+
];
|
|
366
|
+
const result = compileBundle({
|
|
367
|
+
inlineMessages: true,
|
|
368
|
+
bundle: createBundle("bottles", [{ type: "input-variable", name: "count" }], {
|
|
369
|
+
en: variants("No bottles", "One bottle"),
|
|
370
|
+
de: variants("Keine Flaschen", "Eine Flasche"),
|
|
371
|
+
}, [{ type: "variable-reference", name: "count" }]),
|
|
372
|
+
fallbackMap: { en: undefined, de: "en" },
|
|
373
|
+
messageReferenceExpression: (locale) => `${locale}_bottles`,
|
|
374
|
+
settings: { baseLocale: "en", locales: ["en", "de"] },
|
|
375
|
+
});
|
|
376
|
+
expect(result.unreferencedMessageLocales).toEqual(["en", "de"]);
|
|
377
|
+
expect(result.bundle.code).not.toContain("_bottles");
|
|
378
|
+
const module = await importBundle(result, "bottles");
|
|
379
|
+
expect(module.bottles({ count: 1 }, { locale: "de" })).toBe("Eine Flasche");
|
|
380
|
+
expect(module.bottles({ count: 7 }, { locale: "en" })).toBe("bottles");
|
|
381
|
+
expect(module.bottles({ count: 7 }, { locale: "de" })).toBe("bottles");
|
|
382
|
+
});
|
|
383
|
+
test("keeps message functions with inputs in a per-locale build", () => {
|
|
384
|
+
const result = compileBundle({
|
|
385
|
+
inlineMessages: true,
|
|
386
|
+
bundle: createInputBundle(),
|
|
387
|
+
fallbackMap: { en: undefined, de: "en" },
|
|
388
|
+
messageReferenceExpression: (locale) => `${locale}_welcome`,
|
|
389
|
+
settings: { baseLocale: "en", locales: ["en", "de"] },
|
|
390
|
+
experimentalStaticLocale: perLocaleBuildStaticLocaleExpression,
|
|
391
|
+
});
|
|
392
|
+
expect(result.unreferencedMessageLocales).toEqual([]);
|
|
393
|
+
expect(result.bundle.code).toContain('if (locale === "de") return de_welcome(inputs)');
|
|
394
|
+
expect(result.bundle.code).toContain("return en_welcome(inputs)");
|
|
395
|
+
});
|
|
396
|
+
test("runs inlined bodies on the server and forwards the inputs on the client when middleware locale splitting is on", async () => {
|
|
397
|
+
const result = compileBundle({
|
|
398
|
+
inlineMessages: true,
|
|
399
|
+
bundle: createInputBundle(),
|
|
400
|
+
fallbackMap: { en: undefined, de: "en" },
|
|
401
|
+
messageReferenceExpression: (locale) => `${locale}_welcome`,
|
|
402
|
+
settings: { baseLocale: "en", locales: ["en", "de"] },
|
|
403
|
+
experimentalMiddlewareLocaleSplitting: true,
|
|
404
|
+
});
|
|
405
|
+
expect(result.unreferencedMessageLocales).toEqual(["en", "de"]);
|
|
406
|
+
expect(result.bundle.code).not.toContain("_welcome");
|
|
407
|
+
const module = await importBundle(result, "welcome", `const experimentalMiddlewareLocaleSplitting = true;
|
|
408
|
+
let isServer = true;
|
|
409
|
+
export const setIsServer = (value) => { isServer = value; };
|
|
410
|
+
export const tracked = [];
|
|
411
|
+
const trackMessageCall = (id, locale) => tracked.push([id, locale]);`);
|
|
412
|
+
const inputs = { name: "Ada" };
|
|
413
|
+
expect(module.welcome(inputs, { locale: "de" })).toBe("Hallo Ada");
|
|
414
|
+
expect(module.tracked).toEqual([["welcome", "de"]]);
|
|
415
|
+
const serverCalls = [];
|
|
416
|
+
const scope = globalThis;
|
|
417
|
+
scope.__paraglide = {
|
|
418
|
+
ssr: {
|
|
419
|
+
welcome: (received) => {
|
|
420
|
+
serverCalls.push(received);
|
|
421
|
+
return "from the server";
|
|
422
|
+
},
|
|
423
|
+
},
|
|
424
|
+
};
|
|
425
|
+
try {
|
|
426
|
+
module.setIsServer(false);
|
|
427
|
+
expect(module.welcome(inputs, { locale: "de" })).toBe("from the server");
|
|
428
|
+
expect(serverCalls).toEqual([inputs]);
|
|
429
|
+
expect(serverCalls[0]).toBe(inputs);
|
|
430
|
+
}
|
|
431
|
+
finally {
|
|
432
|
+
delete scope.__paraglide;
|
|
433
|
+
}
|
|
252
434
|
});
|
|
253
435
|
test("keeps static text message references in a per-locale build", () => {
|
|
254
436
|
const bundle = createPlainTextBundle("greeting", {
|