@xndrjs/i18n 0.7.0 → 0.8.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 (69) hide show
  1. package/README.md +67 -872
  2. package/dist/codegen/index.d.ts +117 -51
  3. package/dist/codegen/index.js +1585 -93
  4. package/dist/codegen/index.js.map +1 -1
  5. package/dist/index.d.ts +100 -234
  6. package/dist/index.js +74 -638
  7. package/dist/index.js.map +1 -1
  8. package/dist/validation/index.d.ts +5 -0
  9. package/dist/validation/index.js.map +1 -1
  10. package/package.json +2 -2
  11. package/src/IcuTranslationProviderMulti.test.ts +18 -40
  12. package/src/IcuTranslationProviderMulti.ts +27 -37
  13. package/src/audit/audit-dictionaries.ts +1 -1
  14. package/src/audit/run-audit.test.ts +6 -7
  15. package/src/builder-load-registry.ts +26 -5
  16. package/src/builder-loaders.ts +8 -11
  17. package/src/builder-types.test.ts +11 -42
  18. package/src/builder.test.ts +82 -243
  19. package/src/builder.ts +8 -110
  20. package/src/codegen/codegen-config-schema.ts +82 -77
  21. package/src/codegen/config.test.ts +55 -143
  22. package/src/codegen/config.ts +10 -67
  23. package/src/codegen/dictionary-spec-contract.test.ts +28 -0
  24. package/src/codegen/dictionary-spec-contract.ts +138 -0
  25. package/src/codegen/emit/dictionary-schema-file.ts +7 -43
  26. package/src/codegen/emit/instance-file.test.ts +35 -52
  27. package/src/codegen/emit/instance-file.ts +170 -268
  28. package/src/codegen/emit/namespace-loaders-file.test.ts +72 -74
  29. package/src/codegen/emit/namespace-loaders-file.ts +147 -90
  30. package/src/codegen/emit/types-file.test.ts +20 -41
  31. package/src/codegen/emit/types-file.ts +48 -74
  32. package/src/codegen/generate-i18n-types.test.ts +163 -492
  33. package/src/codegen/generate-i18n-types.ts +7 -269
  34. package/src/codegen/paths.ts +0 -14
  35. package/src/codegen/project-locales-set-namespace.test.ts +44 -86
  36. package/src/codegen/read-dictionary.test.ts +27 -9
  37. package/src/codegen/read-dictionary.ts +18 -40
  38. package/src/codegen/regenerate-namespaces.ts +180 -0
  39. package/src/codegen/run-codegen.test.ts +230 -0
  40. package/src/codegen/run-codegen.ts +252 -0
  41. package/src/codegen/types.ts +0 -6
  42. package/src/codegen-config/build-config.ts +4 -23
  43. package/src/codegen-config/codegen-config.test.ts +10 -6
  44. package/src/codegen-config/index.ts +18 -3
  45. package/src/engine.ts +3 -27
  46. package/src/fetch-artifact.ts +16 -0
  47. package/src/i18n-handle.ts +202 -0
  48. package/src/index.ts +15 -34
  49. package/src/project-locales.ts +2 -2
  50. package/src/scope-multi.ts +1 -20
  51. package/src/scope-types.ts +14 -6
  52. package/src/scope.test.ts +3 -312
  53. package/src/serialized-state.test.ts +114 -0
  54. package/src/serialized-state.ts +28 -0
  55. package/src/setup/setup-i18n.test.ts +22 -33
  56. package/src/setup/setup-i18n.ts +22 -27
  57. package/src/types.ts +3 -3
  58. package/src/validation/index.ts +4 -0
  59. package/src/IcuTranslationProviderSingle.test.ts +0 -177
  60. package/src/IcuTranslationProviderSingle.ts +0 -114
  61. package/src/builder-multi.ts +0 -481
  62. package/src/codegen/emit/dictionary-file.test.ts +0 -215
  63. package/src/codegen/emit/dictionary-file.ts +0 -244
  64. package/src/deep-freeze.test.ts +0 -40
  65. package/src/deep-freeze.ts +0 -22
  66. package/src/patch-key.test.ts +0 -186
  67. package/src/patch-key.ts +0 -140
  68. package/src/scope-single.ts +0 -85
  69. package/src/single-builder.ts +0 -153
package/dist/index.d.ts CHANGED
@@ -7,10 +7,32 @@ type DeliveryArtifactsMap<RequestLocales extends string, DeliveryArea extends st
7
7
  /** When a delivery-area map is configured, resolve partition locales; otherwise keep the full pool. */
8
8
  type LocalesForDeliveryAreaOrAll<RequestLocales extends string, DeliveryArea extends string, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea>, Area extends string> = [DeliveryArea] extends [never] ? RequestLocales : Area extends DeliveryArea ? DeliveryArtifacts[Area][number] : never;
9
9
 
