@flyingrobots/bijou-i18n-tools 5.0.0 → 7.1.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
@@ -9,6 +9,8 @@ Workflow and authoring tooling for Bijou localization.
9
9
  - provider-neutral tabular export/import rows
10
10
  - spreadsheet-friendly workbook export/import
11
11
  - CSV/TSV sheet serialization and parsing
12
+ - source string-table CSV/TSV import/export
13
+ - per-locale runtime catalog generation from string tables
12
14
  - serializable catalog-bundle export/import
13
15
  - JSON bundle serialization and parsing
14
16
  - provider-neutral async service adapter ports for workbook and bundle exchange
@@ -19,6 +21,26 @@ Workflow and authoring tooling for Bijou localization.
19
21
 
20
22
  This package is intentionally provider-neutral. Filesystem, XLSX, or service-backed adapters can sit on top of it without polluting the core tooling API.
21
23
 
24
+ ## String Table Workflow
25
+
26
+ Use the string-table helpers when one committed CSV/TSV file should be the
27
+ translation source and runtime should load one selected locale at a time:
28
+
29
+ ```typescript
30
+ import {
31
+ parseStringTable,
32
+ runtimeCatalogsForLocaleFromStringTable,
33
+ } from '@flyingrobots/bijou-i18n-tools';
34
+
35
+ const table = parseStringTable(csv, 'csv');
36
+ const catalogs = runtimeCatalogsForLocaleFromStringTable(table, 'fr');
37
+ ```
38
+
39
+ The generated runtime catalogs include only the selected locale's values. Source
40
+ strings remain in the string table and the generated source-locale catalog.
41
+ Other locale translations stay in the source table and do not ride along in the
42
+ runtime payload.
43
+
22
44
  Service-backed workflows can use the built-in async adapter ports without
23
45
  pulling remote service details into the tooling core:
24
46
 
@@ -1,5 +1,15 @@
1
1
  import type { CatalogBundle, ExchangeSheet } from './exchange.js';
2
2
  export type DelimitedFormat = 'csv' | 'tsv';
3
+ export interface DelimitedSheet {
4
+ readonly columns: readonly string[];
5
+ readonly rows: readonly Readonly<Record<string, string>>[];
6
+ }
7
+ export interface DelimitedSheetInput {
8
+ readonly columns: readonly string[];
9
+ readonly rows: readonly object[];
10
+ }
11
+ export declare function serializeDelimitedSheet(sheet: DelimitedSheetInput, format: DelimitedFormat): string;
12
+ export declare function parseDelimitedSheet(input: string, format: DelimitedFormat): DelimitedSheet;
3
13
  export declare function serializeExchangeSheet(sheet: ExchangeSheet, format: DelimitedFormat): string;
4
14
  export declare function parseExchangeSheet(name: string, input: string, format: DelimitedFormat): ExchangeSheet;
5
15
  export declare function serializeCatalogBundleJson(bundle: CatalogBundle): string;
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAA0B,MAAM,eAAe,CAAC;AAG1F,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;AA4G5C,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAa5F;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GACtB,aAAa,CA0Bf;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAExE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAcnE"}
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAA0B,MAAM,eAAe,CAAC;AAG1F,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAiHD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAUnG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,cAAc,CA0B1F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAE5F;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GACtB,aAAa,CAYf;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAExE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAcnE"}
package/dist/adapters.js CHANGED
@@ -88,38 +88,52 @@ function assertWorkbookRow(row, context) {
88
88
  }
89
89
  return row;
90
90
  }
