@flyingrobots/bijou-i18n 5.0.0 → 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,7 +10,13 @@ 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
13
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
14
20
 
15
21
  This package is intentionally runtime-only. Spreadsheet workflows, stale detection, pseudo-localization, and catalog compilation belong in `@flyingrobots/bijou-i18n-tools`.
16
22
 
@@ -34,6 +40,35 @@ const runtime = await createI18nRuntimeAsync({
34
40
  });
35
41
  ```
36
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
+
37
72
  The same loader seam also supports file-backed locale bundles through
38
73
  `@flyingrobots/bijou-i18n-tools-node`:
39
74
 
@@ -57,6 +92,106 @@ await runtime.preloadLocale('de');
57
92
  await runtime.setLocale('de');
58
93
  ```
59
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
+
60
195
  ## Documentation
61
196
 
62
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 { createI18nRuntimeAsync, createI18nRuntime, ref, type I18nCatalogLoader, 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,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,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
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,sBAAsB,EACtB,iBAAiB,EACjB,GAAG,GAWJ,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;
@@ -25,13 +26,24 @@ export interface I18nFormatterPort {
25
26
  formatList(values: readonly string[], locale: string): string;
26
27
  }
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;
28
38
  export interface I18nRuntimeOptions {
29
39
  readonly locale: string;
30
40
  readonly direction: I18nDirection;
31
41
  readonly fallbackLocale?: string;
32
42
  readonly formatter?: Partial<I18nFormatterPort>;
43
+ readonly fallbackCatalogs?: readonly I18nCatalog[];
33
44
  readonly catalogs?: readonly I18nCatalog[];
34
45
  readonly loader?: I18nCatalogLoader;
46
+ readonly missingMessage?: I18nMissingMessageFormatter;
35
47
  }
36
48
  export interface I18nRuntime extends I18nFormatterPort {
37
49
  readonly locale: string;
@@ -41,6 +53,7 @@ export interface I18nRuntime extends I18nFormatterPort {
41
53
  unloadCatalog(namespace: string): void;
42
54
  preloadLocale(locale: string): Promise<void>;
43
55
  setLocale(locale: string, direction?: I18nDirection): Promise<void>;
56
+ localize<Value = unknown>(request: LocalizationRequest): LocalizedObject<Value>;
44
57
  t(key: I18nCatalogKey, values?: Readonly<Record<string, unknown>>): string;
45
58
  resource<T = unknown>(key: I18nCatalogKey): T | undefined;
46
59
  }
@@ -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,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;AAEpF,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,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CACrC;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,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,CAuK1E;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAM9F"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
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,7 +34,7 @@ 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();
37
38
  const manualCatalogs = new Map();
38
39
  const loaderCatalogs = new Map();
39
40
  const loaderCache = new Map();
@@ -44,33 +45,63 @@ export function createI18nRuntime(options) {
44
45
  function rememberCatalog(target, catalog) {
45
46
  target.set(catalog.namespace, catalog);
46
47
  }
47
- function applyCatalogs(source) {
48
+ function applyCatalogsTo(targetEntries, source) {
48
49
  for (const catalog of source.values()) {
49
- const scoped = [];
50
50
  for (const entry of catalog.entries) {
51
51
  const key = keyToString(entry.key);
52
- entries.set(key, entry);
53
- scoped.push(key);
52
+ const existing = targetEntries.get(key);
53
+ targetEntries.set(key, existing === undefined ? entry : mergeCatalogEntry(existing, entry));
54
54
  }
55
- namespaces.set(catalog.namespace, scoped);
56
55
  }
57
56
  }
58
- function rebuildCatalogState() {
59
- entries.clear();
60
- namespaces.clear();
61
- applyCatalogs(manualCatalogs);
62
- applyCatalogs(loaderCatalogs);
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
63
  }
64
- function getEntry(key) {
65
- const entry = entries.get(keyToString(key));
66
- if (entry === undefined) {
67
- throw new Error(`Missing i18n key: ${keyToString(key)}`);
64
+ function commitCatalogState(nextEntries) {
65
+ entries.clear();
66
+ for (const [key, entry] of nextEntries) {
67
+ entries.set(key, entry);
68
68
  }
69
- return entry;
70
69
  }
71
- 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
+ }
72
104
  const candidates = [
73
- entry.values[currentLocale],
74
105
  entry.values[entry.sourceLocale],
75
106
  entry.values[fallbackLocale],
76
107
  entry.fallbackValue,
@@ -79,43 +110,80 @@ export function createI18nRuntime(options) {
79
110
  if (candidate === undefined) {
80
111
  continue;
81
112
  }
82
- if (isReference(candidate)) {
83
- const refKey = keyToString(candidate.$ref);
84
- if (seen.has(refKey)) {
85
- throw new Error(`Cyclic i18n reference: ${refKey}`);
86
- }
87
- seen.add(refKey);
88
- const referencedEntry = entries.get(refKey);
89
- if (referencedEntry === undefined) {
90
- throw new Error(`Missing i18n reference: ${refKey}`);
91
- }
92
- const resolved = resolveLocalizedValue(referencedEntry, seen);
93
- seen.delete(refKey);
94
- if (resolved !== undefined) {
95
- return resolved;
96
- }
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) {
97
143
  throw new Error(`Missing i18n reference: ${refKey}`);
98
144
  }
99
- 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}`);
100
155
  }
101
- return undefined;
156
+ return {
157
+ status: candidateStatus,
158
+ value: candidate,
159
+ issues: [],
160
+ };
102
161
  }
103
162
  async function preloadLocale(locale) {
104
163
  if (options.loader === undefined || loaderCache.has(locale)) {
105
164
  return;
106
165
  }
107
- loaderCache.set(locale, await options.loader(locale));
166
+ const catalogs = await options.loader(locale);
167
+ loaderCache.set(locale, catalogs);
108
168
  }
109
- async function activateLoaderLocale(locale) {
169
+ async function loadLocaleCatalogs(locale) {
110
170
  if (options.loader === undefined) {
111
- return;
171
+ return undefined;
112
172
  }
113
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);
114
182
  loaderCatalogs.clear();
115
- for (const catalog of loaderCache.get(locale) ?? []) {
116
- rememberCatalog(loaderCatalogs, catalog);
183
+ for (const [namespace, catalog] of stagedLoaderCatalogs) {
184
+ loaderCatalogs.set(namespace, catalog);
117
185
  }
118
- rebuildCatalogState();
186
+ commitCatalogState(nextEntries);
119
187
  }
120
188
  if (options.catalogs !== undefined) {
121
189
  for (const catalog of options.catalogs) {
@@ -123,6 +191,97 @@ export function createI18nRuntime(options) {
123
191
  }
124
192
  rebuildCatalogState();
125
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
+ }
264
+ }
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
+ });
284
+ }
126
285
  return {
127
286
  get locale() {
128
287
  return currentLocale;
@@ -147,29 +306,46 @@ export function createI18nRuntime(options) {
147
306
  },
148
307
  preloadLocale,
149
308
  async setLocale(locale, direction) {
309
+ if (options.loader === undefined) {
310
+ currentLocale = locale;
311
+ if (direction !== undefined) {
312
+ currentDirection = direction;
313
+ }
314
+ return;
315
+ }
316
+ const catalogs = await loadLocaleCatalogs(locale);
317
+ if (catalogs !== undefined) {
318
+ activateLoaderCatalogs(catalogs);
319
+ }
150
320
  currentLocale = locale;
151
321
  if (direction !== undefined) {
152
322
  currentDirection = direction;
153
323
  }
154
- await activateLoaderLocale(locale);
324
+ },
325
+ localize(request) {
326
+ return localizeRequest(request);
155
327
  },
156
328
  t(key, values = {}) {
157
- const entry = getEntry(key);
158
- if (entry.kind !== 'message') {
329
+ const entry = entries.get(keyToString(key));
330
+ if (entry !== undefined && entry.kind !== 'message') {
159
331
  throw new Error(`Expected message entry for ${keyToString(key)} but found ${entry.kind}`);
160
332
  }
161
- const resolved = resolveLocalizedValue(entry, new Set());
162
- 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') {
163
338
  throw new Error(`Resolved message for ${keyToString(key)} was not a string`);
164
339
  }
165
- return interpolate(resolved, values);
340
+ return resolved.value;
166
341
  },
167
342
  resource(key) {
168
343
  const entry = entries.get(keyToString(key));
169
344
  if (entry === undefined) {
170
345
  return undefined;
171
346
  }
172
- return resolveLocalizedValue(entry, new Set());
347
+ const resolved = resolveLocalizedValue(entry, new Set());
348
+ return resolved === undefined ? undefined : freezeLocalizedValue(resolved);
173
349
  },
174
350
  formatNumber(value, locale) {
175
351
  return formatter.formatNumber(value, locale);
@@ -185,6 +361,21 @@ export function createI18nRuntime(options) {
185
361
  },
186
362
  };
187
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
+ }
188
379
  export async function createI18nRuntimeAsync(options) {
189
380
  const runtime = createI18nRuntime(options);
190
381
  if (options.loader !== undefined) {
@@ -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": "5.0.0",
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",