@digitaldefiance/i18n-lib 3.0.0 → 3.5.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.
Files changed (62) hide show
  1. package/README.md +125 -0
  2. package/package.json +1 -1
  3. package/src/icu/ast.d.ts +48 -0
  4. package/src/icu/ast.d.ts.map +1 -0
  5. package/src/icu/ast.js +16 -0
  6. package/src/icu/ast.js.map +1 -0
  7. package/src/icu/compiler.d.ts +16 -0
  8. package/src/icu/compiler.d.ts.map +1 -0
  9. package/src/icu/compiler.js +81 -0
  10. package/src/icu/compiler.js.map +1 -0
  11. package/src/icu/formatter-registry.d.ts +10 -0
  12. package/src/icu/formatter-registry.d.ts.map +1 -0
  13. package/src/icu/formatter-registry.js +34 -0
  14. package/src/icu/formatter-registry.js.map +1 -0
  15. package/src/icu/formatters/base-formatter.d.ts +8 -0
  16. package/src/icu/formatters/base-formatter.d.ts.map +1 -0
  17. package/src/icu/formatters/base-formatter.js +3 -0
  18. package/src/icu/formatters/base-formatter.js.map +1 -0
  19. package/src/icu/formatters/date-formatter.d.ts +5 -0
  20. package/src/icu/formatters/date-formatter.d.ts.map +1 -0
  21. package/src/icu/formatters/date-formatter.js +31 -0
  22. package/src/icu/formatters/date-formatter.js.map +1 -0
  23. package/src/icu/formatters/number-formatter.d.ts +5 -0
  24. package/src/icu/formatters/number-formatter.d.ts.map +1 -0
  25. package/src/icu/formatters/number-formatter.js +30 -0
  26. package/src/icu/formatters/number-formatter.js.map +1 -0
  27. package/src/icu/formatters/plural-formatter.d.ts +5 -0
  28. package/src/icu/formatters/plural-formatter.d.ts.map +1 -0
  29. package/src/icu/formatters/plural-formatter.js +15 -0
  30. package/src/icu/formatters/plural-formatter.js.map +1 -0
  31. package/src/icu/formatters/select-formatter.d.ts +5 -0
  32. package/src/icu/formatters/select-formatter.d.ts.map +1 -0
  33. package/src/icu/formatters/select-formatter.js +10 -0
  34. package/src/icu/formatters/select-formatter.js.map +1 -0
  35. package/src/icu/formatters/selectordinal-formatter.d.ts +5 -0
  36. package/src/icu/formatters/selectordinal-formatter.d.ts.map +1 -0
  37. package/src/icu/formatters/selectordinal-formatter.js +22 -0
  38. package/src/icu/formatters/selectordinal-formatter.js.map +1 -0
  39. package/src/icu/formatters/time-formatter.d.ts +5 -0
  40. package/src/icu/formatters/time-formatter.d.ts.map +1 -0
  41. package/src/icu/formatters/time-formatter.js +31 -0
  42. package/src/icu/formatters/time-formatter.js.map +1 -0
  43. package/src/icu/helpers.d.ts +9 -0
  44. package/src/icu/helpers.d.ts.map +1 -0
  45. package/src/icu/helpers.js +31 -0
  46. package/src/icu/helpers.js.map +1 -0
  47. package/src/icu/parser.d.ts +29 -0
  48. package/src/icu/parser.d.ts.map +1 -0
  49. package/src/icu/parser.js +194 -0
  50. package/src/icu/parser.js.map +1 -0
  51. package/src/icu/runtime.d.ts +10 -0
  52. package/src/icu/runtime.d.ts.map +1 -0
  53. package/src/icu/runtime.js +28 -0
  54. package/src/icu/runtime.js.map +1 -0
  55. package/src/icu/tokenizer.d.ts +37 -0
  56. package/src/icu/tokenizer.d.ts.map +1 -0
  57. package/src/icu/tokenizer.js +187 -0
  58. package/src/icu/tokenizer.js.map +1 -0
  59. package/src/icu/validator.d.ts +11 -0
  60. package/src/icu/validator.d.ts.map +1 -0
  61. package/src/icu/validator.js +140 -0
  62. package/src/icu/validator.js.map +1 -0
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TimeFormatter = void 0;
4
+ class TimeFormatter {
5
+ format(value, style, context) {
6
+ const date = value instanceof Date ? value : new Date(value);
7
+ if (isNaN(date.getTime()))
8
+ return String(value);
9
+ const locale = context?.locale || 'en-US';
10
+ const options = {};
11
+ switch (style) {
12
+ case 'short':
13
+ options.timeStyle = 'short';
14
+ break;
15
+ case 'medium':
16
+ options.timeStyle = 'medium';
17
+ break;
18
+ case 'long':
19
+ options.timeStyle = 'long';
20
+ break;
21
+ case 'full':
22
+ options.timeStyle = 'full';
23
+ break;
24
+ default:
25
+ options.timeStyle = 'medium';
26
+ }
27
+ return new Intl.DateTimeFormat(locale, options).format(date);
28
+ }
29
+ }
30
+ exports.TimeFormatter = TimeFormatter;
31
+ //# sourceMappingURL=time-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-formatter.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-i18n-lib/src/icu/formatters/time-formatter.ts"],"names":[],"mappings":";;;AAEA,MAAa,aAAa;IACxB,MAAM,CAAC,KAAU,EAAE,KAAc,EAAE,OAA0B;QAC3D,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC;QAC1C,MAAM,OAAO,GAA+B,EAAE,CAAC;QAE/C,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,OAAO;gBACV,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;gBAC5B,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC;gBAC7B,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC;gBAC3B,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC;gBAC3B,MAAM;YACR;gBACE,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;CACF;AA3BD,sCA2BC"}
@@ -0,0 +1,9 @@
1
+ import { ValidationOptions } from './validator';
2
+ import { Compiler } from './compiler';
3
+ import { MessageNode } from './ast';
4
+ export declare function isICUMessage(message: string): boolean;
5
+ export declare function parseICUMessage(message: string): MessageNode;
6
+ export declare function compileICUMessage(message: string): ReturnType<Compiler['compile']>;
7
+ export declare function formatICUMessage(message: string, values: Record<string, any>, locale?: string): string;
8
+ export declare function validateICUMessage(message: string, options?: ValidationOptions): void;
9
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAIpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAIlF;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,MAAM,GAAE,MAAgB,GACvB,MAAM,CAER;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAGrF"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isICUMessage = isICUMessage;
4
+ exports.parseICUMessage = parseICUMessage;
5
+ exports.compileICUMessage = compileICUMessage;
6
+ exports.formatICUMessage = formatICUMessage;
7
+ exports.validateICUMessage = validateICUMessage;
8
+ const parser_1 = require("./parser");
9
+ const validator_1 = require("./validator");
10
+ const compiler_1 = require("./compiler");
11
+ const runtime_1 = require("./runtime");
12
+ const defaultRuntime = new runtime_1.Runtime();
13
+ function isICUMessage(message) {
14
+ return /\{[^}]+\}/.test(message);
15
+ }
16
+ function parseICUMessage(message) {
17
+ return (0, parser_1.parse)(message);
18
+ }
19
+ function compileICUMessage(message) {
20
+ const ast = (0, parser_1.parse)(message);
21
+ const compiler = new compiler_1.Compiler();
22
+ return compiler.compile(ast);
23
+ }
24
+ function formatICUMessage(message, values, locale = 'en-US') {
25
+ return defaultRuntime.format(message, values, { locale });
26
+ }
27
+ function validateICUMessage(message, options) {
28
+ const ast = (0, parser_1.parse)(message);
29
+ (0, validator_1.validate)(ast, options);
30
+ }
31
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/helpers.ts"],"names":[],"mappings":";;AAQA,oCAEC;AAED,0CAEC;AAED,8CAIC;AAED,4CAMC;AAED,gDAGC;AAjCD,qCAAiC;AACjC,2CAA0D;AAC1D,yCAAsC;AACtC,uCAAoC;AAGpC,MAAM,cAAc,GAAG,IAAI,iBAAO,EAAE,CAAC;AAErC,SAAgB,YAAY,CAAC,OAAe;IAC1C,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,eAAe,CAAC,OAAe;IAC7C,OAAO,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,mBAAQ,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,gBAAgB,CAC9B,OAAe,EACf,MAA2B,EAC3B,SAAiB,OAAO;IAExB,OAAO,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAe,EAAE,OAA2B;IAC7E,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;IAC3B,IAAA,oBAAQ,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ICU MessageFormat Parser
3
+ */
4
+ import { MessageNode } from './ast';
5
+ export declare class ParseError extends Error {
6
+ position: number;
7
+ constructor(message: string, position: number);
8
+ }
9
+ export declare class Parser {
10
+ private tokens;
11
+ private position;
12
+ constructor(input: string);
13
+ parse(): MessageNode;
14
+ private parseMessage;
15
+ private parseLiteral;
16
+ private parseArgument;
17
+ private parsePlural;
18
+ private parseSelect;
19
+ private parseSelectOrdinal;
20
+ private check;
21
+ private advance;
22
+ private isAtEnd;
23
+ private peek;
24
+ private previous;
25
+ private consume;
26
+ private skipWhitespace;
27
+ }
28
+ export declare function parse(input: string): MessageNode;
29
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,WAAW,EAQZ,MAAM,OAAO,CAAC;AAEf,qBAAa,UAAW,SAAQ,KAAK;IACC,QAAQ,EAAE,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAS,QAAQ,EAAE,MAAM;CAIrD;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,QAAQ,CAAa;gBAEjB,KAAK,EAAE,MAAM;IAIzB,KAAK,IAAI,WAAW;IAIpB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IAuCrB,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,cAAc;CAKvB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAEhD"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /**
3
+ * ICU MessageFormat Parser
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Parser = exports.ParseError = void 0;
7
+ exports.parse = parse;
8
+ const tokenizer_1 = require("./tokenizer");
9
+ const ast_1 = require("./ast");
10
+ class ParseError extends Error {
11
+ position;
12
+ constructor(message, position) {
13
+ super(`Parse error at position ${position}: ${message}`);
14
+ this.position = position;
15
+ this.name = 'ParseError';
16
+ }
17
+ }
18
+ exports.ParseError = ParseError;
19
+ class Parser {
20
+ tokens;
21
+ position = 0;
22
+ constructor(input) {
23
+ this.tokens = new tokenizer_1.Tokenizer(input).tokenize();
24
+ }
25
+ parse() {
26
+ return this.parseMessage();
27
+ }
28
+ parseMessage() {
29
+ const elements = [];
30
+ while (!this.isAtEnd() && !this.check(tokenizer_1.TokenType.CLOSE_BRACE)) {
31
+ if (this.check(tokenizer_1.TokenType.TEXT)) {
32
+ elements.push(this.parseLiteral());
33
+ }
34
+ else if (this.check(tokenizer_1.TokenType.OPEN_BRACE)) {
35
+ elements.push(this.parseArgument());
36
+ }
37
+ else if (this.check(tokenizer_1.TokenType.HASH)) {
38
+ // # is treated as literal in message context
39
+ this.advance();
40
+ elements.push({ type: ast_1.NodeType.LITERAL, value: '#' });
41
+ }
42
+ else {
43
+ this.advance(); // Skip unexpected tokens
44
+ }
45
+ }
46
+ return { type: ast_1.NodeType.MESSAGE, elements };
47
+ }
48
+ parseLiteral() {
49
+ const token = this.advance();
50
+ return { type: ast_1.NodeType.LITERAL, value: token.value };
51
+ }
52
+ parseArgument() {
53
+ this.consume(tokenizer_1.TokenType.OPEN_BRACE, 'Expected {');
54
+ const name = this.consume(tokenizer_1.TokenType.IDENTIFIER, 'Expected argument name').value;
55
+ // Simple argument: {name}
56
+ if (this.check(tokenizer_1.TokenType.CLOSE_BRACE)) {
57
+ this.advance();
58
+ return { type: ast_1.NodeType.ARGUMENT, name };
59
+ }
60
+ // Formatted argument: {name, type} or {name, type, style}
61
+ this.consume(tokenizer_1.TokenType.COMMA, 'Expected ,');
62
+ const format = this.consume(tokenizer_1.TokenType.IDENTIFIER, 'Expected format type').value;
63
+ // Check for plural/select/selectordinal
64
+ if (format === 'plural') {
65
+ return this.parsePlural(name);
66
+ }
67
+ if (format === 'select') {
68
+ return this.parseSelect(name);
69
+ }
70
+ if (format === 'selectordinal') {
71
+ return this.parseSelectOrdinal(name);
72
+ }
73
+ // Regular formatted argument: {name, type, style}
74
+ let style;
75
+ if (this.check(tokenizer_1.TokenType.COMMA)) {
76
+ this.advance();
77
+ style = this.consume(tokenizer_1.TokenType.IDENTIFIER, 'Expected style').value;
78
+ }
79
+ this.consume(tokenizer_1.TokenType.CLOSE_BRACE, 'Expected }');
80
+ return { type: ast_1.NodeType.ARGUMENT, name, format, style };
81
+ }
82
+ parsePlural(name) {
83
+ this.consume(tokenizer_1.TokenType.COMMA, 'Expected ,');
84
+ this.skipWhitespace();
85
+ const cases = {};
86
+ let offset;
87
+ // Parse offset if present
88
+ if (this.check(tokenizer_1.TokenType.IDENTIFIER) && this.peek().value === 'offset') {
89
+ this.advance(); // offset
90
+ this.skipWhitespace();
91
+ this.consume(tokenizer_1.TokenType.IDENTIFIER, 'Expected offset value'); // number
92
+ offset = 0; // Simplified for now
93
+ this.skipWhitespace();
94
+ }
95
+ // Parse cases
96
+ while (!this.check(tokenizer_1.TokenType.CLOSE_BRACE) && !this.isAtEnd()) {
97
+ this.skipWhitespace();
98
+ if (this.check(tokenizer_1.TokenType.CLOSE_BRACE))
99
+ break;
100
+ const caseKey = this.consume(tokenizer_1.TokenType.IDENTIFIER, 'Expected case key').value;
101
+ this.skipWhitespace();
102
+ this.consume(tokenizer_1.TokenType.OPEN_BRACE, 'Expected {');
103
+ const caseMessage = this.parseMessage();
104
+ this.consume(tokenizer_1.TokenType.CLOSE_BRACE, 'Expected }');
105
+ cases[caseKey] = caseMessage;
106
+ }
107
+ if (Object.keys(cases).length === 0) {
108
+ throw new ParseError('Plural must have at least one case', this.peek().position);
109
+ }
110
+ this.consume(tokenizer_1.TokenType.CLOSE_BRACE, 'Expected }');
111
+ return { type: ast_1.NodeType.PLURAL, name, offset, cases };
112
+ }
113
+ parseSelect(name) {
114
+ this.consume(tokenizer_1.TokenType.COMMA, 'Expected ,');
115
+ this.skipWhitespace();
116
+ const cases = {};
117
+ // Parse cases
118
+ while (!this.check(tokenizer_1.TokenType.CLOSE_BRACE) && !this.isAtEnd()) {
119
+ this.skipWhitespace();
120
+ if (this.check(tokenizer_1.TokenType.CLOSE_BRACE))
121
+ break;
122
+ const caseKey = this.consume(tokenizer_1.TokenType.IDENTIFIER, 'Expected case key').value;
123
+ this.skipWhitespace();
124
+ this.consume(tokenizer_1.TokenType.OPEN_BRACE, 'Expected {');
125
+ const caseMessage = this.parseMessage();
126
+ this.consume(tokenizer_1.TokenType.CLOSE_BRACE, 'Expected }');
127
+ cases[caseKey] = caseMessage;
128
+ }
129
+ this.consume(tokenizer_1.TokenType.CLOSE_BRACE, 'Expected }');
130
+ return { type: ast_1.NodeType.SELECT, name, cases };
131
+ }
132
+ parseSelectOrdinal(name) {
133
+ this.consume(tokenizer_1.TokenType.COMMA, 'Expected ,');
134
+ this.skipWhitespace();
135
+ const cases = {};
136
+ let offset;
137
+ // Parse offset if present
138
+ if (this.check(tokenizer_1.TokenType.IDENTIFIER) && this.peek().value === 'offset') {
139
+ this.advance(); // offset
140
+ this.skipWhitespace();
141
+ this.consume(tokenizer_1.TokenType.IDENTIFIER, 'Expected offset value'); // number
142
+ offset = 0; // Simplified for now
143
+ this.skipWhitespace();
144
+ }
145
+ // Parse cases
146
+ while (!this.check(tokenizer_1.TokenType.CLOSE_BRACE) && !this.isAtEnd()) {
147
+ this.skipWhitespace();
148
+ if (this.check(tokenizer_1.TokenType.CLOSE_BRACE))
149
+ break;
150
+ const caseKey = this.consume(tokenizer_1.TokenType.IDENTIFIER, 'Expected case key').value;
151
+ this.skipWhitespace();
152
+ this.consume(tokenizer_1.TokenType.OPEN_BRACE, 'Expected {');
153
+ const caseMessage = this.parseMessage();
154
+ this.consume(tokenizer_1.TokenType.CLOSE_BRACE, 'Expected }');
155
+ cases[caseKey] = caseMessage;
156
+ }
157
+ this.consume(tokenizer_1.TokenType.CLOSE_BRACE, 'Expected }');
158
+ return { type: ast_1.NodeType.SELECTORDINAL, name, offset, cases };
159
+ }
160
+ check(type) {
161
+ if (this.isAtEnd())
162
+ return false;
163
+ return this.peek().type === type;
164
+ }
165
+ advance() {
166
+ if (!this.isAtEnd())
167
+ this.position++;
168
+ return this.previous();
169
+ }
170
+ isAtEnd() {
171
+ return this.peek().type === tokenizer_1.TokenType.EOF;
172
+ }
173
+ peek() {
174
+ return this.tokens[this.position];
175
+ }
176
+ previous() {
177
+ return this.tokens[this.position - 1];
178
+ }
179
+ consume(type, message) {
180
+ if (this.check(type))
181
+ return this.advance();
182
+ throw new ParseError(message, this.peek().position);
183
+ }
184
+ skipWhitespace() {
185
+ while (this.check(tokenizer_1.TokenType.TEXT) && this.peek().value.trim() === '') {
186
+ this.advance();
187
+ }
188
+ }
189
+ }
190
+ exports.Parser = Parser;
191
+ function parse(input) {
192
+ return new Parser(input).parse();
193
+ }
194
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { FormatterRegistry } from './formatter-registry';
2
+ import { FormatterContext } from './formatters/base-formatter';
3
+ export declare class Runtime {
4
+ private compiler;
5
+ private cache;
6
+ constructor(registry?: FormatterRegistry);
7
+ format(message: string, values: Record<string, any>, context: FormatterContext): string;
8
+ clearCache(): void;
9
+ }
10
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,KAAK,CAAsC;gBAEvC,QAAQ,CAAC,EAAE,iBAAiB;IAIxC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM;IAavF,UAAU,IAAI,IAAI;CAGnB"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Runtime = void 0;
4
+ const parser_1 = require("./parser");
5
+ const validator_1 = require("./validator");
6
+ const compiler_1 = require("./compiler");
7
+ class Runtime {
8
+ compiler;
9
+ cache = new Map();
10
+ constructor(registry) {
11
+ this.compiler = new compiler_1.Compiler(registry);
12
+ }
13
+ format(message, values, context) {
14
+ let compiled = this.cache.get(message);
15
+ if (!compiled) {
16
+ const ast = (0, parser_1.parse)(message);
17
+ (0, validator_1.validate)(ast);
18
+ compiled = this.compiler.compile(ast);
19
+ this.cache.set(message, compiled);
20
+ }
21
+ return compiled(values, context);
22
+ }
23
+ clearCache() {
24
+ this.cache.clear();
25
+ }
26
+ }
27
+ exports.Runtime = Runtime;
28
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/runtime.ts"],"names":[],"mappings":";;;AAAA,qCAAiC;AACjC,2CAAuC;AACvC,yCAAuD;AAIvD,MAAa,OAAO;IACV,QAAQ,CAAW;IACnB,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,YAAY,QAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,OAAe,EAAE,MAA2B,EAAE,OAAyB;QAC5E,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;YAC3B,IAAA,oBAAQ,EAAC,GAAG,CAAC,CAAC;YACd,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAxBD,0BAwBC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * ICU MessageFormat Tokenizer
3
+ */
4
+ export declare enum TokenType {
5
+ TEXT = "TEXT",
6
+ OPEN_BRACE = "OPEN_BRACE",
7
+ CLOSE_BRACE = "CLOSE_BRACE",
8
+ COMMA = "COMMA",
9
+ HASH = "HASH",
10
+ IDENTIFIER = "IDENTIFIER",
11
+ EOF = "EOF"
12
+ }
13
+ export interface Token {
14
+ type: TokenType;
15
+ value: string;
16
+ position: number;
17
+ }
18
+ export declare class Tokenizer {
19
+ private input;
20
+ private position;
21
+ private length;
22
+ private braceDepth;
23
+ private lastTokenType;
24
+ private formatDepths;
25
+ private lastIdentifierWasAtFormatDepth;
26
+ constructor(input: string);
27
+ tokenize(): Token[];
28
+ private nextToken;
29
+ private readIdentifier;
30
+ private readText;
31
+ private peek;
32
+ private isIdentifierStart;
33
+ private isIdentifierChar;
34
+ private isWhitespace;
35
+ private isAtFormatLevel;
36
+ }
37
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/tokenizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,SAAS;IACnB,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,WAAW,gBAAgB;IAC3B,KAAK,UAAU;IACf,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,GAAG,QAAQ;CACZ;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,8BAA8B,CAAkB;gBAE5C,KAAK,EAAE,MAAM;IAKzB,QAAQ,IAAI,KAAK,EAAE;IAYnB,OAAO,CAAC,SAAS;IA8EjB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,QAAQ;IA4ChB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;CAYxB"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * ICU MessageFormat Tokenizer
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Tokenizer = exports.TokenType = void 0;
7
+ var TokenType;
8
+ (function (TokenType) {
9
+ TokenType["TEXT"] = "TEXT";
10
+ TokenType["OPEN_BRACE"] = "OPEN_BRACE";
11
+ TokenType["CLOSE_BRACE"] = "CLOSE_BRACE";
12
+ TokenType["COMMA"] = "COMMA";
13
+ TokenType["HASH"] = "HASH";
14
+ TokenType["IDENTIFIER"] = "IDENTIFIER";
15
+ TokenType["EOF"] = "EOF";
16
+ })(TokenType || (exports.TokenType = TokenType = {}));
17
+ class Tokenizer {
18
+ input;
19
+ position = 0;
20
+ length;
21
+ braceDepth = 0;
22
+ lastTokenType = null;
23
+ formatDepths = new Set(); // Tracks which depths are format specs
24
+ lastIdentifierWasAtFormatDepth = false;
25
+ constructor(input) {
26
+ this.input = input;
27
+ this.length = input.length;
28
+ }
29
+ tokenize() {
30
+ const tokens = [];
31
+ while (this.position < this.length) {
32
+ const token = this.nextToken();
33
+ if (token.type !== TokenType.EOF) {
34
+ tokens.push(token);
35
+ }
36
+ }
37
+ tokens.push({ type: TokenType.EOF, value: '', position: this.position });
38
+ return tokens;
39
+ }
40
+ nextToken() {
41
+ if (this.position >= this.length) {
42
+ return { type: TokenType.EOF, value: '', position: this.position };
43
+ }
44
+ const char = this.input[this.position];
45
+ // Handle escape sequences - quoted braces
46
+ if (char === "'") {
47
+ const next = this.peek();
48
+ if (next === '{' || next === '}') {
49
+ const pos = this.position;
50
+ this.position++; // Skip quote
51
+ this.position++; // Skip brace
52
+ return { type: TokenType.TEXT, value: next, position: pos };
53
+ }
54
+ }
55
+ // Special characters
56
+ if (char === '{') {
57
+ const prevDepth = this.braceDepth;
58
+ this.braceDepth++;
59
+ // Add to format depths if:
60
+ // 1. Start of message (null)
61
+ // 2. After TEXT - new format in message (unless after case name)
62
+ // 3. After CLOSE_BRACE at depth 0 - consecutive formats
63
+ // 4. After OPEN_BRACE - nested format (unless after case name)
64
+ // NOT after IDENTIFIER at format depth - that's a case name, next brace is message content
65
+ if (this.lastTokenType === null ||
66
+ (this.lastTokenType === TokenType.TEXT && !this.lastIdentifierWasAtFormatDepth) ||
67
+ (this.lastTokenType === TokenType.CLOSE_BRACE && prevDepth === 0) ||
68
+ (this.lastTokenType === TokenType.OPEN_BRACE && !this.lastIdentifierWasAtFormatDepth)) {
69
+ this.formatDepths.add(this.braceDepth);
70
+ }
71
+ this.lastIdentifierWasAtFormatDepth = false;
72
+ const token = { type: TokenType.OPEN_BRACE, value: char, position: this.position++ };
73
+ this.lastTokenType = TokenType.OPEN_BRACE;
74
+ return token;
75
+ }
76
+ if (char === '}') {
77
+ this.formatDepths.delete(this.braceDepth);
78
+ this.braceDepth--;
79
+ this.lastIdentifierWasAtFormatDepth = false; // Reset after closing
80
+ const token = { type: TokenType.CLOSE_BRACE, value: char, position: this.position++ };
81
+ this.lastTokenType = TokenType.CLOSE_BRACE;
82
+ return token;
83
+ }
84
+ if (char === ',') {
85
+ // Comma at depth 1+ is format separator, at depth 0 is text
86
+ if (this.braceDepth >= 1) {
87
+ const token = { type: TokenType.COMMA, value: char, position: this.position++ };
88
+ this.lastTokenType = TokenType.COMMA;
89
+ return token;
90
+ }
91
+ // At depth 0, comma is just text
92
+ return this.readText();
93
+ }
94
+ if (char === '#') {
95
+ return { type: TokenType.HASH, value: char, position: this.position++ };
96
+ }
97
+ // Whitespace - skip at format level OR after identifier at depth 1
98
+ if (this.isWhitespace(char) && (this.isAtFormatLevel() || (this.braceDepth === 1 && this.lastTokenType === TokenType.IDENTIFIER))) {
99
+ this.position++;
100
+ return this.nextToken();
101
+ }
102
+ // Identifier (variable names, keywords) - at format level
103
+ if (this.isIdentifierStart(char)) {
104
+ if (this.isAtFormatLevel()) {
105
+ return this.readIdentifier();
106
+ }
107
+ }
108
+ // Text (everything else)
109
+ return this.readText();
110
+ }
111
+ readIdentifier() {
112
+ const start = this.position;
113
+ while (this.position < this.length && this.isIdentifierChar(this.input[this.position])) {
114
+ this.position++;
115
+ }
116
+ const token = {
117
+ type: TokenType.IDENTIFIER,
118
+ value: this.input.substring(start, this.position),
119
+ position: start,
120
+ };
121
+ this.lastTokenType = TokenType.IDENTIFIER;
122
+ this.lastIdentifierWasAtFormatDepth = this.formatDepths.has(this.braceDepth);
123
+ return token;
124
+ }
125
+ readText() {
126
+ const start = this.position;
127
+ let text = '';
128
+ while (this.position < this.length) {
129
+ const char = this.input[this.position];
130
+ // Handle escaped quotes - stop before them
131
+ if (char === "'" && (this.peek() === '{' || this.peek() === '}')) {
132
+ break;
133
+ }
134
+ // Stop at special characters (but not if they're escaped)
135
+ if (char === '{' || char === '#') {
136
+ break;
137
+ }
138
+ // For }, only stop if we're inside braces
139
+ if (char === '}' && this.braceDepth > 0) {
140
+ break;
141
+ }
142
+ // Stop at comma if we're at format level (depth >= 1)
143
+ if (char === ',' && this.braceDepth >= 1) {
144
+ break;
145
+ }
146
+ text += char;
147
+ this.position++;
148
+ }
149
+ const token = {
150
+ type: TokenType.TEXT,
151
+ value: text,
152
+ position: start,
153
+ };
154
+ this.lastTokenType = TokenType.TEXT;
155
+ // Don't reset the identifier flag for whitespace-only text
156
+ if (text.trim() !== '') {
157
+ this.lastIdentifierWasAtFormatDepth = false;
158
+ }
159
+ return token;
160
+ }
161
+ peek() {
162
+ return this.position + 1 < this.length ? this.input[this.position + 1] : '';
163
+ }
164
+ isIdentifierStart(char) {
165
+ return /[a-zA-Z_]/.test(char);
166
+ }
167
+ isIdentifierChar(char) {
168
+ return /[a-zA-Z0-9_]/.test(char);
169
+ }
170
+ isWhitespace(char) {
171
+ return /\s/.test(char);
172
+ }
173
+ isAtFormatLevel() {
174
+ // We're at format level if current depth is marked as format AND:
175
+ // 1. After OPEN_BRACE (expecting variable name)
176
+ // 2. After COMMA (expecting format type or case name)
177
+ // 3. After CLOSE_BRACE (just finished a case message, expecting another case name)
178
+ if (!this.formatDepths.has(this.braceDepth)) {
179
+ return false;
180
+ }
181
+ return this.lastTokenType === TokenType.OPEN_BRACE ||
182
+ this.lastTokenType === TokenType.COMMA ||
183
+ this.lastTokenType === TokenType.CLOSE_BRACE;
184
+ }
185
+ }
186
+ exports.Tokenizer = Tokenizer;
187
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { MessageNode } from './ast';
2
+ export declare class ValidationError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ export interface ValidationOptions {
6
+ requireOtherCase?: boolean;
7
+ allowCircularReferences?: boolean;
8
+ maxDepth?: number;
9
+ }
10
+ export declare function validate(ast: MessageNode, options?: ValidationOptions): void;
11
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/icu/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqE,MAAM,OAAO,CAAC;AAEvG,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI,CAIhF"}