@fieldia/core 0.1.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.
- package/LICENSE +21 -0
- package/README.md +31 -0
- package/package.json +40 -0
- package/schema/page.schema.json +2142 -0
- package/src/index.d.mts +15 -0
- package/src/index.d.ts +15 -0
- package/src/index.js +46 -0
- package/src/index.js.map +1 -0
- package/src/index.mjs +14 -0
- package/src/index.mjs.map +1 -0
- package/src/lib/expression/evaluateModifier.d.mts +55 -0
- package/src/lib/expression/evaluateModifier.d.ts +55 -0
- package/src/lib/expression/evaluateModifier.js +121 -0
- package/src/lib/expression/evaluateModifier.js.map +1 -0
- package/src/lib/expression/evaluateModifier.mjs +117 -0
- package/src/lib/expression/evaluateModifier.mjs.map +1 -0
- package/src/lib/expression/evaluator.d.mts +23 -0
- package/src/lib/expression/evaluator.d.ts +23 -0
- package/src/lib/expression/evaluator.js +122 -0
- package/src/lib/expression/evaluator.js.map +1 -0
- package/src/lib/expression/evaluator.mjs +118 -0
- package/src/lib/expression/evaluator.mjs.map +1 -0
- package/src/lib/expression/extractFieldNames.d.mts +41 -0
- package/src/lib/expression/extractFieldNames.d.ts +41 -0
- package/src/lib/expression/extractFieldNames.js +97 -0
- package/src/lib/expression/extractFieldNames.js.map +1 -0
- package/src/lib/expression/extractFieldNames.mjs +93 -0
- package/src/lib/expression/extractFieldNames.mjs.map +1 -0
- package/src/lib/expression/modifier.d.mts +14 -0
- package/src/lib/expression/modifier.d.ts +14 -0
- package/src/lib/expression/modifier.js +55 -0
- package/src/lib/expression/modifier.js.map +1 -0
- package/src/lib/expression/modifier.mjs +52 -0
- package/src/lib/expression/modifier.mjs.map +1 -0
- package/src/lib/expression/parser.d.mts +109 -0
- package/src/lib/expression/parser.d.ts +109 -0
- package/src/lib/expression/parser.js +317 -0
- package/src/lib/expression/parser.js.map +1 -0
- package/src/lib/expression/parser.mjs +313 -0
- package/src/lib/expression/parser.mjs.map +1 -0
- package/src/lib/expression/tokenizer.d.mts +31 -0
- package/src/lib/expression/tokenizer.d.ts +31 -0
- package/src/lib/expression/tokenizer.js +100 -0
- package/src/lib/expression/tokenizer.js.map +1 -0
- package/src/lib/expression/tokenizer.mjs +96 -0
- package/src/lib/expression/tokenizer.mjs.map +1 -0
- package/src/lib/format/field.d.mts +967 -0
- package/src/lib/format/field.d.ts +967 -0
- package/src/lib/format/field.js +147 -0
- package/src/lib/format/field.js.map +1 -0
- package/src/lib/format/field.mjs +144 -0
- package/src/lib/format/field.mjs.map +1 -0
- package/src/lib/format/json-schema.d.mts +6 -0
- package/src/lib/format/json-schema.d.ts +6 -0
- package/src/lib/format/json-schema.js +14 -0
- package/src/lib/format/json-schema.js.map +1 -0
- package/src/lib/format/json-schema.mjs +11 -0
- package/src/lib/format/json-schema.mjs.map +1 -0
- package/src/lib/format/json.d.mts +7 -0
- package/src/lib/format/json.d.ts +7 -0
- package/src/lib/format/json.js +7 -0
- package/src/lib/format/json.js.map +1 -0
- package/src/lib/format/json.mjs +4 -0
- package/src/lib/format/json.mjs.map +1 -0
- package/src/lib/format/layout.d.mts +521 -0
- package/src/lib/format/layout.d.ts +521 -0
- package/src/lib/format/layout.js +150 -0
- package/src/lib/format/layout.js.map +1 -0
- package/src/lib/format/layout.mjs +147 -0
- package/src/lib/format/layout.mjs.map +1 -0
- package/src/lib/format/layout.types.d.mts +22 -0
- package/src/lib/format/layout.types.d.ts +22 -0
- package/src/lib/format/layout.types.js +3 -0
- package/src/lib/format/layout.types.js.map +1 -0
- package/src/lib/format/layout.types.mjs +2 -0
- package/src/lib/format/layout.types.mjs.map +1 -0
- package/src/lib/format/page.d.mts +511 -0
- package/src/lib/format/page.d.ts +511 -0
- package/src/lib/format/page.js +27 -0
- package/src/lib/format/page.js.map +1 -0
- package/src/lib/format/page.mjs +24 -0
- package/src/lib/format/page.mjs.map +1 -0
- package/src/lib/format/validate.d.mts +23 -0
- package/src/lib/format/validate.d.ts +23 -0
- package/src/lib/format/validate.js +210 -0
- package/src/lib/format/validate.js.map +1 -0
- package/src/lib/format/validate.mjs +207 -0
- package/src/lib/format/validate.mjs.map +1 -0
- package/src/lib/record/check.d.mts +14 -0
- package/src/lib/record/check.d.ts +14 -0
- package/src/lib/record/check.js +167 -0
- package/src/lib/record/check.js.map +1 -0
- package/src/lib/record/check.mjs +163 -0
- package/src/lib/record/check.mjs.map +1 -0
- package/src/lib/record/data-source.d.mts +109 -0
- package/src/lib/record/data-source.d.ts +109 -0
- package/src/lib/record/data-source.js +3 -0
- package/src/lib/record/data-source.js.map +1 -0
- package/src/lib/record/data-source.mjs +2 -0
- package/src/lib/record/data-source.mjs.map +1 -0
- package/src/lib/record/form.d.mts +106 -0
- package/src/lib/record/form.d.ts +106 -0
- package/src/lib/record/form.js +545 -0
- package/src/lib/record/form.js.map +1 -0
- package/src/lib/record/form.mjs +542 -0
- package/src/lib/record/form.mjs.map +1 -0
- package/src/lib/record/memory-data-source.d.mts +28 -0
- package/src/lib/record/memory-data-source.d.ts +28 -0
- package/src/lib/record/memory-data-source.js +132 -0
- package/src/lib/record/memory-data-source.js.map +1 -0
- package/src/lib/record/memory-data-source.mjs +129 -0
- package/src/lib/record/memory-data-source.mjs.map +1 -0
- package/src/lib/record/messages.d.mts +35 -0
- package/src/lib/record/messages.d.ts +35 -0
- package/src/lib/record/messages.js +111 -0
- package/src/lib/record/messages.js.map +1 -0
- package/src/lib/record/messages.mjs +107 -0
- package/src/lib/record/messages.mjs.map +1 -0
- package/src/lib/record/scheduler.d.mts +12 -0
- package/src/lib/record/scheduler.d.ts +12 -0
- package/src/lib/record/scheduler.js +16 -0
- package/src/lib/record/scheduler.js.map +1 -0
- package/src/lib/record/scheduler.mjs +12 -0
- package/src/lib/record/scheduler.mjs.map +1 -0
- package/src/lib/record/values.d.mts +54 -0
- package/src/lib/record/values.d.ts +54 -0
- package/src/lib/record/values.js +78 -0
- package/src/lib/record/values.js.map +1 -0
- package/src/lib/record/values.mjs +71 -0
- package/src/lib/record/values.mjs.map +1 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expression parser for modifiers, ported from the React form engine.
|
|
3
|
+
*
|
|
4
|
+
* Recursive descent parser that converts tokens into an Abstract Syntax Tree (AST).
|
|
5
|
+
* Implements Python-like operator precedence:
|
|
6
|
+
* 1. OR (lowest precedence)
|
|
7
|
+
* 2. AND
|
|
8
|
+
* 3. NOT
|
|
9
|
+
* 4. Comparison operators (==, !=, <, >, <=, >=, in, not in)
|
|
10
|
+
* 5. Values/Identifiers (highest precedence)
|
|
11
|
+
*/
|
|
12
|
+
import { type Token } from './tokenizer';
|
|
13
|
+
/**
|
|
14
|
+
* AST Node Types
|
|
15
|
+
*/
|
|
16
|
+
export type ASTNode = BinaryOpNode | UnaryOpNode | LiteralNode | IdentifierNode;
|
|
17
|
+
export interface BinaryOpNode {
|
|
18
|
+
type: 'BinaryOp';
|
|
19
|
+
operator: string;
|
|
20
|
+
left: ASTNode;
|
|
21
|
+
right: ASTNode;
|
|
22
|
+
}
|
|
23
|
+
export interface UnaryOpNode {
|
|
24
|
+
type: 'UnaryOp';
|
|
25
|
+
operator: string;
|
|
26
|
+
operand: ASTNode;
|
|
27
|
+
}
|
|
28
|
+
export interface LiteralNode {
|
|
29
|
+
type: 'Literal';
|
|
30
|
+
value: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface IdentifierNode {
|
|
33
|
+
type: 'Identifier';
|
|
34
|
+
name: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Recursive Descent Expression Parser
|
|
38
|
+
*/
|
|
39
|
+
export declare class ExpressionParser {
|
|
40
|
+
private tokens;
|
|
41
|
+
private position;
|
|
42
|
+
constructor(tokens: Token[]);
|
|
43
|
+
/**
|
|
44
|
+
* Parse tokens into an AST
|
|
45
|
+
*/
|
|
46
|
+
parse(): ASTNode;
|
|
47
|
+
/**
|
|
48
|
+
* Parse OR expressions (lowest precedence)
|
|
49
|
+
* or_expr: and_expr ('or' and_expr)*
|
|
50
|
+
*/
|
|
51
|
+
private parseOr;
|
|
52
|
+
/**
|
|
53
|
+
* Parse AND expressions
|
|
54
|
+
* and_expr: not_expr ('and' not_expr)*
|
|
55
|
+
*/
|
|
56
|
+
private parseAnd;
|
|
57
|
+
/**
|
|
58
|
+
* Parse NOT expressions
|
|
59
|
+
* not_expr: 'not' comparison | comparison
|
|
60
|
+
*/
|
|
61
|
+
private parseNot;
|
|
62
|
+
/**
|
|
63
|
+
* Parse comparison expressions
|
|
64
|
+
* comparison: value (comp_op value)?
|
|
65
|
+
* comp_op: '==' | '!=' | '<>' | '<' | '>' | '<=' | '>=' | 'in' | 'not in'
|
|
66
|
+
*/
|
|
67
|
+
private parseComparison;
|
|
68
|
+
/**
|
|
69
|
+
* Parse value expressions (highest precedence)
|
|
70
|
+
* value: '(' or_expr ')' | literal | identifier
|
|
71
|
+
*/
|
|
72
|
+
private parseValue;
|
|
73
|
+
/**
|
|
74
|
+
* Check if current token matches any of the given types/values
|
|
75
|
+
*/
|
|
76
|
+
private match;
|
|
77
|
+
/**
|
|
78
|
+
* Match logical operators (case-insensitive)
|
|
79
|
+
*/
|
|
80
|
+
private matchLogical;
|
|
81
|
+
/**
|
|
82
|
+
* Match comparison operators (case-insensitive)
|
|
83
|
+
*/
|
|
84
|
+
private matchOperator;
|
|
85
|
+
/**
|
|
86
|
+
* Check if current token has given type
|
|
87
|
+
*/
|
|
88
|
+
private check;
|
|
89
|
+
/**
|
|
90
|
+
* Consume current token and advance
|
|
91
|
+
*/
|
|
92
|
+
private advance;
|
|
93
|
+
/**
|
|
94
|
+
* Get current token without advancing
|
|
95
|
+
*/
|
|
96
|
+
private peek;
|
|
97
|
+
/**
|
|
98
|
+
* Get previous token
|
|
99
|
+
*/
|
|
100
|
+
private previous;
|
|
101
|
+
/**
|
|
102
|
+
* Check if we've consumed all tokens
|
|
103
|
+
*/
|
|
104
|
+
private isAtEnd;
|
|
105
|
+
/**
|
|
106
|
+
* Consume a token of specific type/value or throw error
|
|
107
|
+
*/
|
|
108
|
+
private consume;
|
|
109
|
+
}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Expression parser for modifiers, ported from the React form engine.
|
|
4
|
+
*
|
|
5
|
+
* Recursive descent parser that converts tokens into an Abstract Syntax Tree (AST).
|
|
6
|
+
* Implements Python-like operator precedence:
|
|
7
|
+
* 1. OR (lowest precedence)
|
|
8
|
+
* 2. AND
|
|
9
|
+
* 3. NOT
|
|
10
|
+
* 4. Comparison operators (==, !=, <, >, <=, >=, in, not in)
|
|
11
|
+
* 5. Values/Identifiers (highest precedence)
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ExpressionParser = void 0;
|
|
15
|
+
const tokenizer_1 = require("./tokenizer");
|
|
16
|
+
/**
|
|
17
|
+
* Recursive Descent Expression Parser
|
|
18
|
+
*/
|
|
19
|
+
class ExpressionParser {
|
|
20
|
+
tokens;
|
|
21
|
+
position = 0;
|
|
22
|
+
constructor(tokens) {
|
|
23
|
+
this.tokens = tokens;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse tokens into an AST
|
|
27
|
+
*/
|
|
28
|
+
parse() {
|
|
29
|
+
if (this.tokens.length === 0) {
|
|
30
|
+
throw new Error('Cannot parse empty expression');
|
|
31
|
+
}
|
|
32
|
+
const ast = this.parseOr();
|
|
33
|
+
// Ensure all tokens were consumed
|
|
34
|
+
if (!this.isAtEnd()) {
|
|
35
|
+
throw new Error(`Unexpected token at position ${this.position}: ${this.peek()?.value}`);
|
|
36
|
+
}
|
|
37
|
+
return ast;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parse OR expressions (lowest precedence)
|
|
41
|
+
* or_expr: and_expr ('or' and_expr)*
|
|
42
|
+
*/
|
|
43
|
+
parseOr() {
|
|
44
|
+
let left = this.parseAnd();
|
|
45
|
+
while (this.matchLogical('or')) {
|
|
46
|
+
const operator = this.previous().value;
|
|
47
|
+
const right = this.parseAnd();
|
|
48
|
+
left = {
|
|
49
|
+
type: 'BinaryOp',
|
|
50
|
+
operator: operator.toLowerCase(),
|
|
51
|
+
left,
|
|
52
|
+
right,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return left;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse AND expressions
|
|
59
|
+
* and_expr: not_expr ('and' not_expr)*
|
|
60
|
+
*/
|
|
61
|
+
parseAnd() {
|
|
62
|
+
let left = this.parseNot();
|
|
63
|
+
while (this.matchLogical('and')) {
|
|
64
|
+
const operator = this.previous().value;
|
|
65
|
+
const right = this.parseNot();
|
|
66
|
+
left = {
|
|
67
|
+
type: 'BinaryOp',
|
|
68
|
+
operator: operator.toLowerCase(),
|
|
69
|
+
left,
|
|
70
|
+
right,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return left;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse NOT expressions
|
|
77
|
+
* not_expr: 'not' comparison | comparison
|
|
78
|
+
*/
|
|
79
|
+
parseNot() {
|
|
80
|
+
if (this.matchLogical('not')) {
|
|
81
|
+
const operator = this.previous().value;
|
|
82
|
+
const operand = this.parseComparison();
|
|
83
|
+
return {
|
|
84
|
+
type: 'UnaryOp',
|
|
85
|
+
operator: operator.toLowerCase(),
|
|
86
|
+
operand,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return this.parseComparison();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Parse comparison expressions
|
|
93
|
+
* comparison: value (comp_op value)?
|
|
94
|
+
* comp_op: '==' | '!=' | '<>' | '<' | '>' | '<=' | '>=' | 'in' | 'not in'
|
|
95
|
+
*/
|
|
96
|
+
parseComparison() {
|
|
97
|
+
const left = this.parseValue();
|
|
98
|
+
const compOperators = ['==', '!=', '<>', '<', '>', '<=', '>=', 'in', 'not in'];
|
|
99
|
+
if (this.matchOperator(...compOperators)) {
|
|
100
|
+
const operator = this.previous().value;
|
|
101
|
+
const right = this.parseValue();
|
|
102
|
+
return {
|
|
103
|
+
type: 'BinaryOp',
|
|
104
|
+
operator: operator.toLowerCase(),
|
|
105
|
+
left,
|
|
106
|
+
right,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// If no comparison operator, return value as-is (truthiness check)
|
|
110
|
+
return left;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse value expressions (highest precedence)
|
|
114
|
+
* value: '(' or_expr ')' | literal | identifier
|
|
115
|
+
*/
|
|
116
|
+
parseValue() {
|
|
117
|
+
// Parenthesized expression
|
|
118
|
+
if (this.match('PAREN', '(')) {
|
|
119
|
+
const expr = this.parseOr();
|
|
120
|
+
this.consume('PAREN', ')', 'Expected closing parenthesis');
|
|
121
|
+
return expr;
|
|
122
|
+
}
|
|
123
|
+
// String literal
|
|
124
|
+
if (this.check('STRING')) {
|
|
125
|
+
const token = this.advance();
|
|
126
|
+
// Remove quotes
|
|
127
|
+
const value = token.value.slice(1, -1);
|
|
128
|
+
return { type: 'Literal', value };
|
|
129
|
+
}
|
|
130
|
+
// True, False, None
|
|
131
|
+
if (this.check('CONSTANT')) {
|
|
132
|
+
const token = this.advance();
|
|
133
|
+
return { type: 'Literal', value: tokenizer_1.CONSTANTS.get(token.value) ?? null };
|
|
134
|
+
}
|
|
135
|
+
// Number literal
|
|
136
|
+
if (this.check('NUMBER')) {
|
|
137
|
+
const token = this.advance();
|
|
138
|
+
return { type: 'Literal', value: Number(token.value) };
|
|
139
|
+
}
|
|
140
|
+
// List literal
|
|
141
|
+
if (this.check('LIST')) {
|
|
142
|
+
const token = this.advance();
|
|
143
|
+
const value = parseListLiteral(token.value);
|
|
144
|
+
return { type: 'Literal', value };
|
|
145
|
+
}
|
|
146
|
+
// Identifier
|
|
147
|
+
if (this.check('IDENTIFIER')) {
|
|
148
|
+
const token = this.advance();
|
|
149
|
+
return { type: 'Identifier', name: token.value };
|
|
150
|
+
}
|
|
151
|
+
throw new Error(`Unexpected token: ${this.peek()?.value || 'EOF'}`);
|
|
152
|
+
}
|
|
153
|
+
// ========== Helper Methods ==========
|
|
154
|
+
/**
|
|
155
|
+
* Check if current token matches any of the given types/values
|
|
156
|
+
*/
|
|
157
|
+
match(type, ...values) {
|
|
158
|
+
if (this.check(type)) {
|
|
159
|
+
if (values.length === 0) {
|
|
160
|
+
this.advance();
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
const token = this.peek();
|
|
164
|
+
if (token && values.includes(token.value)) {
|
|
165
|
+
this.advance();
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Match logical operators (case-insensitive)
|
|
173
|
+
*/
|
|
174
|
+
matchLogical(...operators) {
|
|
175
|
+
const token = this.peek();
|
|
176
|
+
if (token && token.type === 'LOGICAL') {
|
|
177
|
+
const lowerValue = token.value.toLowerCase();
|
|
178
|
+
if (operators.map(op => op.toLowerCase()).includes(lowerValue)) {
|
|
179
|
+
this.advance();
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Match comparison operators (case-insensitive)
|
|
187
|
+
*/
|
|
188
|
+
matchOperator(...operators) {
|
|
189
|
+
const token = this.peek();
|
|
190
|
+
if (token && token.type === 'OPERATOR') {
|
|
191
|
+
const lowerValue = token.value.toLowerCase();
|
|
192
|
+
if (operators.map(op => op.toLowerCase()).includes(lowerValue)) {
|
|
193
|
+
this.advance();
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if current token has given type
|
|
201
|
+
*/
|
|
202
|
+
check(type) {
|
|
203
|
+
const token = this.peek();
|
|
204
|
+
return token?.type === type;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Consume current token and advance
|
|
208
|
+
*/
|
|
209
|
+
advance() {
|
|
210
|
+
if (!this.isAtEnd()) {
|
|
211
|
+
this.position++;
|
|
212
|
+
}
|
|
213
|
+
return this.previous();
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get current token without advancing
|
|
217
|
+
*/
|
|
218
|
+
peek() {
|
|
219
|
+
if (this.isAtEnd()) {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
return this.tokens[this.position];
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get previous token
|
|
226
|
+
*/
|
|
227
|
+
previous() {
|
|
228
|
+
return this.tokens[this.position - 1];
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Check if we've consumed all tokens
|
|
232
|
+
*/
|
|
233
|
+
isAtEnd() {
|
|
234
|
+
return this.position >= this.tokens.length;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Consume a token of specific type/value or throw error
|
|
238
|
+
*/
|
|
239
|
+
consume(type, value, message) {
|
|
240
|
+
if (this.check(type)) {
|
|
241
|
+
const token = this.peek();
|
|
242
|
+
if (token && token.value === value) {
|
|
243
|
+
return this.advance();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
throw new Error(message);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.ExpressionParser = ExpressionParser;
|
|
250
|
+
/**
|
|
251
|
+
* Parse a list literal string into an array
|
|
252
|
+
* Example: "['draft', 'sent']" -> ['draft', 'sent']
|
|
253
|
+
*/
|
|
254
|
+
function parseListLiteral(listStr) {
|
|
255
|
+
try {
|
|
256
|
+
// Remove brackets
|
|
257
|
+
const content = listStr.slice(1, -1).trim();
|
|
258
|
+
if (!content) {
|
|
259
|
+
return [];
|
|
260
|
+
}
|
|
261
|
+
// Split by comma and parse each element
|
|
262
|
+
const elements = [];
|
|
263
|
+
let current = '';
|
|
264
|
+
let inString = false;
|
|
265
|
+
let stringChar = '';
|
|
266
|
+
for (let i = 0; i < content.length; i++) {
|
|
267
|
+
const char = content[i];
|
|
268
|
+
if ((char === "'" || char === '"') && (i === 0 || content[i - 1] !== '\\')) {
|
|
269
|
+
if (!inString) {
|
|
270
|
+
inString = true;
|
|
271
|
+
stringChar = char;
|
|
272
|
+
}
|
|
273
|
+
else if (char === stringChar) {
|
|
274
|
+
inString = false;
|
|
275
|
+
stringChar = '';
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (char === ',' && !inString) {
|
|
279
|
+
elements.push(parseElement(current.trim()));
|
|
280
|
+
current = '';
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
current += char;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (current.trim()) {
|
|
287
|
+
elements.push(parseElement(current.trim()));
|
|
288
|
+
}
|
|
289
|
+
return elements;
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
// A list that cannot be read is a syntax error, not an empty list.
|
|
293
|
+
throw new Error(`Cannot read the list ${listStr}`, { cause: error });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Parse a single element from a list
|
|
298
|
+
*/
|
|
299
|
+
function parseElement(element) {
|
|
300
|
+
// String
|
|
301
|
+
if ((element.startsWith("'") && element.endsWith("'")) ||
|
|
302
|
+
(element.startsWith('"') && element.endsWith('"'))) {
|
|
303
|
+
return element.slice(1, -1);
|
|
304
|
+
}
|
|
305
|
+
// Number
|
|
306
|
+
if (!isNaN(Number(element))) {
|
|
307
|
+
return Number(element);
|
|
308
|
+
}
|
|
309
|
+
// Boolean
|
|
310
|
+
if (element.toLowerCase() === 'true')
|
|
311
|
+
return true;
|
|
312
|
+
if (element.toLowerCase() === 'false')
|
|
313
|
+
return false;
|
|
314
|
+
// Default to string
|
|
315
|
+
return element;
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/parser.ts"],"names":[],"mappings":"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"}
|