@xndrjs/i18n 0.2.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +572 -0
  2. package/bin/codegen.mjs +17 -0
  3. package/bin/setup.mjs +14 -0
  4. package/dist/index.d.ts +124 -0
  5. package/dist/index.js +320 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/types-CFWVT2PP.d.ts +77 -0
  8. package/dist/validation/index.d.ts +44 -0
  9. package/dist/validation/index.js +490 -0
  10. package/dist/validation/index.js.map +1 -0
  11. package/package.json +65 -0
  12. package/src/IcuTranslationProviderMulti.test.ts +290 -0
  13. package/src/IcuTranslationProviderMulti.ts +195 -0
  14. package/src/IcuTranslationProviderSingle.test.ts +314 -0
  15. package/src/IcuTranslationProviderSingle.ts +155 -0
  16. package/src/codegen/config.ts +63 -0
  17. package/src/codegen/emit/dictionary-file.ts +73 -0
  18. package/src/codegen/emit/dictionary-schema-file.ts +129 -0
  19. package/src/codegen/emit/instance-file.ts +60 -0
  20. package/src/codegen/emit/namespace-loaders-file.ts +44 -0
  21. package/src/codegen/emit/types-file.ts +118 -0
  22. package/src/codegen/generate-i18n-types.test.ts +482 -0
  23. package/src/codegen/generate-i18n-types.ts +173 -0
  24. package/src/codegen/icu-analysis.ts +88 -0
  25. package/src/codegen/locale-fallback.ts +64 -0
  26. package/src/codegen/paths.ts +27 -0
  27. package/src/codegen/types.ts +30 -0
  28. package/src/deep-freeze.test.ts +27 -0
  29. package/src/deep-freeze.ts +17 -0
  30. package/src/ensure-namespace.integration.test.ts +66 -0
  31. package/src/ensure-namespace.test.ts +125 -0
  32. package/src/ensure-namespace.ts +70 -0
  33. package/src/icu/extract-variables.ts +87 -0
  34. package/src/icu/parse-template.ts +24 -0
  35. package/src/index.ts +32 -0
  36. package/src/resolve-locale.test.ts +91 -0
  37. package/src/resolve-locale.ts +88 -0
  38. package/src/setup/setup-i18n.test.ts +86 -0
  39. package/src/setup/setup-i18n.ts +179 -0
  40. package/src/setup/type-names.ts +20 -0
  41. package/src/types.ts +34 -0
  42. package/src/validation/create-args-schema.ts +76 -0
  43. package/src/validation/create-normalized-schema.ts +52 -0
  44. package/src/validation/errors.ts +41 -0
  45. package/src/validation/index.ts +90 -0
  46. package/src/validation/normalize.ts +158 -0
  47. package/src/validation/to-dictionary.ts +67 -0
  48. package/src/validation/types.ts +78 -0
  49. package/src/validation/validate-normalized.ts +91 -0
  50. package/src/validation/validation.test.ts +265 -0