10
+ /** Serialized builder resource: namespace + partition (locale / delivery area). */
11
+ type BuilderResourceEntry = readonly [namespace: string, partition: string];
12
+
13
+ /**
14
+ * Portable i18n instance state after `serialize()`: dictionary strings + which
15
+ * builder resources are already loaded (namespace × partition).
16
+ */
17
+ interface I18nSerializedState<Dictionary = Record<string, unknown>> {
18
+ dictionary: Dictionary;
19
+ resources: readonly BuilderResourceEntry[];
20
+ }
21
+ /**
22
+ * Input nested under generated `createI18n({ state? })`. Omitted `state` defaults to an empty
23
+ * dictionary (lazy cold start). `resources` may be omitted or `[]`.
24
+ */
25
+ type I18nCreateInput<Dictionary = Record<string, unknown>> = {
26
+ dictionary: Dictionary;
27
+ resources?: readonly BuilderResourceEntry[];
28
+ };
29
+ declare function normalizeI18nCreateInput<Dictionary>(value?: I18nCreateInput<Dictionary>): I18nSerializedState<Dictionary>;
30
+
10
31
  type LocaleDictionary = Record<string, string>;
11
32
  type KeyDictionary = Record<string, LocaleDictionary>;
12
33
  type MultiDictionary = Record<string, KeyDictionary>;
