@flyingrobots/bijou-i18n 4.4.1 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,9 +10,188 @@ The in-memory localization runtime for Bijou.
10
10
  - generic resource lookup
11
11
  - runtime-safe references
12
12
  - locale-aware formatting seams
13
+ - explicit fallback catalogs
14
+ - injectable missing-localization message formatting
15
+ - async locale loader support for runtime-integrated catalog activation
16
+ - an application-facing `LocalizationPort` that resolves structured localized
17
+ objects
18
+ - `isJsonShapedLocalizedValue()` for adapter-side resource/data payload
19
+ conformance checks
13
20
 
14
21
  This package is intentionally runtime-only. Spreadsheet workflows, stale detection, pseudo-localization, and catalog compilation belong in `@flyingrobots/bijou-i18n-tools`.
15
22
 
23
+ ## Loader Seam
24
+
25
+ Use `createI18nRuntime()` for fully preloaded catalogs, or
26
+ `createI18nRuntimeAsync()` when catalogs need to be loaded lazily:
27
+
28
+ ```ts
29
+ import { createI18nRuntimeAsync, type I18nCatalogLoader } from '@flyingrobots/bijou-i18n';
30
+
31
+ const loader: I18nCatalogLoader = async (locale) => {
32
+ const module = await import(`./catalogs/${locale}.js`);
33
+ return module.catalogs;
34
+ };
35
+
36
+ const runtime = await createI18nRuntimeAsync({
37
+ locale: 'fr',
38
+ direction: 'ltr',
39
+ loader,
40
+ });
41
+ ```
42
+
43
+ When runtime payloads are generated as pure per-locale catalogs, load the source
44
+ or fallback catalog separately:
45
+
46
+ ```ts
47
+ import { createI18nRuntime } from '@flyingrobots/bijou-i18n';
48
+
49
+ const runtime = createI18nRuntime({
50
+ locale: 'fr',
51
+ direction: 'ltr',
52
+ fallbackLocale: 'en',
53
+ fallbackCatalogs: [englishCatalog],
54
+ catalogs: [frenchCatalog],
55
+ });
56
+ ```
57
+
58
+ Production apps can use fallback catalogs for readable missing translations.
59
+ Development apps can inject `missingMessage` to render a loud marker instead of
60
+ quietly falling back when the selected locale is missing a string:
61
+
62
+ ```ts
63
+ const runtime = createI18nRuntime({
64
+ locale: 'fr',
65
+ direction: 'ltr',
66
+ fallbackLocale: 'en',
67
+ fallbackCatalogs: [englishCatalog],
68
+ missingMessage: ({ key }) => `<MISSING LOC STRING KEY=${key.namespace}:${key.id}>`,
69
+ });
70
+ ```
71
+
72
+ The same loader seam also supports file-backed locale bundles through
73
+ `@flyingrobots/bijou-i18n-tools-node`:
74
+
75
+ ```ts
76
+ import { createI18nRuntimeAsync } from '@flyingrobots/bijou-i18n';
77
+ import { createCatalogBundleFileLoader } from '@flyingrobots/bijou-i18n-tools-node';
78
+
79
+ const runtime = await createI18nRuntimeAsync({
80
+ locale: 'fr',
81
+ direction: 'ltr',
82
+ loader: createCatalogBundleFileLoader({
83
+ resolvePath: (locale) => `./i18n/${locale}.json`,
84
+ }),
85
+ });
86
+ ```
87
+
88
+ Once created, the runtime can preload and activate locales explicitly:
89
+
90
+ ```ts
91
+ await runtime.preloadLocale('de');
92
+ await runtime.setLocale('de');
93
+ ```
94
+
95
+ ## Localization Port
96
+
97
+ Use `LocalizationPort` at application and view boundaries when callers need a
98
+ localized object instead of a concrete runtime:
99
+
100
+ ```ts
101
+ import {
102
+ createI18nRuntime,
103
+ createRuntimeLocalizationPort,
104
+ } from '@flyingrobots/bijou-i18n';
105
+
106
+ const runtime = createI18nRuntime({
107
+ locale: 'fr',
108
+ direction: 'ltr',
109
+ fallbackLocale: 'en',
110
+ fallbackCatalogs: [englishCatalog],
111
+ catalogs: [frenchCatalog],
112
+ });
113
+ const localization = createRuntimeLocalizationPort(runtime);
114
+
115
+ const title = localization.resolve<string>({
116
+ key: { namespace: 'app', id: 'title' },
117
+ });
118
+ ```
119
+
120
+ `resolve()` returns a frozen localized object with the key, locale, direction,
121
+ entry kind, translated/fallback/missing status, value, issues, and facts. That
122
+ keeps rendering code away from catalog loading, filesystem paths, CSV data, and
123
+ runtime mutation details while preserving enough state for tooling and lower
124
+ modes.
125
+
126
+ ## Resource And Data Payloads
127
+
128
+ Message entries resolve to strings. `resource` and `data` entries resolve to
129
+ portable structured values, and the runtime freezes those values before handing
130
+ them to callers.
131
+
132
+ Keep resource/data payloads JSON-shaped:
133
+
134
+ - strings, numbers, booleans, null, and undefined
135
+ - arrays with indexed entries only
136
+ - plain objects with enumerable data properties only
137
+
138
+ Do not use:
139
+
140
+ - class instances or built-ins such as `Date`
141
+ - symbol-keyed properties
142
+ - non-enumerable properties
143
+ - accessor properties
144
+ - cyclic object graphs
145
+ - functions, symbols, or bigint values
146
+
147
+ Unsupported shapes are rejected at the localization boundary rather than being
148
+ silently normalized. This keeps generated catalogs, runtime loader adapters, and
149
+ view code honest: adapters must produce portable data, and consumers can trust
150
+ that localized resource/data values are immutable snapshots rather than mutable
151
+ runtime handles.
152
+
153
+ Adapters can check payloads before building catalogs:
154
+
155
+ ```ts
156
+ import { isJsonShapedLocalizedValue } from '@flyingrobots/bijou-i18n';
157
+
158
+ if (!isJsonShapedLocalizedValue(payload)) {
159
+ throw new Error('i18n resource/data payload must be JSON-shaped');
160
+ }
161
+ ```
162
+
163
+ Valid resource/data payloads are dense, plain data:
164
+
165
+ ```ts
166
+ const validResource = {
167
+ label: 'Counter',
168
+ range: { min: 0, max: 10 },
169
+ marks: ['empty', 'half', 'full'],
170
+ };
171
+ ```
172
+
173
+ Invalid payloads are rejected instead of being silently normalized:
174
+
175
+ ```ts
176
+ class CounterResource {
177
+ readonly label = 'Counter';
178
+ }
179
+
180
+ const sparse = new Array<string>(2);
181
+ sparse[1] = 'full';
182
+
183
+ const accessor = Object.defineProperty({}, 'label', {
184
+ enumerable: true,
185
+ get() {
186
+ return 'Counter';
187
+ },
188
+ });
189
+
190
+ isJsonShapedLocalizedValue(new CounterResource()); // false
191
+ isJsonShapedLocalizedValue(sparse); // false
192
+ isJsonShapedLocalizedValue(accessor); // false
193
+ ```
194
+
16
195
  ## Documentation