@@ -0,0 +1,124 @@
1
+ import { V as ValidationResult } from './types-CFWVT2PP.js';
2
+ import '@formatjs/icu-messageformat-parser';
3
+
4
+ type LocaleDictionary = Record<string, string>;
5
+ type KeyDictionary = Record<string, LocaleDictionary>;
6
+ type MultiDictionary = Record<string, KeyDictionary>;
7
+ type LocaleOfSingle<Schema extends KeyDictionary> = {
8
+ [K in keyof Schema]: keyof Schema[K];
9
+ }[keyof Schema] & string;
10
+ type LocaleOfMulti<Schema extends MultiDictionary> = {
11
+ [NS in keyof Schema]: {
12
+ [K in keyof Schema[NS]]: keyof Schema[NS][K];
13
+ }[keyof Schema[NS]];
14
+ }[keyof Schema] & string;
15
+ type LocaleFallbackMap$1 = Record<string, string | null>;
16
+ type RequestLocale<DictionaryLocale extends string, Fallback extends LocaleFallbackMap$1 | undefined = undefined> = DictionaryLocale | (Fallback extends LocaleFallbackMap$1 ? keyof Fallback & string : never);
17
+ type IcuTranslationProviderOptions<Fallback extends LocaleFallbackMap$1 | undefined = undefined> = {
18
+ localeFallback?: Fallback;
19
+ };
20
+
21
+ interface TranslationProviderSingleForLocale<Schema extends KeyDictionary, Params extends {
22
+ [K in keyof Schema]: unknown;
23
+ }, Locale extends string> {
24
+ readonly locale: Locale;
25
+ get<K extends keyof Schema & string>(key: K, ...params: Params[K] extends never ? [] : [params: Params[K]]): string;
26
+ }
27
+ interface TranslationProviderSingle<Schema extends KeyDictionary, Params extends {
28
+ [K in keyof Schema]: unknown;
29
+ }, RequestLocales extends string = LocaleOfSingle<Schema>> {
30
+ get<K extends keyof Schema & string>(key: K, locale: RequestLocales, ...params: Params[K] extends never ? [] : [params: Params[K]]): string;
31
+ forLocale<Locale extends RequestLocales>(locale: Locale): TranslationProviderSingleForLocale<Schema, Params, Locale>;
32
+ getAll(): Schema;
33
+ setAll(values: Schema): void;
34
+ }
35
+ declare class IcuTranslationProviderSingleForLocale<Schema extends KeyDictionary, Params extends {
36
+ [K in keyof Schema]: unknown;
37
+ }, RequestLocales extends string, Locale extends RequestLocales, Fallback extends LocaleFallbackMap$1 | undefined> implements TranslationProviderSingleForLocale<Schema, Params, Locale> {
38
+ private readonly provider;
39
+ readonly locale: Locale;
40
+ constructor(provider: IcuTranslationProviderSingle<Schema, Params, RequestLocales, Fallback>, locale: Locale);
41
+ get<K extends keyof Schema & string>(key: K, ...args: Params[K] extends never ? [] : [params: Params[K]]): string;
42
+ }
43
+ declare class IcuTranslationProviderSingle<Schema extends KeyDictionary, Params extends {
44
+ [K in keyof Schema]: unknown;
45
+ }, RequestLocales extends string = LocaleOfSingle<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> implements TranslationProviderSingle<Schema, Params, RequestLocales> {
46
+ private dictionary;
47
+ private compiledCache;
48
+ private readonly localeFallback?;
49
+ constructor(dictionary: Schema, options?: IcuTranslationProviderOptions<Fallback>);
50
+ get<K extends keyof Schema & string>(key: K, locale: RequestLocales, ...args: Params[K] extends never ? [] : [params: Params[K]]): string;
51
+ forLocale<Locale extends RequestLocales>(locale: Locale): IcuTranslationProviderSingleForLocale<Schema, Params, RequestLocales, Locale, Fallback>;
52
+ getAll(): Schema;
53
+ setAll(values: Schema): void;
54
+ }
55
+
56
+ interface TranslationProviderMultiForLocale<Schema extends MultiDictionary, Params extends {
57
+ [NS in keyof Schema]: {
58
+ [K in keyof Schema[NS]]: unknown;
59
+ };
60
+ }, Locale extends string> {
61
+ readonly locale: Locale;
62
+ get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, ...params: Params[NS][K] extends never ? [] : [params: Params[NS][K]]): string;
63
+ }
64
+ interface TranslationProviderMulti<Schema extends MultiDictionary, Params extends {
65
+ [NS in keyof Schema]: {
66
+ [K in keyof Schema[NS]]: unknown;
67
+ };
68
+ }, RequestLocales extends string = LocaleOfMulti<Schema>> {
69
+ get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, locale: RequestLocales, ...params: Params[NS][K] extends never ? [] : [params: Params[NS][K]]): string;
70
+ forLocale<Locale extends RequestLocales>(locale: Locale): TranslationProviderMultiForLocale<Schema, Params, Locale>;
71
+ getAll(): Schema;
72
+ hasNamespace<NS extends keyof Schema & string>(namespace: NS): boolean;
73
+ setAll(values: Schema): void;
74
+ setNamespace<NS extends keyof Schema>(namespace: NS, values: Schema[NS]): void;
75
+ }
76
+ declare class IcuTranslationProviderMultiForLocale<Schema extends MultiDictionary, Params extends {
77
+ [NS in keyof Schema]: {
78
+ [K in keyof Schema[NS]]: unknown;
79
+ };
80
+ }, RequestLocales extends string, Locale extends RequestLocales, Fallback extends LocaleFallbackMap$1 | undefined> implements TranslationProviderMultiForLocale<Schema, Params, Locale> {
81
+ private readonly provider;
82
+ readonly locale: Locale;
83
+ constructor(provider: IcuTranslationProviderMulti<Schema, Params, RequestLocales, Fallback>, locale: Locale);
84
+ get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, ...args: Params[NS][K] extends never ? [] : [params: Params[NS][K]]): string;
85
+ }
86
+ declare class IcuTranslationProviderMulti<Schema extends MultiDictionary, Params extends {
87
+ [NS in keyof Schema]: {
88
+ [K in keyof Schema[NS]]: unknown;
89
+ };
90
+ }, RequestLocales extends string = LocaleOfMulti<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> implements TranslationProviderMulti<Schema, Params, RequestLocales> {
91
+ private dictionary;
92
+ private compiledCache;
93
+ private readonly localeFallback?;
94
+ private loadedNamespaces;
95
+ constructor(dictionary: Partial<Schema>, options?: IcuTranslationProviderOptions<Fallback>);
96
+ get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, locale: RequestLocales, ...args: Params[NS][K] extends never ? [] : [params: Params[NS][K]]): string;
97
+ forLocale<Locale extends RequestLocales>(locale: Locale): IcuTranslationProviderMultiForLocale<Schema, Params, RequestLocales, Locale, Fallback>;
98
+ getAll(): Schema;
99
+ hasNamespace<NS extends keyof Schema & string>(namespace: NS): boolean;
100
+ setAll(values: Schema): void;
101
+ setNamespace<NS extends keyof Schema>(namespace: NS, values: Schema[NS]): void;
102
+ }
103
+
104
+ type LocaleFallbackMap = Record<string, string | null>;
105
+ interface ResolvedLocaleTemplate {
106
+ template: string;
107
+ resolvedLocale: string;
108
+ fallbackChain: readonly string[];
109
+ }
110
+ declare function validateLocaleFallback(map: LocaleFallbackMap): void;
111
+ declare function resolveLocaleTemplate(localeByKey: Record<string, string | undefined> | undefined, requestedLocale: string, fallbackMap?: LocaleFallbackMap): ResolvedLocaleTemplate | undefined;
112
+ declare function formatLocaleFallbackChain(requestedLocale: string, fallbackMap?: LocaleFallbackMap): string;
113
+
114
+ interface EnsureNamespacesLoadedOptions<Schema extends MultiDictionary, NS extends keyof Schema & string> {
115
+ provider: Pick<{
116
+ hasNamespace(namespace: NS): boolean;
117
+ setNamespace(namespace: NS, values: Schema[NS]): void;
118
+ }, "hasNamespace" | "setNamespace">;
119
+ resolveLoader: (namespace: NS) => () => Promise<unknown>;
120
+ validate: (namespace: NS, raw: unknown) => ValidationResult<Schema[NS]>;
121
+ }
122
+ declare function ensureNamespacesLoadedImpl<Schema extends MultiDictionary, NS extends keyof Schema & string>(options: EnsureNamespacesLoadedOptions<Schema, NS>, namespaces: NS[]): Promise<void>;
123
+
124
+ export { type EnsureNamespacesLoadedOptions, IcuTranslationProviderMulti, type IcuTranslationProviderOptions, IcuTranslationProviderSingle, type KeyDictionary, type LocaleDictionary, type LocaleFallbackMap$1 as LocaleFallbackMap, type LocaleOfMulti, type LocaleOfSingle, type MultiDictionary, type RequestLocale, type ResolvedLocaleTemplate, type TranslationProviderMulti, type TranslationProviderMultiForLocale, type TranslationProviderSingle, type TranslationProviderSingleForLocale, ensureNamespacesLoadedImpl, formatLocaleFallbackChain, resolveLocaleTemplate, validateLocaleFallback };
package/dist/index.js ADDED
@@ -0,0 +1,320 @@
1
+ import { IntlMessageFormat } from 'intl-messageformat';
2
+
3
+ // src/IcuTranslationProviderSingle.ts
4
+
5
+ // src/deep-freeze.ts
6
+ function deepFreeze(value) {
7
+ if (value === null || typeof value !== "object") {
8
+ return value;
9
+ }
10
+ Object.freeze(value);
11
+ for (const child of Object.values(value)) {
12
+ deepFreeze(child);
13
+ }
14
+ return value;
15
+ }
16
+ function cloneAndFreeze(value) {
17
+ return deepFreeze(structuredClone(value));
18
+ }
19
+
20
+ // src/resolve-locale.ts
21
+ function validateLocaleFallback(map) {
22
+ for (const startLocale of Object.keys(map)) {
23
+ const visited = /* @__PURE__ */ new Set();
24
+ let current = startLocale;
25
+ while (current !== void 0) {
26
+ if (visited.has(current)) {
27
+ throw new Error(`[i18n] Circular locale fallback detected involving "${current}"`);
28
+ }
29
+ visited.add(current);
30
+ const next = map[current];
31
+ if (next === void 0 || next === null) {
32
+ break;
33
+ }
34
+ current = next;
35
+ }
36
+ }
37
+ }
38
+ function resolveLocaleTemplate(localeByKey, requestedLocale, fallbackMap) {
39
+ const chain = [requestedLocale];
40
+ let currentLocale = requestedLocale;
41
+ while (true) {
42
+ const template = localeByKey?.[currentLocale];
43
+ if (template !== void 0) {
44
+ return { template, resolvedLocale: currentLocale, fallbackChain: chain };
45
+ }
46
+ if (!fallbackMap) {
47
+ return void 0;
48
+ }
49
+ const fallback = fallbackMap[currentLocale];
50
+ if (fallback === void 0 || fallback === null) {
51
+ return void 0;
52
+ }
53
+ if (chain.includes(fallback)) {
54
+ throw new Error(
55
+ `[i18n] Circular locale fallback detected: ${[...chain, fallback].join(" \u2192 ")}`
56
+ );
57
+ }
58
+ chain.push(fallback);
59
+ currentLocale = fallback;
60
+ }
61
+ }
62
+ function formatLocaleFallbackChain(requestedLocale, fallbackMap) {
63
+ if (!fallbackMap) {
64
+ return requestedLocale;
65
+ }
66
+ const chain = [requestedLocale];
67
+ let current = requestedLocale;
68
+ while (true) {
69
+ const fallback = fallbackMap[current];
70
+ if (fallback === void 0 || fallback === null) {
71
+ break;
72
+ }
73
+ if (chain.includes(fallback)) {
74
+ chain.push(fallback);
75
+ break;
76
+ }
77
+ chain.push(fallback);
78
+ current = fallback;
79
+ }
80
+ return chain.join(" \u2192 ");
81
+ }
82
+
83
+ // src/IcuTranslationProviderSingle.ts
84
+ var IcuTranslationProviderSingleForLocale = class {
85
+ constructor(provider, locale) {
86
+ this.provider = provider;
87
+ this.locale = locale;
88
+ }
89
+ provider;
90
+ locale;
91
+ get(key, ...args) {
92
+ return this.provider.get(key, this.locale, ...args);
93
+ }
94
+ };
95
+ var IcuTranslationProviderSingle = class {
96
+ dictionary;
97
+ compiledCache = {};
98
+ localeFallback;
99
+ constructor(dictionary, options) {
100
+ this.dictionary = structuredClone(dictionary);
101
+ if (options?.localeFallback) {
102
+ validateLocaleFallback(options.localeFallback);
103
+ this.localeFallback = options.localeFallback;
104
+ }
105
+ }
106
+ get(key, locale, ...args) {
107
+ const params = args[0];
108
+ const resolved = resolveLocaleTemplate(this.dictionary[key], locale, this.localeFallback);
109
+ if (!resolved) {
110
+ const chain = formatLocaleFallbackChain(locale, this.localeFallback);
111
+ throw new Error(
112
+ `[i18n] Missing key or locale: "${String(key)}" [${locale}] (fallback chain: ${chain})`
113
+ );
114
+ }
115
+ const { template, resolvedLocale } = resolved;
116
+ if (!this.compiledCache[resolvedLocale]) {
117
+ this.compiledCache[resolvedLocale] = {};
118
+ }
119
+ const cacheKey = String(key);
120
+ if (!this.compiledCache[resolvedLocale][cacheKey]) {
121
+ try {
122
+ this.compiledCache[resolvedLocale][cacheKey] = new IntlMessageFormat(
123
+ template,
124
+ resolvedLocale
125
+ );
126
+ } catch (err) {
127
+ const message = err instanceof Error ? err.message : String(err);
128
+ throw new Error(
129
+ `[i18n ICU Syntax Error] Dictionary error for key "${String(key)}" [${resolvedLocale}]: ${message}`
130
+ );
131
+ }
132
+ }
133
+ try {
134
+ return this.compiledCache[resolvedLocale][cacheKey].format(params);
135
+ } catch (err) {
136
+ const message = err instanceof Error ? err.message : String(err);
137
+ throw new Error(
138
+ `[i18n Formatting Error] Invalid or missing parameters for key "${String(key)}" [${resolvedLocale}]: ${message}`
139
+ );
140
+ }
141
+ }
142
+ forLocale(locale) {
143
+ return new IcuTranslationProviderSingleForLocale(this, locale);
144
+ }
145
+ getAll() {
146
+ return cloneAndFreeze(this.dictionary);
147
+ }
148
+ setAll(values) {
149
+ this.dictionary = structuredClone(values);
150
+ this.compiledCache = {};
151
+ }
152
+ };
153
+ var IcuTranslationProviderMultiForLocale = class {
154
+ constructor(provider, locale) {
155
+ this.provider = provider;
156
+ this.locale = locale;
157
+ }
158
+ provider;
159
+ locale;
160
+ get(namespace, key, ...args) {
161
+ return this.provider.get(namespace, key, this.locale, ...args);
162
+ }
163
+ };
164
+ var IcuTranslationProviderMulti = class {
165
+ dictionary;
166
+ compiledCache = {};
167
+ localeFallback;
168
+ loadedNamespaces;
169
+ constructor(dictionary, options) {
170
+ this.dictionary = structuredClone(dictionary);
171
+ this.loadedNamespaces = new Set(Object.keys(dictionary));
172
+ if (options?.localeFallback) {
173
+ validateLocaleFallback(options.localeFallback);
174
+ this.localeFallback = options.localeFallback;
175
+ }
176
+ }
177
+ get(namespace, key, locale, ...args) {
178
+ if (!this.loadedNamespaces.has(namespace)) {
179
+ throw new Error(
180
+ `[i18n] Namespace not loaded: "${String(namespace)}". Call ensureNamespacesLoaded(i18n, ["${String(namespace)}"]) first.`
181
+ );
182
+ }
183
+ const params = args[0];
184
+ const localeByKey = this.dictionary[namespace]?.[key];
185
+ const resolved = resolveLocaleTemplate(localeByKey, locale, this.localeFallback);
186
+ if (!resolved) {
187
+ const chain = formatLocaleFallbackChain(locale, this.localeFallback);
188
+ throw new Error(
189
+ `[i18n] Missing key or locale: namespace "${String(namespace)}", key "${String(key)}" [${locale}] (fallback chain: ${chain})`
190
+ );
191
+ }
192
+ const { template, resolvedLocale } = resolved;
193
+ if (!this.compiledCache[resolvedLocale]) {
194
+ this.compiledCache[resolvedLocale] = {};
195
+ }
196
+ if (!this.compiledCache[resolvedLocale][namespace]) {
197
+ this.compiledCache[resolvedLocale][namespace] = {};
198
+ }
199
+ const namespaceCache = this.compiledCache[resolvedLocale][namespace];
200
+ const cacheKey = String(key);
201
+ if (!namespaceCache[cacheKey]) {
202
+ try {
203
+ namespaceCache[cacheKey] = new IntlMessageFormat(template, resolvedLocale);
204
+ } catch (err) {
205
+ const message = err instanceof Error ? err.message : String(err);
206
+ throw new Error(
207
+ `[i18n ICU Syntax Error] namespace "${String(namespace)}", key "${String(key)}" [${resolvedLocale}]: ${message}`
208
+ );
209
+ }
210
+ }
211
+ try {
212
+ return namespaceCache[cacheKey].format(params);
213
+ } catch (err) {
214
+ const message = err instanceof Error ? err.message : String(err);
215
+ throw new Error(
216
+ `[i18n Formatting Error] namespace "${String(namespace)}", key "${String(key)}" [${resolvedLocale}]: ${message}`
217
+ );
218
+ }
219
+ }
220
+ forLocale(locale) {
221
+ return new IcuTranslationProviderMultiForLocale(this, locale);
222
+ }
223
+ getAll() {
224
+ return cloneAndFreeze(this.dictionary);
225
+ }
226
+ hasNamespace(namespace) {
227
+ return this.loadedNamespaces.has(namespace);
228
+ }
229
+ setAll(values) {
230
+ this.dictionary = structuredClone(values);
231
+ this.compiledCache = {};
232
+ this.loadedNamespaces = new Set(Object.keys(values));
233
+ }
234
+ setNamespace(namespace, values) {
235
+ this.dictionary = {
236
+ ...this.dictionary,
237
+ [namespace]: structuredClone(values)
238
+ };
239
+ this.loadedNamespaces.add(namespace);
240
+ for (const locale of Object.keys(this.compiledCache)) {
241
+ delete this.compiledCache[locale]?.[namespace];
242
+ }
243
+ }
244
+ };
245
+
246
+ // src/validation/errors.ts
247
+ function issueMessage(issue) {
248
+ switch (issue.kind) {
249
+ case "missing_key":
250
+ return `Missing required key at ${issue.path.join(".")}`;
251
+ case "invalid_input":
252
+ case "invalid_locale_value":
253
+ case "icu_syntax_error":
254
+ case "locale_args_mismatch":
255
+ case "variable_mismatch":
256
+ case "variable_type_mismatch":
257
+ return issue.message;
258
+ }
259
+ }
260
+ function formatIssues(issues) {
261
+ return issues.map((issue) => {
262
+ if ("path" in issue && issue.path.length > 0) {
263
+ return `[${issue.path.join(".")}] ${issue.kind}: ${issueMessage(issue)}`;
264
+ }
265
+ return `${issue.kind}: ${issueMessage(issue)}`;
266
+ }).join("\n");
267
+ }
268
+ var DictionaryValidationError = class extends Error {
269
+ constructor(issues) {
270
+ super(formatIssues(issues));
271
+ this.issues = issues;
272
+ this.name = "DictionaryValidationError";
273
+ }
274
+ issues;
275
+ };
276
+
277
+ // src/ensure-namespace.ts
278
+ var inFlightByProvider = /* @__PURE__ */ new WeakMap();
279
+ async function ensureOneNamespace(options, namespace) {
280
+ if (options.provider.hasNamespace(namespace)) {
281
+ return;
282
+ }
283
+ const providerKey = options.provider;
284
+ let inFlight = inFlightByProvider.get(providerKey);
285
+ if (!inFlight) {
286
+ inFlight = /* @__PURE__ */ new Map();
287
+ inFlightByProvider.set(providerKey, inFlight);
288
+ }
289
+ const existing = inFlight.get(namespace);
290
+ if (existing) {
291
+ return existing;
292
+ }
293
+ const promise = (async () => {
294
+ try {
295
+ if (options.provider.hasNamespace(namespace)) {
296
+ return;
297
+ }
298
+ const raw = await options.resolveLoader(namespace)();
299
+ const result = options.validate(namespace, raw);
300
+ if (!result.ok) {
301
+ throw new DictionaryValidationError(result.issues);
302
+ }
303
+ options.provider.setNamespace(namespace, result.data);
304
+ } finally {
305
+ inFlight.delete(namespace);
306
+ }
307
+ })();
308
+ inFlight.set(namespace, promise);
309
+ return promise;
310
+ }
311
+ async function ensureNamespacesLoadedImpl(options, namespaces) {
312
+ if (namespaces.length === 0) {
313
+ return;
314
+ }
315
+ await Promise.all(namespaces.map((namespace) => ensureOneNamespace(options, namespace)));
316
+ }
317
+
318
+ export { IcuTranslationProviderMulti, IcuTranslationProviderSingle, ensureNamespacesLoadedImpl, formatLocaleFallbackChain, resolveLocaleTemplate, validateLocaleFallback };
319
+ //# sourceMappingURL=index.js.map
320
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deep-freeze.ts","../src/resolve-locale.ts","../src/IcuTranslationProviderSingle.ts","../src/IcuTranslationProviderMulti.ts","../src/validation/errors.ts","../src/ensure-namespace.ts"],"names":["IntlMessageFormat"],"mappings":"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","file":"index.js","sourcesContent":["export function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n Object.freeze(value);\n\n for (const child of Object.values(value)) {\n deepFreeze(child);\n }\n\n return value;\n}\n\nexport function cloneAndFreeze<T>(value: T): T {\n return deepFreeze(structuredClone(value));\n}\n","export type LocaleFallbackMap = Record<string, string | null>;\n\nexport interface ResolvedLocaleTemplate {\n template: string;\n resolvedLocale: string;\n fallbackChain: readonly string[];\n}\n\nexport function validateLocaleFallback(map: LocaleFallbackMap): void {\n for (const startLocale of Object.keys(map)) {\n const visited = new Set<string>();\n let current: string | undefined = startLocale;\n\n while (current !== undefined) {\n if (visited.has(current)) {\n throw new Error(`[i18n] Circular locale fallback detected involving \"${current}\"`);\n }\n visited.add(current);\n\n const next: string | null | undefined = map[current];\n if (next === undefined || next === null) {\n break;\n }\n current = next;\n }\n }\n}\n\nexport function resolveLocaleTemplate(\n localeByKey: Record<string, string | undefined> | undefined,\n requestedLocale: string,\n fallbackMap?: LocaleFallbackMap\n): ResolvedLocaleTemplate | undefined {\n const chain: string[] = [requestedLocale];\n let currentLocale = requestedLocale;\n\n while (true) {\n const template = localeByKey?.[currentLocale];\n if (template !== undefined) {\n return { template, resolvedLocale: currentLocale, fallbackChain: chain };\n }\n\n if (!fallbackMap) {\n return undefined;\n }\n\n const fallback = fallbackMap[currentLocale];\n if (fallback === undefined || fallback === null) {\n return undefined;\n }\n\n if (chain.includes(fallback)) {\n throw new Error(\n `[i18n] Circular locale fallback detected: ${[...chain, fallback].join(\" → \")}`\n );\n }\n\n chain.push(fallback);\n currentLocale = fallback;\n }\n}\n\nexport function formatLocaleFallbackChain(\n requestedLocale: string,\n fallbackMap?: LocaleFallbackMap\n): string {\n if (!fallbackMap) {\n return requestedLocale;\n }\n\n const chain: string[] = [requestedLocale];\n let current = requestedLocale;\n\n while (true) {\n const fallback = fallbackMap[current];\n if (fallback === undefined || fallback === null) {\n break;\n }\n if (chain.includes(fallback)) {\n chain.push(fallback);\n break;\n }\n chain.push(fallback);\n current = fallback;\n }\n\n return chain.join(\" → \");\n}\n","import { IntlMessageFormat } from \"intl-messageformat\";\nimport { cloneAndFreeze } from \"./deep-freeze.js\";\nimport {\n formatLocaleFallbackChain,\n resolveLocaleTemplate,\n validateLocaleFallback,\n} from \"./resolve-locale.js\";\nimport type {\n IcuTranslationProviderOptions,\n KeyDictionary,\n LocaleFallbackMap,\n LocaleOfSingle,\n SingleCompiledCache,\n} from \"./types.js\";\n\nexport interface TranslationProviderSingleForLocale<\n Schema extends KeyDictionary,\n Params extends { [K in keyof Schema]: unknown },\n Locale extends string,\n> {\n readonly locale: Locale;\n get<K extends keyof Schema & string>(\n key: K,\n ...params: Params[K] extends never ? [] : [params: Params[K]]\n ): string;\n}\n\nexport interface TranslationProviderSingle<\n Schema extends KeyDictionary,\n Params extends { [K in keyof Schema]: unknown },\n RequestLocales extends string = LocaleOfSingle<Schema>,\n> {\n get<K extends keyof Schema & string>(\n key: K,\n locale: RequestLocales,\n ...params: Params[K] extends never ? [] : [params: Params[K]]\n ): string;\n forLocale<Locale extends RequestLocales>(\n locale: Locale\n ): TranslationProviderSingleForLocale<Schema, Params, Locale>;\n getAll(): Schema;\n setAll(values: Schema): void;\n}\n\nexport class IcuTranslationProviderSingleForLocale<\n Schema extends KeyDictionary,\n Params extends { [K in keyof Schema]: unknown },\n RequestLocales extends string,\n Locale extends RequestLocales,\n Fallback extends LocaleFallbackMap | undefined,\n> implements TranslationProviderSingleForLocale<Schema, Params, Locale> {\n constructor(\n private readonly provider: IcuTranslationProviderSingle<\n Schema,\n Params,\n RequestLocales,\n Fallback\n >,\n readonly locale: Locale\n ) {}\n\n get<K extends keyof Schema & string>(\n key: K,\n ...args: Params[K] extends never ? [] : [params: Params[K]]\n ): string {\n return (\n this.provider.get as (\n key: K,\n locale: Locale,\n ...params: Params[K] extends never ? [] : [params: Params[K]]\n ) => string\n )(key, this.locale, ...args);\n }\n}\n\nexport class IcuTranslationProviderSingle<\n Schema extends KeyDictionary,\n Params extends { [K in keyof Schema]: unknown },\n RequestLocales extends string = LocaleOfSingle<Schema>,\n Fallback extends LocaleFallbackMap | undefined = undefined,\n> implements TranslationProviderSingle<Schema, Params, RequestLocales> {\n private dictionary: Schema;\n private compiledCache: SingleCompiledCache = {};\n private readonly localeFallback?: Fallback;\n\n constructor(dictionary: Schema, options?: IcuTranslationProviderOptions<Fallback>) {\n this.dictionary = structuredClone(dictionary);\n if (options?.localeFallback) {\n validateLocaleFallback(options.localeFallback);\n this.localeFallback = options.localeFallback;\n }\n }\n\n get<K extends keyof Schema & string>(\n key: K,\n locale: RequestLocales,\n ...args: Params[K] extends never ? [] : [params: Params[K]]\n ): string {\n const params = args[0] as Record<string, unknown> | undefined;\n const resolved = resolveLocaleTemplate(this.dictionary[key], locale, this.localeFallback);\n\n if (!resolved) {\n const chain = formatLocaleFallbackChain(locale, this.localeFallback);\n throw new Error(\n `[i18n] Missing key or locale: \"${String(key)}\" [${locale}] (fallback chain: ${chain})`\n );\n }\n\n const { template, resolvedLocale } = resolved;\n\n if (!this.compiledCache[resolvedLocale]) {\n this.compiledCache[resolvedLocale] = {};\n }\n\n const cacheKey = String(key);\n\n if (!this.compiledCache[resolvedLocale][cacheKey]) {\n try {\n this.compiledCache[resolvedLocale][cacheKey] = new IntlMessageFormat(\n template,\n resolvedLocale\n );\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(\n `[i18n ICU Syntax Error] Dictionary error for key \"${String(key)}\" [${resolvedLocale}]: ${message}`\n );\n }\n }\n\n try {\n return this.compiledCache[resolvedLocale][cacheKey].format(params) as string;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(\n `[i18n Formatting Error] Invalid or missing parameters for key \"${String(key)}\" [${resolvedLocale}]: ${message}`\n );\n }\n }\n\n forLocale<Locale extends RequestLocales>(\n locale: Locale\n ): IcuTranslationProviderSingleForLocale<Schema, Params, RequestLocales, Locale, Fallback> {\n return new IcuTranslationProviderSingleForLocale(this, locale);\n }\n\n getAll(): Schema {\n return cloneAndFreeze(this.dictionary);\n }\n\n setAll(values: Schema): void {\n this.dictionary = structuredClone(values);\n this.compiledCache = {};\n }\n}\n","import { IntlMessageFormat } from \"intl-messageformat\";\nimport { cloneAndFreeze } from \"./deep-freeze.js\";\nimport {\n formatLocaleFallbackChain,\n resolveLocaleTemplate,\n validateLocaleFallback,\n} from \"./resolve-locale.js\";\nimport type {\n IcuTranslationProviderOptions,\n LocaleFallbackMap,\n LocaleOfMulti,\n MultiCompiledCache,\n MultiDictionary,\n} from \"./types.js\";\n\nexport interface TranslationProviderMultiForLocale<\n Schema extends MultiDictionary,\n Params extends { [NS in keyof Schema]: { [K in keyof Schema[NS]]: unknown } },\n Locale extends string,\n> {\n readonly locale: Locale;\n get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(\n namespace: NS,\n key: K,\n ...params: Params[NS][K] extends never ? [] : [params: Params[NS][K]]\n ): string;\n}\n\nexport interface TranslationProviderMulti<\n Schema extends MultiDictionary,\n Params extends { [NS in keyof Schema]: { [K in keyof Schema[NS]]: unknown } },\n RequestLocales extends string = LocaleOfMulti<Schema>,\n> {\n get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(\n namespace: NS,\n key: K,\n locale: RequestLocales,\n ...params: Params[NS][K] extends never ? [] : [params: Params[NS][K]]\n ): string;\n forLocale<Locale extends RequestLocales>(\n locale: Locale\n ): TranslationProviderMultiForLocale<Schema, Params, Locale>;\n getAll(): Schema;\n hasNamespace<NS extends keyof Schema & string>(namespace: NS): boolean;\n setAll(values: Schema): void;\n setNamespace<NS extends keyof Schema>(namespace: NS, values: Schema[NS]): void;\n}\n\nexport class IcuTranslationProviderMultiForLocale<\n Schema extends MultiDictionary,\n Params extends { [NS in keyof Schema]: { [K in keyof Schema[NS]]: unknown } },\n RequestLocales extends string,\n Locale extends RequestLocales,\n Fallback extends LocaleFallbackMap | undefined,\n> implements TranslationProviderMultiForLocale<Schema, Params, Locale> {\n constructor(\n private readonly provider: IcuTranslationProviderMulti<\n Schema,\n Params,\n RequestLocales,\n Fallback\n >,\n readonly locale: Locale\n ) {}\n\n get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(\n namespace: NS,\n key: K,\n ...args: Params[NS][K] extends never ? [] : [params: Params[NS][K]]\n ): string {\n return (\n this.provider.get as <\n NS extends keyof Schema,\n K extends keyof Schema[NS] & keyof Params[NS] & string,\n >(\n namespace: NS,\n key: K,\n locale: Locale,\n ...params: Params[NS][K] extends never ? [] : [params: Params[NS][K]]\n ) => string\n )(namespace, key, this.locale, ...args);\n }\n}\n\nexport class IcuTranslationProviderMulti<\n Schema extends MultiDictionary,\n Params extends { [NS in keyof Schema]: { [K in keyof Schema[NS]]: unknown } },\n RequestLocales extends string = LocaleOfMulti<Schema>,\n Fallback extends LocaleFallbackMap | undefined = undefined,\n> implements TranslationProviderMulti<Schema, Params, RequestLocales> {\n private dictionary: Schema;\n private compiledCache: MultiCompiledCache = {};\n private readonly localeFallback?: Fallback;\n private loadedNamespaces: Set<string>;\n\n constructor(dictionary: Partial<Schema>, options?: IcuTranslationProviderOptions<Fallback>) {\n this.dictionary = structuredClone(dictionary) as Schema;\n this.loadedNamespaces = new Set(Object.keys(dictionary));\n if (options?.localeFallback) {\n validateLocaleFallback(options.localeFallback);\n this.localeFallback = options.localeFallback;\n }\n }\n\n get<NS extends keyof Schema, K extends keyof Schema[NS] & keyof Params[NS] & string>(\n namespace: NS,\n key: K,\n locale: RequestLocales,\n ...args: Params[NS][K] extends never ? [] : [params: Params[NS][K]]\n ): string {\n if (!this.loadedNamespaces.has(namespace as string)) {\n throw new Error(\n `[i18n] Namespace not loaded: \"${String(namespace)}\". Call ensureNamespacesLoaded(i18n, [\"${String(namespace)}\"]) first.`\n );\n }\n\n const params = args[0] as Record<string, unknown> | undefined;\n const localeByKey = (\n this.dictionary[namespace as string] as Record<string, Record<string, string>>\n )?.[key];\n const resolved = resolveLocaleTemplate(localeByKey, locale, this.localeFallback);\n\n if (!resolved) {\n const chain = formatLocaleFallbackChain(locale, this.localeFallback);\n throw new Error(\n `[i18n] Missing key or locale: namespace \"${String(namespace)}\", key \"${String(key)}\" [${locale}] (fallback chain: ${chain})`\n );\n }\n\n const { template, resolvedLocale } = resolved;\n\n if (!this.compiledCache[resolvedLocale]) {\n this.compiledCache[resolvedLocale] = {};\n }\n\n if (!this.compiledCache[resolvedLocale][namespace as string]) {\n this.compiledCache[resolvedLocale][namespace as string] = {};\n }\n\n const namespaceCache = this.compiledCache[resolvedLocale][namespace as string]!;\n const cacheKey = String(key);\n\n if (!namespaceCache[cacheKey]) {\n try {\n namespaceCache[cacheKey] = new IntlMessageFormat(template, resolvedLocale);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(\n `[i18n ICU Syntax Error] namespace \"${String(namespace)}\", key \"${String(key)}\" [${resolvedLocale}]: ${message}`\n );\n }\n }\n\n try {\n return namespaceCache[cacheKey].format(params) as string;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(\n `[i18n Formatting Error] namespace \"${String(namespace)}\", key \"${String(key)}\" [${resolvedLocale}]: ${message}`\n );\n }\n }\n\n forLocale<Locale extends RequestLocales>(\n locale: Locale\n ): IcuTranslationProviderMultiForLocale<Schema, Params, RequestLocales, Locale, Fallback> {\n return new IcuTranslationProviderMultiForLocale(this, locale);\n }\n\n getAll(): Schema {\n return cloneAndFreeze(this.dictionary);\n }\n\n hasNamespace<NS extends keyof Schema & string>(namespace: NS): boolean {\n return this.loadedNamespaces.has(namespace);\n }\n\n setAll(values: Schema): void {\n this.dictionary = structuredClone(values);\n this.compiledCache = {};\n this.loadedNamespaces = new Set(Object.keys(values));\n }\n\n setNamespace<NS extends keyof Schema>(namespace: NS, values: Schema[NS]): void {\n this.dictionary = {\n ...this.dictionary,\n [namespace]: structuredClone(values),\n };\n this.loadedNamespaces.add(namespace as string);\n\n for (const locale of Object.keys(this.compiledCache)) {\n delete this.compiledCache[locale]?.[namespace as string];\n }\n }\n}\n","import type { ValidationIssue, ValidationResult } from \"./types.js\";\n\nfunction issueMessage(issue: ValidationIssue): string {\n switch (issue.kind) {\n case \"missing_key\":\n return `Missing required key at ${issue.path.join(\".\")}`;\n case \"invalid_input\":\n case \"invalid_locale_value\":\n case \"icu_syntax_error\":\n case \"locale_args_mismatch\":\n case \"variable_mismatch\":\n case \"variable_type_mismatch\":\n return issue.message;\n }\n}\n\nexport function formatIssues(issues: readonly ValidationIssue[]): string {\n return issues\n .map((issue) => {\n if (\"path\" in issue && issue.path.length > 0) {\n return `[${issue.path.join(\".\")}] ${issue.kind}: ${issueMessage(issue)}`;\n }\n return `${issue.kind}: ${issueMessage(issue)}`;\n })\n .join(\"\\n\");\n}\n\nexport class DictionaryValidationError extends Error {\n constructor(public readonly issues: readonly ValidationIssue[]) {\n super(formatIssues(issues));\n this.name = \"DictionaryValidationError\";\n }\n}\n\nexport function assertValidDictionary<T>(\n result: ValidationResult<T>\n): asserts result is { ok: true; data: T } {\n if (!result.ok) {\n throw new DictionaryValidationError(result.issues);\n }\n}\n","import type { MultiDictionary } from \"./types.js\";\nimport type { ValidationResult } from \"./validation/types.js\";\nimport { DictionaryValidationError } from \"./validation/errors.js\";\n\nexport interface EnsureNamespacesLoadedOptions<\n Schema extends MultiDictionary,\n NS extends keyof Schema & string,\n> {\n provider: Pick<\n { hasNamespace(namespace: NS): boolean; setNamespace(namespace: NS, values: Schema[NS]): void },\n \"hasNamespace\" | \"setNamespace\"\n >;\n resolveLoader: (namespace: NS) => () => Promise<unknown>;\n validate: (namespace: NS, raw: unknown) => ValidationResult<Schema[NS]>;\n}\n\nconst inFlightByProvider = new WeakMap<object, Map<string, Promise<void>>>();\n\nasync function ensureOneNamespace<Schema extends MultiDictionary, NS extends keyof Schema & string>(\n options: EnsureNamespacesLoadedOptions<Schema, NS>,\n namespace: NS\n): Promise<void> {\n if (options.provider.hasNamespace(namespace)) {\n return;\n }\n\n const providerKey = options.provider as object;\n let inFlight = inFlightByProvider.get(providerKey);\n if (!inFlight) {\n inFlight = new Map();\n inFlightByProvider.set(providerKey, inFlight);\n }\n\n const existing = inFlight.get(namespace);\n if (existing) {\n return existing;\n }\n\n const promise = (async () => {\n try {\n if (options.provider.hasNamespace(namespace)) {\n return;\n }\n\n const raw = await options.resolveLoader(namespace)();\n const result = options.validate(namespace, raw);\n if (!result.ok) {\n throw new DictionaryValidationError(result.issues);\n }\n\n options.provider.setNamespace(namespace, result.data);\n } finally {\n inFlight!.delete(namespace);\n }\n })();\n\n inFlight.set(namespace, promise);\n return promise;\n}\n\nexport async function ensureNamespacesLoadedImpl<\n Schema extends MultiDictionary,\n NS extends keyof Schema & string,\n>(options: EnsureNamespacesLoadedOptions<Schema, NS>, namespaces: NS[]): Promise<void> {\n if (namespaces.length === 0) {\n return;\n }\n\n await Promise.all(namespaces.map((namespace) => ensureOneNamespace(options, namespace)));\n}\n"]}
@@ -0,0 +1,77 @@
1
+ import { parse } from '@formatjs/icu-messageformat-parser';
2
+
3
+ type VariableType = "string" | "number" | "date";
4
+ type VariableSpec = Record<string, VariableType>;
5
+ type IcuAst = ReturnType<typeof parse>;
6
+ declare function extractVariables(nodes: IcuAst): VariableSpec;
7
+ declare function mergeVariableSpecs(target: VariableSpec, source: VariableSpec): VariableSpec;
8
+ declare function variableSpecsEqual(a: VariableSpec, b: VariableSpec): boolean;
9
+
10
+ type ParsedLocaleEntry = {
11
+ readonly template: string;
12
+ readonly args: VariableSpec;
13
+ };
14
+ type ParsedKeyEntry = {
15
+ readonly locales: Readonly<Record<string, ParsedLocaleEntry>>;
16
+ readonly mergedArgs: VariableSpec;
17
+ };
18
+ type NormalizedKeyDictionary = Readonly<Record<string, ParsedKeyEntry>>;
19
+ type NormalizedMultiDictionary = Readonly<Record<string, NormalizedKeyDictionary>>;
20
+ type NormalizedDictionary = {
21
+ readonly mode: "single";
22
+ readonly keys: NormalizedKeyDictionary;
23
+ } | {
24
+ readonly mode: "multi";
25
+ readonly namespaces: NormalizedMultiDictionary;
26
+ };
27
+ type DictionarySpec = {
28
+ readonly mode: "single";
29
+ readonly requiredKeys: readonly string[];
30
+ readonly argsByKey: Readonly<Record<string, VariableSpec>>;
31
+ } | {
32
+ readonly mode: "multi";
33
+ readonly requiredKeys: Readonly<Record<string, readonly string[]>>;
34
+ readonly argsByKey: Readonly<Record<string, Readonly<Record<string, VariableSpec>>>>;
35
+ };
36
+ type ValidationIssue = {
37
+ readonly kind: "invalid_input";
38
+ readonly message: string;
39
+ } | {
40
+ readonly kind: "missing_key";
41
+ readonly path: readonly string[];
42
+ } | {
43
+ readonly kind: "invalid_locale_value";
44
+ readonly path: readonly string[];
45
+ readonly message: string;
46
+ } | {
47
+ readonly kind: "icu_syntax_error";
48
+ readonly path: readonly string[];
49
+ readonly message: string;
50
+ } | {
51
+ readonly kind: "locale_args_mismatch";
52
+ readonly path: readonly string[];
53
+ readonly locales: Readonly<Record<string, VariableSpec>>;
54
+ readonly message: string;
55
+ } | {
56
+ readonly kind: "variable_mismatch";
57
+ readonly path: readonly string[];
58
+ readonly expected: VariableSpec;
59
+ readonly found: VariableSpec;
60
+ readonly message: string;
61
+ } | {
62
+ readonly kind: "variable_type_mismatch";
63
+ readonly path: readonly string[];
64
+ readonly variable: string;
65
+ readonly expected: VariableType;
66
+ readonly found: VariableType;
67
+ readonly message: string;
68
+ };
69
+ type ValidationResult<T> = {
70
+ readonly ok: true;
71
+ readonly data: T;
72
+ } | {
73
+ readonly ok: false;
74
+ readonly issues: readonly ValidationIssue[];
75
+ };
76
+
77
+ export { type DictionarySpec as D, type NormalizedDictionary as N, type ParsedKeyEntry as P, type ValidationResult as V, type VariableSpec as a, type ValidationIssue as b, type NormalizedKeyDictionary as c, type NormalizedMultiDictionary as d, type ParsedLocaleEntry as e, type VariableType as f, extractVariables as g, mergeVariableSpecs as m, variableSpecsEqual as v };
@@ -0,0 +1,44 @@
1
+ import { D as DictionarySpec, V as ValidationResult, N as NormalizedDictionary, a as VariableSpec, b as ValidationIssue } from '../types-CFWVT2PP.js';
2
+ export { c as NormalizedKeyDictionary, d as NormalizedMultiDictionary, P as ParsedKeyEntry, e as ParsedLocaleEntry, f as VariableType, g as extractVariables, m as mergeVariableSpecs, v as variableSpecsEqual } from '../types-CFWVT2PP.js';
3
+ import { z } from 'zod';
4
+ import '@formatjs/icu-messageformat-parser';
5
+
6
+ declare function normalizeDictionary(input: unknown, spec: DictionarySpec): ValidationResult<NormalizedDictionary>;
7
+
8
+ type LocaleDictionary = Record<string, string>;
9
+ type KeyDictionary = Record<string, LocaleDictionary>;
10
+ type MultiDictionary = Record<string, KeyDictionary>;
11
+ declare function toDictionary(normalized: NormalizedDictionary): KeyDictionary | MultiDictionary;
12
+ declare function toNamespaceDictionary(normalized: NormalizedDictionary, namespace: string): KeyDictionary;
13
+
14
+ declare function validateNormalizedDictionary(normalized: NormalizedDictionary, spec: DictionarySpec): ValidationResult<NormalizedDictionary>;
15
+
16
+ declare function createArgsSchema(expected: VariableSpec): z.ZodType<VariableSpec>;
17
+
18
+ declare function createNormalizedDictionarySchema(spec: DictionarySpec): z.ZodType<NormalizedDictionary>;
19
+
20
+ declare function formatIssues(issues: readonly ValidationIssue[]): string;
21
+ declare class DictionaryValidationError extends Error {
22
+ readonly issues: readonly ValidationIssue[];
23
+ constructor(issues: readonly ValidationIssue[]);
24
+ }
25
+ declare function assertValidDictionary<T>(result: ValidationResult<T>): asserts result is {
26
+ ok: true;
27
+ data: T;
28
+ };
29
+
30
+ type ParseTemplateSuccess = {
31
+ readonly ok: true;
32
+ readonly args: VariableSpec;
33
+ };
34
+ type ParseTemplateFailure = {
35
+ readonly ok: false;
36
+ readonly message: string;
37
+ };
38
+ type ParseTemplateResult = ParseTemplateSuccess | ParseTemplateFailure;
39
+ declare function parseTemplate(template: string): ParseTemplateResult;
40
+
41
+ declare function validateExternalDictionary<TSchema>(input: unknown, spec: DictionarySpec): ValidationResult<TSchema>;
42
+ declare function validateExternalNamespace<TNamespaceSchema>(namespace: string, input: unknown, spec: DictionarySpec): ValidationResult<TNamespaceSchema>;
43
+
44
+ export { DictionarySpec, DictionaryValidationError, NormalizedDictionary, type ParseTemplateResult, ValidationIssue, ValidationResult, VariableSpec, assertValidDictionary, createArgsSchema, createNormalizedDictionarySchema, formatIssues, normalizeDictionary, parseTemplate, toDictionary, toNamespaceDictionary, validateExternalDictionary, validateExternalNamespace, validateNormalizedDictionary };