@intlify/message-compiler 9.13.1 → 10.0.0-alpha.2
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/dist/message-compiler.cjs +54 -139
- package/dist/message-compiler.d.ts +0 -22
- package/dist/message-compiler.esm-browser.js +55 -137
- package/dist/message-compiler.esm-browser.prod.js +2 -2
- package/dist/message-compiler.global.js +54 -139
- package/dist/message-compiler.global.prod.js +2 -2
- package/dist/message-compiler.mjs +55 -137
- package/dist/message-compiler.node.mjs +55 -137
- package/dist/message-compiler.prod.cjs +54 -139
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* message-compiler
|
|
2
|
+
* message-compiler v10.0.0-alpha.2
|
|
3
3
|
* (c) 2024 kazuya kawaguchi
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
@@ -43,23 +43,6 @@ function join(items, separator = '') {
|
|
|
43
43
|
return items.reduce((str, item, index) => (index === 0 ? str + item : str + separator + item), '');
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
const CompileWarnCodes = {
|
|
47
|
-
USE_MODULO_SYNTAX: 1,
|
|
48
|
-
__EXTEND_POINT__: 2
|
|
49
|
-
};
|
|
50
|
-
/** @internal */
|
|
51
|
-
const warnMessages = {
|
|
52
|
-
[CompileWarnCodes.USE_MODULO_SYNTAX]: `Use modulo before '{{0}}'.`
|
|
53
|
-
};
|
|
54
|
-
function createCompileWarn(code, loc, ...args) {
|
|
55
|
-
const msg = format(warnMessages[code] || '', ...(args || [])) ;
|
|
56
|
-
const message = { message: String(msg), code };
|
|
57
|
-
if (loc) {
|
|
58
|
-
message.location = loc;
|
|
59
|
-
}
|
|
60
|
-
return message;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
46
|
const CompileErrorCodes = {
|
|
64
47
|
// tokenizer error codes
|
|
65
48
|
EXPECTED_TOKEN: 1,
|
|
@@ -184,7 +167,6 @@ function createScanner(str) {
|
|
|
184
167
|
}
|
|
185
168
|
function skipToPeek() {
|
|
186
169
|
const target = _index + _peekOffset;
|
|
187
|
-
// eslint-disable-next-line no-unmodified-loop-condition
|
|
188
170
|
while (target !== _index) {
|
|
189
171
|
next();
|
|
190
172
|
}
|
|
@@ -218,11 +200,11 @@ function createTokenizer(source, options = {}) {
|
|
|
218
200
|
const _initLoc = currentPosition();
|
|
219
201
|
const _initOffset = currentOffset();
|
|
220
202
|
const _context = {
|
|
221
|
-
currentType:
|
|
203
|
+
currentType: 13 /* TokenTypes.EOF */,
|
|
222
204
|
offset: _initOffset,
|
|
223
205
|
startLoc: _initLoc,
|
|
224
206
|
endLoc: _initLoc,
|
|
225
|
-
lastType:
|
|
207
|
+
lastType: 13 /* TokenTypes.EOF */,
|
|
226
208
|
lastOffset: _initOffset,
|
|
227
209
|
lastStartLoc: _initLoc,
|
|
228
210
|
lastEndLoc: _initLoc,
|
|
@@ -257,7 +239,7 @@ function createTokenizer(source, options = {}) {
|
|
|
257
239
|
}
|
|
258
240
|
return token;
|
|
259
241
|
}
|
|
260
|
-
const getEndToken = (context) => getToken(context,
|
|
242
|
+
const getEndToken = (context) => getToken(context, 13 /* TokenTypes.EOF */);
|
|
261
243
|
function eat(scnr, ch) {
|
|
262
244
|
if (scnr.currentChar() === ch) {
|
|
263
245
|
scnr.next();
|
|
@@ -331,7 +313,7 @@ function createTokenizer(source, options = {}) {
|
|
|
331
313
|
}
|
|
332
314
|
function isLinkedDotStart(scnr, context) {
|
|
333
315
|
const { currentType } = context;
|
|
334
|
-
if (currentType !==
|
|
316
|
+
if (currentType !== 7 /* TokenTypes.LinkedAlias */) {
|
|
335
317
|
return false;
|
|
336
318
|
}
|
|
337
319
|
peekSpaces(scnr);
|
|
@@ -341,7 +323,7 @@ function createTokenizer(source, options = {}) {
|
|
|
341
323
|
}
|
|
342
324
|
function isLinkedModifierStart(scnr, context) {
|
|
343
325
|
const { currentType } = context;
|
|
344
|
-
if (currentType !==
|
|
326
|
+
if (currentType !== 8 /* TokenTypes.LinkedDot */) {
|
|
345
327
|
return false;
|
|
346
328
|
}
|
|
347
329
|
peekSpaces(scnr);
|
|
@@ -351,8 +333,8 @@ function createTokenizer(source, options = {}) {
|
|
|
351
333
|
}
|
|
352
334
|
function isLinkedDelimiterStart(scnr, context) {
|
|
353
335
|
const { currentType } = context;
|
|
354
|
-
if (!(currentType ===
|
|
355
|
-
currentType ===
|
|
336
|
+
if (!(currentType === 7 /* TokenTypes.LinkedAlias */ ||
|
|
337
|
+
currentType === 11 /* TokenTypes.LinkedModifier */)) {
|
|
356
338
|
return false;
|
|
357
339
|
}
|
|
358
340
|
peekSpaces(scnr);
|
|
@@ -362,7 +344,7 @@ function createTokenizer(source, options = {}) {
|
|
|
362
344
|
}
|
|
363
345
|
function isLinkedReferStart(scnr, context) {
|
|
364
346
|
const { currentType } = context;
|
|
365
|
-
if (currentType !==
|
|
347
|
+
if (currentType !== 9 /* TokenTypes.LinkedDelimiter */) {
|
|
366
348
|
return false;
|
|
367
349
|
}
|
|
368
350
|
const fn = () => {
|
|
@@ -371,7 +353,6 @@ function createTokenizer(source, options = {}) {
|
|
|
371
353
|
return isIdentifierStart(scnr.peek());
|
|
372
354
|
}
|
|
373
355
|
else if (ch === "@" /* TokenChars.LinkedAlias */ ||
|
|
374
|
-
ch === "%" /* TokenChars.Modulo */ ||
|
|
375
356
|
ch === "|" /* TokenChars.Pipe */ ||
|
|
376
357
|
ch === ":" /* TokenChars.LinkedDelimiter */ ||
|
|
377
358
|
ch === "." /* TokenChars.LinkedDot */ ||
|
|
@@ -398,41 +379,25 @@ function createTokenizer(source, options = {}) {
|
|
|
398
379
|
scnr.resetPeek();
|
|
399
380
|
return ret;
|
|
400
381
|
}
|
|
401
|
-
function detectModuloStart(scnr) {
|
|
402
|
-
const spaces = peekSpaces(scnr);
|
|
403
|
-
const ret = scnr.currentPeek() === "%" /* TokenChars.Modulo */ &&
|
|
404
|
-
scnr.peek() === "{" /* TokenChars.BraceLeft */;
|
|
405
|
-
scnr.resetPeek();
|
|
406
|
-
return {
|
|
407
|
-
isModulo: ret,
|
|
408
|
-
hasSpace: spaces.length > 0
|
|
409
|
-
};
|
|
410
|
-
}
|
|
411
382
|
function isTextStart(scnr, reset = true) {
|
|
412
|
-
const fn = (hasSpace = false, prev = ''
|
|
383
|
+
const fn = (hasSpace = false, prev = '') => {
|
|
413
384
|
const ch = scnr.currentPeek();
|
|
414
385
|
if (ch === "{" /* TokenChars.BraceLeft */) {
|
|
415
|
-
return
|
|
386
|
+
return hasSpace;
|
|
416
387
|
}
|
|
417
388
|
else if (ch === "@" /* TokenChars.LinkedAlias */ || !ch) {
|
|
418
|
-
return
|
|
419
|
-
}
|
|
420
|
-
else if (ch === "%" /* TokenChars.Modulo */) {
|
|
421
|
-
scnr.peek();
|
|
422
|
-
return fn(hasSpace, "%" /* TokenChars.Modulo */, true);
|
|
389
|
+
return hasSpace;
|
|
423
390
|
}
|
|
424
391
|
else if (ch === "|" /* TokenChars.Pipe */) {
|
|
425
|
-
return prev ===
|
|
426
|
-
? true
|
|
427
|
-
: !(prev === CHAR_SP || prev === CHAR_LF);
|
|
392
|
+
return !(prev === CHAR_SP || prev === CHAR_LF);
|
|
428
393
|
}
|
|
429
394
|
else if (ch === CHAR_SP) {
|
|
430
395
|
scnr.peek();
|
|
431
|
-
return fn(true, CHAR_SP
|
|
396
|
+
return fn(true, CHAR_SP);
|
|
432
397
|
}
|
|
433
398
|
else if (ch === CHAR_LF) {
|
|
434
399
|
scnr.peek();
|
|
435
|
-
return fn(true, CHAR_LF
|
|
400
|
+
return fn(true, CHAR_LF);
|
|
436
401
|
}
|
|
437
402
|
else {
|
|
438
403
|
return true;
|
|
@@ -502,18 +467,8 @@ function createTokenizer(source, options = {}) {
|
|
|
502
467
|
}
|
|
503
468
|
return num;
|
|
504
469
|
}
|
|
505
|
-
function readModulo(scnr) {
|
|
506
|
-
skipSpaces(scnr);
|
|
507
|
-
const ch = scnr.currentChar();
|
|
508
|
-
if (ch !== "%" /* TokenChars.Modulo */) {
|
|
509
|
-
emitError(CompileErrorCodes.EXPECTED_TOKEN, currentPosition(), 0, ch);
|
|
510
|
-
}
|
|
511
|
-
scnr.next();
|
|
512
|
-
return "%" /* TokenChars.Modulo */;
|
|
513
|
-
}
|
|
514
470
|
function readText(scnr) {
|
|
515
471
|
let buf = '';
|
|
516
|
-
// eslint-disable-next-line no-constant-condition
|
|
517
472
|
while (true) {
|
|
518
473
|
const ch = scnr.currentChar();
|
|
519
474
|
if (ch === "{" /* TokenChars.BraceLeft */ ||
|
|
@@ -523,15 +478,6 @@ function createTokenizer(source, options = {}) {
|
|
|
523
478
|
!ch) {
|
|
524
479
|
break;
|
|
525
480
|
}
|
|
526
|
-
else if (ch === "%" /* TokenChars.Modulo */) {
|
|
527
|
-
if (isTextStart(scnr)) {
|
|
528
|
-
buf += ch;
|
|
529
|
-
scnr.next();
|
|
530
|
-
}
|
|
531
|
-
else {
|
|
532
|
-
break;
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
481
|
else if (ch === CHAR_SP || ch === CHAR_LF) {
|
|
536
482
|
if (isTextStart(scnr)) {
|
|
537
483
|
buf += ch;
|
|
@@ -667,7 +613,6 @@ function createTokenizer(source, options = {}) {
|
|
|
667
613
|
const fn = (buf) => {
|
|
668
614
|
const ch = scnr.currentChar();
|
|
669
615
|
if (ch === "{" /* TokenChars.BraceLeft */ ||
|
|
670
|
-
ch === "%" /* TokenChars.Modulo */ ||
|
|
671
616
|
ch === "@" /* TokenChars.LinkedAlias */ ||
|
|
672
617
|
ch === "|" /* TokenChars.Pipe */ ||
|
|
673
618
|
ch === "(" /* TokenChars.ParenLeft */ ||
|
|
@@ -746,31 +691,31 @@ function createTokenizer(source, options = {}) {
|
|
|
746
691
|
return token;
|
|
747
692
|
}
|
|
748
693
|
if (context.braceNest > 0 &&
|
|
749
|
-
(context.currentType ===
|
|
750
|
-
context.currentType ===
|
|
751
|
-
context.currentType ===
|
|
694
|
+
(context.currentType === 4 /* TokenTypes.Named */ ||
|
|
695
|
+
context.currentType === 5 /* TokenTypes.List */ ||
|
|
696
|
+
context.currentType === 6 /* TokenTypes.Literal */)) {
|
|
752
697
|
emitError(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE, currentPosition(), 0);
|
|
753
698
|
context.braceNest = 0;
|
|
754
699
|
return readToken(scnr, context);
|
|
755
700
|
}
|
|
756
701
|
if ((validNamedIdentifier = isNamedIdentifierStart(scnr, context))) {
|
|
757
|
-
token = getToken(context,
|
|
702
|
+
token = getToken(context, 4 /* TokenTypes.Named */, readNamedIdentifier(scnr));
|
|
758
703
|
skipSpaces(scnr);
|
|
759
704
|
return token;
|
|
760
705
|
}
|
|
761
706
|
if ((validListIdentifier = isListIdentifierStart(scnr, context))) {
|
|
762
|
-
token = getToken(context,
|
|
707
|
+
token = getToken(context, 5 /* TokenTypes.List */, readListIdentifier(scnr));
|
|
763
708
|
skipSpaces(scnr);
|
|
764
709
|
return token;
|
|
765
710
|
}
|
|
766
711
|
if ((validLiteral = isLiteralStart(scnr, context))) {
|
|
767
|
-
token = getToken(context,
|
|
712
|
+
token = getToken(context, 6 /* TokenTypes.Literal */, readLiteral(scnr));
|
|
768
713
|
skipSpaces(scnr);
|
|
769
714
|
return token;
|
|
770
715
|
}
|
|
771
716
|
if (!validNamedIdentifier && !validListIdentifier && !validLiteral) {
|
|
772
717
|
// TODO: we should be re-designed invalid cases, when we will extend message syntax near the future ...
|
|
773
|
-
token = getToken(context,
|
|
718
|
+
token = getToken(context, 12 /* TokenTypes.InvalidPlace */, readInvalidIdentifier(scnr));
|
|
774
719
|
emitError(CompileErrorCodes.INVALID_TOKEN_IN_PLACEHOLDER, currentPosition(), 0, token.value);
|
|
775
720
|
skipSpaces(scnr);
|
|
776
721
|
return token;
|
|
@@ -785,27 +730,27 @@ function createTokenizer(source, options = {}) {
|
|
|
785
730
|
const { currentType } = context;
|
|
786
731
|
let token = null;
|
|
787
732
|
const ch = scnr.currentChar();
|
|
788
|
-
if ((currentType ===
|
|
789
|
-
currentType ===
|
|
790
|
-
currentType ===
|
|
791
|
-
currentType ===
|
|
733
|
+
if ((currentType === 7 /* TokenTypes.LinkedAlias */ ||
|
|
734
|
+
currentType === 8 /* TokenTypes.LinkedDot */ ||
|
|
735
|
+
currentType === 11 /* TokenTypes.LinkedModifier */ ||
|
|
736
|
+
currentType === 9 /* TokenTypes.LinkedDelimiter */) &&
|
|
792
737
|
(ch === CHAR_LF || ch === CHAR_SP)) {
|
|
793
738
|
emitError(CompileErrorCodes.INVALID_LINKED_FORMAT, currentPosition(), 0);
|
|
794
739
|
}
|
|
795
740
|
switch (ch) {
|
|
796
741
|
case "@" /* TokenChars.LinkedAlias */:
|
|
797
742
|
scnr.next();
|
|
798
|
-
token = getToken(context,
|
|
743
|
+
token = getToken(context, 7 /* TokenTypes.LinkedAlias */, "@" /* TokenChars.LinkedAlias */);
|
|
799
744
|
context.inLinked = true;
|
|
800
745
|
return token;
|
|
801
746
|
case "." /* TokenChars.LinkedDot */:
|
|
802
747
|
skipSpaces(scnr);
|
|
803
748
|
scnr.next();
|
|
804
|
-
return getToken(context,
|
|
749
|
+
return getToken(context, 8 /* TokenTypes.LinkedDot */, "." /* TokenChars.LinkedDot */);
|
|
805
750
|
case ":" /* TokenChars.LinkedDelimiter */:
|
|
806
751
|
skipSpaces(scnr);
|
|
807
752
|
scnr.next();
|
|
808
|
-
return getToken(context,
|
|
753
|
+
return getToken(context, 9 /* TokenTypes.LinkedDelimiter */, ":" /* TokenChars.LinkedDelimiter */);
|
|
809
754
|
default:
|
|
810
755
|
if (isPluralStart(scnr)) {
|
|
811
756
|
token = getToken(context, 1 /* TokenTypes.Pipe */, readPlural(scnr));
|
|
@@ -821,7 +766,7 @@ function createTokenizer(source, options = {}) {
|
|
|
821
766
|
}
|
|
822
767
|
if (isLinkedModifierStart(scnr, context)) {
|
|
823
768
|
skipSpaces(scnr);
|
|
824
|
-
return getToken(context,
|
|
769
|
+
return getToken(context, 11 /* TokenTypes.LinkedModifier */, readLinkedModifier(scnr));
|
|
825
770
|
}
|
|
826
771
|
if (isLinkedReferStart(scnr, context)) {
|
|
827
772
|
skipSpaces(scnr);
|
|
@@ -830,10 +775,10 @@ function createTokenizer(source, options = {}) {
|
|
|
830
775
|
return readTokenInPlaceholder(scnr, context) || token;
|
|
831
776
|
}
|
|
832
777
|
else {
|
|
833
|
-
return getToken(context,
|
|
778
|
+
return getToken(context, 10 /* TokenTypes.LinkedKey */, readLinkedRefer(scnr));
|
|
834
779
|
}
|
|
835
780
|
}
|
|
836
|
-
if (currentType ===
|
|
781
|
+
if (currentType === 7 /* TokenTypes.LinkedAlias */) {
|
|
837
782
|
emitError(CompileErrorCodes.INVALID_LINKED_FORMAT, currentPosition(), 0);
|
|
838
783
|
}
|
|
839
784
|
context.braceNest = 0;
|
|
@@ -843,7 +788,7 @@ function createTokenizer(source, options = {}) {
|
|
|
843
788
|
}
|
|
844
789
|
// TODO: We need refactoring of token parsing ...
|
|
845
790
|
function readToken(scnr, context) {
|
|
846
|
-
let token = { type:
|
|
791
|
+
let token = { type: 13 /* TokenTypes.EOF */ };
|
|
847
792
|
if (context.braceNest > 0) {
|
|
848
793
|
return readTokenInPlaceholder(scnr, context) || getEndToken(context);
|
|
849
794
|
}
|
|
@@ -868,12 +813,6 @@ function createTokenizer(source, options = {}) {
|
|
|
868
813
|
context.inLinked = false;
|
|
869
814
|
return token;
|
|
870
815
|
}
|
|
871
|
-
const { isModulo, hasSpace } = detectModuloStart(scnr);
|
|
872
|
-
if (isModulo) {
|
|
873
|
-
return hasSpace
|
|
874
|
-
? getToken(context, 0 /* TokenTypes.Text */, readText(scnr))
|
|
875
|
-
: getToken(context, 4 /* TokenTypes.Modulo */, readModulo(scnr));
|
|
876
|
-
}
|
|
877
816
|
if (isTextStart(scnr)) {
|
|
878
817
|
return getToken(context, 0 /* TokenTypes.Text */, readText(scnr));
|
|
879
818
|
}
|
|
@@ -891,7 +830,7 @@ function createTokenizer(source, options = {}) {
|
|
|
891
830
|
_context.offset = currentOffset();
|
|
892
831
|
_context.startLoc = currentPosition();
|
|
893
832
|
if (_scnr.currentChar() === EOF) {
|
|
894
|
-
return getToken(_context,
|
|
833
|
+
return getToken(_context, 13 /* TokenTypes.EOF */);
|
|
895
834
|
}
|
|
896
835
|
return readToken(_scnr, _context);
|
|
897
836
|
}
|
|
@@ -927,7 +866,7 @@ function fromEscapeSequence(match, codePoint4, codePoint6) {
|
|
|
927
866
|
}
|
|
928
867
|
function createParser(options = {}) {
|
|
929
868
|
const location = options.location !== false;
|
|
930
|
-
const { onError
|
|
869
|
+
const { onError } = options;
|
|
931
870
|
function emitError(tokenzer, code, start, offset, ...args) {
|
|
932
871
|
const end = tokenzer.currentPosition();
|
|
933
872
|
end.offset += offset;
|
|
@@ -941,15 +880,6 @@ function createParser(options = {}) {
|
|
|
941
880
|
onError(err);
|
|
942
881
|
}
|
|
943
882
|
}
|
|
944
|
-
function emitWarn(tokenzer, code, start, offset, ...args) {
|
|
945
|
-
const end = tokenzer.currentPosition();
|
|
946
|
-
end.offset += offset;
|
|
947
|
-
end.column += offset;
|
|
948
|
-
if (onWarn) {
|
|
949
|
-
const loc = location ? createLocation(start, end) : null;
|
|
950
|
-
onWarn(createCompileWarn(code, loc, args));
|
|
951
|
-
}
|
|
952
|
-
}
|
|
953
883
|
function startNode(type, offset, loc) {
|
|
954
884
|
const node = { type };
|
|
955
885
|
if (location) {
|
|
@@ -986,14 +916,11 @@ function createParser(options = {}) {
|
|
|
986
916
|
endNode(node, tokenizer.currentOffset(), tokenizer.currentPosition());
|
|
987
917
|
return node;
|
|
988
918
|
}
|
|
989
|
-
function parseNamed(tokenizer, key
|
|
919
|
+
function parseNamed(tokenizer, key) {
|
|
990
920
|
const context = tokenizer.context();
|
|
991
921
|
const { lastOffset: offset, lastStartLoc: loc } = context; // get brace left loc
|
|
992
922
|
const node = startNode(4 /* NodeTypes.Named */, offset, loc);
|
|
993
923
|
node.key = key;
|
|
994
|
-
if (modulo === true) {
|
|
995
|
-
node.modulo = true;
|
|
996
|
-
}
|
|
997
924
|
tokenizer.nextToken(); // skip brach right
|
|
998
925
|
endNode(node, tokenizer.currentOffset(), tokenizer.currentPosition());
|
|
999
926
|
return node;
|
|
@@ -1012,7 +939,7 @@ function createParser(options = {}) {
|
|
|
1012
939
|
const context = tokenizer.context();
|
|
1013
940
|
const { lastOffset: offset, lastStartLoc: loc } = context; // get linked dot loc
|
|
1014
941
|
const node = startNode(8 /* NodeTypes.LinkedModifier */, offset, loc);
|
|
1015
|
-
if (token.type !==
|
|
942
|
+
if (token.type !== 11 /* TokenTypes.LinkedModifier */) {
|
|
1016
943
|
// empty modifier
|
|
1017
944
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_MODIFIER, context.lastStartLoc, 0);
|
|
1018
945
|
node.value = '';
|
|
@@ -1043,13 +970,13 @@ function createParser(options = {}) {
|
|
|
1043
970
|
const context = tokenizer.context();
|
|
1044
971
|
const linkedNode = startNode(6 /* NodeTypes.Linked */, context.offset, context.startLoc);
|
|
1045
972
|
let token = tokenizer.nextToken();
|
|
1046
|
-
if (token.type ===
|
|
973
|
+
if (token.type === 8 /* TokenTypes.LinkedDot */) {
|
|
1047
974
|
const parsed = parseLinkedModifier(tokenizer);
|
|
1048
975
|
linkedNode.modifier = parsed.node;
|
|
1049
976
|
token = parsed.nextConsumeToken || tokenizer.nextToken();
|
|
1050
977
|
}
|
|
1051
978
|
// asset check token
|
|
1052
|
-
if (token.type !==
|
|
979
|
+
if (token.type !== 9 /* TokenTypes.LinkedDelimiter */) {
|
|
1053
980
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1054
981
|
}
|
|
1055
982
|
token = tokenizer.nextToken();
|
|
@@ -1058,25 +985,25 @@ function createParser(options = {}) {
|
|
|
1058
985
|
token = tokenizer.nextToken();
|
|
1059
986
|
}
|
|
1060
987
|
switch (token.type) {
|
|
1061
|
-
case
|
|
988
|
+
case 10 /* TokenTypes.LinkedKey */:
|
|
1062
989
|
if (token.value == null) {
|
|
1063
990
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1064
991
|
}
|
|
1065
992
|
linkedNode.key = parseLinkedKey(tokenizer, token.value || '');
|
|
1066
993
|
break;
|
|
1067
|
-
case
|
|
994
|
+
case 4 /* TokenTypes.Named */:
|
|
1068
995
|
if (token.value == null) {
|
|
1069
996
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1070
997
|
}
|
|
1071
998
|
linkedNode.key = parseNamed(tokenizer, token.value || '');
|
|
1072
999
|
break;
|
|
1073
|
-
case
|
|
1000
|
+
case 5 /* TokenTypes.List */:
|
|
1074
1001
|
if (token.value == null) {
|
|
1075
1002
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1076
1003
|
}
|
|
1077
1004
|
linkedNode.key = parseList(tokenizer, token.value || '');
|
|
1078
1005
|
break;
|
|
1079
|
-
case
|
|
1006
|
+
case 6 /* TokenTypes.Literal */:
|
|
1080
1007
|
if (token.value == null) {
|
|
1081
1008
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1082
1009
|
}
|
|
@@ -1113,7 +1040,6 @@ function createParser(options = {}) {
|
|
|
1113
1040
|
const node = startNode(2 /* NodeTypes.Message */, startOffset, startLoc);
|
|
1114
1041
|
node.items = [];
|
|
1115
1042
|
let nextToken = null;
|
|
1116
|
-
let modulo = null;
|
|
1117
1043
|
do {
|
|
1118
1044
|
const token = nextToken || tokenizer.nextToken();
|
|
1119
1045
|
nextToken = null;
|
|
@@ -1124,39 +1050,32 @@ function createParser(options = {}) {
|
|
|
1124
1050
|
}
|
|
1125
1051
|
node.items.push(parseText(tokenizer, token.value || ''));
|
|
1126
1052
|
break;
|
|
1127
|
-
case
|
|
1053
|
+
case 5 /* TokenTypes.List */:
|
|
1128
1054
|
if (token.value == null) {
|
|
1129
1055
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1130
1056
|
}
|
|
1131
1057
|
node.items.push(parseList(tokenizer, token.value || ''));
|
|
1132
1058
|
break;
|
|
1133
|
-
case 4 /* TokenTypes.
|
|
1134
|
-
modulo = true;
|
|
1135
|
-
break;
|
|
1136
|
-
case 5 /* TokenTypes.Named */:
|
|
1059
|
+
case 4 /* TokenTypes.Named */:
|
|
1137
1060
|
if (token.value == null) {
|
|
1138
1061
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1139
1062
|
}
|
|
1140
|
-
node.items.push(parseNamed(tokenizer, token.value || ''
|
|
1141
|
-
if (modulo) {
|
|
1142
|
-
emitWarn(tokenizer, CompileWarnCodes.USE_MODULO_SYNTAX, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1143
|
-
modulo = null;
|
|
1144
|
-
}
|
|
1063
|
+
node.items.push(parseNamed(tokenizer, token.value || ''));
|
|
1145
1064
|
break;
|
|
1146
|
-
case
|
|
1065
|
+
case 6 /* TokenTypes.Literal */:
|
|
1147
1066
|
if (token.value == null) {
|
|
1148
1067
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, getTokenCaption(token));
|
|
1149
1068
|
}
|
|
1150
1069
|
node.items.push(parseLiteral(tokenizer, token.value || ''));
|
|
1151
1070
|
break;
|
|
1152
|
-
case
|
|
1071
|
+
case 7 /* TokenTypes.LinkedAlias */: {
|
|
1153
1072
|
const parsed = parseLinked(tokenizer);
|
|
1154
1073
|
node.items.push(parsed.node);
|
|
1155
1074
|
nextToken = parsed.nextConsumeToken || null;
|
|
1156
1075
|
break;
|
|
1157
1076
|
}
|
|
1158
1077
|
}
|
|
1159
|
-
} while (context.currentType !==
|
|
1078
|
+
} while (context.currentType !== 13 /* TokenTypes.EOF */ &&
|
|
1160
1079
|
context.currentType !== 1 /* TokenTypes.Pipe */);
|
|
1161
1080
|
// adjust message node loc
|
|
1162
1081
|
const endOffset = context.currentType === 1 /* TokenTypes.Pipe */
|
|
@@ -1180,7 +1099,7 @@ function createParser(options = {}) {
|
|
|
1180
1099
|
hasEmptyMessage = msg.items.length === 0;
|
|
1181
1100
|
}
|
|
1182
1101
|
node.cases.push(msg);
|
|
1183
|
-
} while (context.currentType !==
|
|
1102
|
+
} while (context.currentType !== 13 /* TokenTypes.EOF */);
|
|
1184
1103
|
if (hasEmptyMessage) {
|
|
1185
1104
|
emitError(tokenizer, CompileErrorCodes.MUST_HAVE_MESSAGES_IN_PLURAL, loc, 0);
|
|
1186
1105
|
}
|
|
@@ -1191,7 +1110,7 @@ function createParser(options = {}) {
|
|
|
1191
1110
|
const context = tokenizer.context();
|
|
1192
1111
|
const { offset, startLoc } = context;
|
|
1193
1112
|
const msgNode = parseMessage(tokenizer);
|
|
1194
|
-
if (context.currentType ===
|
|
1113
|
+
if (context.currentType === 13 /* TokenTypes.EOF */) {
|
|
1195
1114
|
return msgNode;
|
|
1196
1115
|
}
|
|
1197
1116
|
else {
|
|
@@ -1210,7 +1129,7 @@ function createParser(options = {}) {
|
|
|
1210
1129
|
node.cacheKey = options.onCacheKey(source);
|
|
1211
1130
|
}
|
|
1212
1131
|
// assert whether achieved to EOF
|
|
1213
|
-
if (context.currentType !==
|
|
1132
|
+
if (context.currentType !== 13 /* TokenTypes.EOF */) {
|
|
1214
1133
|
emitError(tokenizer, CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS, context.lastStartLoc, 0, source[context.offset] || '');
|
|
1215
1134
|
}
|
|
1216
1135
|
endNode(node, tokenizer.currentOffset(), tokenizer.currentPosition());
|
|
@@ -1219,7 +1138,7 @@ function createParser(options = {}) {
|
|
|
1219
1138
|
return { parse };
|
|
1220
1139
|
}
|
|
1221
1140
|
function getTokenCaption(token) {
|
|
1222
|
-
if (token.type ===
|
|
1141
|
+
if (token.type === 13 /* TokenTypes.EOF */) {
|
|
1223
1142
|
return 'EOF';
|
|
1224
1143
|
}
|
|
1225
1144
|
const name = (token.value || '').replace(/\r?\n/gu, '\\n');
|
|
@@ -1557,8 +1476,7 @@ function generateNode(generator, node) {
|
|
|
1557
1476
|
}
|
|
1558
1477
|
}
|
|
1559
1478
|
// generate code from AST
|
|
1560
|
-
const generate = (ast, options = {}
|
|
1561
|
-
) => {
|
|
1479
|
+
const generate = (ast, options = {}) => {
|
|
1562
1480
|
const mode = isString(options.mode) ? options.mode : 'normal';
|
|
1563
1481
|
const filename = isString(options.filename)
|
|
1564
1482
|
? options.filename
|
|
@@ -1622,4 +1540,4 @@ function baseCompile(source, options = {}) {
|
|
|
1622
1540
|
}
|
|
1623
1541
|
}
|
|
1624
1542
|
|
|
1625
|
-
export { CompileErrorCodes,
|
|
1543
|
+
export { CompileErrorCodes, ERROR_DOMAIN$2 as ERROR_DOMAIN, LOCATION_STUB, baseCompile, createCompileError, createLocation, createParser, createPosition, defaultOnError, detectHtmlTag, errorMessages };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* message-compiler
|
|
2
|
+
* message-compiler v10.0.0-alpha.2
|
|
3
3
|
* (c) 2024 kazuya kawaguchi
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
const LOCATION_STUB={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function createPosition(e,t,n){return{line:e,column:t,offset:n}}function createLocation(e,t,n){const r={start:e,end:t};return null!=n&&(r.source=n),r}const assign=Object.assign,isString=e=>"string"==typeof e;function join(e,t=""){return e.reduce(((e,n,r)=>0===r?e+n:e+t+n),"")}const CompileWarnCodes={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},warnMessages={[CompileWarnCodes.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function createCompileWarn(e,t,...n){const r={message:String(e),code:e};return t&&(r.location=t),r}const CompileErrorCodes={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},errorMessages={[CompileErrorCodes.EXPECTED_TOKEN]:"Expected token: '{0}'",[CompileErrorCodes.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[CompileErrorCodes.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[CompileErrorCodes.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[CompileErrorCodes.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[CompileErrorCodes.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[CompileErrorCodes.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[CompileErrorCodes.EMPTY_PLACEHOLDER]:"Empty placeholder",[CompileErrorCodes.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[CompileErrorCodes.INVALID_LINKED_FORMAT]:"Invalid linked format",[CompileErrorCodes.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[CompileErrorCodes.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[CompileErrorCodes.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function createCompileError(e,t,n={}){const{domain:r,messages:o,args:s}=n,c=new SyntaxError(String(e));return c.code=e,t&&(c.location=t),c.domain=r,c}function defaultOnError(e){throw e}const RE_HTML_TAG=/<\/?[\w\s="/.':;#-\/]+>/,detectHtmlTag=e=>RE_HTML_TAG.test(e),CHAR_SP=" ",CHAR_CR="\r",CHAR_LF="\n",CHAR_LS=String.fromCharCode(8232),CHAR_PS=String.fromCharCode(8233);function createScanner(e){const t=e;let n=0,r=1,o=1,s=0;const c=e=>t[e]===CHAR_CR&&t[e+1]===CHAR_LF,a=e=>t[e]===CHAR_PS,i=e=>t[e]===CHAR_LS,u=e=>c(e)||(e=>t[e]===CHAR_LF)(e)||a(e)||i(e),l=e=>c(e)||a(e)||i(e)?CHAR_LF:t[e];function E(){return s=0,u(n)&&(r++,o=0),c(n)&&n++,n++,o++,t[n]}return{index:()=>n,line:()=>r,column:()=>o,peekOffset:()=>s,charAt:l,currentChar:()=>l(n),currentPeek:()=>l(n+s),next:E,peek:function(){return c(n+s)&&s++,s++,t[n+s]},reset:function(){n=0,r=1,o=1,s=0},resetPeek:function(e=0){s=e},skipToPeek:function(){const e=n+s;for(;e!==n;)E();s=0}}}const EOF=void 0,DOT=".",LITERAL_DELIMITER="'",ERROR_DOMAIN$1="tokenizer";function createTokenizer(e,t={}){const n=!1!==t.location,r=createScanner(e),o=()=>r.index(),s=()=>createPosition(r.line(),r.column(),r.index()),c=s(),a=o(),i={currentType:14,offset:a,startLoc:c,endLoc:c,lastType:14,lastOffset:a,lastStartLoc:c,lastEndLoc:c,braceNest:0,inLinked:!1,text:""},u=()=>i,{onError:l}=t;function E(e,t,r){e.endLoc=s(),e.currentType=t;const o={type:t};return n&&(o.loc=createLocation(e.startLoc,e.endLoc)),null!=r&&(o.value=r),o}const C=e=>E(e,14);function f(e,t){return e.currentChar()===t?(e.next(),t):(CompileErrorCodes.EXPECTED_TOKEN,s(),"")}function d(e){let t="";for(;e.currentPeek()===CHAR_SP||e.currentPeek()===CHAR_LF;)t+=e.currentPeek(),e.peek();return t}function p(e){const t=d(e);return e.skipToPeek(),t}function _(e){if(e===EOF)return!1;const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||95===t}function L(e,t){const{currentType:n}=t;if(2!==n)return!1;d(e);const r=function(e){if(e===EOF)return!1;const t=e.charCodeAt(0);return t>=48&&t<=57}("-"===e.currentPeek()?e.peek():e.currentPeek());return e.resetPeek(),r}function N(e){d(e);const t="|"===e.currentPeek();return e.resetPeek(),t}function A(e,t=!0){const n=(t=!1,r="",o=!1)=>{const s=e.currentPeek();return"{"===s?"%"!==r&&t:"@"!==s&&s?"%"===s?(e.peek(),n(t,"%",!0)):"|"===s?!("%"!==r&&!o)||!(r===CHAR_SP||r===CHAR_LF):s===CHAR_SP?(e.peek(),n(!0,CHAR_SP,o)):s!==CHAR_LF||(e.peek(),n(!0,CHAR_LF,o)):"%"===r||t},r=n();return t&&e.resetPeek(),r}function T(e,t){const n=e.currentChar();return n===EOF?EOF:t(n)?(e.next(),n):null}function m(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t}function k(e){return T(e,m)}function I(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t||45===t}function S(e){return T(e,I)}function P(e){const t=e.charCodeAt(0);return t>=48&&t<=57}function h(e){return T(e,P)}function O(e){const t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=70||t>=97&&t<=102}function D(e){return T(e,O)}function y(e){let t="",n="";for(;t=h(e);)n+=t;return n}function R(e){let t="";for(;;){const n=e.currentChar();if("{"===n||"}"===n||"@"===n||"|"===n||!n)break;if("%"===n){if(!A(e))break;t+=n,e.next()}else if(n===CHAR_SP||n===CHAR_LF)if(A(e))t+=n,e.next();else{if(N(e))break;t+=n,e.next()}else t+=n,e.next()}return t}function g(e){return e!==LITERAL_DELIMITER&&e!==CHAR_LF}function U(e){const t=e.currentChar();switch(t){case"\\":case"'":return e.next(),`\\${t}`;case"u":return b(e,t,4);case"U":return b(e,t,6);default:return CompileErrorCodes.UNKNOWN_ESCAPE_SEQUENCE,s(),""}}function b(e,t,n){f(e,t);let r="";for(let o=0;o<n;o++){const t=D(e);if(!t){CompileErrorCodes.INVALID_UNICODE_ESCAPE_SEQUENCE,s(),e.currentChar();break}r+=t}return`\\${t}${r}`}function x(e){return"{"!==e&&"}"!==e&&e!==CHAR_SP&&e!==CHAR_LF}function M(e){p(e);const t=f(e,"|");return p(e),t}function v(e,t){let n=null;switch(e.currentChar()){case"{":return t.braceNest>=1&&(CompileErrorCodes.NOT_ALLOW_NEST_PLACEHOLDER,s()),e.next(),n=E(t,2,"{"),p(e),t.braceNest++,n;case"}":return t.braceNest>0&&2===t.currentType&&(CompileErrorCodes.EMPTY_PLACEHOLDER,s()),e.next(),n=E(t,3,"}"),t.braceNest--,t.braceNest>0&&p(e),t.inLinked&&0===t.braceNest&&(t.inLinked=!1),n;case"@":return t.braceNest>0&&(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,s()),n=H(e,t)||C(t),t.braceNest=0,n;default:{let r=!0,o=!0,c=!0;if(N(e))return t.braceNest>0&&(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,s()),n=E(t,1,M(e)),t.braceNest=0,t.inLinked=!1,n;if(t.braceNest>0&&(5===t.currentType||6===t.currentType||7===t.currentType))return CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,s(),t.braceNest=0,X(e,t);if(r=function(e,t){const{currentType:n}=t;if(2!==n)return!1;d(e);const r=_(e.currentPeek());return e.resetPeek(),r}(e,t))return n=E(t,5,function(e){p(e);let t="",n="";for(;t=S(e);)n+=t;return e.currentChar()===EOF&&(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,s()),n}(e)),p(e),n;if(o=L(e,t))return n=E(t,6,function(e){p(e);let t="";return"-"===e.currentChar()?(e.next(),t+=`-${y(e)}`):t+=y(e),e.currentChar()===EOF&&(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,s()),t}(e)),p(e),n;if(c=function(e,t){const{currentType:n}=t;if(2!==n)return!1;d(e);const r=e.currentPeek()===LITERAL_DELIMITER;return e.resetPeek(),r}(e,t))return n=E(t,7,function(e){p(e),f(e,"'");let t="",n="";for(;t=T(e,g);)n+="\\"===t?U(e):t;const r=e.currentChar();return r===CHAR_LF||r===EOF?(CompileErrorCodes.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,s(),r===CHAR_LF&&(e.next(),f(e,"'")),n):(f(e,"'"),n)}(e)),p(e),n;if(!r&&!o&&!c)return n=E(t,13,function(e){p(e);let t="",n="";for(;t=T(e,x);)n+=t;return n}(e)),CompileErrorCodes.INVALID_TOKEN_IN_PLACEHOLDER,s(),n.value,p(e),n;break}}return n}function H(e,t){const{currentType:n}=t;let r=null;const o=e.currentChar();switch(8!==n&&9!==n&&12!==n&&10!==n||o!==CHAR_LF&&o!==CHAR_SP||(CompileErrorCodes.INVALID_LINKED_FORMAT,s()),o){case"@":return e.next(),r=E(t,8,"@"),t.inLinked=!0,r;case".":return p(e),e.next(),E(t,9,".");case":":return p(e),e.next(),E(t,10,":");default:return N(e)?(r=E(t,1,M(e)),t.braceNest=0,t.inLinked=!1,r):function(e,t){const{currentType:n}=t;if(8!==n)return!1;d(e);const r="."===e.currentPeek();return e.resetPeek(),r}(e,t)||function(e,t){const{currentType:n}=t;if(8!==n&&12!==n)return!1;d(e);const r=":"===e.currentPeek();return e.resetPeek(),r}(e,t)?(p(e),H(e,t)):function(e,t){const{currentType:n}=t;if(9!==n)return!1;d(e);const r=_(e.currentPeek());return e.resetPeek(),r}(e,t)?(p(e),E(t,12,function(e){let t="",n="";for(;t=k(e);)n+=t;return n}(e))):function(e,t){const{currentType:n}=t;if(10!==n)return!1;const r=()=>{const t=e.currentPeek();return"{"===t?_(e.peek()):!("@"===t||"%"===t||"|"===t||":"===t||"."===t||t===CHAR_SP||!t)&&(t===CHAR_LF?(e.peek(),r()):A(e,!1))},o=r();return e.resetPeek(),o}(e,t)?(p(e),"{"===o?v(e,t)||r:E(t,11,function(e){const t=n=>{const r=e.currentChar();return"{"!==r&&"%"!==r&&"@"!==r&&"|"!==r&&"("!==r&&")"!==r&&r?r===CHAR_SP?n:(n+=r,e.next(),t(n)):n};return t("")}(e))):(8===n&&(CompileErrorCodes.INVALID_LINKED_FORMAT,s()),t.braceNest=0,t.inLinked=!1,X(e,t))}}function X(e,t){let n={type:14};if(t.braceNest>0)return v(e,t)||C(t);if(t.inLinked)return H(e,t)||C(t);switch(e.currentChar()){case"{":return v(e,t)||C(t);case"}":return CompileErrorCodes.UNBALANCED_CLOSING_BRACE,s(),e.next(),E(t,3,"}");case"@":return H(e,t)||C(t);default:{if(N(e))return n=E(t,1,M(e)),t.braceNest=0,t.inLinked=!1,n;const{isModulo:r,hasSpace:o}=function(e){const t=d(e),n="%"===e.currentPeek()&&"{"===e.peek();return e.resetPeek(),{isModulo:n,hasSpace:t.length>0}}(e);if(r)return o?E(t,0,R(e)):E(t,4,function(e){p(e);const t=e.currentChar();return"%"!==t&&(CompileErrorCodes.EXPECTED_TOKEN,s()),e.next(),"%"}(e));if(A(e))return E(t,0,R(e));break}}return n}return{nextToken:function(){const{currentType:e,offset:t,startLoc:n,endLoc:c}=i;return i.lastType=e,i.lastOffset=t,i.lastStartLoc=n,i.lastEndLoc=c,i.offset=o(),i.startLoc=s(),r.currentChar()===EOF?E(i,14):X(r,i)},currentOffset:o,currentPosition:s,context:u}}const ERROR_DOMAIN="parser",KNOWN_ESCAPES=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function fromEscapeSequence(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const e=parseInt(t||n,16);return e<=55295||e>=57344?String.fromCodePoint(e):"�"}}}function createParser(e={}){const t=!1!==e.location,{onError:n,onWarn:r}=e;function o(e,n,r){const o={type:e};return t&&(o.start=n,o.end=n,o.loc={start:r,end:r}),o}function s(e,n,r,o){o&&(e.type=o),t&&(e.end=n,e.loc&&(e.loc.end=r))}function c(e,t){const n=e.context(),r=o(3,n.offset,n.startLoc);return r.value=t,s(r,e.currentOffset(),e.currentPosition()),r}function a(e,t){const n=e.context(),{lastOffset:r,lastStartLoc:c}=n,a=o(5,r,c);return a.index=parseInt(t,10),e.nextToken(),s(a,e.currentOffset(),e.currentPosition()),a}function i(e,t,n){const r=e.context(),{lastOffset:c,lastStartLoc:a}=r,i=o(4,c,a);return i.key=t,!0===n&&(i.modulo=!0),e.nextToken(),s(i,e.currentOffset(),e.currentPosition()),i}function u(e,t){const n=e.context(),{lastOffset:r,lastStartLoc:c}=n,a=o(9,r,c);return a.value=t.replace(KNOWN_ESCAPES,fromEscapeSequence),e.nextToken(),s(a,e.currentOffset(),e.currentPosition()),a}function l(e){const t=e.context(),n=o(6,t.offset,t.startLoc);let r=e.nextToken();if(9===r.type){const t=function(e){const t=e.nextToken(),n=e.context(),{lastOffset:r,lastStartLoc:c}=n,a=o(8,r,c);return 12!==t.type?(CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_MODIFIER,n.lastStartLoc,a.value="",s(a,r,c),{nextConsumeToken:t,node:a}):(null==t.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,n.lastStartLoc,getTokenCaption(t)),a.value=t.value||"",s(a,e.currentOffset(),e.currentPosition()),{node:a})}(e);n.modifier=t.node,r=t.nextConsumeToken||e.nextToken()}switch(10!==r.type&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),r=e.nextToken(),2===r.type&&(r=e.nextToken()),r.type){case 11:null==r.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),n.key=function(e,t){const n=e.context(),r=o(7,n.offset,n.startLoc);return r.value=t,s(r,e.currentOffset(),e.currentPosition()),r}(e,r.value||"");break;case 5:null==r.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),n.key=i(e,r.value||"");break;case 6:null==r.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),n.key=a(e,r.value||"");break;case 7:null==r.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),n.key=u(e,r.value||"");break;default:{CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_KEY,t.lastStartLoc;const c=e.context(),a=o(7,c.offset,c.startLoc);return a.value="",s(a,c.offset,c.startLoc),n.key=a,s(n,c.offset,c.startLoc),{nextConsumeToken:r,node:n}}}return s(n,e.currentOffset(),e.currentPosition()),{node:n}}function E(e){const t=e.context(),n=o(2,1===t.currentType?e.currentOffset():t.offset,1===t.currentType?t.endLoc:t.startLoc);n.items=[];let r=null,E=null;do{const o=r||e.nextToken();switch(r=null,o.type){case 0:null==o.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(o)),n.items.push(c(e,o.value||""));break;case 6:null==o.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(o)),n.items.push(a(e,o.value||""));break;case 4:E=!0;break;case 5:null==o.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(o)),n.items.push(i(e,o.value||"",!!E)),E&&(CompileWarnCodes.USE_MODULO_SYNTAX,t.lastStartLoc,getTokenCaption(o),E=null);break;case 7:null==o.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(o)),n.items.push(u(e,o.value||""));break;case 8:{const t=l(e);n.items.push(t.node),r=t.nextConsumeToken||null;break}}}while(14!==t.currentType&&1!==t.currentType);return s(n,1===t.currentType?t.lastOffset:e.currentOffset(),1===t.currentType?t.lastEndLoc:e.currentPosition()),n}function C(e){const t=e.context(),{offset:n,startLoc:r}=t,c=E(e);return 14===t.currentType?c:function(e,t,n,r){const c=e.context();let a=0===r.items.length;const i=o(1,t,n);i.cases=[],i.cases.push(r);do{const t=E(e);a||(a=0===t.items.length),i.cases.push(t)}while(14!==c.currentType);return a&&CompileErrorCodes.MUST_HAVE_MESSAGES_IN_PLURAL,s(i,e.currentOffset(),e.currentPosition()),i}(e,n,r,c)}return{parse:function(n){const r=createTokenizer(n,assign({},e)),c=r.context(),a=o(0,c.offset,c.startLoc);return t&&a.loc&&(a.loc.source=n),a.body=C(r),e.onCacheKey&&(a.cacheKey=e.onCacheKey(n)),14!==c.currentType&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,c.lastStartLoc,n[c.offset]),s(a,r.currentOffset(),r.currentPosition()),a}}}function getTokenCaption(e){if(14===e.type)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function createTransformer(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:e=>(n.helpers.add(e),e)}}function traverseNodes(e,t){for(let n=0;n<e.length;n++)traverseNode(e[n],t)}function traverseNode(e,t){switch(e.type){case 1:traverseNodes(e.cases,t),t.helper("plural");break;case 2:traverseNodes(e.items,t);break;case 6:traverseNode(e.key,t),t.helper("linked"),t.helper("type");break;case 5:t.helper("interpolate"),t.helper("list");break;case 4:t.helper("interpolate"),t.helper("named")}}function transform(e,t={}){const n=createTransformer(e);n.helper("normalize"),e.body&&traverseNode(e.body,n);const r=n.context();e.helpers=Array.from(r.helpers)}function optimize(e){const t=e.body;return 2===t.type?optimizeMessageNode(t):t.cases.forEach((e=>optimizeMessageNode(e))),e}function optimizeMessageNode(e){if(1===e.items.length){const t=e.items[0];3!==t.type&&9!==t.type||(e.static=t.value,delete t.value)}else{const t=[];for(let n=0;n<e.items.length;n++){const r=e.items[n];if(3!==r.type&&9!==r.type)break;if(null==r.value)break;t.push(r.value)}if(t.length===e.items.length){e.static=join(t);for(let t=0;t<e.items.length;t++){const n=e.items[t];3!==n.type&&9!==n.type||delete n.value}}}}function minify(e){switch(e.t=e.type,e.type){case 0:{const t=e;minify(t.body),t.b=t.body,delete t.body;break}case 1:{const t=e,n=t.cases;for(let e=0;e<n.length;e++)minify(n[e]);t.c=n,delete t.cases;break}case 2:{const t=e,n=t.items;for(let e=0;e<n.length;e++)minify(n[e]);t.i=n,delete t.items,t.static&&(t.s=t.static,delete t.static);break}case 3:case 9:case 8:case 7:{const t=e;t.value&&(t.v=t.value,delete t.value);break}case 6:{const t=e;minify(t.key),t.k=t.key,delete t.key,t.modifier&&(minify(t.modifier),t.m=t.modifier,delete t.modifier);break}case 5:{const t=e;t.i=t.index,delete t.index;break}case 4:{const t=e;t.k=t.key,delete t.key;break}}delete e.type}function createCodeGenerator(e,t){const{sourceMap:n,filename:r,breakLineCode:o,needIndent:s}=t,c=!1!==t.location,a={filename:r,code:"",column:1,line:1,offset:0,map:void 0,breakLineCode:o,needIndent:s,indentLevel:0};c&&e.loc&&(a.source=e.loc.source);function i(e,t){a.code+=e}function u(e,t=!0){const n=t?o:"";i(s?n+" ".repeat(e):n)}return{context:()=>a,push:i,indent:function(e=!0){const t=++a.indentLevel;e&&u(t)},deindent:function(e=!0){const t=--a.indentLevel;e&&u(t)},newline:function(){u(a.indentLevel)},helper:e=>`_${e}`,needIndent:()=>a.needIndent}}function generateLinkedNode(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),generateNode(e,t.key),t.modifier?(e.push(", "),generateNode(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function generateMessageNode(e,t){const{helper:n,needIndent:r}=e;e.push(`${n("normalize")}([`),e.indent(r());const o=t.items.length;for(let s=0;s<o&&(generateNode(e,t.items[s]),s!==o-1);s++)e.push(", ");e.deindent(r()),e.push("])")}function generatePluralNode(e,t){const{helper:n,needIndent:r}=e;if(t.cases.length>1){e.push(`${n("plural")}([`),e.indent(r());const o=t.cases.length;for(let n=0;n<o&&(generateNode(e,t.cases[n]),n!==o-1);n++)e.push(", ");e.deindent(r()),e.push("])")}}function generateResource(e,t){t.body?generateNode(e,t.body):e.push("null")}function generateNode(e,t){const{helper:n}=e;switch(t.type){case 0:generateResource(e,t);break;case 1:generatePluralNode(e,t);break;case 2:generateMessageNode(e,t);break;case 6:generateLinkedNode(e,t);break;case 8:case 7:case 9:case 3:e.push(JSON.stringify(t.value),t);break;case 5:e.push(`${n("interpolate")}(${n("list")}(${t.index}))`,t);break;case 4:e.push(`${n("interpolate")}(${n("named")}(${JSON.stringify(t.key)}))`,t)}}const generate=(e,t={})=>{const n=isString(t.mode)?t.mode:"normal",r=isString(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,s=null!=t.breakLineCode?t.breakLineCode:"arrow"===n?";":"\n",c=t.needIndent?t.needIndent:"arrow"!==n,a=e.helpers||[],i=createCodeGenerator(e,{mode:n,filename:r,sourceMap:o,breakLineCode:s,needIndent:c});i.push("normal"===n?"function __msg__ (ctx) {":"(ctx) => {"),i.indent(c),a.length>0&&(i.push(`const { ${join(a.map((e=>`${e}: _${e}`)),", ")} } = ctx`),i.newline()),i.push("return "),generateNode(i,e),i.deindent(c),i.push("}"),delete e.helpers;const{code:u,map:l}=i.context();return{ast:e,code:u,map:l?l.toJSON():void 0}};function baseCompile(e,t={}){const n=assign({},t),r=!!n.jit,o=!!n.minify,s=null==n.optimize||n.optimize,c=createParser(n).parse(e);return r?(s&&optimize(c),o&&minify(c),{ast:c,code:""}):(transform(c,n),generate(c,n))}export{CompileErrorCodes,CompileWarnCodes,ERROR_DOMAIN,LOCATION_STUB,baseCompile,createCompileError,createCompileWarn,createLocation,createParser,createPosition,defaultOnError,detectHtmlTag,errorMessages,warnMessages};
|
|
6
|
+
const LOCATION_STUB={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function createPosition(e,t,n){return{line:e,column:t,offset:n}}function createLocation(e,t,n){const r={start:e,end:t};return null!=n&&(r.source=n),r}const assign=Object.assign,isString=e=>"string"==typeof e;function join(e,t=""){return e.reduce(((e,n,r)=>0===r?e+n:e+t+n),"")}const CompileErrorCodes={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},errorMessages={[CompileErrorCodes.EXPECTED_TOKEN]:"Expected token: '{0}'",[CompileErrorCodes.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[CompileErrorCodes.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[CompileErrorCodes.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[CompileErrorCodes.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[CompileErrorCodes.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[CompileErrorCodes.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[CompileErrorCodes.EMPTY_PLACEHOLDER]:"Empty placeholder",[CompileErrorCodes.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[CompileErrorCodes.INVALID_LINKED_FORMAT]:"Invalid linked format",[CompileErrorCodes.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[CompileErrorCodes.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[CompileErrorCodes.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function createCompileError(e,t,n={}){const{domain:r,messages:o,args:c}=n,s=new SyntaxError(String(e));return s.code=e,t&&(s.location=t),s.domain=r,s}function defaultOnError(e){throw e}const RE_HTML_TAG=/<\/?[\w\s="/.':;#-\/]+>/,detectHtmlTag=e=>RE_HTML_TAG.test(e),CHAR_SP=" ",CHAR_CR="\r",CHAR_LF="\n",CHAR_LS=String.fromCharCode(8232),CHAR_PS=String.fromCharCode(8233);function createScanner(e){const t=e;let n=0,r=1,o=1,c=0;const s=e=>t[e]===CHAR_CR&&t[e+1]===CHAR_LF,i=e=>t[e]===CHAR_PS,a=e=>t[e]===CHAR_LS,u=e=>s(e)||(e=>t[e]===CHAR_LF)(e)||i(e)||a(e),l=e=>s(e)||i(e)||a(e)?CHAR_LF:t[e];function E(){return c=0,u(n)&&(r++,o=0),s(n)&&n++,n++,o++,t[n]}return{index:()=>n,line:()=>r,column:()=>o,peekOffset:()=>c,charAt:l,currentChar:()=>l(n),currentPeek:()=>l(n+c),next:E,peek:function(){return s(n+c)&&c++,c++,t[n+c]},reset:function(){n=0,r=1,o=1,c=0},resetPeek:function(e=0){c=e},skipToPeek:function(){const e=n+c;for(;e!==n;)E();c=0}}}const EOF=void 0,DOT=".",LITERAL_DELIMITER="'",ERROR_DOMAIN$1="tokenizer";function createTokenizer(e,t={}){const n=!1!==t.location,r=createScanner(e),o=()=>r.index(),c=()=>createPosition(r.line(),r.column(),r.index()),s=c(),i=o(),a={currentType:13,offset:i,startLoc:s,endLoc:s,lastType:13,lastOffset:i,lastStartLoc:s,lastEndLoc:s,braceNest:0,inLinked:!1,text:""},u=()=>a,{onError:l}=t;function E(e,t,r){e.endLoc=c(),e.currentType=t;const o={type:t};return n&&(o.loc=createLocation(e.startLoc,e.endLoc)),null!=r&&(o.value=r),o}const C=e=>E(e,13);function f(e,t){return e.currentChar()===t?(e.next(),t):(CompileErrorCodes.EXPECTED_TOKEN,c(),"")}function d(e){let t="";for(;e.currentPeek()===CHAR_SP||e.currentPeek()===CHAR_LF;)t+=e.currentPeek(),e.peek();return t}function p(e){const t=d(e);return e.skipToPeek(),t}function L(e){if(e===EOF)return!1;const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||95===t}function _(e,t){const{currentType:n}=t;if(2!==n)return!1;d(e);const r=function(e){if(e===EOF)return!1;const t=e.charCodeAt(0);return t>=48&&t<=57}("-"===e.currentPeek()?e.peek():e.currentPeek());return e.resetPeek(),r}function N(e){d(e);const t="|"===e.currentPeek();return e.resetPeek(),t}function A(e,t=!0){const n=(t=!1,r="")=>{const o=e.currentPeek();return"{"===o?t:"@"!==o&&o?"|"===o?!(r===CHAR_SP||r===CHAR_LF):o===CHAR_SP?(e.peek(),n(!0,CHAR_SP)):o!==CHAR_LF||(e.peek(),n(!0,CHAR_LF)):t},r=n();return t&&e.resetPeek(),r}function T(e,t){const n=e.currentChar();return n===EOF?EOF:t(n)?(e.next(),n):null}function m(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t}function k(e){return T(e,m)}function I(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t||45===t}function S(e){return T(e,I)}function P(e){const t=e.charCodeAt(0);return t>=48&&t<=57}function h(e){return T(e,P)}function O(e){const t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=70||t>=97&&t<=102}function y(e){return T(e,O)}function R(e){let t="",n="";for(;t=h(e);)n+=t;return n}function D(e){return e!==LITERAL_DELIMITER&&e!==CHAR_LF}function g(e){const t=e.currentChar();switch(t){case"\\":case"'":return e.next(),`\\${t}`;case"u":return b(e,t,4);case"U":return b(e,t,6);default:return CompileErrorCodes.UNKNOWN_ESCAPE_SEQUENCE,c(),""}}function b(e,t,n){f(e,t);let r="";for(let o=0;o<n;o++){const t=y(e);if(!t){CompileErrorCodes.INVALID_UNICODE_ESCAPE_SEQUENCE,c(),e.currentChar();break}r+=t}return`\\${t}${r}`}function U(e){return"{"!==e&&"}"!==e&&e!==CHAR_SP&&e!==CHAR_LF}function x(e){p(e);const t=f(e,"|");return p(e),t}function v(e,t){let n=null;switch(e.currentChar()){case"{":return t.braceNest>=1&&(CompileErrorCodes.NOT_ALLOW_NEST_PLACEHOLDER,c()),e.next(),n=E(t,2,"{"),p(e),t.braceNest++,n;case"}":return t.braceNest>0&&2===t.currentType&&(CompileErrorCodes.EMPTY_PLACEHOLDER,c()),e.next(),n=E(t,3,"}"),t.braceNest--,t.braceNest>0&&p(e),t.inLinked&&0===t.braceNest&&(t.inLinked=!1),n;case"@":return t.braceNest>0&&(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,c()),n=H(e,t)||C(t),t.braceNest=0,n;default:{let r=!0,o=!0,s=!0;if(N(e))return t.braceNest>0&&(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,c()),n=E(t,1,x(e)),t.braceNest=0,t.inLinked=!1,n;if(t.braceNest>0&&(4===t.currentType||5===t.currentType||6===t.currentType))return CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,c(),t.braceNest=0,M(e,t);if(r=function(e,t){const{currentType:n}=t;if(2!==n)return!1;d(e);const r=L(e.currentPeek());return e.resetPeek(),r}(e,t))return n=E(t,4,function(e){p(e);let t="",n="";for(;t=S(e);)n+=t;return e.currentChar()===EOF&&(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,c()),n}(e)),p(e),n;if(o=_(e,t))return n=E(t,5,function(e){p(e);let t="";return"-"===e.currentChar()?(e.next(),t+=`-${R(e)}`):t+=R(e),e.currentChar()===EOF&&(CompileErrorCodes.UNTERMINATED_CLOSING_BRACE,c()),t}(e)),p(e),n;if(s=function(e,t){const{currentType:n}=t;if(2!==n)return!1;d(e);const r=e.currentPeek()===LITERAL_DELIMITER;return e.resetPeek(),r}(e,t))return n=E(t,6,function(e){p(e),f(e,"'");let t="",n="";for(;t=T(e,D);)n+="\\"===t?g(e):t;const r=e.currentChar();return r===CHAR_LF||r===EOF?(CompileErrorCodes.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,c(),r===CHAR_LF&&(e.next(),f(e,"'")),n):(f(e,"'"),n)}(e)),p(e),n;if(!r&&!o&&!s)return n=E(t,12,function(e){p(e);let t="",n="";for(;t=T(e,U);)n+=t;return n}(e)),CompileErrorCodes.INVALID_TOKEN_IN_PLACEHOLDER,c(),n.value,p(e),n;break}}return n}function H(e,t){const{currentType:n}=t;let r=null;const o=e.currentChar();switch(7!==n&&8!==n&&11!==n&&9!==n||o!==CHAR_LF&&o!==CHAR_SP||(CompileErrorCodes.INVALID_LINKED_FORMAT,c()),o){case"@":return e.next(),r=E(t,7,"@"),t.inLinked=!0,r;case".":return p(e),e.next(),E(t,8,".");case":":return p(e),e.next(),E(t,9,":");default:return N(e)?(r=E(t,1,x(e)),t.braceNest=0,t.inLinked=!1,r):function(e,t){const{currentType:n}=t;if(7!==n)return!1;d(e);const r="."===e.currentPeek();return e.resetPeek(),r}(e,t)||function(e,t){const{currentType:n}=t;if(7!==n&&11!==n)return!1;d(e);const r=":"===e.currentPeek();return e.resetPeek(),r}(e,t)?(p(e),H(e,t)):function(e,t){const{currentType:n}=t;if(8!==n)return!1;d(e);const r=L(e.currentPeek());return e.resetPeek(),r}(e,t)?(p(e),E(t,11,function(e){let t="",n="";for(;t=k(e);)n+=t;return n}(e))):function(e,t){const{currentType:n}=t;if(9!==n)return!1;const r=()=>{const t=e.currentPeek();return"{"===t?L(e.peek()):!("@"===t||"|"===t||":"===t||"."===t||t===CHAR_SP||!t)&&(t===CHAR_LF?(e.peek(),r()):A(e,!1))},o=r();return e.resetPeek(),o}(e,t)?(p(e),"{"===o?v(e,t)||r:E(t,10,function(e){const t=n=>{const r=e.currentChar();return"{"!==r&&"@"!==r&&"|"!==r&&"("!==r&&")"!==r&&r?r===CHAR_SP?n:(n+=r,e.next(),t(n)):n};return t("")}(e))):(7===n&&(CompileErrorCodes.INVALID_LINKED_FORMAT,c()),t.braceNest=0,t.inLinked=!1,M(e,t))}}function M(e,t){let n={type:13};if(t.braceNest>0)return v(e,t)||C(t);if(t.inLinked)return H(e,t)||C(t);switch(e.currentChar()){case"{":return v(e,t)||C(t);case"}":return CompileErrorCodes.UNBALANCED_CLOSING_BRACE,c(),e.next(),E(t,3,"}");case"@":return H(e,t)||C(t);default:if(N(e))return n=E(t,1,x(e)),t.braceNest=0,t.inLinked=!1,n;if(A(e))return E(t,0,function(e){let t="";for(;;){const n=e.currentChar();if("{"===n||"}"===n||"@"===n||"|"===n||!n)break;if(n===CHAR_SP||n===CHAR_LF)if(A(e))t+=n,e.next();else{if(N(e))break;t+=n,e.next()}else t+=n,e.next()}return t}(e))}return n}return{nextToken:function(){const{currentType:e,offset:t,startLoc:n,endLoc:s}=a;return a.lastType=e,a.lastOffset=t,a.lastStartLoc=n,a.lastEndLoc=s,a.offset=o(),a.startLoc=c(),r.currentChar()===EOF?E(a,13):M(r,a)},currentOffset:o,currentPosition:c,context:u}}const ERROR_DOMAIN="parser",KNOWN_ESCAPES=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function fromEscapeSequence(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const e=parseInt(t||n,16);return e<=55295||e>=57344?String.fromCodePoint(e):"�"}}}function createParser(e={}){const t=!1!==e.location,{onError:n}=e;function r(e,n,r){const o={type:e};return t&&(o.start=n,o.end=n,o.loc={start:r,end:r}),o}function o(e,n,r,o){o&&(e.type=o),t&&(e.end=n,e.loc&&(e.loc.end=r))}function c(e,t){const n=e.context(),c=r(3,n.offset,n.startLoc);return c.value=t,o(c,e.currentOffset(),e.currentPosition()),c}function s(e,t){const n=e.context(),{lastOffset:c,lastStartLoc:s}=n,i=r(5,c,s);return i.index=parseInt(t,10),e.nextToken(),o(i,e.currentOffset(),e.currentPosition()),i}function i(e,t){const n=e.context(),{lastOffset:c,lastStartLoc:s}=n,i=r(4,c,s);return i.key=t,e.nextToken(),o(i,e.currentOffset(),e.currentPosition()),i}function a(e,t){const n=e.context(),{lastOffset:c,lastStartLoc:s}=n,i=r(9,c,s);return i.value=t.replace(KNOWN_ESCAPES,fromEscapeSequence),e.nextToken(),o(i,e.currentOffset(),e.currentPosition()),i}function u(e){const t=e.context(),n=r(6,t.offset,t.startLoc);let c=e.nextToken();if(8===c.type){const t=function(e){const t=e.nextToken(),n=e.context(),{lastOffset:c,lastStartLoc:s}=n,i=r(8,c,s);return 11!==t.type?(CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_MODIFIER,n.lastStartLoc,i.value="",o(i,c,s),{nextConsumeToken:t,node:i}):(null==t.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,n.lastStartLoc,getTokenCaption(t)),i.value=t.value||"",o(i,e.currentOffset(),e.currentPosition()),{node:i})}(e);n.modifier=t.node,c=t.nextConsumeToken||e.nextToken()}switch(9!==c.type&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(c)),c=e.nextToken(),2===c.type&&(c=e.nextToken()),c.type){case 10:null==c.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(c)),n.key=function(e,t){const n=e.context(),c=r(7,n.offset,n.startLoc);return c.value=t,o(c,e.currentOffset(),e.currentPosition()),c}(e,c.value||"");break;case 4:null==c.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(c)),n.key=i(e,c.value||"");break;case 5:null==c.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(c)),n.key=s(e,c.value||"");break;case 6:null==c.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(c)),n.key=a(e,c.value||"");break;default:{CompileErrorCodes.UNEXPECTED_EMPTY_LINKED_KEY,t.lastStartLoc;const s=e.context(),i=r(7,s.offset,s.startLoc);return i.value="",o(i,s.offset,s.startLoc),n.key=i,o(n,s.offset,s.startLoc),{nextConsumeToken:c,node:n}}}return o(n,e.currentOffset(),e.currentPosition()),{node:n}}function l(e){const t=e.context(),n=r(2,1===t.currentType?e.currentOffset():t.offset,1===t.currentType?t.endLoc:t.startLoc);n.items=[];let l=null;do{const r=l||e.nextToken();switch(l=null,r.type){case 0:null==r.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),n.items.push(c(e,r.value||""));break;case 5:null==r.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),n.items.push(s(e,r.value||""));break;case 4:null==r.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),n.items.push(i(e,r.value||""));break;case 6:null==r.value&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,getTokenCaption(r)),n.items.push(a(e,r.value||""));break;case 7:{const t=u(e);n.items.push(t.node),l=t.nextConsumeToken||null;break}}}while(13!==t.currentType&&1!==t.currentType);return o(n,1===t.currentType?t.lastOffset:e.currentOffset(),1===t.currentType?t.lastEndLoc:e.currentPosition()),n}function E(e){const t=e.context(),{offset:n,startLoc:c}=t,s=l(e);return 13===t.currentType?s:function(e,t,n,c){const s=e.context();let i=0===c.items.length;const a=r(1,t,n);a.cases=[],a.cases.push(c);do{const t=l(e);i||(i=0===t.items.length),a.cases.push(t)}while(13!==s.currentType);return i&&CompileErrorCodes.MUST_HAVE_MESSAGES_IN_PLURAL,o(a,e.currentOffset(),e.currentPosition()),a}(e,n,c,s)}return{parse:function(n){const c=createTokenizer(n,assign({},e)),s=c.context(),i=r(0,s.offset,s.startLoc);return t&&i.loc&&(i.loc.source=n),i.body=E(c),e.onCacheKey&&(i.cacheKey=e.onCacheKey(n)),13!==s.currentType&&(CompileErrorCodes.UNEXPECTED_LEXICAL_ANALYSIS,s.lastStartLoc,n[s.offset]),o(i,c.currentOffset(),c.currentPosition()),i}}}function getTokenCaption(e){if(13===e.type)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function createTransformer(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:e=>(n.helpers.add(e),e)}}function traverseNodes(e,t){for(let n=0;n<e.length;n++)traverseNode(e[n],t)}function traverseNode(e,t){switch(e.type){case 1:traverseNodes(e.cases,t),t.helper("plural");break;case 2:traverseNodes(e.items,t);break;case 6:traverseNode(e.key,t),t.helper("linked"),t.helper("type");break;case 5:t.helper("interpolate"),t.helper("list");break;case 4:t.helper("interpolate"),t.helper("named")}}function transform(e,t={}){const n=createTransformer(e);n.helper("normalize"),e.body&&traverseNode(e.body,n);const r=n.context();e.helpers=Array.from(r.helpers)}function optimize(e){const t=e.body;return 2===t.type?optimizeMessageNode(t):t.cases.forEach((e=>optimizeMessageNode(e))),e}function optimizeMessageNode(e){if(1===e.items.length){const t=e.items[0];3!==t.type&&9!==t.type||(e.static=t.value,delete t.value)}else{const t=[];for(let n=0;n<e.items.length;n++){const r=e.items[n];if(3!==r.type&&9!==r.type)break;if(null==r.value)break;t.push(r.value)}if(t.length===e.items.length){e.static=join(t);for(let t=0;t<e.items.length;t++){const n=e.items[t];3!==n.type&&9!==n.type||delete n.value}}}}function minify(e){switch(e.t=e.type,e.type){case 0:{const t=e;minify(t.body),t.b=t.body,delete t.body;break}case 1:{const t=e,n=t.cases;for(let e=0;e<n.length;e++)minify(n[e]);t.c=n,delete t.cases;break}case 2:{const t=e,n=t.items;for(let e=0;e<n.length;e++)minify(n[e]);t.i=n,delete t.items,t.static&&(t.s=t.static,delete t.static);break}case 3:case 9:case 8:case 7:{const t=e;t.value&&(t.v=t.value,delete t.value);break}case 6:{const t=e;minify(t.key),t.k=t.key,delete t.key,t.modifier&&(minify(t.modifier),t.m=t.modifier,delete t.modifier);break}case 5:{const t=e;t.i=t.index,delete t.index;break}case 4:{const t=e;t.k=t.key,delete t.key;break}}delete e.type}function createCodeGenerator(e,t){const{sourceMap:n,filename:r,breakLineCode:o,needIndent:c}=t,s=!1!==t.location,i={filename:r,code:"",column:1,line:1,offset:0,map:void 0,breakLineCode:o,needIndent:c,indentLevel:0};s&&e.loc&&(i.source=e.loc.source);function a(e,t){i.code+=e}function u(e,t=!0){const n=t?o:"";a(c?n+" ".repeat(e):n)}return{context:()=>i,push:a,indent:function(e=!0){const t=++i.indentLevel;e&&u(t)},deindent:function(e=!0){const t=--i.indentLevel;e&&u(t)},newline:function(){u(i.indentLevel)},helper:e=>`_${e}`,needIndent:()=>i.needIndent}}function generateLinkedNode(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),generateNode(e,t.key),t.modifier?(e.push(", "),generateNode(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function generateMessageNode(e,t){const{helper:n,needIndent:r}=e;e.push(`${n("normalize")}([`),e.indent(r());const o=t.items.length;for(let c=0;c<o&&(generateNode(e,t.items[c]),c!==o-1);c++)e.push(", ");e.deindent(r()),e.push("])")}function generatePluralNode(e,t){const{helper:n,needIndent:r}=e;if(t.cases.length>1){e.push(`${n("plural")}([`),e.indent(r());const o=t.cases.length;for(let n=0;n<o&&(generateNode(e,t.cases[n]),n!==o-1);n++)e.push(", ");e.deindent(r()),e.push("])")}}function generateResource(e,t){t.body?generateNode(e,t.body):e.push("null")}function generateNode(e,t){const{helper:n}=e;switch(t.type){case 0:generateResource(e,t);break;case 1:generatePluralNode(e,t);break;case 2:generateMessageNode(e,t);break;case 6:generateLinkedNode(e,t);break;case 8:case 7:case 9:case 3:e.push(JSON.stringify(t.value),t);break;case 5:e.push(`${n("interpolate")}(${n("list")}(${t.index}))`,t);break;case 4:e.push(`${n("interpolate")}(${n("named")}(${JSON.stringify(t.key)}))`,t)}}const generate=(e,t={})=>{const n=isString(t.mode)?t.mode:"normal",r=isString(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,c=null!=t.breakLineCode?t.breakLineCode:"arrow"===n?";":"\n",s=t.needIndent?t.needIndent:"arrow"!==n,i=e.helpers||[],a=createCodeGenerator(e,{mode:n,filename:r,sourceMap:o,breakLineCode:c,needIndent:s});a.push("normal"===n?"function __msg__ (ctx) {":"(ctx) => {"),a.indent(s),i.length>0&&(a.push(`const { ${join(i.map((e=>`${e}: _${e}`)),", ")} } = ctx`),a.newline()),a.push("return "),generateNode(a,e),a.deindent(s),a.push("}"),delete e.helpers;const{code:u,map:l}=a.context();return{ast:e,code:u,map:l?l.toJSON():void 0}};function baseCompile(e,t={}){const n=assign({},t),r=!!n.jit,o=!!n.minify,c=null==n.optimize||n.optimize,s=createParser(n).parse(e);return r?(c&&optimize(s),o&&minify(s),{ast:s,code:""}):(transform(s,n),generate(s,n))}export{CompileErrorCodes,ERROR_DOMAIN,LOCATION_STUB,baseCompile,createCompileError,createLocation,createParser,createPosition,defaultOnError,detectHtmlTag,errorMessages};
|