13
- type LocaleOfSingle<Schema extends KeyDictionary> = {
34
+ /** Locales present on any key of a flat (per-namespace) key dictionary. */
35
+ type LocaleOfKeys<Schema extends KeyDictionary> = {
14
36
  [K in keyof Schema]: keyof Schema[K];
15
37
  }[keyof Schema] & string;
16
38
  type LocaleOfMulti<Schema extends MultiDictionary> = {
@@ -19,7 +41,7 @@ type LocaleOfMulti<Schema extends MultiDictionary> = {
19
41
  }[keyof Schema[NS]];
20
42
  }[keyof Schema] & string;
21
43
  /** Subset of schema keys with any subset of project locales per key — valid input for merge operations. */
22
- type PartialKeyDictionary<T extends KeyDictionary, Locales extends string = LocaleOfSingle<T>> = {
44
+ type PartialKeyDictionary<T extends KeyDictionary, Locales extends string = LocaleOfKeys<T>> = {
23
45
  [K in keyof T]?: Partial<Record<Locales, string>>;
24
46
  };
25
47
  /** Subset of schema namespaces with partial keys/locales — valid input for multi merge operations. */
@@ -56,35 +78,35 @@ type MultiParams<Schema extends MultiDictionary> = {
56
78
  type SchemaForNamespaces<Schema extends MultiDictionary, NsList extends readonly (keyof Schema & string)[]> = Pick<Schema, NsList[number]>;
57
79
  /** Restrict multi ICU params to a subset of namespaces. */
58
80
  type ParamsForNamespaces<Schema extends MultiDictionary, Params extends MultiParams<Schema>, NsList extends readonly (keyof Schema & string)[]> = Pick<Params, NsList[number]>;
59
- /** ICU argument map for a single-namespace schema. */
60
- type SingleParams<Schema extends KeyDictionary> = {
61
- [K in keyof Schema]: unknown;
62
- };
63
81
  /** Rest args for `t()` — `never` params omit the third argument. */
64
82
  type ParamArgs<P> = [P] extends [never] ? [] : [params: P];
83
+ /**
84
+ * Namespace-bound `t(key, …)` — locale already bound.
85
+ * Call sites omit the namespace argument.
86
+ */
87
+ type NamespaceBoundTranslateFn<Schema extends MultiDictionary, Params extends MultiParams<Schema>, NS extends keyof Schema & keyof Params & string> = <const K extends keyof Schema[NS] & keyof Params[NS] & string>(key: K, ...params: ParamArgs<Params[NS][K]>) => string;
65
88
 
66
89
  /** Type-safe translation scope for a multi-namespace schema subset. */
67
90
  interface I18nScopeMulti<Schema extends MultiDictionary, Params, RequestLocales extends string = LocaleOfMulti<Schema>> {
68
91
  t<const NS extends keyof Schema & keyof Params & string, const K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, locale: RequestLocales, ...params: ParamArgs<Params[NS][K]>): string;
69
92
  forLocale<Locale extends RequestLocales>(locale: Locale): I18nScopeMultiForLocale<Schema, Params, RequestLocales, Locale>;
70
93
  }
71
- /** Multi-namespace scope with a bound locale — `t(namespace, key)` and `set(...)` without a locale argument. */
94
+ /** Multi-namespace scope with a bound locale — `t(namespace, key)` without a locale argument. */
72
95
  interface I18nScopeMultiForLocale<Schema extends MultiDictionary, Params, RequestLocales extends string, Locale extends RequestLocales> {
73
96
  readonly locale: Locale;
74
97
  t<const NS extends keyof Schema & keyof Params & string, const K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, ...params: ParamArgs<Params[NS][K]>): string;
75
- set<const NS extends keyof Schema & keyof Params & string, const K extends keyof Schema[NS] & keyof Params[NS] & string>(namespace: NS, key: K, template: string): void;
76
98
  forLocale<Next extends RequestLocales>(locale: Next): I18nScopeMultiForLocale<Schema, Params, RequestLocales, Next>;
77
99
  }
78
100
 
79
101
  declare class IcuTranslationProviderMulti<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> implements I18nEngineMulti<Schema, Params, RequestLocales> {
80
102
  readonly __i18nEngineMode: "multi";
103
+ /** Loaded namespaces only — cold start is `{}`; never claim full Schema until loaded. */
81
104
  private dictionary;
82
105
  private compiledCache;
83
- private readonly preloadedKeys;
84
106
  private readonly builderLoadRegistry;
85
107
  private readonly localeFallback?;
86
108
  private readonly onMissing;
87
- constructor(dictionary: PartialMultiDictionary<Schema, RequestLocales>, options?: IcuTranslationProviderOptions<Fallback>);
109
+ constructor(dictionary?: PartialMultiDictionary<Schema, RequestLocales>, options?: IcuTranslationProviderOptions<Fallback>);
88
110
  getWithLocale(namespace: string, key: string, locale: string, params?: Record<string, unknown>): string;
89
111
  toScope<NsList extends readonly (keyof Schema & string)[], Locale extends RequestLocales>(options: {
90
112
  namespaces: NsList;
@@ -93,87 +115,21 @@ declare class IcuTranslationProviderMulti<Schema extends MultiDictionary, Params
93
115
  toScope<NsList extends readonly (keyof Schema & string)[]>(options: {
94
116
  namespaces: NsList;
95
117
  }): I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, RequestLocales>;
96
- getAll(): Schema;
97
- hasBuilderResourceLoaded(namespace: string, partition: string | undefined): boolean;
98
- markBuilderResourceLoaded(namespace: string, partition: string | undefined): void;
118
+ /** Live dictionary reference (loaded namespaces only). Do not mutate. */
119
+ getAll(): PartialMultiDictionary<Schema, RequestLocales>;
120
+ hasBuilderResourceLoaded(namespace: string, partition: string): boolean;
121
+ markBuilderResourceLoaded(namespace: string, partition: string): void;
122
+ seedBuilderResources(resources: readonly BuilderResourceEntry[]): void;
123
+ serialize(): I18nSerializedState<PartialMultiDictionary<Schema, RequestLocales>>;
99
124
  applyLoadMergeNamespace<NS extends keyof Schema>(namespace: NS, values: PartialKeyDictionary<Schema[NS], RequestLocales>): void;
100
125
  applyLoadMergeAll(values: PartialMultiDictionary<Schema, RequestLocales>): void;
101
- patchKeyMulti(namespace: string, key: string, locale: string, template: string): void;
102
- }
103
-
104
- /** Type-safe translation scope for a single-namespace schema. */
105
- interface I18nScopeSingle<Schema extends KeyDictionary, Params extends {
106
- [K in keyof Schema]: unknown;
107
- }, RequestLocales extends string = LocaleOfSingle<Schema>> {
108
- t<const K extends keyof Schema & string>(key: K, locale: RequestLocales, ...params: ParamArgs<Params[K]>): string;
109
- forLocale<Locale extends RequestLocales>(locale: Locale): I18nScopeSingleForLocale<Schema, Params, Locale>;
110
- }
111
- /** Single-namespace scope with a bound locale — `t(key)` and `set(key)` without a locale argument. */
112
- interface I18nScopeSingleForLocale<Schema extends KeyDictionary, Params extends {
113
- [K in keyof Schema]: unknown;
114
- }, Locale extends string> {
115
- readonly locale: Locale;
116
- t<const K extends keyof Schema & string>(key: K, ...params: ParamArgs<Params[K]>): string;
117
- set<const K extends keyof Schema & string>(key: K, template: string): void;
118
- forLocale<Next extends Locale>(locale: Next): I18nScopeSingleForLocale<Schema, Params, Next>;
119
- }
120
- declare class I18nScopeSingleImpl<Schema extends KeyDictionary, Params extends {
121
- [K in keyof Schema]: unknown;
122
- }, RequestLocales extends string, Fallback extends LocaleFallbackMap$1 | undefined> implements I18nScopeSingle<Schema, Params, RequestLocales> {
123
- private readonly engine;
124
- constructor(engine: IcuTranslationProviderSingle<Schema, Params, RequestLocales, Fallback>);
125
- t: <const K extends keyof Schema & string>(key: K, locale: RequestLocales, ...args: ParamArgs<Params[K]>) => string;
126
- forLocale: <Locale extends RequestLocales>(locale: Locale) => I18nScopeSingleForLocaleImpl<Schema, Params, RequestLocales, Locale, Fallback>;
127
- }
128
- declare class I18nScopeSingleForLocaleImpl<Schema extends KeyDictionary, Params extends {
129
- [K in keyof Schema]: unknown;
130
- }, RequestLocales extends string, Locale extends RequestLocales, Fallback extends LocaleFallbackMap$1 | undefined> implements I18nScopeSingleForLocale<Schema, Params, Locale> {
131
- private readonly engine;
132
- readonly locale: Locale;
133
- constructor(engine: IcuTranslationProviderSingle<Schema, Params, RequestLocales, Fallback>, locale: Locale);
134
- t: <const K extends keyof Schema & string>(key: K, ...args: ParamArgs<Params[K]>) => string;
135
- set: <const K extends keyof Schema & string>(key: K, template: string) => void;
136
- forLocale: <Next extends Locale>(locale: Next) => I18nScopeSingleForLocaleImpl<Schema, Params, RequestLocales, Next, Fallback>;
137
126
  }
138
127
 
139
- declare class IcuTranslationProviderSingle<Schema extends KeyDictionary, Params extends {
140
- [K in keyof Schema]: unknown;
141
- }, RequestLocales extends string = LocaleOfSingle<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> implements I18nEngineSingle<Schema, Params, RequestLocales> {
142
- readonly __i18nEngineMode: "single";
143
- private dictionary;
144
- private compiledCache;
145
- private readonly preloadedKeys;
146
- private readonly builderLoadRegistry;
147
- private readonly localeFallback?;
148
- private readonly onMissing;
149
- constructor(dictionary: Schema, options?: IcuTranslationProviderOptions<Fallback>);
150
- getWithLocale(key: string, locale: string, params?: Record<string, unknown>): string;
151
- toScope(): I18nScopeSingleImpl<Schema, Params, RequestLocales, Fallback>;
152
- toScope<Locale extends RequestLocales>(options: {
153
- locale: Locale;
154
- }): I18nScopeSingleForLocaleImpl<Schema, Params, RequestLocales, Locale, Fallback>;
155
- getAll(): Schema;
156
- hasBuilderResourceLoaded(partition: string | undefined): boolean;
157
- markBuilderResourceLoaded(partition: string | undefined): void;
158
- applyLoadMergeSingle(values: PartialKeyDictionary<Schema, RequestLocales>): void;
159
- patchKey(key: string, locale: string, template: string): void;
160
- }
161
-
162
- /** Mutable translation engine for a single-namespace dictionary. */
163
- interface I18nEngineSingle<Schema extends KeyDictionary, Params extends {
164
- [K in keyof Schema]: unknown;
165
- }, RequestLocales extends string = LocaleOfSingle<Schema>> {
166
- readonly __i18nEngineMode: "single";
167
- getAll(): Schema;
168
- toScope(): I18nScopeSingle<Schema, Params, RequestLocales>;
169
- toScope<Locale extends RequestLocales>(options: {
170
- locale: Locale;
171
- }): I18nScopeSingleForLocale<Schema, Params, Locale>;
172
- }
173
128
  /** Mutable translation engine for a multi-namespace dictionary. */
174
129
  interface I18nEngineMulti<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>> {
175
130
  readonly __i18nEngineMode: "multi";
176
- getAll(): Schema;
131
+ /** Loaded namespaces only — may be empty at cold start. */
132
+ getAll(): PartialMultiDictionary<Schema, RequestLocales>;
177
133
  toScope<NsList extends readonly (keyof Schema & string)[]>(options: {
178
134
  namespaces: NsList;
179
135
  }): I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, RequestLocales>;
@@ -182,144 +138,59 @@ interface I18nEngineMulti<Schema extends MultiDictionary, Params extends MultiPa
182
138
  locale: Locale;
183
139
  }): I18nScopeMultiForLocale<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, RequestLocales, Locale>;
184
140
  }
185
- /** Alias for the default single-namespace engine implementation. */
186
- type I18nEngineSingleImpl<Schema extends KeyDictionary, Params extends {
187
- [K in keyof Schema]: unknown;
188
- }, RequestLocales extends string = LocaleOfSingle<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> = IcuTranslationProviderSingle<Schema, Params, RequestLocales, Fallback>;
189
141
  /** Alias for the default multi-namespace engine implementation. */
190
142
  type I18nEngineMultiImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, Fallback extends LocaleFallbackMap$1 | undefined = undefined> = IcuTranslationProviderMulti<Schema, Params, RequestLocales, Fallback>;
191
143
 
192
- /** Canonical lazy loader — no locale or delivery-area partition. */
193
- type CanonicalLoader<T> = () => Promise<T> | T;
194
144
  /** Split-by-locale or custom-area loader — partition key is locale or area name. */
195
- type PartitionedLoader<T> = (partition: string) => Promise<T> | T;
196
- type NamespaceLoader<T> = CanonicalLoader<T> | PartitionedLoader<T>;
197
- declare function invokeNamespaceLoader<T>(loader: NamespaceLoader<T>, partition: string | undefined): Promise<T>;
145
+ type PartitionedLoader<T> = (partition: string, context: {
146
+ locale: string;
147
+ }) => Promise<T> | T;
148
+ type NamespaceLoader<T> = PartitionedLoader<T>;
149
+ declare function invokeNamespaceLoader<T>(loader: NamespaceLoader<T>, partition: string, context: {
150
+ locale: string;
151
+ }): Promise<T>;
198
152
 
199
- type I18nBuilderMultiOptions<Schema extends MultiDictionary, RequestLocales extends string = LocaleOfMulti<Schema>> = {
153
+ /** Engine handle accepted by {@link createI18nHandle} (with or without localeFallback). */
154
+ type HandleEngine<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string> = I18nEngineMultiImpl<Schema, Params, RequestLocales, LocaleFallbackMap$1 | undefined>;
155
+ /** Non-empty namespace list — required by {@link I18nHandle.load} / {@link I18nHandle.peek}. */
156
+ type NonEmptyNamespaces<NS extends readonly string[]> = NS extends readonly [] ? never : NS;
157
+ /** Maps a request locale to the delivery partition key (locale itself, or a custom area). */
158
+ type PartitionForLocale<RequestLocales extends string> = (locale: RequestLocales) => string;
159
+ type I18nHandleOptions<Schema extends MultiDictionary, RequestLocales extends string = LocaleOfMulti<Schema>> = {
200
160
  namespaceLoaders?: {
201
161
  [NS in keyof Schema & string]?: NamespaceLoader<PartialKeyDictionary<Schema[NS], RequestLocales> | Schema[NS]>;
202
162
  };
163
+ /**
164
+ * Resolves the loader partition for a locale.
165
+ * Default: identity (`locale → locale`) for split-by-locale.
166
+ * Custom delivery: codegen injects `locale → LOCALE_DELIVERY_AREA[locale]`.
167
+ */
168
+ partitionForLocale?: PartitionForLocale<RequestLocales>;
203
169
  };
204
- /** Non-empty namespace list required before partition or load. */
205
- type NonEmptyNamespaces<NS extends readonly string[]> = NS extends readonly [] ? never : NS;
206
- type MultiBuilderState<Schema extends MultiDictionary, RequestLocales extends string = LocaleOfMulti<Schema>, NsList extends readonly (keyof Schema & string)[] = readonly (keyof Schema & string)[]> = {
207
- namespaces: NsList;
208
- locale?: RequestLocales;
209
- deliveryArea?: string;
210
- };
211
- /** Builder returned by `createI18n({})` — only `withNamespaces` until namespaces are selected. */
212
- interface I18nBuilderMultiInitial<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> {
213
- withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiReady<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
214
- }
215
- /** Builder after `withNamespaces([...])` — partition selection and `load()` are available. */
216
- interface I18nBuilderMultiReady<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, NsList extends readonly (keyof Schema & string)[] = readonly (keyof Schema & string)[], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> {
217
- withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiReady<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
218
- withLocale<Locale extends ActiveLocales>(locale: Locale): I18nBuilderMultiForLocale<Schema, Params, RequestLocales, ActiveLocales, NsList, Locale>;
219
- withDeliveryArea<Area extends DeliveryArea>(area: Area): I18nBuilderMultiPartitioned<Schema, Params, RequestLocales, LocalesForDeliveryAreaOrAll<RequestLocales, DeliveryArea, DeliveryArtifacts, Area>, NsList, DeliveryArea, DeliveryArtifacts>;
220
- load(): Promise<I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, ActiveLocales>>;
221
- }
222
- /** @deprecated Alias for {@link I18nBuilderMultiInitial} — the multi builder before `withNamespaces`. */
223
- type I18nBuilderMulti<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, NsList extends readonly (keyof Schema & string)[] = readonly [], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> = [NsList] extends [readonly []] ? I18nBuilderMultiInitial<Schema, Params, RequestLocales, ActiveLocales, DeliveryArea, DeliveryArtifacts> : I18nBuilderMultiReady<Schema, Params, RequestLocales, ActiveLocales, NsList, DeliveryArea, DeliveryArtifacts>;
224
- /** Builder after `withDeliveryArea` — partition is fixed; bind locale via `scope.forLocale` after `load()`. */
225
- interface I18nBuilderMultiPartitioned<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, ActiveLocales extends RequestLocales, NsList extends readonly (keyof Schema & string)[], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> {
226
- withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiPartitioned<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
227
- load(): Promise<I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, ActiveLocales>>;
228
- }
229
- interface I18nBuilderMultiForLocale<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, ActiveLocales extends RequestLocales, NsList extends readonly (keyof Schema & string)[], Locale extends ActiveLocales> {
230
- load(): Promise<I18nScopeMultiForLocale<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, Locale, Locale>>;
231
- }
232
- declare class I18nBuilderMultiInitialImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> implements I18nBuilderMultiInitial<Schema, Params, RequestLocales, ActiveLocales, DeliveryArea, DeliveryArtifacts> {
233
- private readonly engine;
234
- private readonly options?;
235
- constructor(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options?: I18nBuilderMultiOptions<Schema, RequestLocales> | undefined);
236
- withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiReadyImpl<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
237
- }
238
- declare class I18nBuilderMultiReadyImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, ActiveLocales extends RequestLocales = RequestLocales, NsList extends readonly (keyof Schema & string)[] = readonly (keyof Schema & string)[], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> implements I18nBuilderMultiReady<Schema, Params, RequestLocales, ActiveLocales, NsList, DeliveryArea, DeliveryArtifacts> {
239
- private readonly engine;
240
- private readonly options;
241
- private readonly state;
242
- constructor(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options: I18nBuilderMultiOptions<Schema, RequestLocales> | undefined, state: MultiBuilderState<Schema, RequestLocales, NsList>);
243
- private clone;
244
- withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiReadyImpl<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
245
- withLocale<Locale extends ActiveLocales>(locale: Locale): I18nBuilderMultiForLocaleImpl<Schema, Params, RequestLocales, ActiveLocales, NsList, Locale>;
246
- withDeliveryArea<Area extends DeliveryArea>(area: Area): I18nBuilderMultiPartitionedImpl<Schema, Params, RequestLocales, LocalesForDeliveryAreaOrAll<RequestLocales, DeliveryArea, DeliveryArtifacts, Area>, NsList, DeliveryArea, DeliveryArtifacts>;
247
- load(): Promise<I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, ActiveLocales>>;
248
- }
249
- declare class I18nBuilderMultiPartitionedImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, ActiveLocales extends RequestLocales, NsList extends readonly (keyof Schema & string)[], DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>> implements I18nBuilderMultiPartitioned<Schema, Params, RequestLocales, ActiveLocales, NsList, DeliveryArea, DeliveryArtifacts> {
250
- private readonly engine;
251
- private readonly options;
252
- private readonly state;
253
- constructor(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options: I18nBuilderMultiOptions<Schema, RequestLocales> | undefined, state: MultiBuilderState<Schema, RequestLocales, NsList> & {
254
- deliveryArea: string;
255
- });
256
- withNamespaces<const NS extends readonly (keyof Schema & string)[]>(namespaces: NonEmptyNamespaces<NS>): I18nBuilderMultiPartitionedImpl<Schema, Params, RequestLocales, ActiveLocales, NS, DeliveryArea, DeliveryArtifacts>;
257
- load(): Promise<I18nScopeMulti<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, ActiveLocales>>;
258
- }
259
- declare class I18nBuilderMultiForLocaleImpl<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, ActiveLocales extends RequestLocales, NsList extends readonly (keyof Schema & string)[], Locale extends ActiveLocales> implements I18nBuilderMultiForLocale<Schema, Params, RequestLocales, ActiveLocales, NsList, Locale> {
260
- private readonly engine;
261
- private readonly options;
262
- private readonly state;
263
- constructor(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options: I18nBuilderMultiOptions<Schema, RequestLocales> | undefined, state: MultiBuilderState<Schema, RequestLocales, NsList> & {
264
- locale: Locale;
265
- });
266
- load(): Promise<I18nScopeMultiForLocale<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, Locale, Locale>>;
267
- }
268
-
269
- type SingleScopeBound<Schema extends KeyDictionary, Params, Locale extends string> = I18nScopeSingleForLocale<Schema, Params & {
270
- [K in keyof Schema]: unknown;
271
- }, Locale>;
272
- type I18nBuilderSingleOptions<Schema extends KeyDictionary, RequestLocales extends string = LocaleOfSingle<Schema>> = {
273
- dictionaryLoader?: NamespaceLoader<PartialKeyDictionary<Schema, RequestLocales> | Schema>;
274
- };
275
- interface I18nBuilderSingle<Schema extends KeyDictionary, Params extends {
276
- [K in keyof Schema]: unknown;
277
- }, RequestLocales extends string = LocaleOfSingle<Schema>> {
278
- withLocale<Locale extends RequestLocales>(locale: Locale): I18nBuilderSingleForLocaleImpl<Schema, Params, RequestLocales, Locale>;
279
- withDeliveryArea<Area extends string>(area: Area): I18nBuilderSingle<Schema, Params, RequestLocales>;
280
- load(): Promise<I18nScopeSingleImpl<Schema, Params, RequestLocales, LocaleFallbackMap$1 | undefined>>;
281
- }
282
- interface I18nBuilderSingleForLocale<Schema extends KeyDictionary, Params extends {
283
- [K in keyof Schema]: unknown;
284
- }, Locale extends string> {
285
- load(): Promise<SingleScopeBound<Schema, Params, Locale>>;
286
- }
287
- type SingleBuilderState<Schema extends KeyDictionary, RequestLocales extends string = LocaleOfSingle<Schema>> = {
288
- locale?: RequestLocales;
289
- deliveryArea?: string;
170
+ type LoadNamespacesInput<Schema extends MultiDictionary, NsList extends readonly (keyof Schema & string)[], Locale extends string> = {
171
+ namespaces: NonEmptyNamespaces<NsList>;
172
+ locale: Locale;
290
173
  };
291
- declare class I18nBuilderSingleImpl<Schema extends KeyDictionary, Params extends {
292
- [K in keyof Schema]: unknown;
293
- }, RequestLocales extends string = LocaleOfSingle<Schema>> implements I18nBuilderSingle<Schema, Params, RequestLocales> {
294
- private readonly engine;
295
- private readonly options?;
296
- private state;
297
- constructor(engine: I18nEngineSingleImpl<Schema, Params, RequestLocales>, options?: I18nBuilderSingleOptions<Schema, RequestLocales> | undefined, state?: SingleBuilderState<Schema, RequestLocales>);
298
- private clone;
299
- withLocale<Locale extends RequestLocales>(locale: Locale): I18nBuilderSingleForLocaleImpl<Schema, Params, RequestLocales, Locale>;
300
- withDeliveryArea<Area extends string>(_area: Area): I18nBuilderSingle<Schema, Params, RequestLocales>;
301
- load(): Promise<I18nScopeSingleImpl<Schema, Params, RequestLocales, LocaleFallbackMap$1 | undefined>>;
302
- }
303
- declare class I18nBuilderSingleForLocaleImpl<Schema extends KeyDictionary, Params extends {
304
- [K in keyof Schema]: unknown;
305
- }, RequestLocales extends string = LocaleOfSingle<Schema>, Locale extends RequestLocales = RequestLocales> implements I18nBuilderSingleForLocale<Schema, Params, Locale> {
306
- private readonly engine;
307
- private readonly options;
308
- private readonly state;
309
- constructor(engine: I18nEngineSingleImpl<Schema, Params, RequestLocales>, options: I18nBuilderSingleOptions<Schema, RequestLocales> | undefined, state: SingleBuilderState<Schema, RequestLocales> & {
310
- locale: Locale;
311
- });
312
- load(): Promise<SingleScopeBound<Schema, Params, Locale>>;
174
+ /** Locale-bound scope returned by {@link I18nHandle.load} / {@link I18nHandle.peek}. */
175
+ type ScopeForLocale<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string, NsList extends readonly (keyof Schema & string)[], Locale extends RequestLocales> = I18nScopeMultiForLocale<SchemaForNamespaces<Schema, NsList>, ParamsForNamespaces<Schema, Params, NsList>, RequestLocales, Locale>;
176
+ /**
177
+ * Single runtime handle: pass `namespaces` + `locale`; partition is derived via
178
+ * {@link I18nHandleOptions.partitionForLocale}.
179
+ */
180
+ interface I18nHandle<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>> {
181
+ load<const NsList extends readonly (keyof Schema & string)[], Locale extends RequestLocales>(input: LoadNamespacesInput<Schema, NsList, Locale>): Promise<ScopeForLocale<Schema, Params, RequestLocales, NsList, Locale>>;
182
+ /**
183
+ * Sync scope when every requested resource is already marked loaded (e.g. hydrate seed).
184
+ * Returns `null` when a normal async {@link load} is still required.
185
+ */
186
+ peek<const NsList extends readonly (keyof Schema & string)[], Locale extends RequestLocales>(input: LoadNamespacesInput<Schema, NsList, Locale>): ScopeForLocale<Schema, Params, RequestLocales, NsList, Locale> | null;
187
+ /** Dictionary (loaded namespaces) + resources for SSR→CSR hydrate. */
188
+ serialize(): {
189
+ dictionary: PartialMultiDictionary<Schema, RequestLocales>;
190
+ resources: readonly (readonly [string, string])[];
191
+ };
313
192
  }
314
-
315
- declare function createI18nSingleBuilder<Schema extends KeyDictionary, Params extends {
316
- [K in keyof Schema]: unknown;
317
- }, RequestLocales extends string = LocaleOfSingle<Schema>>(engine: I18nEngineSingleImpl<Schema, Params, RequestLocales>, options?: I18nBuilderSingleOptions<Schema, RequestLocales>): I18nBuilderSingleImpl<Schema, Params, RequestLocales>;
318
- declare function createI18nMultiBuilder<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>, DeliveryArea extends string = never, DeliveryArtifacts extends DeliveryArtifactsMap<RequestLocales, DeliveryArea> = DeliveryArtifactsMap<RequestLocales, DeliveryArea>>(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options?: I18nBuilderMultiOptions<Schema, RequestLocales>): I18nBuilderMultiInitialImpl<Schema, Params, RequestLocales, RequestLocales, DeliveryArea, DeliveryArtifacts>;
319
- declare function createI18nBuilder<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>>(engine: I18nEngineMultiImpl<Schema, Params, RequestLocales>, options?: I18nBuilderMultiOptions<Schema, RequestLocales>): I18nBuilderMultiInitialImpl<Schema, Params, RequestLocales, RequestLocales, never, DeliveryArtifactsMap<RequestLocales, never>>;
320
- declare function createI18nBuilder<Schema extends KeyDictionary, Params extends {
321
- [K in keyof Schema]: unknown;
322
- }, RequestLocales extends string = LocaleOfSingle<Schema>>(engine: I18nEngineSingleImpl<Schema, Params, RequestLocales>, options?: I18nBuilderSingleOptions<Schema, RequestLocales>): I18nBuilderSingleImpl<Schema, Params, RequestLocales>;
193
+ declare function createI18nHandle<Schema extends MultiDictionary, Params extends MultiParams<Schema>, RequestLocales extends string = LocaleOfMulti<Schema>>(engine: HandleEngine<Schema, Params, RequestLocales>, options?: I18nHandleOptions<Schema, RequestLocales>): I18nHandle<Schema, Params, RequestLocales>;
323
194
 
324
195
  type LocaleFallbackMap = Record<string, string | null>;
325
196
  interface ResolvedLocaleTemplate {
@@ -331,36 +202,31 @@ declare function validateLocaleFallback(map: LocaleFallbackMap): void;
331
202
  declare function resolveLocaleTemplate(localeByKey: Record<string, string | undefined> | undefined, requestedLocale: string, fallbackMap?: LocaleFallbackMap): ResolvedLocaleTemplate | undefined;
332
203
  declare function formatLocaleFallbackChain(requestedLocale: string, fallbackMap?: LocaleFallbackMap): string;
333
204
 
334
- /**
335
- * Builds a namespace dictionary that contains only the requested locales.
336
- * For each key and target locale, copies the direct template when present;
337
- * otherwise resolves through `localeFallback` (same rules as `.get()` at runtime).
338
- */
339
- declare function projectNamespaceLocalesCore<T extends KeyDictionary>(dictionary: T, locales: readonly string[], localeFallback?: LocaleFallbackMap$1): T;
340
- /**
341
- * Projects a single namespace for a custom delivery area.
342
- * Full locales resolve through `localeFallback` (e.g. external chains like `it → en-US`);
343
- * preserve locales copy only their direct canonical entry when present.
344
- */
345
- declare function projectNamespaceForDeliveryAreaCore<T extends KeyDictionary>(dictionary: T, areaLocales: readonly string[], localeFallback?: LocaleFallbackMap$1): T;
346
- /**
347
- * Projects a multi-namespace dictionary for a custom delivery area.
348
- * Each namespace uses the same delivery-area rules as `projectNamespaceForDeliveryAreaCore`.
349
- */
350
- declare function projectDictionaryForDeliveryAreaCore<T extends MultiDictionary>(dictionary: T, areaLocales: readonly string[], localeFallback?: LocaleFallbackMap$1): T;
351
- /**
352
- * Projects every namespace in a multi-namespace dictionary.
353
- */
354
- declare function projectDictionaryLocalesCore<T extends MultiDictionary>(dictionary: T, locales: readonly string[], localeFallback?: LocaleFallbackMap$1): T;
355
205
  /**
356
206
  * Merges locale entries per translation key without dropping keys or locales
357
207
  * already present in `existing`. Incoming locales overwrite the same locale on conflict.
358
208
  */
359
- declare function mergeNamespaceLocalesCore<T extends KeyDictionary, Locales extends string = LocaleOfSingle<T>>(existing: T, incoming: PartialKeyDictionary<T, Locales>): T;
209
+ declare function mergeNamespaceLocalesCore<T extends KeyDictionary, Locales extends string = LocaleOfKeys<T>>(existing: T, incoming: PartialKeyDictionary<T, Locales>): T;
360
210
  /**
361
211
  * Merges locale entries per key in every namespace present in `incoming`.
362
212
  * Namespaces and keys not in `incoming` are preserved from `existing`.
363
213
  */
364
214
  declare function mergeDictionaryLocalesCore<T extends MultiDictionary, Locales extends string = LocaleOfMulti<T>>(existing: T, incoming: PartialMultiDictionary<T, Locales>): T;
365
215
 
366
- export { type CanonicalLoader, type DeliveryArtifactsMap, type I18nBuilderMulti, type I18nBuilderMultiForLocale, type I18nBuilderMultiInitial, type I18nBuilderMultiOptions, type I18nBuilderMultiPartitioned, type I18nBuilderMultiReady, type I18nBuilderSingle, type I18nBuilderSingleForLocale, type I18nBuilderSingleOptions, type I18nEngineMulti, type I18nEngineMultiImpl, type I18nEngineSingle, type I18nEngineSingleImpl, type I18nScopeMulti, type I18nScopeMultiForLocale, type I18nScopeSingle, type I18nScopeSingleForLocale, IcuTranslationProviderMulti, type IcuTranslationProviderOptions, IcuTranslationProviderSingle, type KeyDictionary, type LocaleDictionary, type LocaleFallbackMap$1 as LocaleFallbackMap, type LocaleOfMulti, type LocaleOfSingle, type LocalesForDeliveryArea, type LocalesForDeliveryAreaOrAll, type MissingTranslationContext, type MultiDictionary, type MultiParams, type NamespaceLoader, type OnMissingTranslation, type ParamsForNamespaces, type PartialKeyDictionary, type PartialMultiDictionary, type PartitionedLoader, type ResolvedLocaleTemplate, type SchemaForNamespaces, type SingleParams, createI18nBuilder, createI18nMultiBuilder, createI18nSingleBuilder, formatLocaleFallbackChain, invokeNamespaceLoader, mergeDictionaryLocalesCore, mergeNamespaceLocalesCore, projectDictionaryForDeliveryAreaCore, projectDictionaryLocalesCore, projectNamespaceForDeliveryAreaCore, projectNamespaceLocalesCore, resolveLocaleTemplate, validateLocaleFallback };
216
+ /**
217
+ * Identifies a delivery JSON artifact. Codegen passes this to {@link FetchArtifact};
218
+ * URL / filesystem mapping is an application concern.
219
+ */
220
+ type DeliveryResourceId = {
221
+ locale: string;
222
+ namespace: string;
223
+ /** Present for `delivery: "custom"` (partition key is the area). */
224
+ area?: string;
225
+ };
226
+ /**
227
+ * Loads a translation JSON artifact by resource id.
228
+ * Must return the parsed JSON value (not a raw Response).
229
+ */
230
+ type FetchArtifact = (id: DeliveryResourceId) => Promise<unknown>;
231
+
232
+ export { type BuilderResourceEntry, type DeliveryArtifactsMap, type DeliveryResourceId, type FetchArtifact, type I18nCreateInput, type I18nEngineMulti, type I18nEngineMultiImpl, type I18nHandle, type I18nHandleOptions, type I18nScopeMulti, type I18nScopeMultiForLocale, type I18nSerializedState, IcuTranslationProviderMulti, type IcuTranslationProviderOptions, type KeyDictionary, type LoadNamespacesInput, type LocaleDictionary, type LocaleFallbackMap$1 as LocaleFallbackMap, type LocaleOfKeys, type LocaleOfMulti, type LocalesForDeliveryArea, type LocalesForDeliveryAreaOrAll, type MissingTranslationContext, type MultiDictionary, type MultiParams, type NamespaceBoundTranslateFn, type NamespaceLoader, type OnMissingTranslation, type ParamsForNamespaces, type PartialKeyDictionary, type PartialMultiDictionary, type PartitionForLocale, type PartitionedLoader, type ResolvedLocaleTemplate, type SchemaForNamespaces, type ScopeForLocale, createI18nHandle, formatLocaleFallbackChain, invokeNamespaceLoader, mergeDictionaryLocalesCore, mergeNamespaceLocalesCore, normalizeI18nCreateInput, resolveLocaleTemplate, validateLocaleFallback };