@zerolith/i18n 0.1.0-alpha.1 → 0.1.0-alpha.10

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
@@ -16,9 +16,15 @@ format.number(1234.5, { style: "currency", currency: "EUR" });
16
16
  - `formatters` wraps `Intl.NumberFormat`, `DateTimeFormat`, `RelativeTimeFormat`, `ListFormat`, and `PluralRules`, cached per locale and options, reading the locale signal when called.
17
17
  - `zerolith-i18n` compiles MessageFormat 2 catalogs (`messages/en.json`) into one module per locale, with a function per message and typed arguments, so a locale is one chunk and no message runtime is loaded.
18
18
 
19
- The guide is `docs/guide/i18n.md` in the repository.
19
+ The guide is on the [docs site](https://zerolith.dev/guide/i18n/).
20
20
 
21
- Status: pre-alpha, nothing published.
21
+ Status: alpha. Install with `npm install @zerolith/i18n@alpha`; the API may change before 1.0.
22
+
23
+ ## Documentation
24
+
25
+ - The [internationalization guide](https://zerolith.dev/guide/i18n/) explains it with examples that run as tests.
26
+ - The [reference](https://zerolith.dev/reference/zerolith-i18n/) lists every export, generated from the source.
27
+ - New to zerolith? The [tutorial](https://zerolith.dev/learn/) builds an app step by step, and the [playground](https://zerolith.dev/playground/) runs code in the browser.
22
28
 
23
29
  ## License
24
30
 
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA6DA,2EAA2E;AAC3E,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDnE"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAwGA,2EAA2E;AAC3E,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8EnE"}
package/dist/cli.js CHANGED
@@ -6,9 +6,41 @@
6
6
  */
7
7
  import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
8
8
  import { basename, join } from "node:path";
9
+ import { realpathSync } from "node:fs";
9
10
  import process from "node:process";
11
+ import { pathToFileURL } from "node:url";
10
12
  import { compileIndex, compileMessages, messageNames } from "./compile.js";
11
13
  const USAGE = "usage: zerolith-i18n <folder> [--out <folder>] [--js] [--strict]\n";
14
+ /** The locale a catalog's file name gives, refusing a name that is not a BCP 47 language tag, such as `en_US.json`. */
15
+ function localeOf(file) {
16
+ const locale = basename(file, ".json");
17
+ try {
18
+ Intl.getCanonicalLocales(locale);
19
+ }
20
+ catch {
21
+ throw new Error(`${locale} is not a language tag; name the file as en.json or pt-BR.json`);
22
+ }
23
+ return locale;
24
+ }
25
+ /** A catalog's messages, refusing a file that is not a JSON object of strings. */
26
+ function catalogOf(text) {
27
+ const parsed = JSON.parse(text);
28
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
29
+ throw new Error("a catalog is a JSON object of messages");
30
+ }
31
+ for (const [key, value] of Object.entries(parsed)) {
32
+ if (typeof value !== "string") {
33
+ throw new Error(`the message "${key}" is not a string`);
34
+ }
35
+ }
36
+ return parsed;
37
+ }
38
+ /** Reports why a catalog cannot be compiled, naming its file, and gives the exit code; nothing has been written. */
39
+ function failure(file, error) {
40
+ const message = error instanceof Error ? error.message.replace(/^zerolith\/i18n: /, "") : String(error);
41
+ process.stderr.write(`zerolith-i18n: ${file}: ${message}\n`);
42
+ return 1;
43
+ }
12
44
  function parse(argv) {
13
45
  const parsed = { folder: undefined, out: undefined, javascript: false, strict: false };
14
46
  for (let index = 0; index < argv.length; index++) {
@@ -59,10 +91,21 @@ export async function main(argv) {
59
91
  return 1;
60
92
  }
61
93
  const out = parsed.out ?? parsed.folder;
62
- await mkdir(out, { recursive: true });
63
94
  const language = parsed.javascript ? "js" : "ts";
64
95
  const folder = parsed.folder;
65
- const catalogs = new Map(await Promise.all(files.map(async (file) => [basename(file, ".json"), JSON.parse(await readFile(join(folder, file), "utf8"))])));
96
+ const read = await Promise.all(files.map(async (file) => {
97
+ try {
98
+ return { file, locale: localeOf(file), catalog: catalogOf(await readFile(join(folder, file), "utf8")) };
99
+ }
100
+ catch (error) {
101
+ return { file, error };
102
+ }
103
+ }));
104
+ const unreadable = read.find((entry) => "error" in entry);
105
+ if (unreadable !== undefined) {
106
+ return failure(unreadable.file, unreadable.error);
107
+ }
108
+ const catalogs = new Map(read.map((entry) => [entry.locale ?? "", entry.catalog ?? {}]));
66
109
  const all = new Set();
67
110
  for (const catalog of catalogs.values()) {
68
111
  for (const name of messageNames(catalog)) {
@@ -70,7 +113,7 @@ export async function main(argv) {
70
113
  }
71
114
  }
72
115
  let missing = 0;
73
- const writes = [];
116
+ const modules = new Map();
74
117
  for (const [locale, catalog] of catalogs) {
75
118
  const present = new Set(messageNames(catalog));
76
119
  for (const name of all) {
@@ -79,15 +122,30 @@ export async function main(argv) {
79
122
  process.stderr.write(`zerolith-i18n: ${locale} lacks ${name}\n`);
80
123
  }
81
124
  }
82
- const compiled = compileMessages(locale, catalog, { language, source: `${locale}.json` });
83
- writes.push(writeFile(join(out, `${locale}.${language}`), compiled.code));
125
+ try {
126
+ modules.set(`${locale}.${language}`, compileMessages(locale, catalog, { language, source: `${locale}.json` }).code);
127
+ }
128
+ catch (error) {
129
+ return failure(`${locale}.json`, error);
130
+ }
84
131
  }
85
- writes.push(writeFile(join(out, `index.${language}`), compileIndex([...catalogs.keys()], { language })));
86
- await Promise.all(writes);
132
+ modules.set(`index.${language}`, compileIndex([...catalogs.keys()], { language }));
133
+ await mkdir(out, { recursive: true });
134
+ await Promise.all([...modules].map(([name, code]) => writeFile(join(out, name), code)));
87
135
  process.stdout.write(`zerolith-i18n: ${catalogs.size} locale(s), ${all.size} message(s), written to ${out}\n`);
88
136
  return missing > 0 && parsed.strict ? 1 : 0;
89
137
  }
90
- if (process.argv[1] !== undefined && /zerolith-i18n|[\\/]cli\.js$/.test(process.argv[1])) {
138
+ /** True when node started this module, directly or through the bin link npm installs, which it resolves the way node resolves its entry. */
139
+ function started() {
140
+ const entry = process.argv[1];
141
+ try {
142
+ return entry !== undefined && pathToFileURL(realpathSync(entry)).href === import.meta.url;
143
+ }
144
+ catch {
145
+ return false;
146
+ }
147
+ }
148
+ if (started()) {
91
149
  process.exitCode = await main(process.argv.slice(2));
92
150
  }
93
151
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/compile.d.ts CHANGED
@@ -20,6 +20,7 @@ export interface CompileOptions {
20
20
  }
21
21
  /** The result of compiling one catalog. */
22
22
  export interface CompiledCatalog {
23
+ /** The generated module's source, TypeScript or JavaScript as the `language` option chose; the `zerolith-i18n` CLI writes it to `<locale>.ts` or `<locale>.js`. */
23
24
  code: string;
24
25
  /** The message keys as function names, in source order. */
25
26
  names: string[];
@@ -28,7 +29,11 @@ export interface CompiledCatalog {
28
29
  * Compiles one locale's catalog into a module: `locale`, one exported
29
30
  * function per message named from its key, and the `Intl` helpers they
30
31
  * share. Each function takes an `args` object typed from the message's
31
- * placeholders, or nothing when the message has none.
32
+ * placeholders, or nothing when the message has none. A formatter whose
33
+ * options are all literals is a module-level binding created on first use
34
+ * and shared by every message that formats the same way; options that read
35
+ * an argument find their formatter in a cache keyed by the options. Only
36
+ * the helpers the messages use are written.
32
37
  */
33
38
  export declare function compileMessages(locale: string, catalog: Catalog, options?: CompileOptions): CompiledCatalog;
34
39
  /** The keys of a catalog as function names, for comparing locales. */
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,wDAAwD;AACxD,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAE3B,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAE5B,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AA4zBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,cAAmB,GAAG,eAAe,CAkD/G;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAGvD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAsB7F"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,wDAAwD;AACxD,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAE3B,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAE5B,mKAAmK;IACnK,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AA+5BD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,cAAmB,GAAG,eAAe,CA+D/G;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAGvD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAsB7F"}