@vasp-framework/parser 0.4.0 → 1.0.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/README.md +21 -8
- package/dist/.tsbuildinfo +1 -1
- package/dist/errors/DiagnosticFormatter.d.ts +17 -0
- package/dist/errors/DiagnosticFormatter.d.ts.map +1 -0
- package/dist/errors/DiagnosticFormatter.js +88 -0
- package/dist/errors/DiagnosticFormatter.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lexer/Lexer.d.ts.map +1 -1
- package/dist/lexer/Lexer.js +35 -6
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/TokenType.d.ts +5 -0
- package/dist/lexer/TokenType.d.ts.map +1 -1
- package/dist/lexer/TokenType.js +8 -0
- package/dist/lexer/TokenType.js.map +1 -1
- package/dist/parser/Parser.d.ts.map +1 -1
- package/dist/parser/Parser.js +233 -14
- package/dist/parser/Parser.js.map +1 -1
- package/dist/validator/SemanticValidator.d.ts +4 -0
- package/dist/validator/SemanticValidator.d.ts.map +1 -1
- package/dist/validator/SemanticValidator.js +171 -8
- package/dist/validator/SemanticValidator.js.map +1 -1
- package/package.json +1 -1
package/dist/lexer/Lexer.js
CHANGED
|
@@ -94,6 +94,8 @@ export class Lexer {
|
|
|
94
94
|
'}': TokenType.RBRACE,
|
|
95
95
|
'[': TokenType.LBRACKET,
|
|
96
96
|
']': TokenType.RBRACKET,
|
|
97
|
+
'(': TokenType.LPAREN,
|
|
98
|
+
')': TokenType.RPAREN,
|
|
97
99
|
':': TokenType.COLON,
|
|
98
100
|
',': TokenType.COMMA,
|
|
99
101
|
};
|
|
@@ -145,17 +147,44 @@ export class Lexer {
|
|
|
145
147
|
break;
|
|
146
148
|
}
|
|
147
149
|
}
|
|
148
|
-
// Handle @default(now)
|
|
150
|
+
// Handle modifiers with parenthetical args: @default(now), @default("val"), @onDelete(cascade)
|
|
149
151
|
let modifier = name;
|
|
150
|
-
if (name === 'default' && this.peek() === '(') {
|
|
152
|
+
if ((name === 'default' || name === 'onDelete') && this.peek() === '(') {
|
|
153
|
+
const parenLoc = this.loc(); // capture opening '(' location for error reporting
|
|
151
154
|
this.advance(); // (
|
|
152
155
|
let arg = '';
|
|
153
156
|
while (this.pos < this.source.length && this.peek() !== ')') {
|
|
154
|
-
|
|
157
|
+
// Skip surrounding quotes for string args like @default("value")
|
|
158
|
+
const c = this.peek();
|
|
159
|
+
if (c === '"' || c === "'") {
|
|
160
|
+
this.advance(); // opening quote
|
|
161
|
+
while (this.pos < this.source.length && this.peek() !== c && this.peek() !== ')') {
|
|
162
|
+
arg += this.advance();
|
|
163
|
+
}
|
|
164
|
+
if (this.peek() === c)
|
|
165
|
+
this.advance(); // closing quote
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
arg += this.advance();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (this.peek() !== ')') {
|
|
172
|
+
throw new ParseError([{
|
|
173
|
+
code: 'E004_UNCLOSED_MODIFIER_ARG',
|
|
174
|
+
message: `Unclosed '(' in @${name} modifier — expected ')'`,
|
|
175
|
+
hint: `Add a closing ')' to complete the @${name}(...) modifier`,
|
|
176
|
+
loc: parenLoc,
|
|
177
|
+
}]);
|
|
178
|
+
}
|
|
179
|
+
this.advance(); // )
|
|
180
|
+
const argTrimmed = arg.trim();
|
|
181
|
+
if (name === 'default') {
|
|
182
|
+
modifier = argTrimmed === 'now' ? 'default_now' : `default_${argTrimmed}`;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// onDelete: cascade | restrict | setNull
|
|
186
|
+
modifier = `onDelete_${argTrimmed}`;
|
|
155
187
|
}
|
|
156
|
-
if (this.peek() === ')')
|
|
157
|
-
this.advance(); // )
|
|
158
|
-
modifier = arg.trim() === 'now' ? 'default_now' : `default_${arg.trim()}`;
|
|
159
188
|
}
|
|
160
189
|
this.tokens.push({ type: TokenType.AT_MODIFIER, value: modifier, loc });
|
|
161
190
|
}
|
package/dist/lexer/Lexer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../../src/lexer/Lexer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../../src/lexer/Lexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,12 @@ export declare enum TokenType {
|
|
|
6
6
|
KW_PAGE = "page",
|
|
7
7
|
KW_QUERY = "query",
|
|
8
8
|
KW_ACTION = "action",
|
|
9
|
+
KW_API = "api",
|
|
10
|
+
KW_MIDDLEWARE = "middleware",
|
|
9
11
|
KW_CRUD = "crud",
|
|
10
12
|
KW_REALTIME = "realtime",
|
|
11
13
|
KW_JOB = "job",
|
|
14
|
+
KW_SEED = "seed",
|
|
12
15
|
KW_IMPORT = "import",
|
|
13
16
|
KW_FROM = "from",
|
|
14
17
|
IDENTIFIER = "IDENTIFIER",
|
|
@@ -20,6 +23,8 @@ export declare enum TokenType {
|
|
|
20
23
|
RBRACE = "}",
|
|
21
24
|
LBRACKET = "[",
|
|
22
25
|
RBRACKET = "]",
|
|
26
|
+
LPAREN = "(",
|
|
27
|
+
RPAREN = ")",
|
|
23
28
|
COLON = ":",
|
|
24
29
|
COMMA = ",",
|
|
25
30
|
EOF = "EOF"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenType.d.ts","sourceRoot":"","sources":["../../src/lexer/TokenType.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IAEnB,MAAM,QAAQ;IACd,OAAO,SAAS;IAChB,SAAS,WAAW;IACpB,QAAQ,UAAU;IAClB,OAAO,SAAS;IAChB,QAAQ,UAAU;IAClB,SAAS,WAAW;IACpB,OAAO,SAAS;IAChB,WAAW,aAAa;IACxB,MAAM,QAAQ;
|
|
1
|
+
{"version":3,"file":"TokenType.d.ts","sourceRoot":"","sources":["../../src/lexer/TokenType.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IAEnB,MAAM,QAAQ;IACd,OAAO,SAAS;IAChB,SAAS,WAAW;IACpB,QAAQ,UAAU;IAClB,OAAO,SAAS;IAChB,QAAQ,UAAU;IAClB,SAAS,WAAW;IACpB,MAAM,QAAQ;IACd,aAAa,eAAe;IAC5B,OAAO,SAAS;IAChB,WAAW,aAAa;IACxB,MAAM,QAAQ;IACd,OAAO,SAAS;IAGhB,SAAS,WAAW;IACpB,OAAO,SAAS;IAGhB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;IAGjB,WAAW,gBAAgB;IAG3B,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,QAAQ,MAAM;IACd,QAAQ,MAAM;IACd,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,KAAK,MAAM;IACX,KAAK,MAAM;IAGX,GAAG,QAAQ;CACZ;AAED,wDAAwD;AACxD,eAAO,MAAM,cAAc,aAczB,CAAA;AAEF,8EAA8E;AAC9E,eAAO,MAAM,YAAY,aAIvB,CAAA"}
|
package/dist/lexer/TokenType.js
CHANGED
|
@@ -8,9 +8,12 @@ export var TokenType;
|
|
|
8
8
|
TokenType["KW_PAGE"] = "page";
|
|
9
9
|
TokenType["KW_QUERY"] = "query";
|
|
10
10
|
TokenType["KW_ACTION"] = "action";
|
|
11
|
+
TokenType["KW_API"] = "api";
|
|
12
|
+
TokenType["KW_MIDDLEWARE"] = "middleware";
|
|
11
13
|
TokenType["KW_CRUD"] = "crud";
|
|
12
14
|
TokenType["KW_REALTIME"] = "realtime";
|
|
13
15
|
TokenType["KW_JOB"] = "job";
|
|
16
|
+
TokenType["KW_SEED"] = "seed";
|
|
14
17
|
// Value-position keywords
|
|
15
18
|
TokenType["KW_IMPORT"] = "import";
|
|
16
19
|
TokenType["KW_FROM"] = "from";
|
|
@@ -26,6 +29,8 @@ export var TokenType;
|
|
|
26
29
|
TokenType["RBRACE"] = "}";
|
|
27
30
|
TokenType["LBRACKET"] = "[";
|
|
28
31
|
TokenType["RBRACKET"] = "]";
|
|
32
|
+
TokenType["LPAREN"] = "(";
|
|
33
|
+
TokenType["RPAREN"] = ")";
|
|
29
34
|
TokenType["COLON"] = ":";
|
|
30
35
|
TokenType["COMMA"] = ",";
|
|
31
36
|
// Meta
|
|
@@ -40,9 +45,12 @@ export const BLOCK_KEYWORDS = new Set([
|
|
|
40
45
|
TokenType.KW_PAGE,
|
|
41
46
|
TokenType.KW_QUERY,
|
|
42
47
|
TokenType.KW_ACTION,
|
|
48
|
+
TokenType.KW_API,
|
|
49
|
+
TokenType.KW_MIDDLEWARE,
|
|
43
50
|
TokenType.KW_CRUD,
|
|
44
51
|
TokenType.KW_REALTIME,
|
|
45
52
|
TokenType.KW_JOB,
|
|
53
|
+
TokenType.KW_SEED,
|
|
46
54
|
]);
|
|
47
55
|
/** All reserved keywords (cannot be used as identifiers in value position) */
|
|
48
56
|
export const ALL_KEYWORDS = new Set([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenType.js","sourceRoot":"","sources":["../../src/lexer/TokenType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"TokenType.js","sourceRoot":"","sources":["../../src/lexer/TokenType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAyCX;AAzCD,WAAY,SAAS;IACnB,sCAAsC;IACtC,2BAAc,CAAA;IACd,6BAAgB,CAAA;IAChB,iCAAoB,CAAA;IACpB,+BAAkB,CAAA;IAClB,6BAAgB,CAAA;IAChB,+BAAkB,CAAA;IAClB,iCAAoB,CAAA;IACpB,2BAAc,CAAA;IACd,yCAA4B,CAAA;IAC5B,6BAAgB,CAAA;IAChB,qCAAwB,CAAA;IACxB,2BAAc,CAAA;IACd,6BAAgB,CAAA;IAEhB,0BAA0B;IAC1B,iCAAoB,CAAA;IACpB,6BAAgB,CAAA;IAEhB,WAAW;IACX,sCAAyB,CAAA;IACzB,8BAAiB,CAAA;IACjB,gCAAmB,CAAA;IACnB,8BAAiB,CAAA;IAEjB,8CAA8C;IAC9C,wCAA2B,CAAA;IAE3B,cAAc;IACd,yBAAY,CAAA;IACZ,yBAAY,CAAA;IACZ,2BAAc,CAAA;IACd,2BAAc,CAAA;IACd,yBAAY,CAAA;IACZ,yBAAY,CAAA;IACZ,wBAAW,CAAA;IACX,wBAAW,CAAA;IAEX,OAAO;IACP,wBAAW,CAAA;AACb,CAAC,EAzCW,SAAS,KAAT,SAAS,QAyCpB;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS;IAC5C,SAAS,CAAC,MAAM;IAChB,SAAS,CAAC,OAAO;IACjB,SAAS,CAAC,SAAS;IACnB,SAAS,CAAC,QAAQ;IAClB,SAAS,CAAC,OAAO;IACjB,SAAS,CAAC,QAAQ;IAClB,SAAS,CAAC,SAAS;IACnB,SAAS,CAAC,MAAM;IAChB,SAAS,CAAC,aAAa;IACvB,SAAS,CAAC,OAAO;IACjB,SAAS,CAAC,WAAW;IACrB,SAAS,CAAC,MAAM;IAChB,SAAS,CAAC,OAAO;CAClB,CAAC,CAAA;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS;IAC1C,GAAG,cAAc;IACjB,SAAS,CAAC,SAAS;IACnB,SAAS,CAAC,OAAO;CAClB,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/parser/Parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/parser/Parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAyBV,OAAO,EACR,MAAM,sBAAsB,CAAA;AAM7B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,OAAO,CAGrE"}
|
package/dist/parser/Parser.js
CHANGED
|
@@ -55,6 +55,14 @@ class Parser {
|
|
|
55
55
|
case TokenType.KW_ACTION:
|
|
56
56
|
ast.actions.push(this.parseAction());
|
|
57
57
|
break;
|
|
58
|
+
case TokenType.KW_MIDDLEWARE:
|
|
59
|
+
;
|
|
60
|
+
(ast.middlewares ??= []).push(this.parseMiddleware());
|
|
61
|
+
break;
|
|
62
|
+
case TokenType.KW_API:
|
|
63
|
+
;
|
|
64
|
+
(ast.apis ??= []).push(this.parseApi());
|
|
65
|
+
break;
|
|
58
66
|
case TokenType.KW_CRUD:
|
|
59
67
|
ast.cruds.push(this.parseCrud());
|
|
60
68
|
break;
|
|
@@ -64,8 +72,14 @@ class Parser {
|
|
|
64
72
|
case TokenType.KW_JOB:
|
|
65
73
|
ast.jobs.push(this.parseJob());
|
|
66
74
|
break;
|
|
75
|
+
case TokenType.KW_SEED:
|
|
76
|
+
if (ast.seed) {
|
|
77
|
+
throw this.error('E040_DUPLICATE_SEED_BLOCK', 'Duplicate seed block found', 'Only one seed block is allowed in main.vasp', kw.loc);
|
|
78
|
+
}
|
|
79
|
+
ast.seed = this.parseSeed();
|
|
80
|
+
break;
|
|
67
81
|
default:
|
|
68
|
-
throw this.error('E010_UNEXPECTED_TOKEN', `Unexpected token '${kw.value}' at top level`, 'Expected a declaration keyword: app, auth, entity, route, page, query, action, crud, realtime, or
|
|
82
|
+
throw this.error('E010_UNEXPECTED_TOKEN', `Unexpected token '${kw.value}' at top level`, 'Expected a declaration keyword: app, auth, entity, route, page, query, action, api, middleware, crud, realtime, job, or seed', kw.loc);
|
|
69
83
|
}
|
|
70
84
|
}
|
|
71
85
|
return ast;
|
|
@@ -79,6 +93,7 @@ class Parser {
|
|
|
79
93
|
let db = 'Drizzle';
|
|
80
94
|
let ssr = false;
|
|
81
95
|
let typescript = false;
|
|
96
|
+
let env = {};
|
|
82
97
|
while (!this.check(TokenType.RBRACE)) {
|
|
83
98
|
const key = this.consumeIdentifier();
|
|
84
99
|
this.consume(TokenType.COLON);
|
|
@@ -109,12 +124,40 @@ class Parser {
|
|
|
109
124
|
case 'typescript':
|
|
110
125
|
typescript = this.consume(TokenType.BOOLEAN).value === 'true';
|
|
111
126
|
break;
|
|
127
|
+
case 'env': {
|
|
128
|
+
this.consume(TokenType.LBRACE);
|
|
129
|
+
while (!this.check(TokenType.RBRACE)) {
|
|
130
|
+
const envKey = this.consumeIdentifier().value;
|
|
131
|
+
this.consume(TokenType.COLON);
|
|
132
|
+
const requirement = this.consumeIdentifier().value;
|
|
133
|
+
if (requirement !== 'required' && requirement !== 'optional') {
|
|
134
|
+
throw this.error('E038_INVALID_ENV_REQUIREMENT', `Invalid env requirement '${requirement}' for '${envKey}'`, 'Use required or optional', this.peek().loc);
|
|
135
|
+
}
|
|
136
|
+
if (envKey in env) {
|
|
137
|
+
throw this.error('E039_DUPLICATE_ENV_KEY', `Duplicate env key '${envKey}' in app.env`, 'Each env key must be declared once', this.peek().loc);
|
|
138
|
+
}
|
|
139
|
+
env[envKey] = requirement;
|
|
140
|
+
if (this.check(TokenType.COMMA))
|
|
141
|
+
this.consume(TokenType.COMMA);
|
|
142
|
+
}
|
|
143
|
+
this.consume(TokenType.RBRACE);
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
112
146
|
default:
|
|
113
|
-
throw this.error('E012_UNKNOWN_PROP', `Unknown app property '${key.value}'`, 'Valid properties: title, db, ssr, typescript', key.loc);
|
|
147
|
+
throw this.error('E012_UNKNOWN_PROP', `Unknown app property '${key.value}'`, 'Valid properties: title, db, ssr, typescript, env', key.loc);
|
|
114
148
|
}
|
|
115
149
|
}
|
|
116
150
|
this.consume(TokenType.RBRACE);
|
|
117
|
-
return {
|
|
151
|
+
return {
|
|
152
|
+
type: 'App',
|
|
153
|
+
name: name.value,
|
|
154
|
+
loc,
|
|
155
|
+
title,
|
|
156
|
+
db,
|
|
157
|
+
ssr,
|
|
158
|
+
typescript,
|
|
159
|
+
...(Object.keys(env).length > 0 ? { env } : {}),
|
|
160
|
+
};
|
|
118
161
|
}
|
|
119
162
|
parseAuth() {
|
|
120
163
|
const loc = this.consume(TokenType.KW_AUTH).loc;
|
|
@@ -122,6 +165,7 @@ class Parser {
|
|
|
122
165
|
this.consume(TokenType.LBRACE);
|
|
123
166
|
let userEntity = '';
|
|
124
167
|
let methods = [];
|
|
168
|
+
let roles = [];
|
|
125
169
|
while (!this.check(TokenType.RBRACE)) {
|
|
126
170
|
const key = this.consumeIdentifier();
|
|
127
171
|
this.consume(TokenType.COLON);
|
|
@@ -132,32 +176,111 @@ class Parser {
|
|
|
132
176
|
case 'methods':
|
|
133
177
|
methods = this.parseIdentifierArray();
|
|
134
178
|
break;
|
|
179
|
+
case 'roles':
|
|
180
|
+
roles = this.parseIdentifierArray();
|
|
181
|
+
break;
|
|
135
182
|
default:
|
|
136
|
-
throw this.error('E013_UNKNOWN_PROP', `Unknown auth property '${key.value}'`, 'Valid properties: userEntity, methods', key.loc);
|
|
183
|
+
throw this.error('E013_UNKNOWN_PROP', `Unknown auth property '${key.value}'`, 'Valid properties: userEntity, methods, roles', key.loc);
|
|
137
184
|
}
|
|
138
185
|
}
|
|
139
186
|
this.consume(TokenType.RBRACE);
|
|
140
|
-
return {
|
|
187
|
+
return {
|
|
188
|
+
type: 'Auth',
|
|
189
|
+
name: name.value,
|
|
190
|
+
loc,
|
|
191
|
+
userEntity,
|
|
192
|
+
methods,
|
|
193
|
+
...(roles.length > 0 ? { roles } : {}),
|
|
194
|
+
};
|
|
141
195
|
}
|
|
142
196
|
parseEntity() {
|
|
143
197
|
const loc = this.consume(TokenType.KW_ENTITY).loc;
|
|
144
198
|
const name = this.consumeIdentifier();
|
|
145
199
|
this.consume(TokenType.LBRACE);
|
|
200
|
+
// Primitive types recognized by the parser — entity names accepted for relations
|
|
201
|
+
const primitiveTypes = new Set(['String', 'Int', 'Boolean', 'DateTime', 'Float', 'Text', 'Json', 'Enum']);
|
|
146
202
|
const fields = [];
|
|
147
|
-
const validTypes = ['String', 'Int', 'Boolean', 'DateTime', 'Float'];
|
|
148
203
|
while (!this.check(TokenType.RBRACE)) {
|
|
149
204
|
const fieldName = this.consumeIdentifier();
|
|
150
205
|
this.consume(TokenType.COLON);
|
|
151
206
|
const fieldTypeToken = this.consumeIdentifier();
|
|
152
|
-
|
|
153
|
-
|
|
207
|
+
const fieldTypeStr = fieldTypeToken.value;
|
|
208
|
+
// Parse Enum variant list: Enum(active, inactive, archived)
|
|
209
|
+
let enumValues;
|
|
210
|
+
if (fieldTypeStr === 'Enum') {
|
|
211
|
+
this.consume(TokenType.LPAREN);
|
|
212
|
+
enumValues = [];
|
|
213
|
+
while (!this.check(TokenType.RPAREN)) {
|
|
214
|
+
enumValues.push(this.consumeIdentifier().value);
|
|
215
|
+
if (this.check(TokenType.COMMA))
|
|
216
|
+
this.consume(TokenType.COMMA);
|
|
217
|
+
}
|
|
218
|
+
this.consume(TokenType.RPAREN);
|
|
219
|
+
if (enumValues.length === 0) {
|
|
220
|
+
throw this.error('E116_EMPTY_ENUM', `Enum field '${fieldName.value}' must have at least one variant`, 'Example: status: Enum(active, inactive, archived)', fieldTypeToken.loc);
|
|
221
|
+
}
|
|
154
222
|
}
|
|
223
|
+
// Detect [] suffix — marks this as an array relation (virtual, no column)
|
|
224
|
+
let isArray = false;
|
|
225
|
+
if (this.check(TokenType.LBRACKET)) {
|
|
226
|
+
this.consume(TokenType.LBRACKET);
|
|
227
|
+
this.consume(TokenType.RBRACKET);
|
|
228
|
+
isArray = true;
|
|
229
|
+
}
|
|
230
|
+
const isRelation = !primitiveTypes.has(fieldTypeStr);
|
|
231
|
+
// Parse modifiers (@id, @unique, @default(...), @nullable, @updatedAt, @onDelete(...))
|
|
155
232
|
const modifiers = [];
|
|
233
|
+
let nullable = false;
|
|
234
|
+
let defaultValue;
|
|
235
|
+
let onDelete;
|
|
236
|
+
let isUpdatedAt = false;
|
|
156
237
|
while (this.check(TokenType.AT_MODIFIER)) {
|
|
157
238
|
const mod = this.consume(TokenType.AT_MODIFIER);
|
|
158
|
-
|
|
239
|
+
const modVal = mod.value;
|
|
240
|
+
if (modVal === 'id') {
|
|
241
|
+
modifiers.push('id');
|
|
242
|
+
}
|
|
243
|
+
else if (modVal === 'unique') {
|
|
244
|
+
modifiers.push('unique');
|
|
245
|
+
}
|
|
246
|
+
else if (modVal === 'default_now') {
|
|
247
|
+
modifiers.push('default_now');
|
|
248
|
+
defaultValue = 'now';
|
|
249
|
+
}
|
|
250
|
+
else if (modVal === 'nullable') {
|
|
251
|
+
nullable = true;
|
|
252
|
+
modifiers.push('nullable');
|
|
253
|
+
}
|
|
254
|
+
else if (modVal === 'updatedAt') {
|
|
255
|
+
isUpdatedAt = true;
|
|
256
|
+
modifiers.push('updatedAt');
|
|
257
|
+
}
|
|
258
|
+
else if (modVal.startsWith('default_')) {
|
|
259
|
+
defaultValue = modVal.slice('default_'.length);
|
|
260
|
+
}
|
|
261
|
+
else if (modVal.startsWith('onDelete_')) {
|
|
262
|
+
onDelete = modVal.slice('onDelete_'.length);
|
|
263
|
+
}
|
|
264
|
+
// Unknown modifiers are silently ignored (forward-compat)
|
|
159
265
|
}
|
|
160
|
-
|
|
266
|
+
const field = {
|
|
267
|
+
name: fieldName.value,
|
|
268
|
+
type: fieldTypeStr,
|
|
269
|
+
modifiers,
|
|
270
|
+
isRelation,
|
|
271
|
+
isArray,
|
|
272
|
+
nullable,
|
|
273
|
+
isUpdatedAt,
|
|
274
|
+
};
|
|
275
|
+
if (isRelation)
|
|
276
|
+
field.relatedEntity = fieldTypeStr;
|
|
277
|
+
if (defaultValue !== undefined)
|
|
278
|
+
field.defaultValue = defaultValue;
|
|
279
|
+
if (onDelete !== undefined)
|
|
280
|
+
field.onDelete = onDelete;
|
|
281
|
+
if (enumValues !== undefined)
|
|
282
|
+
field.enumValues = enumValues;
|
|
283
|
+
fields.push(field);
|
|
161
284
|
}
|
|
162
285
|
this.consume(TokenType.RBRACE);
|
|
163
286
|
return { type: 'Entity', name: name.value, loc, fields };
|
|
@@ -215,6 +338,7 @@ class Parser {
|
|
|
215
338
|
let fn = null;
|
|
216
339
|
let entities = [];
|
|
217
340
|
let auth = false;
|
|
341
|
+
let roles = [];
|
|
218
342
|
while (!this.check(TokenType.RBRACE)) {
|
|
219
343
|
const key = this.consumeIdentifier();
|
|
220
344
|
this.consume(TokenType.COLON);
|
|
@@ -228,15 +352,18 @@ class Parser {
|
|
|
228
352
|
case 'auth':
|
|
229
353
|
auth = this.consume(TokenType.BOOLEAN).value === 'true';
|
|
230
354
|
break;
|
|
355
|
+
case 'roles':
|
|
356
|
+
roles = this.parseIdentifierArray();
|
|
357
|
+
break;
|
|
231
358
|
default:
|
|
232
|
-
throw this.error('E017_UNKNOWN_PROP', `Unknown query property '${key.value}'`, 'Valid properties: fn, entities, auth', key.loc);
|
|
359
|
+
throw this.error('E017_UNKNOWN_PROP', `Unknown query property '${key.value}'`, 'Valid properties: fn, entities, auth, roles', key.loc);
|
|
233
360
|
}
|
|
234
361
|
}
|
|
235
362
|
this.consume(TokenType.RBRACE);
|
|
236
363
|
if (!fn) {
|
|
237
364
|
throw this.error('E018_MISSING_FN', `Query '${name.value}' is missing fn`, 'Add: fn: import { myFn } from "@src/queries.js"', loc);
|
|
238
365
|
}
|
|
239
|
-
return { type: 'Query', name: name.value, loc, fn, entities, auth };
|
|
366
|
+
return { type: 'Query', name: name.value, loc, fn, entities, auth, ...(roles.length > 0 ? { roles } : {}) };
|
|
240
367
|
}
|
|
241
368
|
parseAction() {
|
|
242
369
|
const loc = this.consume(TokenType.KW_ACTION).loc;
|
|
@@ -245,6 +372,7 @@ class Parser {
|
|
|
245
372
|
let fn = null;
|
|
246
373
|
let entities = [];
|
|
247
374
|
let auth = false;
|
|
375
|
+
let roles = [];
|
|
248
376
|
while (!this.check(TokenType.RBRACE)) {
|
|
249
377
|
const key = this.consumeIdentifier();
|
|
250
378
|
this.consume(TokenType.COLON);
|
|
@@ -258,15 +386,18 @@ class Parser {
|
|
|
258
386
|
case 'auth':
|
|
259
387
|
auth = this.consume(TokenType.BOOLEAN).value === 'true';
|
|
260
388
|
break;
|
|
389
|
+
case 'roles':
|
|
390
|
+
roles = this.parseIdentifierArray();
|
|
391
|
+
break;
|
|
261
392
|
default:
|
|
262
|
-
throw this.error('E019_UNKNOWN_PROP', `Unknown action property '${key.value}'`, 'Valid properties: fn, entities, auth', key.loc);
|
|
393
|
+
throw this.error('E019_UNKNOWN_PROP', `Unknown action property '${key.value}'`, 'Valid properties: fn, entities, auth, roles', key.loc);
|
|
263
394
|
}
|
|
264
395
|
}
|
|
265
396
|
this.consume(TokenType.RBRACE);
|
|
266
397
|
if (!fn) {
|
|
267
398
|
throw this.error('E020_MISSING_FN', `Action '${name.value}' is missing fn`, 'Add: fn: import { myFn } from "@src/actions.js"', loc);
|
|
268
399
|
}
|
|
269
|
-
return { type: 'Action', name: name.value, loc, fn, entities, auth };
|
|
400
|
+
return { type: 'Action', name: name.value, loc, fn, entities, auth, ...(roles.length > 0 ? { roles } : {}) };
|
|
270
401
|
}
|
|
271
402
|
parseCrud() {
|
|
272
403
|
const loc = this.consume(TokenType.KW_CRUD).loc;
|
|
@@ -291,6 +422,73 @@ class Parser {
|
|
|
291
422
|
this.consume(TokenType.RBRACE);
|
|
292
423
|
return { type: 'Crud', name: name.value, loc, entity, operations };
|
|
293
424
|
}
|
|
425
|
+
parseApi() {
|
|
426
|
+
const loc = this.consume(TokenType.KW_API).loc;
|
|
427
|
+
const name = this.consumeIdentifier();
|
|
428
|
+
this.consume(TokenType.LBRACE);
|
|
429
|
+
let method = 'GET';
|
|
430
|
+
let path = '';
|
|
431
|
+
let fn = null;
|
|
432
|
+
let auth = false;
|
|
433
|
+
let roles = [];
|
|
434
|
+
while (!this.check(TokenType.RBRACE)) {
|
|
435
|
+
const key = this.consumeIdentifier();
|
|
436
|
+
this.consume(TokenType.COLON);
|
|
437
|
+
switch (key.value) {
|
|
438
|
+
case 'method':
|
|
439
|
+
method = this.consumeIdentifier().value.toUpperCase();
|
|
440
|
+
break;
|
|
441
|
+
case 'path':
|
|
442
|
+
path = this.consumeString();
|
|
443
|
+
break;
|
|
444
|
+
case 'fn':
|
|
445
|
+
fn = this.parseImportExpression();
|
|
446
|
+
break;
|
|
447
|
+
case 'auth':
|
|
448
|
+
auth = this.consume(TokenType.BOOLEAN).value === 'true';
|
|
449
|
+
break;
|
|
450
|
+
case 'roles':
|
|
451
|
+
roles = this.parseIdentifierArray();
|
|
452
|
+
break;
|
|
453
|
+
default:
|
|
454
|
+
throw this.error('E033_UNKNOWN_PROP', `Unknown api property '${key.value}'`, 'Valid properties: method, path, fn, auth, roles', key.loc);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
this.consume(TokenType.RBRACE);
|
|
458
|
+
if (!fn) {
|
|
459
|
+
throw this.error('E034_MISSING_FN', `Api '${name.value}' is missing fn`, 'Add: fn: import { myHandler } from "@src/api.js"', loc);
|
|
460
|
+
}
|
|
461
|
+
if (!path) {
|
|
462
|
+
throw this.error('E035_MISSING_PATH', `Api '${name.value}' is missing path`, 'Add: path: "/api/my-endpoint"', loc);
|
|
463
|
+
}
|
|
464
|
+
return { type: 'Api', name: name.value, loc, method, path, fn, auth, ...(roles.length > 0 ? { roles } : {}) };
|
|
465
|
+
}
|
|
466
|
+
parseMiddleware() {
|
|
467
|
+
const loc = this.consume(TokenType.KW_MIDDLEWARE).loc;
|
|
468
|
+
const name = this.consumeIdentifier();
|
|
469
|
+
this.consume(TokenType.LBRACE);
|
|
470
|
+
let fn = null;
|
|
471
|
+
let scope = 'global';
|
|
472
|
+
while (!this.check(TokenType.RBRACE)) {
|
|
473
|
+
const key = this.consumeIdentifier();
|
|
474
|
+
this.consume(TokenType.COLON);
|
|
475
|
+
switch (key.value) {
|
|
476
|
+
case 'fn':
|
|
477
|
+
fn = this.parseImportExpression();
|
|
478
|
+
break;
|
|
479
|
+
case 'scope':
|
|
480
|
+
scope = this.consumeIdentifier().value;
|
|
481
|
+
break;
|
|
482
|
+
default:
|
|
483
|
+
throw this.error('E036_UNKNOWN_PROP', `Unknown middleware property '${key.value}'`, 'Valid properties: fn, scope', key.loc);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
this.consume(TokenType.RBRACE);
|
|
487
|
+
if (!fn) {
|
|
488
|
+
throw this.error('E037_MISSING_FN', `Middleware '${name.value}' is missing fn`, 'Add: fn: import logger from "@src/middleware/logger.js"', loc);
|
|
489
|
+
}
|
|
490
|
+
return { type: 'Middleware', name: name.value, loc, fn, scope };
|
|
491
|
+
}
|
|
294
492
|
parseRealtime() {
|
|
295
493
|
const loc = this.consume(TokenType.KW_REALTIME).loc;
|
|
296
494
|
const name = this.consumeIdentifier();
|
|
@@ -364,6 +562,27 @@ class Parser {
|
|
|
364
562
|
...(schedule !== undefined ? { schedule } : {}),
|
|
365
563
|
};
|
|
366
564
|
}
|
|
565
|
+
parseSeed() {
|
|
566
|
+
const loc = this.consume(TokenType.KW_SEED).loc;
|
|
567
|
+
this.consume(TokenType.LBRACE);
|
|
568
|
+
let fn = null;
|
|
569
|
+
while (!this.check(TokenType.RBRACE)) {
|
|
570
|
+
const key = this.consumeIdentifier();
|
|
571
|
+
this.consume(TokenType.COLON);
|
|
572
|
+
switch (key.value) {
|
|
573
|
+
case 'fn':
|
|
574
|
+
fn = this.parseImportExpression();
|
|
575
|
+
break;
|
|
576
|
+
default:
|
|
577
|
+
throw this.error('E041_UNKNOWN_PROP', `Unknown seed property '${key.value}'`, 'Valid properties: fn', key.loc);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
this.consume(TokenType.RBRACE);
|
|
581
|
+
if (!fn) {
|
|
582
|
+
throw this.error('E042_MISSING_FN', 'Seed block is missing fn', 'Add: fn: import seedData from "@src/seed.js"', loc);
|
|
583
|
+
}
|
|
584
|
+
return { type: 'Seed', fn, loc };
|
|
585
|
+
}
|
|
367
586
|
// ---- Value parsers ----
|
|
368
587
|
/**
|
|
369
588
|
* Parses both import forms:
|