@vasp-framework/parser 0.4.0 → 0.9.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.
@@ -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) or @default(someValue)
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
- arg += this.advance();
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../../src/lexer/Lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAExE,MAAM,OAAO,KAAK;IAOG;IACA;IAPX,GAAG,GAAG,CAAC,CAAA;IACP,IAAI,GAAG,CAAC,CAAA;IACR,GAAG,GAAG,CAAC,CAAA;IACE,MAAM,GAAY,EAAE,CAAA;IAErC,YACmB,MAAc,EACd,WAAmB,WAAW;QAD9B,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAsB;IAC9C,CAAC;IAEJ,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,yBAAyB,EAAE,CAAA;YAChC,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,MAAK;YACzC,IAAI,CAAC,SAAS,EAAE,CAAA;QAClB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,SAAS,CAAC,GAAG;YACnB,KAAK,EAAE,EAAE;YACT,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC/E,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,4BAA4B;IAEpB,GAAG;QACT,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;IAClF,CAAC;IAEO,IAAI,CAAC,MAAM,GAAG,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAC7C,CAAC;IAEO,OAAO;QACb,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAA;QACxC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,EAAE,CAAA;YACX,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;QACd,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,EAAE,CAAA;QACZ,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAEO,yBAAyB;QAC/B,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;YAEtB,aAAa;YACb,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAC5D,IAAI,CAAC,OAAO,EAAE,CAAA;gBACd,SAAQ;YACV,CAAC;YAED,mBAAmB;YACnB,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACvC,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;oBAC7D,IAAI,CAAC,OAAO,EAAE,CAAA;gBAChB,CAAC;gBACD,SAAQ;YACV,CAAC;YAED,2BAA2B;YAC3B,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBAC3B,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,IAAI;gBACnB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,IAAI;gBACnB,IAAI,MAAM,GAAG,KAAK,CAAA;gBAClB,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACrC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBAChD,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,IAAI;wBACnB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,IAAI;wBACnB,MAAM,GAAG,IAAI,CAAA;wBACb,MAAK;oBACP,CAAC;oBACD,IAAI,CAAC,OAAO,EAAE,CAAA;gBAChB,CAAC;gBACD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,UAAU,CAAC,CAAC;4BACpB,IAAI,EAAE,6BAA6B;4BACnC,OAAO,EAAE,wBAAwB;4BACjC,IAAI,EAAE,mCAAmC;4BACzC,GAAG,EAAE,QAAQ;yBACd,CAAC,CAAC,CAAA;gBACL,CAAC;gBACD,SAAQ;YACV,CAAC;YAED,MAAK;QACP,CAAC;IACH,CAAC;IAEO,SAAS;QACf,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAEtB,0BAA0B;QAC1B,MAAM,WAAW,GAAuC;YACtD,GAAG,EAAE,SAAS,CAAC,MAAM;YACrB,GAAG,EAAE,SAAS,CAAC,MAAM;YACrB,GAAG,EAAE,SAAS,CAAC,QAAQ;YACvB,GAAG,EAAE,SAAS,CAAC,QAAQ;YACvB,GAAG,EAAE,SAAS,CAAC,KAAK;YACpB,GAAG,EAAE,SAAS,CAAC,KAAK;SACrB,CAAA;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;QAC5B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,IAAI,CAAC,OAAO,EAAE,CAAA;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YAChD,OAAM;QACR,CAAC;QAED,8CAA8C;QAC9C,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,EAAE,CAAA;YACnB,OAAM;QACR,CAAC;QAED,iCAAiC;QACjC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACnB,OAAM;QACR,CAAC;QAED,SAAS;QACT,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,EAAE,CAAA;YACjB,OAAM;QACR,CAAC;QAED,0EAA0E;QAC1E,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,uBAAuB,EAAE,CAAA;YAC9B,OAAM;QACR,CAAC;QAED,oBAAoB;QACpB,MAAM,IAAI,UAAU,CAAC,CAAC;gBACpB,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,0BAA0B,EAAE,GAAG;gBACxC,IAAI,EAAE,0DAA0D;gBAChE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;aAChB,CAAC,CAAC,CAAA;IACL,CAAC;IAEO,YAAY;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,cAAc;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;YACrB,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBAClE,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAK;YACP,CAAC;QACH,CAAC;QACD,8CAA8C;QAC9C,IAAI,QAAQ,GAAG,IAAI,CAAA;QACnB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,IAAI;YACnB,IAAI,GAAG,GAAG,EAAE,CAAA;YACZ,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBAC5D,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;YACvB,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,IAAI;YAC5C,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,EAAE,CAAA;QAC3E,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAA;IACzE,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,gBAAgB;QAC/B,IAAI,KAAK,GAAG,EAAE,CAAA;QACd,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACzB,MAAM,IAAI,UAAU,CAAC,CAAC;wBACpB,IAAI,EAAE,0BAA0B;wBAChC,OAAO,EAAE,6BAA6B;wBACtC,IAAI,EAAE,yDAAyD;wBAC/D,GAAG;qBACJ,CAAC,CAAC,CAAA;YACL,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,YAAY;gBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;gBAC9B,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YACjC,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;YACzB,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,UAAU,CAAC,CAAC;oBACpB,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,6BAA6B;oBACtC,IAAI,EAAE,wCAAwC;oBAC9C,GAAG;iBACJ,CAAC,CAAC,CAAA;QACL,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,gBAAgB;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC1D,CAAC;IAEO,QAAQ,CAAC,EAAU;QACzB,MAAM,GAAG,GAA2B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACjG,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;IAEO,UAAU;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,KAAK,GAAG,EAAE,CAAA;QACd,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;YACjF,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YACtE,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,IAAI;YAC5B,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;gBACjF,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;YACzB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC1D,CAAC;IAEO,uBAAuB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,KAAK,GAAG,EAAE,CAAA;QACd,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;YACrB,gEAAgE;YAChE,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzG,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;YACzB,CAAC;iBAAM,CAAC;gBACN,MAAK;YACP,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,iCAAiC;gBACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YAC5D,CAAC;iBAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YAC7D,CAAC;iBAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YAC3D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YAC9D,CAAC;YACD,OAAM;QACR,CAAC;QAED,mBAAmB;QACnB,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YACzD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC9D,CAAC;CACF"}
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;IAGd,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,KAAK,MAAM;IACX,KAAK,MAAM;IAGX,GAAG,QAAQ;CACZ;AAED,wDAAwD;AACxD,eAAO,MAAM,cAAc,aAWzB,CAAA;AAEF,8EAA8E;AAC9E,eAAO,MAAM,YAAY,aAIvB,CAAA"}
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"}
@@ -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,SAoCX;AApCD,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,6BAAgB,CAAA;IAChB,qCAAwB,CAAA;IACxB,2BAAc,CAAA;IAEd,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,wBAAW,CAAA;IACX,wBAAW,CAAA;IAEX,OAAO;IACP,wBAAW,CAAA;AACb,CAAC,EApCW,SAAS,KAAT,SAAS,QAoCpB;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,OAAO;IACjB,SAAS,CAAC,WAAW;IACrB,SAAS,CAAC,MAAM;CACjB,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
+ {"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,EAmBV,OAAO,EACR,MAAM,sBAAsB,CAAA;AAM7B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,OAAO,CAGrE"}
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"}
@@ -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 job', kw.loc);
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 { type: 'App', name: name.value, loc, title, db, ssr, typescript };
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 { type: 'Auth', name: name.value, loc, userEntity, methods };
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
- if (!validTypes.includes(fieldTypeToken.value)) {
153
- throw this.error('E026_INVALID_FIELD_TYPE', `Invalid field type '${fieldTypeToken.value}' in entity '${name.value}'`, `Valid types: ${validTypes.join(', ')}`, fieldTypeToken.loc);
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
- modifiers.push(mod.value);
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
- fields.push({ name: fieldName.value, type: fieldTypeToken.value, modifiers });
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: