@panpanzhao/component-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,734 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.parse = parse;
5
+ var _lexer = require("./lexer");
6
+ var argListStates = {
7
+ START: 0,
8
+ COMMA: 1,
9
+ SET: 2
10
+ };
11
+ var tempalteStates = {
12
+ START: 0,
13
+ SCRIPTING: 1
14
+ };
15
+ var objectStates = {
16
+ START: 0,
17
+ KEY: 1,
18
+ COLON: 2,
19
+ VALUE: 3,
20
+ COMMA: 4
21
+ };
22
+ function parse(input, options) {
23
+ var _a;
24
+ var token;
25
+ var lexer = (0, _lexer.lexer)(input, options);
26
+ var tokens = [];
27
+ var tokenChunk = [];
28
+ // 允许的变量名字空间
29
+ var variableNamespaces = (_a = options === null || options === void 0 ? void 0 : options.variableNamespaces) !== null && _a !== void 0 ? _a : ['window', 'cookie', 'ls', 'ss'];
30
+ if (!Array.isArray(variableNamespaces)) {
31
+ variableNamespaces = [];
32
+ }
33
+ function next() {
34
+ token = tokenChunk.length ? tokenChunk.shift() : lexer.next();
35
+ if (!token) {
36
+ throw new TypeError('next token is undefined');
37
+ }
38
+ tokens.push(token);
39
+ }
40
+ function back() {
41
+ tokenChunk.unshift(tokens.pop());
42
+ token = tokens[tokens.length - 1];
43
+ }
44
+ function matchPunctuator(operator) {
45
+ return token.type === _lexer.TokenName[10 /* Punctuator */] && (Array.isArray(operator) ? ~operator.indexOf(token.value) : token.value === operator);
46
+ }
47
+ function fatal() {
48
+ throw TypeError("Unexpected token " + token.value + " in " + token.start.line + ":" + token.start.column);
49
+ }
50
+ function assert(result) {
51
+ if (!result) {
52
+ fatal();
53
+ }
54
+ return result;
55
+ }
56
+ function expression() {
57
+ return assignmentExpression();
58
+ }
59
+ function skipWhiteSpaceChar() {
60
+ while (token.type === _lexer.TokenName[17 /* Char */] && /^\s+$/m.test(token.value)) {
61
+ next();
62
+ }
63
+ }
64
+ function collectFilterArg() {
65
+ var arg = [];
66
+ while (!matchPunctuator(':') && token.type !== _lexer.TokenName[16 /* OpenFilter */] && token.type !== _lexer.TokenName[5 /* CloseScript */]) {
67
+ var item = literal() || numberLiteral() || stringLiteral() || template() || arrayLiteral() || rawScript() || objectLiteral();
68
+ if (item) {
69
+ arg.push(item);
70
+ } else {
71
+ assert(~[_lexer.TokenName[7 /* Identifier */], _lexer.TokenName[10 /* Punctuator */], _lexer.TokenName[17 /* Char */]].indexOf(token.type));
72
+ // 其他的都当字符处理
73
+ if (arg.length && typeof arg[arg.length - 1] === 'string') {
74
+ arg[arg.length - 1] += token.raw || token.value;
75
+ } else {
76
+ arg.push(token.raw || token.value);
77
+ }
78
+ next();
79
+ }
80
+ }
81
+ if (arg.length && typeof arg[arg.length - 1] === 'string') {
82
+ arg[arg.length - 1] = arg[arg.length - 1].replace(/\s+$/, '');
83
+ if (!arg[arg.length - 1]) {
84
+ arg.pop();
85
+ }
86
+ }
87
+ return arg;
88
+ }
89
+ function complexExpression() {
90
+ var ast = expression();
91
+ var filters = [];
92
+ while (token.type === _lexer.TokenName[16 /* OpenFilter */]) {
93
+ next();
94
+ skipWhiteSpaceChar();
95
+ var name = assert(identifier());
96
+ var fnName = name.name;
97
+ var args = [];
98
+ skipWhiteSpaceChar();
99
+ while (matchPunctuator(':')) {
100
+ next();
101
+ skipWhiteSpaceChar();
102
+ var argContents = collectFilterArg();
103
+ if (argContents.length === 1) {
104
+ argContents = argContents[0];
105
+ } else if (!argContents.length) {
106
+ argContents = '';
107
+ }
108
+ args.push(Array.isArray(argContents) ? {
109
+ type: 'mixed',
110
+ body: argContents
111
+ } : argContents);
112
+ }
113
+ filters.push({
114
+ name: fnName,
115
+ args: args
116
+ });
117
+ }
118
+ if (filters.length) {
119
+ ast = {
120
+ type: 'filter',
121
+ input: ast,
122
+ filters: filters,
123
+ start: ast.start,
124
+ end: filters[filters.length - 1].end
125
+ };
126
+ }
127
+ return ast;
128
+ }
129
+ function arrowFunction() {
130
+ var ast = argList() || variable();
131
+ var args = [];
132
+ var start;
133
+ if ((ast === null || ast === void 0 ? void 0 : ast.type) === 'variable') {
134
+ args = [ast];
135
+ start = ast.start;
136
+ } else if ((ast === null || ast === void 0 ? void 0 : ast.type) === 'arg-list') {
137
+ start = ast.start;
138
+ args = ast.body;
139
+ }
140
+ if (Array.isArray(args) && matchPunctuator('=')) {
141
+ next();
142
+ if (matchPunctuator('>')) {
143
+ next();
144
+ var body = assert(expression());
145
+ return {
146
+ type: 'anonymous_function',
147
+ args: args,
148
+ return: body,
149
+ start: start,
150
+ end: body.end
151
+ };
152
+ } else {
153
+ back();
154
+ }
155
+ }
156
+ return ast;
157
+ }
158
+ function conditionalExpression() {
159
+ var ast = logicalOrExpression();
160
+ if (!ast) {
161
+ return null;
162
+ }
163
+ if (matchPunctuator('?')) {
164
+ next();
165
+ var consequent = assignmentExpression();
166
+ assert(consequent);
167
+ assert(matchPunctuator(':'));
168
+ next();
169
+ var alternate = assignmentExpression();
170
+ assert(alternate);
171
+ return {
172
+ type: 'conditional',
173
+ test: ast,
174
+ consequent: consequent,
175
+ alternate: alternate,
176
+ start: ast.start,
177
+ end: alternate.end
178
+ };
179
+ }
180
+ return ast;
181
+ }
182
+ function binaryExpressionParser(type, operator, parseFunction, rightParseFunction, leftKey, rightKey) {
183
+ if (rightParseFunction === void 0) {
184
+ rightParseFunction = parseFunction;
185
+ }
186
+ if (leftKey === void 0) {
187
+ leftKey = 'left';
188
+ }
189
+ if (rightKey === void 0) {
190
+ rightKey = 'right';
191
+ }
192
+ var ast = parseFunction();
193
+ if (!ast) {
194
+ return null;
195
+ }
196
+ if (matchPunctuator(operator)) {
197
+ while (matchPunctuator(operator)) {
198
+ var _ast;
199
+ next();
200
+ var right = assert(rightParseFunction());
201
+ ast = (_ast = {
202
+ type: type,
203
+ op: operator
204
+ }, _ast[leftKey] = ast, _ast[rightKey] = right, _ast.start = ast.start, _ast.end = right.end, _ast);
205
+ }
206
+ }
207
+ return ast;
208
+ }
209
+ function logicalOrExpression() {
210
+ return binaryExpressionParser('or', '||', logicalAndExpression);
211
+ }
212
+ function logicalAndExpression() {
213
+ return binaryExpressionParser('and', '&&', bitwiseOrExpression);
214
+ }
215
+ function bitwiseOrExpression() {
216
+ return binaryExpressionParser('binary', '|', bitwiseXOrExpression);
217
+ }
218
+ function bitwiseXOrExpression() {
219
+ return binaryExpressionParser('binary', '^', bitwiseAndExpression);
220
+ }
221
+ function bitwiseAndExpression() {
222
+ return binaryExpressionParser('binary', '&', equalityExpression);
223
+ }
224
+ function equalityExpression() {
225
+ return binaryExpressionParser('eq', '==', function () {
226
+ return binaryExpressionParser('ne', '!=', function () {
227
+ return binaryExpressionParser('streq', '===', function () {
228
+ return binaryExpressionParser('strneq', '!==', relationalExpression);
229
+ });
230
+ });
231
+ });
232
+ }
233
+ function relationalExpression() {
234
+ return binaryExpressionParser('lt', '<', function () {
235
+ return binaryExpressionParser('gt', '>', function () {
236
+ return binaryExpressionParser('le', '<=', function () {
237
+ return binaryExpressionParser('ge', '>=', shiftExpression);
238
+ });
239
+ });
240
+ });
241
+ }
242
+ function shiftExpression() {
243
+ return binaryExpressionParser('shift', '<<', function () {
244
+ return binaryExpressionParser('shift', '>>', function () {
245
+ return binaryExpressionParser('shift', '>>>', additiveExpression);
246
+ });
247
+ });
248
+ }
249
+ function additiveExpression() {
250
+ return binaryExpressionParser('add', '+', function () {
251
+ return binaryExpressionParser('minus', '-', multiplicativeExpression);
252
+ });
253
+ }
254
+ function multiplicativeExpression() {
255
+ return binaryExpressionParser('multiply', '*', function () {
256
+ return binaryExpressionParser('divide', '/', function () {
257
+ return binaryExpressionParser('remainder', '%', powerExpression);
258
+ });
259
+ });
260
+ }
261
+ function powerExpression() {
262
+ return binaryExpressionParser('power', '**', unaryExpression);
263
+ }
264
+ function unaryExpression() {
265
+ var unaryOperators = ['+', '-', '~', '!'];
266
+ var stack = [];
267
+ while (matchPunctuator(unaryOperators)) {
268
+ stack.push(token);
269
+ next();
270
+ }
271
+ var ast = postfixExpression();
272
+ assert(!stack.length || ast);
273
+ while (stack.length) {
274
+ var op = stack.pop();
275
+ ast = {
276
+ type: 'unary',
277
+ op: op.value,
278
+ value: ast,
279
+ start: op.start,
280
+ end: op.end
281
+ };
282
+ }
283
+ return ast;
284
+ }
285
+ function postfixExpression(parseFunction) {
286
+ if (parseFunction === void 0) {
287
+ parseFunction = leftHandSideExpression;
288
+ }
289
+ var ast = parseFunction();
290
+ if (!ast) {
291
+ return null;
292
+ }
293
+ while (matchPunctuator('[') || matchPunctuator('.')) {
294
+ var isDot = matchPunctuator('.');
295
+ next();
296
+ var right = assert(isDot ? identifier() || numberLiteral() || rawScript() : expression());
297
+ if (!isDot) {
298
+ assert(matchPunctuator(']'));
299
+ next();
300
+ }
301
+ ast = {
302
+ type: 'getter',
303
+ host: ast,
304
+ key: right,
305
+ start: ast.start,
306
+ end: right.end
307
+ };
308
+ }
309
+ return ast;
310
+ }
311
+ function leftHandSideExpression() {
312
+ return functionCall() || arrowFunction() || primaryExpression();
313
+ }
314
+ function varibleKey(allowVariable, inObject) {
315
+ if (allowVariable === void 0) {
316
+ allowVariable = false;
317
+ }
318
+ if (inObject === void 0) {
319
+ inObject = false;
320
+ }
321
+ return (allowVariable ? variable() : identifier()) || stringLiteral() || numberLiteral() || (inObject ? objectTemplateKey() : template());
322
+ }
323
+ function objectTemplateKey() {
324
+ if (matchPunctuator('[')) {
325
+ next();
326
+ var key = assert(template());
327
+ assert(matchPunctuator(']'));
328
+ next();
329
+ return key;
330
+ }
331
+ return null;
332
+ }
333
+ function stringLiteral() {
334
+ if (token.type === _lexer.TokenName[11 /* StringLiteral */]) {
335
+ var cToken = token;
336
+ next();
337
+ return {
338
+ type: 'string',
339
+ value: cToken.value,
340
+ start: cToken.start,
341
+ end: cToken.end
342
+ };
343
+ }
344
+ return null;
345
+ }
346
+ function numberLiteral() {
347
+ if (token.type === _lexer.TokenName[9 /* NumericLiteral */]) {
348
+ var value = token.value;
349
+ var cToken = token;
350
+ next();
351
+ return {
352
+ type: 'literal',
353
+ value: value,
354
+ start: cToken.start,
355
+ end: cToken.end
356
+ };
357
+ }
358
+ return null;
359
+ }
360
+ function template() {
361
+ if (matchPunctuator('`')) {
362
+ var start = token;
363
+ var end = start;
364
+ next();
365
+ var state = tempalteStates.START;
366
+ var _ast2 = {
367
+ type: 'template',
368
+ body: [],
369
+ start: start.start,
370
+ end: start.end
371
+ };
372
+ while (true) {
373
+ if (state === tempalteStates.SCRIPTING) {
374
+ var exp = assert(expression());
375
+ _ast2.body.push(exp);
376
+ assert(token.type === _lexer.TokenName[15 /* TemplateRightBrace */]);
377
+ next();
378
+ state = tempalteStates.START;
379
+ } else {
380
+ if (matchPunctuator('`')) {
381
+ end = token;
382
+ next();
383
+ break;
384
+ } else if (token.type === _lexer.TokenName[14 /* TemplateLeftBrace */]) {
385
+ next();
386
+ state = tempalteStates.SCRIPTING;
387
+ } else if (token.type === _lexer.TokenName[13 /* TemplateRaw */]) {
388
+ _ast2.body.push({
389
+ type: 'template_raw',
390
+ value: token.value,
391
+ start: token.start,
392
+ end: token.end
393
+ });
394
+ next();
395
+ } else {
396
+ fatal();
397
+ }
398
+ }
399
+ }
400
+ _ast2.end = end.end;
401
+ return _ast2;
402
+ }
403
+ return null;
404
+ }
405
+ function identifier() {
406
+ if (token.type === _lexer.TokenName[7 /* Identifier */]) {
407
+ var cToken = token;
408
+ next();
409
+ return {
410
+ type: 'identifier',
411
+ name: cToken.value,
412
+ start: cToken.start,
413
+ end: cToken.end
414
+ };
415
+ }
416
+ return null;
417
+ }
418
+ function primaryExpression() {
419
+ return variable() || literal() || numberLiteral() || stringLiteral() || template() || arrayLiteral() || objectLiteral() || function () {
420
+ var ast = expressionList();
421
+ if ((ast === null || ast === void 0 ? void 0 : ast.body.length) === 1) {
422
+ return ast.body[0];
423
+ }
424
+ return ast;
425
+ }() || rawScript();
426
+ }
427
+ function literal() {
428
+ if (token.type === _lexer.TokenName[8 /* Literal */] || token.type === _lexer.TokenName[1 /* BooleanLiteral */]) {
429
+ var value = token.value;
430
+ var cToken = token;
431
+ next();
432
+ return {
433
+ type: 'literal',
434
+ value: value,
435
+ start: cToken.start,
436
+ end: cToken.end
437
+ };
438
+ }
439
+ return null;
440
+ }
441
+ function functionCall() {
442
+ if (token.type === _lexer.TokenName[7 /* Identifier */]) {
443
+ var id = token;
444
+ next();
445
+ if (matchPunctuator('(')) {
446
+ var _argList = expressionList();
447
+ assert(_argList);
448
+ return {
449
+ type: 'func_call',
450
+ identifier: id.value,
451
+ args: _argList === null || _argList === void 0 ? void 0 : _argList.body,
452
+ start: id.start,
453
+ end: _argList.end
454
+ };
455
+ } else {
456
+ back();
457
+ }
458
+ }
459
+ return null;
460
+ }
461
+ function arrayLiteral() {
462
+ if (matchPunctuator('[')) {
463
+ var _argList2 = expressionList('[', ']');
464
+ assert(_argList2);
465
+ return {
466
+ type: 'array',
467
+ members: _argList2 === null || _argList2 === void 0 ? void 0 : _argList2.body,
468
+ start: _argList2.start,
469
+ end: _argList2.end
470
+ };
471
+ }
472
+ return null;
473
+ }
474
+ function expressionList(startOP, endOp) {
475
+ if (startOP === void 0) {
476
+ startOP = '(';
477
+ }
478
+ if (endOp === void 0) {
479
+ endOp = ')';
480
+ }
481
+ if (matchPunctuator(startOP)) {
482
+ var start = token;
483
+ var end;
484
+ next();
485
+ var args = [];
486
+ var state = argListStates.START;
487
+ while (true) {
488
+ if (state === argListStates.COMMA || !matchPunctuator(endOp)) {
489
+ var arg = assert(expression());
490
+ args.push(arg);
491
+ state = argListStates.START;
492
+ if (matchPunctuator(',')) {
493
+ next();
494
+ state = argListStates.COMMA;
495
+ }
496
+ } else if (matchPunctuator(endOp)) {
497
+ end = token;
498
+ next();
499
+ break;
500
+ }
501
+ }
502
+ return {
503
+ type: 'expression-list',
504
+ body: args,
505
+ start: start.start,
506
+ end: end.end
507
+ };
508
+ }
509
+ return null;
510
+ }
511
+ function argList(startOP, endOp) {
512
+ if (startOP === void 0) {
513
+ startOP = '(';
514
+ }
515
+ if (endOp === void 0) {
516
+ endOp = ')';
517
+ }
518
+ var count = 0;
519
+ var rollback = function rollback() {
520
+ while (count-- > 0) {
521
+ back();
522
+ }
523
+ return null;
524
+ };
525
+ if (matchPunctuator(startOP)) {
526
+ var start = token;
527
+ var end = start;
528
+ next();
529
+ count++;
530
+ var args = [];
531
+ var state = argListStates.START;
532
+ while (!matchPunctuator(endOp)) {
533
+ if (state === argListStates.COMMA || state === argListStates.START) {
534
+ var arg = variable(false);
535
+ if (!arg) {
536
+ return rollback();
537
+ }
538
+ count++;
539
+ args.push(arg);
540
+ state = argListStates.SET;
541
+ } else if (state === argListStates.SET && matchPunctuator(',')) {
542
+ next();
543
+ count++;
544
+ state = argListStates.COMMA;
545
+ } else {
546
+ return rollback();
547
+ }
548
+ }
549
+ if (matchPunctuator(endOp)) {
550
+ end = token;
551
+ next();
552
+ return {
553
+ type: 'arg-list',
554
+ body: args,
555
+ start: start.start,
556
+ end: end.end
557
+ };
558
+ } else {
559
+ return rollback();
560
+ }
561
+ }
562
+ return null;
563
+ }
564
+ function objectLiteral() {
565
+ if (matchPunctuator('{')) {
566
+ var start = token;
567
+ var end = start;
568
+ next();
569
+ var _ast3 = {
570
+ type: 'object',
571
+ members: [],
572
+ start: start.start,
573
+ end: start.end
574
+ };
575
+ var state = objectStates.START;
576
+ var key, value;
577
+ while (true) {
578
+ if (state === objectStates.KEY) {
579
+ assert(matchPunctuator(':'));
580
+ next();
581
+ state = objectStates.COLON;
582
+ } else if (state === objectStates.COLON) {
583
+ value = assert(expression());
584
+ _ast3.members.push({
585
+ key: key,
586
+ value: value
587
+ });
588
+ state = objectStates.VALUE;
589
+ } else if (state === objectStates.VALUE) {
590
+ if (matchPunctuator(',')) {
591
+ next();
592
+ state = objectStates.COMMA;
593
+ } else if (matchPunctuator('}')) {
594
+ end = token;
595
+ next();
596
+ break;
597
+ } else {
598
+ fatal();
599
+ }
600
+ } else {
601
+ if (state != objectStates.COMMA && matchPunctuator('}')) {
602
+ end = token;
603
+ next();
604
+ break;
605
+ }
606
+ key = assert(varibleKey(false, true));
607
+ state = objectStates.KEY;
608
+ }
609
+ }
610
+ _ast3.end = end.end;
611
+ return _ast3;
612
+ }
613
+ return null;
614
+ }
615
+ function assignmentExpression() {
616
+ return conditionalExpression();
617
+ }
618
+ function contents() {
619
+ var node = {
620
+ type: 'document',
621
+ body: [],
622
+ start: token.start,
623
+ end: token.end
624
+ };
625
+ while (token.type !== _lexer.TokenName[6 /* EOF */]) {
626
+ var _ast4 = raw() || rawScript() || oldVariable();
627
+ if (!_ast4) {
628
+ break;
629
+ }
630
+ node.body.push(_ast4);
631
+ }
632
+ if (node.body.length) {
633
+ node.end = node.body[node.body.length - 1].end;
634
+ }
635
+ return node;
636
+ }
637
+ function raw() {
638
+ if (token.type !== _lexer.TokenName[2 /* RAW */]) {
639
+ return null;
640
+ }
641
+ var cToken = token;
642
+ next();
643
+ return {
644
+ type: 'raw',
645
+ value: cToken.value,
646
+ start: cToken.start,
647
+ end: cToken.end
648
+ };
649
+ }
650
+ function rawScript() {
651
+ if (token.type !== _lexer.TokenName[4 /* OpenScript */]) {
652
+ return null;
653
+ }
654
+ var start = token;
655
+ var end = start;
656
+ next();
657
+ var exp = assert(complexExpression());
658
+ assert(token.type === _lexer.TokenName[5 /* CloseScript */]);
659
+ end = token;
660
+ next();
661
+ return {
662
+ type: 'script',
663
+ body: exp,
664
+ start: start.start,
665
+ end: end.end
666
+ };
667
+ }
668
+ function variable(allowNameSpace) {
669
+ if (allowNameSpace === void 0) {
670
+ allowNameSpace = true;
671
+ }
672
+ if (token.type === _lexer.TokenName[7 /* Identifier */]) {
673
+ var cToken = token;
674
+ next();
675
+ if (allowNameSpace && matchPunctuator(':') && ~variableNamespaces.indexOf(cToken.value)) {
676
+ next();
677
+ var body = assert(postfixExpression());
678
+ return {
679
+ type: 'ns-variable',
680
+ namespace: cToken.value,
681
+ body: body,
682
+ start: cToken.start,
683
+ end: body.end
684
+ };
685
+ }
686
+ return {
687
+ type: 'variable',
688
+ name: cToken.value,
689
+ start: cToken.start,
690
+ end: cToken.end
691
+ };
692
+ } else if (matchPunctuator('&')) {
693
+ var v = token;
694
+ next();
695
+ return {
696
+ type: 'variable',
697
+ name: '&',
698
+ start: v.start,
699
+ end: v.end
700
+ };
701
+ }
702
+ return null;
703
+ }
704
+ function oldVariable() {
705
+ if (token.type !== _lexer.TokenName[3 /* Variable */]) {
706
+ return null;
707
+ }
708
+ var prevToken = token;
709
+ next();
710
+ return {
711
+ type: 'script',
712
+ body: prevToken.value.split('.').reduce(function (prev, key) {
713
+ return prev ? {
714
+ type: 'getter',
715
+ host: prev,
716
+ key: key,
717
+ start: prevToken.start,
718
+ end: prevToken.end
719
+ } : {
720
+ type: 'variable',
721
+ name: key,
722
+ start: prevToken.start,
723
+ end: prevToken.end
724
+ };
725
+ }, null),
726
+ start: prevToken.start,
727
+ end: prevToken.end
728
+ };
729
+ }
730
+ next();
731
+ var ast = (options === null || options === void 0 ? void 0 : options.variableMode) ? postfixExpression(variable) : (options === null || options === void 0 ? void 0 : options.evalMode) ? expression() : contents();
732
+ assert((token === null || token === void 0 ? void 0 : token.type) === _lexer.TokenName[6 /* EOF */]);
733
+ return ast;
734
+ }