91
- export function serializeExchangeSheet(sheet, format) {
91
+ function serializedCell(row, column) {
92
+ const value = row[column];
93
+ return typeof value === 'string' ? value : '';
94
+ }
95
+ export function serializeDelimitedSheet(sheet, format) {
92
96
  const delimiter = delimiterFor(format);
93
97
  const lines = [
94
98
  serializeDelimitedRow(sheet.columns, delimiter),
95
- ...sheet.rows.map((row) => serializeDelimitedRow(sheet.columns.map((column) => {
96
- const value = row[column];
97
- return typeof value === 'string' ? value : '';
98
- }), delimiter)),
99
+ ...sheet.rows.map((row) => serializeDelimitedRow(sheet.columns.map((column) => serializedCell(row, column)), delimiter)),
99
100
  ];
100
101
  return lines.join('\n');
101
102
  }
102
- export function parseExchangeSheet(name, input, format) {
103
+ export function parseDelimitedSheet(input, format) {
103
104
  const delimiter = delimiterFor(format);
104
105
  const rows = parseDelimited(input, delimiter);
105
106
  if (rows.length === 0) {
106
- throw new Error(`Invalid delimited sheet: empty ${name}`);
107
+ throw new Error('Invalid delimited sheet: empty input');
107
108
  }
108
109
  const [header, ...body] = rows;
109
110
  if (header === undefined) {
110
- throw new Error(`Invalid delimited sheet: missing header in ${name}`);
111
+ throw new Error('Invalid delimited sheet: missing header');
111
112
  }
112
113
  const columns = [...header];
113
114
  const parsedRows = body.map((cells, rowIndex) => {
114
115
  if (cells.length !== columns.length) {
115
- throw new Error(`Invalid delimited sheet: ragged row ${rowIndex + 2} in ${name}`);
116
+ throw new Error(`Invalid delimited sheet: ragged row ${rowIndex + 2}`);
116
117
  }
117
- const record = Object.fromEntries(columns.map((column, index) => [column, cells[index] ?? '']));
118
+ return Object.freeze(Object.fromEntries(columns.map((column, index) => [column, cells[index] ?? ''])));
119
+ });
120
+ return Object.freeze({
121
+ columns: Object.freeze(columns),
122
+ rows: Object.freeze(parsedRows),
123
+ });
124
+ }
125
+ export function serializeExchangeSheet(sheet, format) {
126
+ return serializeDelimitedSheet(sheet, format);
127
+ }
128
+ export function parseExchangeSheet(name, input, format) {
129
+ const sheet = parseDelimitedSheet(input, format);
130
+ const parsedRows = sheet.rows.map((row, rowIndex) => {
131
+ const record = { ...row };
118
132
  return assertWorkbookRow(record, `${name}:${rowIndex + 2}`);
119
133
  });
120
134
  return {
121
135
  name,
122
- columns,
136
+ columns: sheet.columns,
123
137
  rows: parsedRows,
124
138
  };
125
139
  }
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- export { parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeExchangeSheet, type DelimitedFormat, } from './adapters.js';
1
+ export { parseDelimitedSheet, parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeDelimitedSheet, serializeExchangeSheet, type DelimitedFormat, type DelimitedSheet, type DelimitedSheetInput, } from './adapters.js';
2
2
  export { decodeExchangeValue, encodeExchangeValue, exportCatalogBundle, exportTranslationWorkbook, importCatalogBundle, importTranslationWorkbook, type CatalogBundle, type EncodedExchangeValue, type ExchangeSheet, type ExchangeValueKind, type ExchangeWorkbook, type SerializedAuthoringCatalog, type SerializedAuthoringCatalogEntry, type SerializedAuthoringTranslation, type TranslationWorkbookRow, } from './exchange.js';
3
3
  export { compileCatalogs, exportTranslationRows, hashSourceValue, importTranslationRows, markStaleTranslations, pseudoLocalize, ref, type AuthoringCatalog, type AuthoringCatalogEntry, type AuthoringTranslation, type AuthoringTranslationStatus, type TranslationRow, } from './tools.js';
4
4
  export { pullCatalogBundleFromService, pullTranslationWorkbookFromService, pushCatalogBundleToService, pushTranslationWorkbookToService, type CatalogBundleServiceAdapter, type CatalogBundleServicePullResult, type ExchangeWorkbookServiceAdapter, type ServiceExchangeAdapter, type ServiceExchangeSnapshot, type TranslationWorkbookServicePullResult, } from './service.js';
5
+ export { authoringCatalogsFromStringTable, exportStringTable, parseStringTable, runtimeCatalogsByLocaleFromStringTable, runtimeCatalogsForLocaleFromStringTable, serializeStringTable, stringTableFromDelimitedSheet, type StringTable, type StringTableRow, } from './string-table.js';
5
6
  //# 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,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,GAAG,EACH,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,0BAA0B,EAC1B,gCAAgC,EAChC,KAAK,2BAA2B,EAChC,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oCAAoC,GAC1C,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,GAAG,EACH,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,0BAA0B,EAC1B,gCAAgC,EAChC,KAAK,2BAA2B,EAChC,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oCAAoC,GAC1C,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gCAAgC,EAChC,iBAAiB,EACjB,gBAAgB,EAChB,sCAAsC,EACtC,uCAAuC,EACvC,oBAAoB,EACpB,6BAA6B,EAC7B,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
- export { parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeExchangeSheet, } from './adapters.js';
1
+ export { parseDelimitedSheet, parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeDelimitedSheet, serializeExchangeSheet, } from './adapters.js';
2
2
  export { decodeExchangeValue, encodeExchangeValue, exportCatalogBundle, exportTranslationWorkbook, importCatalogBundle, importTranslationWorkbook, } from './exchange.js';
3
3
  export { compileCatalogs, exportTranslationRows, hashSourceValue, importTranslationRows, markStaleTranslations, pseudoLocalize, ref, } from './tools.js';
4
4
  export { pullCatalogBundleFromService, pullTranslationWorkbookFromService, pushCatalogBundleToService, pushTranslationWorkbookToService, } from './service.js';
5
+ export { authoringCatalogsFromStringTable, exportStringTable, parseStringTable, runtimeCatalogsByLocaleFromStringTable, runtimeCatalogsForLocaleFromStringTable, serializeStringTable, stringTableFromDelimitedSheet, } from './string-table.js';
5
6
  //# 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,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,GAEvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,GAU1B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,GAAG,GAMJ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,0BAA0B,EAC1B,gCAAgC,GAOjC,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,GAIvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,GAU1B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,GAAG,GAMJ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,0BAA0B,EAC1B,gCAAgC,GAOjC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gCAAgC,EAChC,iBAAiB,EACjB,gBAAgB,EAChB,sCAAsC,EACtC,uCAAuC,EACvC,oBAAoB,EACpB,6BAA6B,GAG9B,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { I18nCatalog } from '@flyingrobots/bijou-i18n';
2
+ import { type DelimitedFormat, type DelimitedSheet } from './adapters.js';
3
+ import { type AuthoringCatalog } from './tools.js';
4
+ export interface StringTableRow {
5
+ readonly namespace: string;
6
+ readonly id: string;
7
+ readonly kind: string;
8
+ readonly sourceLocale: string;
9
+ readonly sourceValueKind: string;
10
+ readonly sourceValue: string;
11
+ readonly locale: string;
12
+ readonly valueKind: string;
13
+ readonly value: string;
14
+ readonly status: string;
15
+ readonly description: string;
16
+ }
17
+ export interface StringTable {
18
+ readonly columns: readonly string[];
19
+ readonly rows: readonly StringTableRow[];
20
+ }
21
+ export declare function exportStringTable(catalogs: readonly AuthoringCatalog[], locales: readonly string[]): StringTable;
22
+ export declare function parseStringTable(input: string, format: DelimitedFormat): StringTable;
23
+ export declare function serializeStringTable(table: StringTable, format: DelimitedFormat): string;
24
+ export declare function stringTableFromDelimitedSheet(sheet: DelimitedSheet): StringTable;
25
+ export declare function authoringCatalogsFromStringTable(table: StringTable): readonly AuthoringCatalog[];
26
+ export declare function runtimeCatalogsForLocaleFromStringTable(table: StringTable, locale: string): readonly I18nCatalog[];
27
+ export declare function runtimeCatalogsByLocaleFromStringTable(table: StringTable): Readonly<Record<string, readonly I18nCatalog[]>>;
28
+ //# sourceMappingURL=string-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-table.d.ts","sourceRoot":"","sources":["../src/string-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAEL,KAAK,gBAAgB,EAItB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;CAC1C;AAsFD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,WAAW,CAoCb;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAGpF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAKxF;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,cAAc,GAAG,WAAW,CAQhF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,gBAAgB,EAAE,CAoDhG;AAED,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,SAAS,WAAW,EAAE,CAMxB;AAED,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,WAAW,GACjB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,CAAC,CAKlD"}
@@ -0,0 +1,216 @@
1
+ import { parseDelimitedSheet, serializeDelimitedSheet, } from './adapters.js';
2
+ import { decodeExchangeValue, encodeExchangeValue, } from './exchange.js';
3
+ import { hashSourceValue, } from './tools.js';
4
+ const STRING_TABLE_COLUMNS = [
5
+ 'namespace',
6
+ 'id',
7
+ 'kind',
8
+ 'sourceLocale',
9
+ 'sourceValueKind',
10
+ 'sourceValue',
11
+ 'locale',
12
+ 'valueKind',
13
+ 'value',
14
+ 'status',
15
+ 'description',
16
+ ];
17
+ function isEntryKind(value) {
18
+ return value === 'message' || value === 'resource' || value === 'data';
19
+ }
20
+ function isTranslationStatus(value) {
21
+ return value === 'current' || value === 'stale' || value === 'missing';
22
+ }
23
+ function assertStringTableRow(row, context) {
24
+ const namespace = requiredCell(row, 'namespace', context);
25
+ const id = requiredCell(row, 'id', context);
26
+ const kind = requiredCell(row, 'kind', context);
27
+ const sourceLocale = requiredCell(row, 'sourceLocale', context);
28
+ const sourceValueKind = requiredCell(row, 'sourceValueKind', context);
29
+ const sourceValue = requiredCell(row, 'sourceValue', context);
30
+ const locale = requiredCell(row, 'locale', context);
31
+ const valueKind = requiredCell(row, 'valueKind', context);
32
+ const value = requiredCell(row, 'value', context);
33
+ const status = requiredCell(row, 'status', context);
34
+ const description = requiredCell(row, 'description', context);
35
+ if (!isEntryKind(kind)) {
36
+ throw new Error(`Invalid string table: unknown entry kind ${kind} in ${context}`);
37
+ }
38
+ if (!isTranslationStatus(status)) {
39
+ throw new Error(`Invalid string table: unknown status ${status} in ${context}`);
40
+ }
41
+ if (valueKind === '' && value !== '' && status !== 'missing') {
42
+ throw new Error(`Invalid string table: missing valueKind in ${context}`);
43
+ }
44
+ return Object.freeze({
45
+ namespace,
46
+ id,
47
+ kind,
48
+ sourceLocale,
49
+ sourceValueKind,
50
+ sourceValue,
51
+ locale,
52
+ valueKind,
53
+ value,
54
+ status,
55
+ description,
56
+ });
57
+ }
58
+ function requiredCell(row, column, context) {
59
+ const value = row[column];
60
+ if (typeof value !== 'string') {
61
+ throw new Error(`Invalid string table: missing ${column} in ${context}`);
62
+ }
63
+ return value;
64
+ }
65
+ function decode(kind, payload, context) {
66
+ try {
67
+ return decodeExchangeValue({ kind: kind, payload });
68
+ }
69
+ catch (error) {
70
+ const message = error instanceof Error ? error.message : 'unknown error';
71
+ throw new Error(`Invalid string table value in ${context}: ${message}`);
72
+ }
73
+ }
74
+ function rowKey(row) {
75
+ return `${row.namespace}:${row.id}`;
76
+ }
77
+ export function exportStringTable(catalogs, locales) {
78
+ const rows = [];
79
+ for (const catalog of catalogs) {
80
+ for (const entry of catalog.entries) {
81
+ const encodedSource = encodeExchangeValue(entry.sourceValue);
82
+ const sourceLocales = new Set([entry.sourceLocale, ...locales]);
83
+ for (const locale of sourceLocales) {
84
+ const translation = locale === entry.sourceLocale
85
+ ? {
86
+ value: entry.sourceValue,
87
+ status: 'current',
88
+ }
89
+ : entry.translations[locale];
90
+ const encodedValue = translation?.value === undefined
91
+ ? undefined
92
+ : encodeExchangeValue(translation.value);
93
+ rows.push(Object.freeze({
94
+ namespace: entry.key.namespace,
95
+ id: entry.key.id,
96
+ kind: entry.kind,
97
+ sourceLocale: entry.sourceLocale,
98
+ sourceValueKind: encodedSource.kind,
99
+ sourceValue: encodedSource.payload,
100
+ locale,
101
+ valueKind: encodedValue?.kind ?? '',
102
+ value: encodedValue?.payload ?? '',
103
+ status: translation?.status ?? 'missing',
104
+ description: entry.description ?? '',
105
+ }));
106
+ }
107
+ }
108
+ }
109
+ return Object.freeze({
110
+ columns: STRING_TABLE_COLUMNS,
111
+ rows: Object.freeze(rows.sort(compareRows)),
112
+ });
113
+ }
114
+ export function parseStringTable(input, format) {
115
+ const sheet = parseDelimitedSheet(input, format);
116
+ return stringTableFromDelimitedSheet(sheet);
117
+ }
118
+ export function serializeStringTable(table, format) {
119
+ return serializeDelimitedSheet({
120
+ columns: STRING_TABLE_COLUMNS,
121
+ rows: table.rows,
122
+ }, format);
123
+ }
124
+ export function stringTableFromDelimitedSheet(sheet) {
125
+ if (!STRING_TABLE_COLUMNS.every((column) => sheet.columns.includes(column))) {
126
+ throw new Error('Invalid string table: missing required columns');
127
+ }
128
+ return Object.freeze({
129
+ columns: STRING_TABLE_COLUMNS,
130
+ rows: Object.freeze(sheet.rows.map((row, index) => assertStringTableRow(row, `row ${index + 2}`))),
131
+ });
132
+ }
133
+ export function authoringCatalogsFromStringTable(table) {
134
+ const entriesByKey = new Map();
135
+ for (const row of table.rows) {
136
+ const key = rowKey(row);
137
+ const sourceValue = decode(row.sourceValueKind, row.sourceValue, key);
138
+ const existing = entriesByKey.get(key);
139
+ const entry = existing ?? {
140
+ key: { namespace: row.namespace, id: row.id },
141
+ kind: row.kind,
142
+ sourceLocale: row.sourceLocale,
143
+ sourceValue,
144
+ translations: {},
145
+ ...(row.description === '' ? {} : { description: row.description }),
146
+ };
147
+ if (existing !== undefined) {
148
+ if (existing.kind !== row.kind || existing.sourceLocale !== row.sourceLocale) {
149
+ throw new Error(`Invalid string table: conflicting entry metadata for ${key}`);
150
+ }
151
+ if (JSON.stringify(existing.sourceValue) !== JSON.stringify(sourceValue)) {
152
+ throw new Error(`Invalid string table: conflicting source value for ${key}`);
153
+ }
154
+ }
155
+ if (row.locale !== row.sourceLocale && row.status !== 'missing' && row.valueKind !== '') {
156
+ const translations = { ...entry.translations };
157
+ translations[row.locale] = {
158
+ value: decode(row.valueKind, row.value, `${key}:${row.locale}`),
159
+ sourceHash: hashSourceValue(sourceValue),
160
+ status: row.status,
161
+ };
162
+ entriesByKey.set(key, {
163
+ ...entry,
164
+ translations,
165
+ });
166
+ }
167
+ else if (existing === undefined) {
168
+ entriesByKey.set(key, entry);
169
+ }
170
+ }
171
+ const catalogs = new Map();
172
+ for (const entry of entriesByKey.values()) {
173
+ const catalogEntries = catalogs.get(entry.key.namespace) ?? [];
174
+ catalogEntries.push(entry);
175
+ catalogs.set(entry.key.namespace, catalogEntries);
176
+ }
177
+ return Object.freeze([...catalogs.entries()]
178
+ .sort(([left], [right]) => left.localeCompare(right))
179
+ .map(([namespace, entries]) => Object.freeze({
180
+ namespace,
181
+ entries: Object.freeze(entries.sort((left, right) => left.key.id.localeCompare(right.key.id))),
182
+ })));
183
+ }
184
+ export function runtimeCatalogsForLocaleFromStringTable(table, locale) {
185
+ const catalogs = authoringCatalogsFromStringTable(table);
186
+ return Object.freeze(catalogs.map((catalog) => Object.freeze({
187
+ namespace: catalog.namespace,
188
+ entries: Object.freeze(catalog.entries.map((entry) => runtimeEntryForLocale(entry, locale))),
189
+ })));
190
+ }
191
+ export function runtimeCatalogsByLocaleFromStringTable(table) {
192
+ const locales = [...new Set(table.rows.map((row) => row.locale))].sort((left, right) => left.localeCompare(right));
193
+ return Object.freeze(Object.fromEntries(locales.map((locale) => [locale, runtimeCatalogsForLocaleFromStringTable(table, locale)])));
194
+ }
195
+ function runtimeEntryForLocale(entry, locale) {
196
+ const values = {};
197
+ const translation = entry.translations[locale];
198
+ if (locale === entry.sourceLocale) {
199
+ values[entry.sourceLocale] = entry.sourceValue;
200
+ }
201
+ else if (translation?.status === 'current') {
202
+ values[locale] = translation.value;
203
+ }
204
+ return Object.freeze({
205
+ key: entry.key,
206
+ kind: entry.kind,
207
+ sourceLocale: entry.sourceLocale,
208
+ values: Object.freeze(values),
209
+ });
210
+ }
211
+ function compareRows(left, right) {
212
+ return left.namespace.localeCompare(right.namespace)
213
+ || left.id.localeCompare(right.id)
214
+ || left.locale.localeCompare(right.locale);
215
+ }
216
+ //# sourceMappingURL=string-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-table.js","sourceRoot":"","sources":["../src/string-table.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flyingrobots/bijou-i18n-tools",
3
- "version": "5.0.0",
3
+ "version": "7.1.0",
4
4
  "description": "Localization workflow tooling for Bijou — authoring catalogs, stale detection, tabular export/import, and runtime compilation.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -24,12 +24,12 @@
24
24
  "lint": "tsc --noEmit"
25
25
  },
26
26
  "dependencies": {
27
- "@flyingrobots/bijou-i18n": "5.0.0"
27
+ "@flyingrobots/bijou-i18n": "7.1.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^22.0.0",
31
31
  "typescript": "^5.9.3",
32
- "vitest": "^4.0.18"
32
+ "vitest": "^4.1.8"
33
33
  },
34
34
  "keywords": [
35
35
  "i18n",