@flyingrobots/bijou-i18n-tools-node 7.2.0 → 8.0.0-rc.1

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.
@@ -1,25 +1,5 @@
1
- import type { I18nCatalog } from '@flyingrobots/bijou-i18n';
2
- import { type CatalogBundle, type DelimitedFormat, type ExchangeSheet, type ExchangeWorkbook, type StringTable } from '@flyingrobots/bijou-i18n-tools';
3
- export interface WorkbookDirectorySheet {
4
- readonly name: string;
5
- readonly fileName: string;
6
- }
7
- export interface WorkbookDirectoryManifest {
8
- readonly version: 1;
9
- readonly format: DelimitedFormat;
10
- readonly sheets: readonly WorkbookDirectorySheet[];
11
- }
12
- export declare function writeExchangeSheetFile(path: string, sheet: ExchangeSheet, format?: DelimitedFormat): Promise<void>;
13
- export declare function writeStringTableFile(path: string, table: StringTable, format?: DelimitedFormat): Promise<void>;
14
- export declare function readStringTableFile(path: string, format?: DelimitedFormat): Promise<StringTable>;
15
- export declare function readStringTableFileSync(path: string, format?: DelimitedFormat): StringTable;
16
- export declare function readExchangeSheetFile(path: string, format?: DelimitedFormat): Promise<ExchangeSheet>;
17
- export declare function writeCatalogBundleFile(path: string, bundle: CatalogBundle): Promise<void>;
18
- export declare function readCatalogBundleFile(path: string): Promise<CatalogBundle>;
19
- export declare function writeRuntimeCatalogFiles(dir: string, table: StringTable): Promise<void>;
20
- export declare function writeRuntimeCatalogFilesSync(dir: string, table: StringTable): void;
21
- export declare function readRuntimeCatalogFilesForLocale(dir: string, locale: string): Promise<readonly I18nCatalog[]>;
22
- export declare function readRuntimeCatalogFilesForLocaleSync(dir: string, locale: string): readonly I18nCatalog[];
23
- export declare function writeExchangeWorkbookDirectory(dir: string, workbook: ExchangeWorkbook, format: DelimitedFormat): Promise<void>;
24
- export declare function readExchangeWorkbookDirectory(dir: string): Promise<ExchangeWorkbook>;
1
+ export type { WorkbookDirectoryManifest, WorkbookDirectorySheet } from './filesystem.part01.js';
2
+ export { readCatalogBundleFile, readExchangeSheetFile, readStringTableFile, readStringTableFileSync, writeCatalogBundleFile, writeExchangeSheetFile, writeStringTableFile } from './filesystem.part01.js';
3
+ export { readRuntimeCatalogFilesForLocale, readRuntimeCatalogFilesForLocaleSync, writeRuntimeCatalogFiles, writeRuntimeCatalogFilesSync } from './filesystem.part02.js';
4
+ export { readExchangeWorkbookDirectory, writeExchangeWorkbookDirectory } from './filesystem.part03.js';
25
5
  //# sourceMappingURL=filesystem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../src/filesystem.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAQL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACpD;AA2CD,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,EACpB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,WAAW,CAAC,CAItB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,eAAe,GACvB,WAAW,CAIb;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,aAAa,CAAC,CAIxB;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/F;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAIhF;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GACjB,IAAI,CAcN;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAUjC;AAED,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,SAAS,WAAW,EAAE,CASxB;AAED,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyB1F"}
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../src/filesystem.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC1M,OAAO,EAAE,gCAAgC,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACxK,OAAO,EAAE,6BAA6B,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,249 +1,4 @@
1
- import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
2
- import { mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
3
- import { basename, extname, join } from 'node:path';
4
- import { parseStringTable, parseCatalogBundleJson, parseExchangeSheet, runtimeCatalogsByLocaleFromStringTable, serializeCatalogBundleJson, serializeExchangeSheet, serializeStringTable, } from '@flyingrobots/bijou-i18n-tools';
5
- function inferDelimitedFormat(path) {
6
- const extension = extname(path).toLowerCase();
7
- if (extension === '.csv') {
8
- return 'csv';
9
- }
10
- if (extension === '.tsv') {
11
- return 'tsv';
12
- }
13
- throw new Error(`Unsupported sheet file extension: ${extension || '(none)'}`);
14
- }
15
- function inferBundleExtension(path) {
16
- const extension = extname(path).toLowerCase();
17
- if (extension !== '.json') {
18
- throw new Error(`Unsupported catalog bundle file extension: ${extension || '(none)'}`);
19
- }
20
- }
21
- function slugifySheetName(name) {
22
- const slug = name
23
- .trim()
24
- .replace(/\s+/g, '-')
25
- .replace(/[^a-zA-Z0-9._-]/g, '-')
26
- .replace(/-+/g, '-');
27
- return slug.length === 0 ? 'sheet' : slug;
28
- }
29
- function manifestPath(dir) {
30
- return join(dir, 'workbook.json');
31
- }
32
- function sheetNameFromPath(path) {
33
- const base = basename(path);
34
- const extension = extname(base);
35
- return base.slice(0, base.length - extension.length);
36
- }
37
- function isJsonRecord(value) {
38
- return typeof value === 'object' && value !== null && !Array.isArray(value);
39
- }
40
- export async function writeExchangeSheetFile(path, sheet, format) {
41
- const resolvedFormat = format ?? inferDelimitedFormat(path);
42
- const content = serializeExchangeSheet(sheet, resolvedFormat);
43
- await mkdir(dirnameSafe(path), { recursive: true });
44
- await writeFile(path, content, 'utf8');
45
- }
46
- export async function writeStringTableFile(path, table, format) {
47
- const resolvedFormat = format ?? inferDelimitedFormat(path);
48
- await mkdir(dirnameSafe(path), { recursive: true });
49
- await writeFile(path, serializeStringTable(table, resolvedFormat), 'utf8');
50
- }
51
- export async function readStringTableFile(path, format) {
52
- const resolvedFormat = format ?? inferDelimitedFormat(path);
53
- const content = await readFile(path, 'utf8');
54
- return parseStringTable(content, resolvedFormat);
55
- }
56
- export function readStringTableFileSync(path, format) {
57
- const resolvedFormat = format ?? inferDelimitedFormat(path);
58
- const content = readFileSync(path, 'utf8');
59
- return parseStringTable(content, resolvedFormat);
60
- }
61
- export async function readExchangeSheetFile(path, format) {
62
- const resolvedFormat = format ?? inferDelimitedFormat(path);
63
- const content = await readFile(path, 'utf8');
64
- return parseExchangeSheet(sheetNameFromPath(path), content, resolvedFormat);
65
- }
66
- export async function writeCatalogBundleFile(path, bundle) {
67
- inferBundleExtension(path);
68
- await mkdir(dirnameSafe(path), { recursive: true });
69
- await writeFile(path, serializeCatalogBundleJson(bundle), 'utf8');
70
- }
71
- export async function readCatalogBundleFile(path) {
72
- inferBundleExtension(path);
73
- const content = await readFile(path, 'utf8');
74
- return parseCatalogBundleJson(content);
75
- }
76
- export async function writeRuntimeCatalogFiles(dir, table) {
77
- const byLocale = runtimeCatalogsByLocaleFromStringTable(table);
78
- await mkdir(dir, { recursive: true });
79
- for (const [locale, catalogs] of Object.entries(byLocale)) {
80
- const localeDir = join(dir, locale);
81
- await mkdir(localeDir, { recursive: true });
82
- for (const catalog of catalogs) {
83
- await writeFile(join(localeDir, runtimeCatalogFileName(catalog.namespace)), `${JSON.stringify(catalog, null, 2)}\n`, 'utf8');
84
- }
85
- }
86
- }
87
- export function writeRuntimeCatalogFilesSync(dir, table) {
88
- const byLocale = runtimeCatalogsByLocaleFromStringTable(table);
89
- mkdirSync(dir, { recursive: true });
90
- for (const [locale, catalogs] of Object.entries(byLocale)) {
91
- const localeDir = join(dir, locale);
92
- mkdirSync(localeDir, { recursive: true });
93
- for (const catalog of catalogs) {
94
- writeFileSync(join(localeDir, runtimeCatalogFileName(catalog.namespace)), `${JSON.stringify(catalog, null, 2)}\n`, 'utf8');
95
- }
96
- }
97
- }
98
- export async function readRuntimeCatalogFilesForLocale(dir, locale) {
99
- const localeDir = join(dir, locale);
100
- const files = (await readdir(localeDir))
101
- .filter((file) => file.endsWith('.json'))
102
- .sort((left, right) => left.localeCompare(right));
103
- const catalogs = await Promise.all(files.map(async (file) => parseRuntimeCatalog(await readFile(join(localeDir, file), 'utf8'), `${localeDir}/${file}`)));
104
- return Object.freeze(catalogs);
105
- }
106
- export function readRuntimeCatalogFilesForLocaleSync(dir, locale) {
107
- const localeDir = join(dir, locale);
108
- const files = readdirSync(localeDir)
109
- .filter((file) => file.endsWith('.json'))
110
- .sort((left, right) => left.localeCompare(right));
111
- return Object.freeze(files.map((file) => parseRuntimeCatalog(readFileSync(join(localeDir, file), 'utf8'), `${localeDir}/${file}`)));
112
- }
113
- export async function writeExchangeWorkbookDirectory(dir, workbook, format) {
114
- await mkdir(dir, { recursive: true });
115
- const manifest = {
116
- version: 1,
117
- format,
118
- sheets: workbook.sheets.map((sheet) => ({
119
- name: sheet.name,
120
- fileName: `${slugifySheetName(sheet.name)}.${format}`,
121
- })),
122
- };
123
- for (const sheet of workbook.sheets) {
124
- const entry = manifest.sheets.find((candidate) => candidate.name === sheet.name);
125
- if (entry === undefined) {
126
- throw new Error(`Missing workbook manifest entry for sheet: ${sheet.name}`);
127
- }
128
- await writeFile(join(dir, entry.fileName), serializeExchangeSheet(sheet, format), 'utf8');
129
- }
130
- await writeFile(manifestPath(dir), JSON.stringify(manifest, null, 2), 'utf8');
131
- }
132
- export async function readExchangeWorkbookDirectory(dir) {
133
- let manifestRaw;
134
- try {
135
- manifestRaw = await readFile(manifestPath(dir), 'utf8');
136
- }
137
- catch {
138
- throw new Error(`Missing workbook manifest: ${manifestPath(dir)}`);
139
- }
140
- const manifest = parseWorkbookManifest(manifestRaw);
141
- const sheets = [];
142
- for (const sheet of manifest.sheets) {
143
- const path = join(dir, sheet.fileName);
144
- let content;
145
- try {
146
- content = await readFile(path, 'utf8');
147
- }
148
- catch {
149
- throw new Error(`Missing workbook sheet file: ${path}`);
150
- }
151
- sheets.push(parseExchangeSheet(sheet.name, content, manifest.format));
152
- }
153
- return {
154
- version: 1,
155
- sheets,
156
- };
157
- }
158
- function parseWorkbookManifest(input) {
159
- let parsed;
160
- try {
161
- parsed = JSON.parse(input);
162
- }
163
- catch {
164
- throw new Error('Invalid workbook manifest: malformed json');
165
- }
166
- if (!isJsonRecord(parsed)) {
167
- throw new Error('Invalid workbook manifest: expected object');
168
- }
169
- const { version, format, sheets } = parsed;
170
- if (version !== 1) {
171
- throw new Error(`Invalid workbook manifest: unsupported version ${String(version)}`);
172
- }
173
- if (format !== 'csv' && format !== 'tsv') {
174
- throw new Error(`Invalid workbook manifest: unsupported format ${String(format)}`);
175
- }
176
- if (!Array.isArray(sheets)) {
177
- throw new Error('Invalid workbook manifest: expected sheets array');
178
- }
179
- const parsedSheets = sheets.map((sheet) => {
180
- if (!isJsonRecord(sheet)) {
181
- throw new Error('Invalid workbook manifest: sheet entry must be an object');
182
- }
183
- const { name, fileName } = sheet;
184
- if (typeof name !== 'string' || typeof fileName !== 'string') {
185
- throw new Error('Invalid workbook manifest: sheet entry requires name and fileName');
186
- }
187
- return { name, fileName };
188
- });
189
- return {
190
- version: 1,
191
- format,
192
- sheets: parsedSheets,
193
- };
194
- }
195
- function dirnameSafe(path) {
196
- const slash = path.lastIndexOf('/');
197
- return slash <= 0 ? '.' : path.slice(0, slash);
198
- }
199
- function runtimeCatalogFileName(namespace) {
200
- return `${encodeURIComponent(namespace)}.json`;
201
- }
202
- function parseRuntimeCatalog(input, context) {
203
- let parsed;
204
- try {
205
- parsed = JSON.parse(input);
206
- }
207
- catch {
208
- throw new Error(`Invalid runtime catalog json: malformed json in ${context}`);
209
- }
210
- if (!isJsonRecord(parsed)) {
211
- throw new Error(`Invalid runtime catalog json: expected object in ${context}`);
212
- }
213
- const { namespace, entries } = parsed;
214
- if (typeof namespace !== 'string' || !Array.isArray(entries)) {
215
- throw new Error(`Invalid runtime catalog json: missing namespace or entries in ${context}`);
216
- }
217
- return {
218
- namespace,
219
- entries: entries.map((entry, index) => parseRuntimeCatalogEntry(entry, `${context} entries[${String(index)}]`)),
220
- };
221
- }
222
- function parseRuntimeCatalogEntry(value, context) {
223
- if (!isJsonRecord(value)) {
224
- throw new Error(`Invalid runtime catalog json: expected entry object in ${context}`);
225
- }
226
- const { key, kind, sourceLocale, values } = value;
227
- if (!isJsonRecord(key)) {
228
- throw new Error(`Invalid runtime catalog json: expected entry key object in ${context}`);
229
- }
230
- if (typeof key['namespace'] !== 'string' || typeof key['id'] !== 'string') {
231
- throw new Error(`Invalid runtime catalog json: entry key requires namespace and id in ${context}`);
232
- }
233
- if (kind !== 'message' && kind !== 'resource' && kind !== 'data') {
234
- throw new Error(`Invalid runtime catalog json: unsupported entry kind in ${context}`);
235
- }
236
- if (typeof sourceLocale !== 'string' || !isJsonRecord(values)) {
237
- throw new Error(`Invalid runtime catalog json: entry requires sourceLocale and values in ${context}`);
238
- }
239
- const entry = {
240
- key: { namespace: key['namespace'], id: key['id'] },
241
- kind,
242
- sourceLocale,
243
- values,
244
- };
245
- return Object.hasOwn(value, 'fallbackValue')
246
- ? { ...entry, fallbackValue: value['fallbackValue'] }
247
- : entry;
248
- }
1
+ export { readCatalogBundleFile, readExchangeSheetFile, readStringTableFile, readStringTableFileSync, writeCatalogBundleFile, writeExchangeSheetFile, writeStringTableFile } from './filesystem.part01.js';
2
+ export { readRuntimeCatalogFilesForLocale, readRuntimeCatalogFilesForLocaleSync, writeRuntimeCatalogFiles, writeRuntimeCatalogFilesSync } from './filesystem.part02.js';
3
+ export { readExchangeWorkbookDirectory, writeExchangeWorkbookDirectory } from './filesystem.part03.js';
249
4
  //# sourceMappingURL=filesystem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../src/filesystem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../src/filesystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC1M,OAAO,EAAE,gCAAgC,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACxK,OAAO,EAAE,6BAA6B,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type CatalogBundle, type DelimitedFormat, type ExchangeSheet, type StringTable } from '@flyingrobots/bijou-i18n-tools';
2
+ export interface WorkbookDirectorySheet {
3
+ readonly name: string;
4
+ readonly fileName: string;
5
+ }
6
+ export interface WorkbookDirectoryManifest {
7
+ readonly version: 1;
8
+ readonly format: DelimitedFormat;
9
+ readonly sheets: readonly WorkbookDirectorySheet[];
10
+ }
11
+ declare function slugifySheetName(name: string): string;
12
+ declare function manifestPath(dir: string): string;
13
+ declare function isJsonRecord(value: unknown): value is Readonly<Record<string, unknown>>;
14
+ export declare function writeExchangeSheetFile(path: string, sheet: ExchangeSheet, format?: DelimitedFormat): Promise<void>;
15
+ export declare function writeStringTableFile(path: string, table: StringTable, format?: DelimitedFormat): Promise<void>;
16
+ export declare function readStringTableFile(path: string, format?: DelimitedFormat): Promise<StringTable>;
17
+ export declare function readStringTableFileSync(path: string, format?: DelimitedFormat): StringTable;
18
+ export declare function readExchangeSheetFile(path: string, format?: DelimitedFormat): Promise<ExchangeSheet>;
19
+ export declare function writeCatalogBundleFile(path: string, bundle: CatalogBundle): Promise<void>;
20
+ export declare function readCatalogBundleFile(path: string): Promise<CatalogBundle>;
21
+ declare function runtimeCatalogFileName(namespace: string): string;
22
+ export { isJsonRecord, manifestPath, runtimeCatalogFileName, slugifySheetName };
23
+ //# sourceMappingURL=filesystem.part01.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.part01.d.ts","sourceRoot":"","sources":["../src/filesystem.part01.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0I,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAExQ,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACpD;AAoBD,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9C;AAED,iBAAS,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzC;AAQD,iBAAS,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAEhF;AAOD,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,EACpB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,WAAW,CAAC,CAItB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,eAAe,GACvB,WAAW,CAIb;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,aAAa,CAAC,CAIxB;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/F;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAIhF;AAED,iBAAS,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { readFileSync } from 'node:fs';
3
+ import { basename, extname, join } from 'node:path';
4
+ import { parseStringTable, parseCatalogBundleJson, parseExchangeSheet, serializeCatalogBundleJson, serializeExchangeSheet, serializeStringTable } from '@flyingrobots/bijou-i18n-tools';
5
+ function inferDelimitedFormat(path) {
6
+ const extension = extname(path).toLowerCase();
7
+ if (extension === '.csv') {
8
+ return 'csv';
9
+ }
10
+ if (extension === '.tsv') {
11
+ return 'tsv';
12
+ }
13
+ throw new Error(`Unsupported sheet file extension: ${extension || '(none)'}`);
14
+ }
15
+ function inferBundleExtension(path) {
16
+ const extension = extname(path).toLowerCase();
17
+ if (extension !== '.json') {
18
+ throw new Error(`Unsupported catalog bundle file extension: ${extension || '(none)'}`);
19
+ }
20
+ }
21
+ function slugifySheetName(name) {
22
+ const slug = name
23
+ .trim()
24
+ .replace(/\s+/g, '-')
25
+ .replace(/[^a-zA-Z0-9._-]/g, '-')
26
+ .replace(/-+/g, '-');
27
+ return slug.length === 0 ? 'sheet' : slug;
28
+ }
29
+ function manifestPath(dir) {
30
+ return join(dir, 'workbook.json');
31
+ }
32
+ function sheetNameFromPath(path) {
33
+ const base = basename(path);
34
+ const extension = extname(base);
35
+ return base.slice(0, base.length - extension.length);
36
+ }
37
+ function isJsonRecord(value) {
38
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
39
+ }
40
+ function dirnameSafe(path) {
41
+ const slash = path.lastIndexOf('/');
42
+ return slash <= 0 ? '.' : path.slice(0, slash);
43
+ }
44
+ export async function writeExchangeSheetFile(path, sheet, format) {
45
+ const resolvedFormat = format ?? inferDelimitedFormat(path);
46
+ const content = serializeExchangeSheet(sheet, resolvedFormat);
47
+ await mkdir(dirnameSafe(path), { recursive: true });
48
+ await writeFile(path, content, 'utf8');
49
+ }
50
+ export async function writeStringTableFile(path, table, format) {
51
+ const resolvedFormat = format ?? inferDelimitedFormat(path);
52
+ await mkdir(dirnameSafe(path), { recursive: true });
53
+ await writeFile(path, serializeStringTable(table, resolvedFormat), 'utf8');
54
+ }
55
+ export async function readStringTableFile(path, format) {
56
+ const resolvedFormat = format ?? inferDelimitedFormat(path);
57
+ const content = await readFile(path, 'utf8');
58
+ return parseStringTable(content, resolvedFormat);
59
+ }
60
+ export function readStringTableFileSync(path, format) {
61
+ const resolvedFormat = format ?? inferDelimitedFormat(path);
62
+ const content = readFileSync(path, 'utf8');
63
+ return parseStringTable(content, resolvedFormat);
64
+ }
65
+ export async function readExchangeSheetFile(path, format) {
66
+ const resolvedFormat = format ?? inferDelimitedFormat(path);
67
+ const content = await readFile(path, 'utf8');
68
+ return parseExchangeSheet(sheetNameFromPath(path), content, resolvedFormat);
69
+ }
70
+ export async function writeCatalogBundleFile(path, bundle) {
71
+ inferBundleExtension(path);
72
+ await mkdir(dirnameSafe(path), { recursive: true });
73
+ await writeFile(path, serializeCatalogBundleJson(bundle), 'utf8');
74
+ }
75
+ export async function readCatalogBundleFile(path) {
76
+ inferBundleExtension(path);
77
+ const content = await readFile(path, 'utf8');
78
+ return parseCatalogBundleJson(content);
79
+ }
80
+ function runtimeCatalogFileName(namespace) {
81
+ return `${encodeURIComponent(namespace)}.json`;
82
+ }
83
+ export { isJsonRecord, manifestPath, runtimeCatalogFileName, slugifySheetName };
84
+ //# sourceMappingURL=filesystem.part01.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.part01.js","sourceRoot":"","sources":["../src/filesystem.part01.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { I18nCatalog } from '@flyingrobots/bijou-i18n';
2
+ import { type StringTable } from '@flyingrobots/bijou-i18n-tools';
3
+ export declare function writeRuntimeCatalogFiles(dir: string, table: StringTable): Promise<void>;
4
+ export declare function writeRuntimeCatalogFilesSync(dir: string, table: StringTable): void;
5
+ export declare function readRuntimeCatalogFilesForLocale(dir: string, locale: string): Promise<readonly I18nCatalog[]>;
6
+ export declare function readRuntimeCatalogFilesForLocaleSync(dir: string, locale: string): readonly I18nCatalog[];
7
+ //# sourceMappingURL=filesystem.part02.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.part02.d.ts","sourceRoot":"","sources":["../src/filesystem.part02.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAA0C,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG1G,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GACjB,IAAI,CAcN;AAoDD,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAUjC;AAED,wBAAgB,oCAAoC,CAClD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,SAAS,WAAW,EAAE,CASxB"}
@@ -0,0 +1,90 @@
1
+ import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
2
+ import { mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { runtimeCatalogsByLocaleFromStringTable } from '@flyingrobots/bijou-i18n-tools';
5
+ import { isJsonRecord, runtimeCatalogFileName } from './filesystem.part01.js';
6
+ export async function writeRuntimeCatalogFiles(dir, table) {
7
+ const byLocale = runtimeCatalogsByLocaleFromStringTable(table);
8
+ await mkdir(dir, { recursive: true });
9
+ for (const [locale, catalogs] of Object.entries(byLocale)) {
10
+ const localeDir = join(dir, locale);
11
+ await mkdir(localeDir, { recursive: true });
12
+ for (const catalog of catalogs) {
13
+ await writeFile(join(localeDir, runtimeCatalogFileName(catalog.namespace)), `${JSON.stringify(catalog, null, 2)}\n`, 'utf8');
14
+ }
15
+ }
16
+ }
17
+ export function writeRuntimeCatalogFilesSync(dir, table) {
18
+ const byLocale = runtimeCatalogsByLocaleFromStringTable(table);
19
+ mkdirSync(dir, { recursive: true });
20
+ for (const [locale, catalogs] of Object.entries(byLocale)) {
21
+ const localeDir = join(dir, locale);
22
+ mkdirSync(localeDir, { recursive: true });
23
+ for (const catalog of catalogs) {
24
+ writeFileSync(join(localeDir, runtimeCatalogFileName(catalog.namespace)), `${JSON.stringify(catalog, null, 2)}\n`, 'utf8');
25
+ }
26
+ }
27
+ }
28
+ function parseRuntimeCatalogEntry(value, context) {
29
+ if (!isJsonRecord(value)) {
30
+ throw new Error(`Invalid runtime catalog json: expected entry object in ${context}`);
31
+ }
32
+ const { key, kind, sourceLocale, values } = value;
33
+ if (!isJsonRecord(key)) {
34
+ throw new Error(`Invalid runtime catalog json: expected entry key object in ${context}`);
35
+ }
36
+ if (typeof key['namespace'] !== 'string' || typeof key['id'] !== 'string') {
37
+ throw new Error(`Invalid runtime catalog json: entry key requires namespace and id in ${context}`);
38
+ }
39
+ if (kind !== 'message' && kind !== 'resource' && kind !== 'data') {
40
+ throw new Error(`Invalid runtime catalog json: unsupported entry kind in ${context}`);
41
+ }
42
+ if (typeof sourceLocale !== 'string' || !isJsonRecord(values)) {
43
+ throw new Error(`Invalid runtime catalog json: entry requires sourceLocale and values in ${context}`);
44
+ }
45
+ const entry = {
46
+ key: { namespace: key['namespace'], id: key['id'] },
47
+ kind,
48
+ sourceLocale,
49
+ values,
50
+ };
51
+ return Object.hasOwn(value, 'fallbackValue')
52
+ ? { ...entry, fallbackValue: value['fallbackValue'] }
53
+ : entry;
54
+ }
55
+ function parseRuntimeCatalog(input, context) {
56
+ let parsed;
57
+ try {
58
+ parsed = JSON.parse(input);
59
+ }
60
+ catch {
61
+ throw new Error(`Invalid runtime catalog json: malformed json in ${context}`);
62
+ }
63
+ if (!isJsonRecord(parsed)) {
64
+ throw new Error(`Invalid runtime catalog json: expected object in ${context}`);
65
+ }
66
+ const { namespace, entries } = parsed;
67
+ if (typeof namespace !== 'string' || !Array.isArray(entries)) {
68
+ throw new Error(`Invalid runtime catalog json: missing namespace or entries in ${context}`);
69
+ }
70
+ return {
71
+ namespace,
72
+ entries: entries.map((entry, index) => parseRuntimeCatalogEntry(entry, `${context} entries[${String(index)}]`)),
73
+ };
74
+ }
75
+ export async function readRuntimeCatalogFilesForLocale(dir, locale) {
76
+ const localeDir = join(dir, locale);
77
+ const files = (await readdir(localeDir))
78
+ .filter((file) => file.endsWith('.json'))
79
+ .sort((left, right) => left.localeCompare(right));
80
+ const catalogs = await Promise.all(files.map(async (file) => parseRuntimeCatalog(await readFile(join(localeDir, file), 'utf8'), `${localeDir}/${file}`)));
81
+ return Object.freeze(catalogs);
82
+ }
83
+ export function readRuntimeCatalogFilesForLocaleSync(dir, locale) {
84
+ const localeDir = join(dir, locale);
85
+ const files = readdirSync(localeDir)
86
+ .filter((file) => file.endsWith('.json'))
87
+ .sort((left, right) => left.localeCompare(right));
88
+ return Object.freeze(files.map((file) => parseRuntimeCatalog(readFileSync(join(localeDir, file), 'utf8'), `${localeDir}/${file}`)));
89
+ }
90
+ //# sourceMappingURL=filesystem.part02.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.part02.js","sourceRoot":"","sources":["../src/filesystem.part02.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type DelimitedFormat, type ExchangeWorkbook } from '@flyingrobots/bijou-i18n-tools';
2
+ export declare function writeExchangeWorkbookDirectory(dir: string, workbook: ExchangeWorkbook, format: DelimitedFormat): Promise<void>;
3
+ export declare function readExchangeWorkbookDirectory(dir: string): Promise<ExchangeWorkbook>;
4
+ //# sourceMappingURL=filesystem.part03.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.part03.d.ts","sourceRoot":"","sources":["../src/filesystem.part03.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8C,KAAK,eAAe,EAAsB,KAAK,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAI7J,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAqBf;AA0CD,wBAAsB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyB1F"}
@@ -0,0 +1,87 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { parseExchangeSheet, serializeExchangeSheet } from '@flyingrobots/bijou-i18n-tools';
4
+ import { isJsonRecord, manifestPath, slugifySheetName } from './filesystem.part01.js';
5
+ export async function writeExchangeWorkbookDirectory(dir, workbook, format) {
6
+ await mkdir(dir, { recursive: true });
7
+ const manifest = {
8
+ version: 1,
9
+ format,
10
+ sheets: workbook.sheets.map((sheet) => ({
11
+ name: sheet.name,
12
+ fileName: `${slugifySheetName(sheet.name)}.${format}`,
13
+ })),
14
+ };
15
+ for (const sheet of workbook.sheets) {
16
+ const entry = manifest.sheets.find((candidate) => candidate.name === sheet.name);
17
+ if (entry === undefined) {
18
+ throw new Error(`Missing workbook manifest entry for sheet: ${sheet.name}`);
19
+ }
20
+ await writeFile(join(dir, entry.fileName), serializeExchangeSheet(sheet, format), 'utf8');
21
+ }
22
+ await writeFile(manifestPath(dir), JSON.stringify(manifest, null, 2), 'utf8');
23
+ }
24
+ function parseWorkbookManifest(input) {
25
+ let parsed;
26
+ try {
27
+ parsed = JSON.parse(input);
28
+ }
29
+ catch {
30
+ throw new Error('Invalid workbook manifest: malformed json');
31
+ }
32
+ if (!isJsonRecord(parsed)) {
33
+ throw new Error('Invalid workbook manifest: expected object');
34
+ }
35
+ const { version, format, sheets } = parsed;
36
+ if (version !== 1) {
37
+ throw new Error(`Invalid workbook manifest: unsupported version ${String(version)}`);
38
+ }
39
+ if (format !== 'csv' && format !== 'tsv') {
40
+ throw new Error(`Invalid workbook manifest: unsupported format ${String(format)}`);
41
+ }
42
+ if (!Array.isArray(sheets)) {
43
+ throw new Error('Invalid workbook manifest: expected sheets array');
44
+ }
45
+ const parsedSheets = sheets.map((sheet) => {
46
+ if (!isJsonRecord(sheet)) {
47
+ throw new Error('Invalid workbook manifest: sheet entry must be an object');
48
+ }
49
+ const { name, fileName } = sheet;
50
+ if (typeof name !== 'string' || typeof fileName !== 'string') {
51
+ throw new Error('Invalid workbook manifest: sheet entry requires name and fileName');
52
+ }
53
+ return { name, fileName };
54
+ });
55
+ return {
56
+ version: 1,
57
+ format,
58
+ sheets: parsedSheets,
59
+ };
60
+ }
61
+ export async function readExchangeWorkbookDirectory(dir) {
62
+ let manifestRaw;
63
+ try {
64
+ manifestRaw = await readFile(manifestPath(dir), 'utf8');
65
+ }
66
+ catch {
67
+ throw new Error(`Missing workbook manifest: ${manifestPath(dir)}`);
68
+ }
69
+ const manifest = parseWorkbookManifest(manifestRaw);
70
+ const sheets = [];
71
+ for (const sheet of manifest.sheets) {
72
+ const path = join(dir, sheet.fileName);
73
+ let content;
74
+ try {
75
+ content = await readFile(path, 'utf8');
76
+ }
77
+ catch {
78
+ throw new Error(`Missing workbook sheet file: ${path}`);
79
+ }
80
+ sheets.push(parseExchangeSheet(sheet.name, content, manifest.format));
81
+ }
82
+ return {
83
+ version: 1,
84
+ sheets,
85
+ };
86
+ }
87
+ //# sourceMappingURL=filesystem.part03.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.part03.js","sourceRoot":"","sources":["../src/filesystem.part03.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flyingrobots/bijou-i18n-tools-node",
3
- "version": "7.2.0",
3
+ "version": "8.0.0-rc.1",
4
4
  "description": "Node filesystem helpers for Bijou localization exchange workflows.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -24,8 +24,8 @@
24
24
  "lint": "tsc --noEmit"
25
25
  },
26
26
  "dependencies": {
27
- "@flyingrobots/bijou-i18n": "7.2.0",
28
- "@flyingrobots/bijou-i18n-tools": "7.2.0"
27
+ "@flyingrobots/bijou-i18n": "8.0.0-rc.1",
28
+ "@flyingrobots/bijou-i18n-tools": "8.0.0-rc.1"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^22.0.0",