17
196
 
18
197
  See the [Bijou repo](https://github.com/flyingrobots/bijou) for the full documentation map, architecture guide, and design system.
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
- export { createI18nRuntime, ref, type I18nCatalog, type I18nCatalogEntry, type I18nCatalogKey, type I18nDirection, type I18nEntryKind, type I18nFormatterPort, type I18nReference, type I18nRuntime, type I18nRuntimeOptions, } from './runtime.js';
1
+ export { createI18nRuntimeAsync, createI18nRuntime, ref, type I18nCatalogLoader, type I18nCatalog, type I18nCatalogEntry, type I18nCatalogKey, type I18nDirection, type I18nEntryKind, type I18nFormatterPort, type I18nMissingMessageContext, type I18nMissingMessageFormatter, type I18nMissingReason, type I18nReference, type I18nRuntime, type I18nRuntimeOptions, } from './runtime.js';
2
+ export { createRuntimeLocalizationPort, freezeLocalizedObject, freezeLocalizedValue, isJsonShapedLocalizedValue, type LocalizedObject, type LocalizationFact, type LocalizationFactKind, type LocalizationIssue, type LocalizationIssueCode, type LocalizationPort, type LocalizationRequest, type LocalizationStatus, type RuntimeLocalizationPortSource, } from './localization.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,GAAG,EACH,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,GAAG,EACH,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,GACnC,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
- export { createI18nRuntime, ref, } from './runtime.js';
1
+ export { createI18nRuntimeAsync, createI18nRuntime, ref, } from './runtime.js';
2
+ export { createRuntimeLocalizationPort, freezeLocalizedObject, freezeLocalizedValue, isJsonShapedLocalizedValue, } from './localization.js';
2
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,GAAG,GAUJ,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,GAAG,GAcJ,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,GAU3B,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,79 @@
1
+ import type { I18nCatalogKey, I18nDirection, I18nEntryKind } from './runtime.js';
2
+ export type LocalizationStatus = 'translated' | 'fallback' | 'missing';
3
+ export interface LocalizationRequest {
4
+ readonly key: I18nCatalogKey;
5
+ readonly kind?: I18nEntryKind;
6
+ readonly values?: Readonly<Record<string, unknown>>;
7
+ }
8
+ export type LocalizationIssueCode = 'missing-key' | 'missing-locale' | 'kind-mismatch' | 'invalid-message-value';
9
+ export interface LocalizationIssue {
10
+ readonly code: LocalizationIssueCode;
11
+ readonly key: I18nCatalogKey;
12
+ readonly locale: string;
13
+ readonly fallbackLocale: string;
14
+ readonly message: string;
15
+ }
16
+ export type LocalizationFactKind = 'locale' | 'direction' | 'localization-status' | 'entry-kind';
17
+ export interface LocalizationFact {
18
+ readonly kind: LocalizationFactKind;
19
+ readonly key: string;
20
+ readonly value: string;
21
+ }
22
+ /**
23
+ * Structured localization result returned by a {@link LocalizationPort}.
24
+ *
25
+ * Values are expected to be JSON-shaped boundary payloads: plain objects,
26
+ * arrays, scalars, or nullish values. Symbol-keyed properties, non-enumerable
27
+ * properties, cyclic graphs, class instances, and accessors are outside the
28
+ * portable catalog contract; accessors are rejected when plain objects cross
29
+ * the freeze boundary.
30
+ */
31
+ export interface LocalizedObject<Value = unknown> {
32
+ readonly key: I18nCatalogKey;
33
+ readonly locale: string;
34
+ readonly fallbackLocale: string;
35
+ readonly sourceLocale?: string;
36
+ readonly direction: I18nDirection;
37
+ readonly kind: I18nEntryKind;
38
+ readonly status: LocalizationStatus;
39
+ readonly value?: Value;
40
+ readonly issues: readonly LocalizationIssue[];
41
+ readonly facts: readonly LocalizationFact[];
42
+ }
43
+ export interface LocalizationPort {
44
+ readonly locale: string;
45
+ readonly direction: I18nDirection;
46
+ resolve<Value = unknown>(request: LocalizationRequest): LocalizedObject<Value>;
47
+ formatNumber(value: number): string;
48
+ formatDate(value: Date): string;
49
+ formatTime(value: Date): string;
50
+ formatList(values: readonly string[]): string;
51
+ }
52
+ export interface RuntimeLocalizationPortSource {
53
+ readonly locale: string;
54
+ readonly direction: I18nDirection;
55
+ localize<Value = unknown>(request: LocalizationRequest): LocalizedObject<Value>;
56
+ formatNumber(value: number, locale: string): string;
57
+ formatDate(value: Date, locale: string): string;
58
+ formatTime(value: Date, locale: string): string;
59
+ formatList(values: readonly string[], locale: string): string;
60
+ }
61
+ export declare function createRuntimeLocalizationPort(runtime: RuntimeLocalizationPortSource): LocalizationPort;
62
+ export declare function freezeLocalizedObject<Value>(object: LocalizedObject<Value>): LocalizedObject<Value>;
63
+ /**
64
+ * Deep-freeze a JSON-shaped localized value.
65
+ *
66
+ * This helper intentionally preserves the portable catalog contract rather
67
+ * than arbitrary JavaScript object identity. Plain objects must expose data
68
+ * properties only; accessor-backed plain objects are rejected.
69
+ */
70
+ export declare function freezeLocalizedValue<Value>(value: Value): Value;
71
+ /**
72
+ * Check whether a value can cross the localization resource/data boundary.
73
+ *
74
+ * This performs the same validation as {@link freezeLocalizedValue} without
75
+ * exposing the frozen clone. Adapter code can use it to reject non-portable
76
+ * payloads before constructing catalogs.
77
+ */
78
+ export declare function isJsonShapedLocalizedValue(value: unknown): boolean;
79
+ //# sourceMappingURL=localization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localization.d.ts","sourceRoot":"","sources":["../src/localization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ export function createRuntimeLocalizationPort(runtime) {
2
+ return Object.freeze({
3
+ get locale() {
4
+ return runtime.locale;
5
+ },
6
+ get direction() {
7
+ return runtime.direction;
8
+ },
9
+ resolve(request) {
10
+ return runtime.localize(request);
11
+ },
12
+ formatNumber(value) {
13
+ return runtime.formatNumber(value, runtime.locale);
14
+ },
15
+ formatDate(value) {
16
+ return runtime.formatDate(value, runtime.locale);
17
+ },
18
+ formatTime(value) {
19
+ return runtime.formatTime(value, runtime.locale);
20
+ },
21
+ formatList(values) {
22
+ return runtime.formatList(values, runtime.locale);
23
+ },
24
+ });
25
+ }
26
+ export function freezeLocalizedObject(object) {
27
+ return Object.freeze({
28
+ ...object,
29
+ key: Object.freeze({ ...object.key }),
30
+ value: freezeLocalizedValue(object.value),
31
+ issues: Object.freeze(object.issues.map((issue) => Object.freeze({
32
+ ...issue,
33
+ key: Object.freeze({ ...issue.key }),
34
+ }))),
35
+ facts: Object.freeze(object.facts.map((fact) => Object.freeze({ ...fact }))),
36
+ });
37
+ }
38
+ /**
39
+ * Deep-freeze a JSON-shaped localized value.
40
+ *
41
+ * This helper intentionally preserves the portable catalog contract rather
42
+ * than arbitrary JavaScript object identity. Plain objects must expose data
43
+ * properties only; accessor-backed plain objects are rejected.
44
+ */
45
+ export function freezeLocalizedValue(value) {
46
+ return cloneLocalizedValue(value, 'value', new WeakSet());
47
+ }
48
+ /**
49
+ * Check whether a value can cross the localization resource/data boundary.
50
+ *
51
+ * This performs the same validation as {@link freezeLocalizedValue} without
52
+ * exposing the frozen clone. Adapter code can use it to reject non-portable
53
+ * payloads before constructing catalogs.
54
+ */
55
+ export function isJsonShapedLocalizedValue(value) {
56
+ try {
57
+ freezeLocalizedValue(value);
58
+ return true;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ function cloneLocalizedValue(value, path, seen) {
65
+ if (value == null || typeof value !== 'object') {
66
+ if (typeof value === 'bigint' || typeof value === 'symbol' || typeof value === 'function') {
67
+ throw new Error(`Localized value contains unsupported ${typeof value} at ${path}`);
68
+ }
69
+ return value;
70
+ }
71
+ const objectValue = value;
72
+ if (seen.has(objectValue)) {
73
+ throw new Error(`Localized value contains circular reference at ${path}`);
74
+ }
75
+ seen.add(objectValue);
76
+ try {
77
+ return cloneLocalizedObjectValue(value, path, seen);
78
+ }
79
+ finally {
80
+ seen.delete(objectValue);
81
+ }
82
+ }
83
+ function cloneLocalizedObjectValue(value, path, seen) {
84
+ if (Array.isArray(value)) {
85
+ validateLocalizedArray(value, path);
86
+ return Object.freeze(value.map((item, index) => cloneLocalizedValue(item, `${path}[${index}]`, seen)));
87
+ }
88
+ const prototype = Object.getPrototypeOf(value);
89
+ if (prototype !== Object.prototype && prototype !== null) {
90
+ throw new Error(`Localized value contains unsupported ${objectKind(value)} at ${path}`);
91
+ }
92
+ const output = {};
93
+ const descriptors = Object.getOwnPropertyDescriptors(value);
94
+ for (const key of Reflect.ownKeys(descriptors)) {
95
+ if (typeof key === 'symbol') {
96
+ throw new Error(`Localized value contains unsupported symbol property at ${path}`);
97
+ }
98
+ const descriptor = descriptors[key];
99
+ if (descriptor === undefined) {
100
+ continue;
101
+ }
102
+ const propertyPath = `${path}.${key}`;
103
+ if (!descriptor.enumerable) {
104
+ throw new Error(`Localized value contains unsupported non-enumerable property: ${propertyPath}`);
105
+ }
106
+ if (!('value' in descriptor)) {
107
+ throw new Error(`Localized value contains unsupported accessor property: ${propertyPath}`);
108
+ }
109
+ output[key] = cloneLocalizedValue(descriptor.value, propertyPath, seen);
110
+ }
111
+ return Object.freeze(output);
112
+ }
113
+ function validateLocalizedArray(value, path) {
114
+ const descriptors = Object.getOwnPropertyDescriptors(value);
115
+ let indexedPropertyCount = 0;
116
+ for (const key of Reflect.ownKeys(descriptors)) {
117
+ if (typeof key === 'symbol') {
118
+ throw new Error(`Localized value contains unsupported symbol property at ${path}`);
119
+ }
120
+ if (key === 'length') {
121
+ continue;
122
+ }
123
+ const descriptor = descriptors[key];
124
+ if (descriptor === undefined) {
125
+ continue;
126
+ }
127
+ const propertyPath = arrayPropertyPath(path, key);
128
+ if (!descriptor.enumerable) {
129
+ throw new Error(`Localized value contains unsupported non-enumerable property: ${propertyPath}`);
130
+ }
131
+ if (!('value' in descriptor)) {
132
+ throw new Error(`Localized value contains unsupported accessor property: ${propertyPath}`);
133
+ }
134
+ if (!isArrayIndexKey(key)) {
135
+ throw new Error(`Localized value contains unsupported array property: ${propertyPath}`);
136
+ }
137
+ indexedPropertyCount += 1;
138
+ }
139
+ if (indexedPropertyCount !== value.length) {
140
+ throw new Error(`Localized value contains unsupported sparse array at ${path}`);
141
+ }
142
+ }
143
+ function arrayPropertyPath(path, key) {
144
+ return isArrayIndexKey(key) ? `${path}[${key}]` : `${path}.${key}`;
145
+ }
146
+ function isArrayIndexKey(key) {
147
+ if (key === '') {
148
+ return false;
149
+ }
150
+ const index = Number(key);
151
+ return Number.isInteger(index)
152
+ && index >= 0
153
+ && index < 2 ** 32 - 1
154
+ && String(index) === key;
155
+ }
156
+ function objectKind(value) {
157
+ return Object.prototype.toString.call(value).slice(8, -1);
158
+ }
159
+ //# sourceMappingURL=localization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localization.js","sourceRoot":"","sources":["../src/localization.ts"],"names":[],"mappings":"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"}
package/dist/runtime.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type LocalizedObject, type LocalizationRequest } from './localization.js';
1
2
  export type I18nDirection = 'ltr' | 'rtl' | 'auto';
2
3
  export interface I18nCatalogKey {
3
4
  readonly namespace: string;
@@ -24,20 +25,39 @@ export interface I18nFormatterPort {
24
25
  formatTime(value: Date, locale: string): string;
25
26
  formatList(values: readonly string[], locale: string): string;
26
27
  }
28
+ export type I18nCatalogLoader = (locale: string) => Promise<readonly I18nCatalog[]>;
29
+ export type I18nMissingReason = 'missing-key' | 'missing-locale';
30
+ export interface I18nMissingMessageContext {
31
+ readonly key: I18nCatalogKey;
32
+ readonly locale: string;
33
+ readonly fallbackLocale: string;
34
+ readonly sourceLocale?: string;
35
+ readonly reason: I18nMissingReason;
36
+ }
37
+ export type I18nMissingMessageFormatter = (context: I18nMissingMessageContext) => string;
27
38
  export interface I18nRuntimeOptions {
28
39
  readonly locale: string;
29
40
  readonly direction: I18nDirection;
30
41
  readonly fallbackLocale?: string;
31
42
  readonly formatter?: Partial<I18nFormatterPort>;
43
+ readonly fallbackCatalogs?: readonly I18nCatalog[];
44
+ readonly catalogs?: readonly I18nCatalog[];
45
+ readonly loader?: I18nCatalogLoader;
46
+ readonly missingMessage?: I18nMissingMessageFormatter;
32
47
  }
33
48
  export interface I18nRuntime extends I18nFormatterPort {
34
49
  readonly locale: string;
35
50
  readonly direction: I18nDirection;
36
51
  loadCatalog(catalog: I18nCatalog): void;
52
+ loadCatalogs(catalogs: readonly I18nCatalog[]): void;
37
53
  unloadCatalog(namespace: string): void;
54
+ preloadLocale(locale: string): Promise<void>;
55
+ setLocale(locale: string, direction?: I18nDirection): Promise<void>;
56
+ localize<Value = unknown>(request: LocalizationRequest): LocalizedObject<Value>;
38
57
  t(key: I18nCatalogKey, values?: Readonly<Record<string, unknown>>): string;
39
58
  resource<T = unknown>(key: I18nCatalogKey): T | undefined;
40
59
  }
41
60
  export declare function ref(key: I18nCatalogKey): I18nReference;
42
61
  export declare function createI18nRuntime(options: I18nRuntimeOptions): I18nRuntime;
62
+ export declare function createI18nRuntimeAsync(options: I18nRuntimeOptions): Promise<I18nRuntime>;
43
63
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACpD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACxC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,CAAC,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC;IAC3E,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,CAAC,GAAG,SAAS,CAAC;CAC3D;AAoCD,wBAAgB,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,aAAa,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAyG1E"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAEpB,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACpD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/D;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;AAEpF,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAEjE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED,MAAM,MAAM,2BAA2B,GAAG,CAAC,OAAO,EAAE,yBAAyB,KAAK,MAAM,CAAC;AAEzF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,2BAA2B,CAAC;CACvD;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACxC,YAAY,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,CAAC;IACrD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,QAAQ,CAAC,KAAK,GAAG,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC;IAC3E,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,CAAC,GAAG,SAAS,CAAC;CAC3D;AA0CD,wBAAgB,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,aAAa,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAmZ1E;AAkBD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAM9F"}
package/dist/runtime.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { freezeLocalizedObject, freezeLocalizedValue, } from './localization.js';
1
2
  const DEFAULT_FORMATTER = {
2
3
  formatNumber(value, locale) {
3
4
  return new Intl.NumberFormat(locale).format(value);
@@ -33,19 +34,74 @@ export function ref(key) {
33
34
  }
34
35
  export function createI18nRuntime(options) {
35
36
  const entries = new Map();
36
- const namespaces = new Map();
37
+ const fallbackCatalogs = new Map();
38
+ const manualCatalogs = new Map();
39
+ const loaderCatalogs = new Map();
40
+ const loaderCache = new Map();
37
41
  const formatter = { ...DEFAULT_FORMATTER, ...(options.formatter ?? {}) };
38
42
  const fallbackLocale = options.fallbackLocale ?? 'en';
39
- function getEntry(key) {
40
- const entry = entries.get(keyToString(key));
41
- if (entry === undefined) {
42
- throw new Error(`Missing i18n key: ${keyToString(key)}`);
43
+ let currentLocale = options.locale;
44
+ let currentDirection = options.direction;
45
+ function rememberCatalog(target, catalog) {
46
+ target.set(catalog.namespace, catalog);
47
+ }
48
+ function applyCatalogsTo(targetEntries, source) {
49
+ for (const catalog of source.values()) {
50
+ for (const entry of catalog.entries) {
51
+ const key = keyToString(entry.key);
52
+ const existing = targetEntries.get(key);
53
+ targetEntries.set(key, existing === undefined ? entry : mergeCatalogEntry(existing, entry));
54
+ }
55
+ }
56
+ }
57
+ function buildCatalogState(stagedLoaderCatalogs = loaderCatalogs) {
58
+ const nextEntries = new Map();
59
+ applyCatalogsTo(nextEntries, fallbackCatalogs);
60
+ applyCatalogsTo(nextEntries, manualCatalogs);
61
+ applyCatalogsTo(nextEntries, stagedLoaderCatalogs);
62
+ return nextEntries;
63
+ }
64
+ function commitCatalogState(nextEntries) {
65
+ entries.clear();
66
+ for (const [key, entry] of nextEntries) {
67
+ entries.set(key, entry);
43
68
  }
44
- return entry;
45
69
  }
46
- function resolveLocalizedValue(entry, seen) {
70
+ function rebuildCatalogState() {
71
+ commitCatalogState(buildCatalogState());
72
+ }
73
+ function localizationIssue(code, key, message) {
74
+ return {
75
+ code,
76
+ key,
77
+ locale: currentLocale,
78
+ fallbackLocale,
79
+ message,
80
+ };
81
+ }
82
+ function resolveLocalizedValueResult(entry, seen, options = {}) {
83
+ const localized = entry.values[currentLocale];
84
+ if (localized !== undefined) {
85
+ return resolveCandidateResult(localized, seen, options, 'translated');
86
+ }
87
+ if (options.missingMessage !== undefined
88
+ && currentLocale !== entry.sourceLocale
89
+ && currentLocale !== fallbackLocale) {
90
+ return {
91
+ status: 'missing',
92
+ value: options.missingMessage({
93
+ key: entry.key,
94
+ locale: currentLocale,
95
+ fallbackLocale,
96
+ sourceLocale: entry.sourceLocale,
97
+ reason: 'missing-locale',
98
+ }),
99
+ issues: [
100
+ localizationIssue('missing-locale', entry.key, `Missing selected-locale value for ${keyToString(entry.key)}`),
101
+ ],
102
+ };
103
+ }
47
104
  const candidates = [
48
- entry.values[options.locale],
49
105
  entry.values[entry.sourceLocale],
50
106
  entry.values[fallbackLocale],
51
107
  entry.fallbackValue,
@@ -54,66 +110,242 @@ export function createI18nRuntime(options) {
54
110
  if (candidate === undefined) {
55
111
  continue;
56
112
  }
57
- if (isReference(candidate)) {
58
- const refKey = keyToString(candidate.$ref);
59
- if (seen.has(refKey)) {
60
- throw new Error(`Cyclic i18n reference: ${refKey}`);
61
- }
62
- seen.add(refKey);
63
- const referencedEntry = entries.get(refKey);
64
- if (referencedEntry === undefined) {
65
- throw new Error(`Missing i18n reference: ${refKey}`);
66
- }
67
- const resolved = resolveLocalizedValue(referencedEntry, seen);
68
- seen.delete(refKey);
69
- if (resolved !== undefined) {
70
- return resolved;
71
- }
113
+ return resolveCandidateResult(candidate, seen, options, 'fallback');
114
+ }
115
+ return {
116
+ status: 'missing',
117
+ issues: [
118
+ localizationIssue('missing-locale', entry.key, `Missing localized value for ${keyToString(entry.key)}`),
119
+ ],
120
+ };
121
+ }
122
+ function resolveLocalizedValue(entry, seen, options = {}) {
123
+ return resolveLocalizedValueResult(entry, seen, options).value;
124
+ }
125
+ function mergeResolutionStatus(candidateStatus, referencedStatus) {
126
+ if (candidateStatus === 'missing' || referencedStatus === 'missing') {
127
+ return 'missing';
128
+ }
129
+ if (candidateStatus === 'fallback' || referencedStatus === 'fallback') {
130
+ return 'fallback';
131
+ }
132
+ return 'translated';
133
+ }
134
+ function resolveCandidateResult(candidate, seen, options = {}, candidateStatus) {
135
+ if (isReference(candidate)) {
136
+ const refKey = keyToString(candidate.$ref);
137
+ if (seen.has(refKey)) {
138
+ throw new Error(`Cyclic i18n reference: ${refKey}`);
139
+ }
140
+ seen.add(refKey);
141
+ const referencedEntry = entries.get(refKey);
142
+ if (referencedEntry === undefined) {
72
143
  throw new Error(`Missing i18n reference: ${refKey}`);
73
144
  }
74
- return candidate;
145
+ const resolved = resolveLocalizedValueResult(referencedEntry, seen, options);
146
+ seen.delete(refKey);
147
+ if (resolved.value !== undefined) {
148
+ return {
149
+ status: mergeResolutionStatus(candidateStatus, resolved.status),
150
+ value: resolved.value,
151
+ issues: resolved.issues,
152
+ };
153
+ }
154
+ throw new Error(`Missing i18n reference: ${refKey}`);
155
+ }
156
+ return {
157
+ status: candidateStatus,
158
+ value: candidate,
159
+ issues: [],
160
+ };
161
+ }
162
+ async function preloadLocale(locale) {
163
+ if (options.loader === undefined || loaderCache.has(locale)) {
164
+ return;
165
+ }
166
+ const catalogs = await options.loader(locale);
167
+ loaderCache.set(locale, catalogs);
168
+ }
169
+ async function loadLocaleCatalogs(locale) {
170
+ if (options.loader === undefined) {
171
+ return undefined;
172
+ }
173
+ await preloadLocale(locale);
174
+ return loaderCache.get(locale) ?? [];
175
+ }
176
+ function activateLoaderCatalogs(catalogs) {
177
+ const stagedLoaderCatalogs = new Map();
178
+ for (const catalog of catalogs) {
179
+ rememberCatalog(stagedLoaderCatalogs, catalog);
180
+ }
181
+ const nextEntries = buildCatalogState(stagedLoaderCatalogs);
182
+ loaderCatalogs.clear();
183
+ for (const [namespace, catalog] of stagedLoaderCatalogs) {
184
+ loaderCatalogs.set(namespace, catalog);
185
+ }
186
+ commitCatalogState(nextEntries);
187
+ }
188
+ if (options.catalogs !== undefined) {
189
+ for (const catalog of options.catalogs) {
190
+ rememberCatalog(manualCatalogs, catalog);
191
+ }
192
+ rebuildCatalogState();
193
+ }
194
+ if (options.fallbackCatalogs !== undefined) {
195
+ for (const catalog of options.fallbackCatalogs) {
196
+ rememberCatalog(fallbackCatalogs, catalog);
197
+ }
198
+ rebuildCatalogState();
199
+ }
200
+ function localizeRequest(request) {
201
+ const entry = entries.get(keyToString(request.key));
202
+ const kind = request.kind ?? entry?.kind ?? 'message';
203
+ const facts = [
204
+ { kind: 'locale', key: 'locale', value: currentLocale },
205
+ { kind: 'direction', key: 'direction', value: currentDirection },
206
+ ];
207
+ if (entry === undefined) {
208
+ const issue = localizationIssue('missing-key', request.key, `Missing i18n key: ${keyToString(request.key)}`);
209
+ const value = kind === 'message' && options.missingMessage !== undefined
210
+ ? interpolate(options.missingMessage({
211
+ key: request.key,
212
+ locale: currentLocale,
213
+ fallbackLocale,
214
+ reason: 'missing-key',
215
+ }), request.values ?? {})
216
+ : undefined;
217
+ return freezeLocalizedObject({
218
+ key: request.key,
219
+ locale: currentLocale,
220
+ fallbackLocale,
221
+ direction: currentDirection,
222
+ kind,
223
+ status: 'missing',
224
+ value,
225
+ issues: [issue],
226
+ facts: [
227
+ ...facts,
228
+ { kind: 'localization-status', key: 'status', value: 'missing' },
229
+ { kind: 'entry-kind', key: 'kind', value: kind },
230
+ ],
231
+ });
232
+ }
233
+ if (request.kind !== undefined && entry.kind !== request.kind) {
234
+ const issue = localizationIssue('kind-mismatch', request.key, `Expected ${request.kind} entry for ${keyToString(request.key)} but found ${entry.kind}`);
235
+ return freezeLocalizedObject({
236
+ key: request.key,
237
+ locale: currentLocale,
238
+ fallbackLocale,
239
+ sourceLocale: entry.sourceLocale,
240
+ direction: currentDirection,
241
+ kind: entry.kind,
242
+ status: 'missing',
243
+ issues: [issue],
244
+ facts: [
245
+ ...facts,
246
+ { kind: 'localization-status', key: 'status', value: 'missing' },
247
+ { kind: 'entry-kind', key: 'kind', value: entry.kind },
248
+ ],
249
+ });
250
+ }
251
+ const resolved = resolveLocalizedValueResult(entry, new Set(), {
252
+ missingMessage: entry.kind === 'message' ? options.missingMessage : undefined,
253
+ });
254
+ let value = resolved.value;
255
+ const issues = [...resolved.issues];
256
+ if (entry.kind === 'message' && value !== undefined) {
257
+ if (typeof value !== 'string') {
258
+ issues.push(localizationIssue('invalid-message-value', request.key, `Resolved message for ${keyToString(request.key)} was not a string`));
259
+ value = undefined;
260
+ }
261
+ else {
262
+ value = interpolate(value, request.values ?? {});
263
+ }
75
264
  }
76
- return undefined;
265
+ const status = issues.some((issue) => issue.code === 'invalid-message-value')
266
+ ? 'missing'
267
+ : resolved.status;
268
+ return freezeLocalizedObject({
269
+ key: request.key,
270
+ locale: currentLocale,
271
+ fallbackLocale,
272
+ sourceLocale: entry.sourceLocale,
273
+ direction: currentDirection,
274
+ kind: entry.kind,
275
+ status,
276
+ value,
277
+ issues,
278
+ facts: [
279
+ ...facts,
280
+ { kind: 'localization-status', key: 'status', value: status },
281
+ { kind: 'entry-kind', key: 'kind', value: entry.kind },
282
+ ],
283
+ });
77
284
  }
78
285
  return {
79
- locale: options.locale,
80
- direction: options.direction,
286
+ get locale() {
287
+ return currentLocale;
288
+ },
289
+ get direction() {
290
+ return currentDirection;
291
+ },
81
292
  loadCatalog(catalog) {
82
- const scoped = namespaces.get(catalog.namespace) ?? [];
83
- for (const entry of catalog.entries) {
84
- const key = keyToString(entry.key);
85
- entries.set(key, entry);
86
- scoped.push(key);
293
+ rememberCatalog(manualCatalogs, catalog);
294
+ rebuildCatalogState();
295
+ },
296
+ loadCatalogs(catalogs) {
297
+ for (const catalog of catalogs) {
298
+ rememberCatalog(manualCatalogs, catalog);
87
299
  }
88
- namespaces.set(catalog.namespace, scoped);
300
+ rebuildCatalogState();
89
301
  },
90
302
  unloadCatalog(namespace) {
91
- const scoped = namespaces.get(namespace);
92
- if (scoped === undefined) {
303
+ manualCatalogs.delete(namespace);
304
+ loaderCatalogs.delete(namespace);
305
+ rebuildCatalogState();
306
+ },
307
+ preloadLocale,
308
+ async setLocale(locale, direction) {
309
+ if (options.loader === undefined) {
310
+ currentLocale = locale;
311
+ if (direction !== undefined) {
312
+ currentDirection = direction;
313
+ }
93
314
  return;
94
315
  }
95
- for (const key of scoped) {
96
- entries.delete(key);
316
+ const catalogs = await loadLocaleCatalogs(locale);
317
+ if (catalogs !== undefined) {
318
+ activateLoaderCatalogs(catalogs);
97
319
  }
98
- namespaces.delete(namespace);
320
+ currentLocale = locale;
321
+ if (direction !== undefined) {
322
+ currentDirection = direction;
323
+ }
324
+ },
325
+ localize(request) {
326
+ return localizeRequest(request);
99
327
  },
100
328
  t(key, values = {}) {
101
- const entry = getEntry(key);
102
- if (entry.kind !== 'message') {
329
+ const entry = entries.get(keyToString(key));
330
+ if (entry !== undefined && entry.kind !== 'message') {
103
331
  throw new Error(`Expected message entry for ${keyToString(key)} but found ${entry.kind}`);
104
332
  }
105
- const resolved = resolveLocalizedValue(entry, new Set());
106
- if (typeof resolved !== 'string') {
333
+ const resolved = localizeRequest({ key, kind: 'message', values });
334
+ if (resolved.value === undefined) {
335
+ throw new Error(`Missing i18n key: ${keyToString(key)}`);
336
+ }
337
+ if (typeof resolved.value !== 'string') {
107
338
  throw new Error(`Resolved message for ${keyToString(key)} was not a string`);
108
339
  }
109
- return interpolate(resolved, values);
340
+ return resolved.value;
110
341
  },
111
342
  resource(key) {
112
343
  const entry = entries.get(keyToString(key));
113
344
  if (entry === undefined) {
114
345
  return undefined;
115
346
  }
116
- return resolveLocalizedValue(entry, new Set());
347
+ const resolved = resolveLocalizedValue(entry, new Set());
348
+ return resolved === undefined ? undefined : freezeLocalizedValue(resolved);
117
349
  },
118
350
  formatNumber(value, locale) {
119
351
  return formatter.formatNumber(value, locale);
@@ -129,4 +361,26 @@ export function createI18nRuntime(options) {
129
361
  },
130
362
  };
131
363
  }
364
+ function mergeCatalogEntry(left, right) {
365
+ if (left.kind !== right.kind || left.sourceLocale !== right.sourceLocale) {
366
+ throw new Error(`Conflicting i18n catalog entry metadata for ${keyToString(left.key)}`);
367
+ }
368
+ return {
369
+ key: left.key,
370
+ kind: left.kind,
371
+ sourceLocale: left.sourceLocale,
372
+ values: {
373
+ ...left.values,
374
+ ...right.values,
375
+ },
376
+ fallbackValue: right.fallbackValue ?? left.fallbackValue,
377
+ };
378
+ }
379
+ export async function createI18nRuntimeAsync(options) {
380
+ const runtime = createI18nRuntime(options);
381
+ if (options.loader !== undefined) {
382
+ await runtime.setLocale(options.locale, options.direction);
383
+ }
384
+ return runtime;
385
+ }
132
386
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flyingrobots/bijou-i18n",
3
- "version": "4.4.1",
3
+ "version": "7.0.0",
4
4
  "description": "In-memory localization runtime for Bijou — catalogs, locale direction, and runtime-safe lookups.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -26,7 +26,7 @@
26
26
  "devDependencies": {
27
27
  "@types/node": "^22.0.0",
28
28
  "typescript": "^5.9.3",
29
- "vitest": "^4.0.18"
29
+ "vitest": "^4.1.8"
30
30
  },
31
31
  "keywords": [
32
32
  "i18n",