spex-parser 0.1.1 → 0.1.3

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.
@@ -18,7 +18,7 @@ jobs:
18
18
  - name: Setup Node.js
19
19
  uses: actions/setup-node@v4
20
20
  with:
21
- node-version: '20'
21
+ node-version: '22'
22
22
  cache: 'npm'
23
23
 
24
24
  - name: Install dependencies
@@ -4,32 +4,22 @@ on:
4
4
  release:
5
5
  types: [published]
6
6
 
7
+ permissions:
8
+ id-token: write # Required for OIDC
9
+ contents: read
10
+
7
11
  jobs:
8
12
  publish:
9
- name: Publish to npm
10
13
  runs-on: ubuntu-latest
11
-
12
14
  steps:
13
- - name: Checkout
14
- uses: actions/checkout@v4
15
+ - uses: actions/checkout@v6
15
16
 
16
- - name: Setup Node.js
17
- uses: actions/setup-node@v4
17
+ - uses: actions/setup-node@v6
18
18
  with:
19
- node-version: '20'
19
+ node-version: '24'
20
20
  registry-url: 'https://registry.npmjs.org'
21
- cache: 'npm'
22
-
23
- - name: Install dependencies
24
- run: npm ci
25
-
26
- - name: Build
27
- run: npm run build
28
-
29
- - name: Run tests
30
- run: npm test
31
-
32
- - name: Publish to npm
33
- run: npm stage publish
34
- env:
35
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
21
+ package-manager-cache: false # never use caching in release builds
22
+ - run: npm ci
23
+ - run: npm run build --if-present
24
+ - run: npm test
25
+ - run: npm publish
package/README.md CHANGED
@@ -10,18 +10,18 @@ In particular, Spex aims to solve the following problems:
10
10
  - Chat interfaces do not integrate well with existing software engineering tools such as version control systems.
11
11
  - Referencing objects in the code base requires repetitive and verbose prompts.
12
12
  - Because architecture and design are not persisted, AI agents must constantly read and reason about multiple files, leading to inefficient token usage.
13
- - Reusability in chat interfaces is extremely limited and abstraction is arbitrary.
13
+ - Reusability in chat interfaces is extremely limited and abstraction is arbitrary.
14
14
 
15
15
  The idea behind chat interfaces in AI coding tools is that _everyone_ should be able to code. While admirable, this approach often makes the tools inadequate for professional developers.
16
16
 
17
17
  Spex acknowledges that in serious software projects it is neither wise nor feasible to replace programmers with machines. Instead, Spex integrates with the mental model and ecosystem of professional programmers, enabling them to be significantly more efficient. For this reason, Spex is probably not suited to someone that is not familiar with programming. This is a conscious decision made to cater to the needs of professional programmers and not the general public.
18
18
 
19
- For this reason, Spex syntax is intentionally close to common languages such as TypeScript and SQL. Instead of manually implementing software, developers describe *spaces of valid implementations* using familiar programming abstractions such as:
19
+ For this reason, Spex syntax is intentionally close to common languages such as TypeScript and SQL. Instead of manually implementing software, developers describe _spaces of valid implementations_ using familiar programming abstractions such as:
20
20
 
21
- * objects
22
- * functions
23
- * dependencies
24
- * constraints
21
+ - objects
22
+ - functions
23
+ - dependencies
24
+ - constraints
25
25
 
26
26
  The Spex runtime synthesizes concrete implementations based on these specifications.
27
27
 
@@ -31,9 +31,9 @@ The Spex runtime synthesizes concrete implementations based on these specificati
31
31
 
32
32
  In Spex:
33
33
 
34
- * a type represents a space of possible implementations
35
- * constraints refine that space
36
- * reusable abstractions are represented as subtypes
34
+ - a type represents a space of possible implementations
35
+ - constraints refine that space
36
+ - reusable abstractions are represented as subtypes
37
37
 
38
38
  For example:
39
39
 
@@ -56,10 +56,10 @@ Developers can build on top of these abstractions instead of repeatedly specifyi
56
56
 
57
57
  Spex is designed to:
58
58
 
59
- * feel familiar to software developers
60
- * resemble SQL-style declarative programming
61
- * support compositional software synthesis
62
- * enable reusable architectural abstractions
59
+ - feel familiar to software developers
60
+ - resemble SQL-style declarative programming
61
+ - support compositional software synthesis
62
+ - enable reusable architectural abstractions
63
63
 
64
64
  ---
65
65
 
@@ -124,6 +124,7 @@ string -> number
124
124
  string -> unit
125
125
  unit -> string
126
126
  ```
127
+
127
128
  `string -> unit` represents all functions that take a string as input and do not return anything. `unit -> string` on the other hand, is a function that takes nothing as input, but returns a string.
128
129
 
129
130
  ## Subobjects
@@ -142,7 +143,7 @@ SELECT {
142
143
  }
143
144
  ```
144
145
 
145
- Subobjects are themselves objects so they could be subobjected as well. A good heuristic for writing constraints is to make the expression read as:
146
+ Subobjects are themselves objects so they could be subobjected as well. A good heuristic for writing constraints is to make the expression read as:
146
147
 
147
148
  > "from `object` select those that `{constraint}`".
148
149
 
@@ -204,6 +205,13 @@ SELECT {
204
205
 
205
206
  This forms an explicit software dependency graph between objects.
206
207
 
208
+ The parser automatically extracts references from constraints into structured AST nodes, making it easy to analyze dependencies programmatically. Each constraint is parsed into a sequence of text segments and reference nodes:
209
+
210
+ ```spex
211
+ "call @LoadTodos using @path"
212
+ → [text: "call ", ref: LoadTodos, text: " using ", ref: path]
213
+ ```
214
+
207
215
  Use `.` to reference a member of a product object:
208
216
 
209
217
  ```spex
@@ -296,15 +304,40 @@ Generation of some object naturally triggers generation of it's dependencies as
296
304
 
297
305
  ---
298
306
 
307
+ # Packaging Code
308
+
309
+ To specify how generated code should be packaged, use the `PACKAGE` declaration:
310
+
311
+ ```spex
312
+ PACKAGE EXECUTABLE <name> AS <object>
313
+ PACKAGE MODULE <name> AS <object>
314
+ ```
315
+
316
+ `EXECUTABLE` packages the object as a standalone application entry point. `MODULE` packages it as a library or module that can be imported by other code.
317
+
318
+ ```spex
319
+ PACKAGE EXECUTABLE myapp AS Main;
320
+ PACKAGE MODULE mylib AS utils;
321
+ ```
322
+
323
+ The object can be any valid Spex expression:
324
+
325
+ ```spex
326
+ PACKAGE EXECUTABLE cli AS (path: string) -> unit;
327
+ PACKAGE MODULE mylib AS app.handlers;
328
+ ```
329
+
330
+ ---
331
+
299
332
  # Why SQL?
300
333
 
301
334
  Spex uses SQL-inspired syntax because developers already understand:
302
335
 
303
- * schemas
304
- * views
305
- * refinement through selection
306
- * declarative programming
307
- * dependency relationships
336
+ - schemas
337
+ - views
338
+ - refinement through selection
339
+ - declarative programming
340
+ - dependency relationships
308
341
 
309
342
  This dramatically reduces the learning curve.
310
343
 
@@ -314,10 +347,10 @@ This dramatically reduces the learning curve.
314
347
 
315
348
  Spex aims to provide:
316
349
 
317
- * reusable semantic software abstractions
318
- * compositional AI-assisted programming
319
- * declarative architecture specification
320
- * implementation synthesis guided by constraints
350
+ - reusable semantic software abstractions
351
+ - compositional AI-assisted programming
352
+ - declarative architecture specification
353
+ - implementation synthesis guided by constraints
321
354
 
322
355
  Instead of prompting LLMs directly, developers work with structured software semantics that can be analyzed, refined, verified, and synthesized.
323
356
 
@@ -507,7 +540,7 @@ SELECT {
507
540
  ## Code Generation
508
541
 
509
542
  ```spex
510
- GENERATE Main
543
+ package executable MyTodo as Main;
511
544
  ```
512
545
 
513
546
  This triggers generation of the complete CLI application and all required dependencies.
package/dist/ast.d.ts CHANGED
@@ -2,7 +2,14 @@ export type SpexFile = {
2
2
  kind: 'SpexFile';
3
3
  declarations: Declaration[];
4
4
  };
5
- export type Declaration = ObjectDeclaration | ImportDeclaration | ExportDeclaration | GenerateDeclaration;
5
+ export type Declaration = ObjectDeclaration | ImportDeclaration | ExportDeclaration | GenerateDeclaration | PackageDeclaration;
6
+ export type PackageKind = 'EXECUTABLE' | 'MODULE';
7
+ export type PackageDeclaration = {
8
+ kind: 'PackageDeclaration';
9
+ packageType: PackageKind;
10
+ name: string;
11
+ objectName: ObjectExpression;
12
+ };
6
13
  export type ObjectDeclaration = {
7
14
  kind: 'ObjectDeclaration';
8
15
  name: string;
@@ -36,10 +43,23 @@ export type ExponentialObject = {
36
43
  base: ObjectExpression;
37
44
  exponent: ObjectExpression;
38
45
  };
46
+ export type ConstraintReference = {
47
+ kind: 'ConstraintReference';
48
+ name: string;
49
+ };
50
+ export type ConstraintText = {
51
+ kind: 'ConstraintText';
52
+ text: string;
53
+ };
54
+ export type ConstraintPart = ConstraintReference | ConstraintText;
55
+ export type Constraint = {
56
+ raw: string;
57
+ parts: ConstraintPart[];
58
+ };
39
59
  export type SubObject = {
40
60
  kind: 'SubObject';
41
61
  base: ObjectExpression;
42
- constraint: string;
62
+ constraint: Constraint;
43
63
  };
44
64
  export type ArrayObject = {
45
65
  kind: 'ArrayObject';
package/dist/ast.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,UAAU,CAAA;IAChB,YAAY,EAAE,WAAW,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,CAAA;AAEvB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,aAAa,GACb,iBAAiB,GACjB,SAAS,GACT,WAAW,CAAA;AAEf,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,gBAAgB,CAAA;IACtB,QAAQ,EAAE,gBAAgB,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,gBAAgB,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,gBAAgB,CAAA;CACvB,CAAA"}
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,UAAU,CAAA;IAChB,YAAY,EAAE,WAAW,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,CAAA;AAEtB,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,WAAW,EAAE,WAAW,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,gBAAgB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,aAAa,GACb,iBAAiB,GACjB,SAAS,GACT,WAAW,CAAA;AAEf,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAA;IACzB,IAAI,EAAE,gBAAgB,CAAA;IACtB,QAAQ,EAAE,gBAAgB,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,gBAAgB,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,cAAc,CAAA;AAEjE,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,cAAc,EAAE,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,gBAAgB,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,gBAAgB,CAAA;CACvB,CAAA"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { SpexLexer } from './lexer.js';
2
2
  export { SpexParser } from './parser.js';
3
3
  export { SpexParserVisitor, parseToAst } from './visitor.js';
4
- export type { SpexFile, Declaration, ObjectDeclaration, ObjectExpression, NamedObject, ProductObject, ExponentialObject, SubObject, } from './ast.js';
4
+ export type { SpexFile, Declaration, ObjectDeclaration, ObjectExpression, NamedObject, ProductObject, ExponentialObject, SubObject, PackageDeclaration, PackageKind, Constraint, ConstraintPart, ConstraintReference, ConstraintText, } from './ast.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,YAAY,EACV,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,SAAS,GACV,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,YAAY,EACV,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,UAAU,CAAA"}
package/dist/lexer.d.ts CHANGED
@@ -7,6 +7,9 @@ export declare const SelectTok: import("chevrotain").TokenType;
7
7
  export declare const GenerateTok: import("chevrotain").TokenType;
8
8
  export declare const ImportTok: import("chevrotain").TokenType;
9
9
  export declare const ExportTok: import("chevrotain").TokenType;
10
+ export declare const PackageTok: import("chevrotain").TokenType;
11
+ export declare const ExecutableTok: import("chevrotain").TokenType;
12
+ export declare const ModuleTok: import("chevrotain").TokenType;
10
13
  export declare const ArrowTok: import("chevrotain").TokenType;
11
14
  export declare const LCurly: import("chevrotain").TokenType;
12
15
  export declare const RCurly: import("chevrotain").TokenType;
@@ -1 +1 @@
1
- {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,UAAU,gCAIrB,CAAA;AAGF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,KAAK,gCAGhB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,WAAW,gCAGtB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AAGF,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,MAAM,gCAAgD,CAAA;AACnE,eAAO,MAAM,MAAM,gCAAgD,CAAA;AACnE,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,MAAM,gCAAiD,CAAA;AACpE,eAAO,MAAM,MAAM,gCAAiD,CAAA;AACpE,eAAO,MAAM,KAAK,gCAA+C,CAAA;AACjE,eAAO,MAAM,KAAK,gCAA+C,CAAA;AACjE,eAAO,MAAM,SAAS,gCAAmD,CAAA;AACzE,eAAO,MAAM,GAAG,gCAA8C,CAAA;AAG9D,eAAO,MAAM,WAAW,gCAGtB,CAAA;AAGF,eAAO,MAAM,WAAW,gCAGtB,CAAA;AAGF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AAGF,eAAO,MAAM,UAAU,gCAGrB,CAAA;AAEF,eAAO,MAAM,SAAS,kCA+BrB,CAAA;AAED,eAAO,MAAM,SAAS,OAAuB,CAAA"}
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,UAAU,gCAIrB,CAAA;AAGF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,KAAK,gCAGhB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,WAAW,gCAGtB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,UAAU,gCAGrB,CAAA;AACF,eAAO,MAAM,aAAa,gCAGxB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AAGF,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,MAAM,gCAAgD,CAAA;AACnE,eAAO,MAAM,MAAM,gCAAgD,CAAA;AACnE,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,QAAQ,gCAAmD,CAAA;AACxE,eAAO,MAAM,MAAM,gCAAiD,CAAA;AACpE,eAAO,MAAM,MAAM,gCAAiD,CAAA;AACpE,eAAO,MAAM,KAAK,gCAA+C,CAAA;AACjE,eAAO,MAAM,KAAK,gCAA+C,CAAA;AACjE,eAAO,MAAM,SAAS,gCAAmD,CAAA;AACzE,eAAO,MAAM,GAAG,gCAA8C,CAAA;AAG9D,eAAO,MAAM,WAAW,gCAGtB,CAAA;AAGF,eAAO,MAAM,WAAW,gCAGtB,CAAA;AAGF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,SAAS,gCAGpB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AACF,eAAO,MAAM,OAAO,gCAGlB,CAAA;AAGF,eAAO,MAAM,UAAU,gCAGrB,CAAA;AAEF,eAAO,MAAM,SAAS,kCAkCrB,CAAA;AAED,eAAO,MAAM,SAAS,OAAuB,CAAA"}
package/dist/lexer.js CHANGED
@@ -33,6 +33,18 @@ export const ExportTok = createToken({
33
33
  name: 'ExportTok',
34
34
  pattern: /export\b/i,
35
35
  });
36
+ export const PackageTok = createToken({
37
+ name: 'PackageTok',
38
+ pattern: /package\b/i,
39
+ });
40
+ export const ExecutableTok = createToken({
41
+ name: 'ExecutableTok',
42
+ pattern: /executable\b/i,
43
+ });
44
+ export const ModuleTok = createToken({
45
+ name: 'ModuleTok',
46
+ pattern: /module\b/i,
47
+ });
36
48
  // Symbols
37
49
  export const ArrowTok = createToken({ name: 'ArrowTok', pattern: /->/ });
38
50
  export const LCurly = createToken({ name: 'LCurly', pattern: /{/ });
@@ -86,6 +98,9 @@ export const allTokens = [
86
98
  GenerateTok,
87
99
  ImportTok,
88
100
  ExportTok,
101
+ PackageTok,
102
+ ExecutableTok,
103
+ ModuleTok,
89
104
  ArrowTok,
90
105
  SelectBlock,
91
106
  LCurly,
package/dist/lexer.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;IACpC,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK,CAAC,OAAO;CACrB,CAAC,CAAA;AAEF,8BAA8B;AAC9B,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;IACnC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;IAC/B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;CACjB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC;IACjC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;CACnB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;IACnC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;IACrC,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,aAAa;CACvB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;IACnC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;IACnC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;IACpC,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,YAAY;CACtB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;IACvC,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;IACnC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAA;AAEF,UAAU;AACV,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACxE,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;AACnE,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;AACnE,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACxE,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACxE,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACpE,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACpE,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;AACjE,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;AACjE,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;AACzE,MAAM,CAAC,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAE9D,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;IACrC,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAA;AAEF,WAAW;AACX,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;IACrC,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,iBAAiB;CAC3B,CAAC,CAAA;AAEF,+BAA+B;AAC/B,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;IACnC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;IACnC,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC;IACjC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;CACnB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC;IACjC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;CACnB,CAAC,CAAA;AAEF,cAAc;AACd,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;IACpC,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,wBAAwB;CAClC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU;IAEV,SAAS;IACT,KAAK;IACL,OAAO;IACP,SAAS;IACT,WAAW;IACX,SAAS;IACT,SAAS;IACT,UAAU;IACV,aAAa;IACb,SAAS;IAET,QAAQ;IACR,WAAW;IACX,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,SAAS;IACT,GAAG;IACH,WAAW;IAEX,SAAS;IACT,SAAS;IACT,OAAO;IACP,OAAO;IAEP,UAAU;CACX,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA"}
package/dist/parser.d.ts CHANGED
@@ -14,5 +14,6 @@ export declare class SpexParser extends CstParser {
14
14
  private moduleImport;
15
15
  private exportDeclaration;
16
16
  private generateDeclaration;
17
+ private packageDeclaration;
17
18
  }
18
19
  //# sourceMappingURL=parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA4BtC,qBAAa,UAAW,SAAQ,SAAS;;IAMhC,QAAQ,sEAIb;IAEF,OAAO,CAAC,WAAW,CAkBjB;IAEF,OAAO,CAAC,iBAAiB,CAMvB;IAEF,OAAO,CAAC,gBAAgB,CAMtB;IAEF,OAAO,CAAC,aAAa,CAkBnB;IAEF,OAAO,CAAC,WAAW,CAYjB;IAEF,OAAO,CAAC,aAAa,CASnB;IAEF,OAAO,CAAC,SAAS,CAKf;IAEF,OAAO,CAAC,iBAAiB,CAYvB;IAEF,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,YAAY,CAIlB;IAEF,OAAO,CAAC,iBAAiB,CAIvB;IAEF,OAAO,CAAC,mBAAmB,CAIzB;CACH"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA+BtC,qBAAa,UAAW,SAAQ,SAAS;;IAMhC,QAAQ,sEAIb;IAEF,OAAO,CAAC,WAAW,CAsBjB;IAEF,OAAO,CAAC,iBAAiB,CAMvB;IAEF,OAAO,CAAC,gBAAgB,CAMtB;IAEF,OAAO,CAAC,aAAa,CAkBnB;IAEF,OAAO,CAAC,WAAW,CAYjB;IAEF,OAAO,CAAC,aAAa,CASnB;IAEF,OAAO,CAAC,SAAS,CAKf;IAEF,OAAO,CAAC,iBAAiB,CAYvB;IAEF,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,YAAY,CAIlB;IAEF,OAAO,CAAC,iBAAiB,CAIvB;IAEF,OAAO,CAAC,mBAAmB,CAIzB;IAEF,OAAO,CAAC,kBAAkB,CAOxB;CACH"}
package/dist/parser.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { CstParser } from 'chevrotain';
2
- import { allTokens, CreateTok, AsTok, FromTok, SelectTok, GenerateTok, ImportTok, ExportTok, ArrowTok, SelectBlock, LBracket, RBracket, LParen, RParen, Colon, Comma, Semicolon, Dot, Identifier, PathLiteral, StringTok, NumberTok, BoolTok, UnitTok, } from './lexer.js';
2
+ import { allTokens, CreateTok, AsTok, FromTok, SelectTok, GenerateTok, ImportTok, ExportTok, PackageTok, ExecutableTok, ModuleTok, ArrowTok, SelectBlock, LBracket, RBracket, LParen, RParen, Colon, Comma, Semicolon, Dot, Identifier, PathLiteral, StringTok, NumberTok, BoolTok, UnitTok, } from './lexer.js';
3
3
  export class SpexParser extends CstParser {
4
4
  constructor() {
5
5
  super(allTokens);
@@ -12,6 +12,10 @@ export class SpexParser extends CstParser {
12
12
  });
13
13
  declaration = this.RULE('declaration', () => {
14
14
  this.OR([
15
+ {
16
+ GATE: this.BACKTRACK(this.packageDeclaration),
17
+ ALT: () => this.SUBRULE(this.packageDeclaration),
18
+ },
15
19
  {
16
20
  GATE: this.BACKTRACK(this.objectDeclaration),
17
21
  ALT: () => this.SUBRULE(this.objectDeclaration),
@@ -128,5 +132,13 @@ export class SpexParser extends CstParser {
128
132
  this.CONSUME(Identifier);
129
133
  this.CONSUME(Semicolon);
130
134
  });
135
+ packageDeclaration = this.RULE('packageDeclaration', () => {
136
+ this.CONSUME(PackageTok);
137
+ this.OR([{ ALT: () => this.CONSUME(ExecutableTok) }, { ALT: () => this.CONSUME(ModuleTok) }]);
138
+ this.CONSUME(Identifier);
139
+ this.CONSUME(AsTok);
140
+ this.SUBRULE(this.objectExpression);
141
+ this.CONSUME(Semicolon);
142
+ });
131
143
  }
132
144
  //# sourceMappingURL=parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
package/dist/visitor.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import type { ICstVisitor } from 'chevrotain';
2
- import type { SpexFile, Declaration, ObjectDeclaration, ImportDeclaration, ExportDeclaration, GenerateDeclaration, ObjectExpression, NamedObject, ProductObject, SubObject } from './ast.js';
2
+ import type { SpexFile, Declaration, ObjectDeclaration, ImportDeclaration, ExportDeclaration, GenerateDeclaration, PackageDeclaration, ObjectExpression, NamedObject, ProductObject, SubObject, Constraint } from './ast.js';
3
3
  declare const BaseSpexVisitor: new (...args: any[]) => ICstVisitor<any, any>;
4
+ export declare const REFERENCE_PATTERN: RegExp;
5
+ export declare function parseConstraint(raw: string): Constraint;
4
6
  export declare class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<any, any> {
5
7
  constructor();
6
8
  spexFile(ctx: any): SpexFile;
@@ -15,6 +17,7 @@ export declare class SpexParserVisitor extends BaseSpexVisitor implements ICstVi
15
17
  namedImport(ctx: any): ImportDeclaration;
16
18
  moduleImport(ctx: any): ImportDeclaration;
17
19
  exportDeclaration(ctx: any): ExportDeclaration;
20
+ packageDeclaration(ctx: any): PackageDeclaration;
18
21
  generateDeclaration(ctx: any): GenerateDeclaration;
19
22
  }
20
23
  export declare function parseToAst(text: string): SpexFile;
@@ -1 +1 @@
1
- {"version":3,"file":"visitor.d.ts","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,SAAS,EAEV,MAAM,UAAU,CAAA;AAKjB,QAAA,MAAM,eAAe,+CAAgD,CAAA;AAErE,qBAAa,iBAAkB,SAAQ,eAAgB,YAAW,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;;IAMrF,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ;IAK5B,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAalC,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAQ9C,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB;IAe5C,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB;IAiBzC,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAmBlC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa;IAStC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS;IAU9B,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAO9C,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAYxC,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAWzC,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAO9C,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB;CAMnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAWjD"}
1
+ {"version":3,"file":"visitor.d.ts","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,SAAS,EAET,UAAU,EAGX,MAAM,UAAU,CAAA;AAKjB,QAAA,MAAM,eAAe,+CAAgD,CAAA;AAErE,eAAO,MAAM,iBAAiB,QAA4C,CAAA;AAE1E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAkBvD;AAED,qBAAa,iBAAkB,SAAQ,eAAgB,YAAW,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;;IAMrF,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ;IAK5B,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAgBlC,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAQ9C,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB;IAe5C,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB;IAiBzC,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAmBlC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa;IAStC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS;IAU9B,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAO9C,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAYxC,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAWzC,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB;IAO9C,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,kBAAkB;IAUhD,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB;CAMnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAWjD"}
package/dist/visitor.js CHANGED
@@ -2,6 +2,23 @@ import { SpexLexer } from './lexer.js';
2
2
  import { SpexParser } from './parser.js';
3
3
  const parserInstance = new SpexParser();
4
4
  const BaseSpexVisitor = parserInstance.getBaseCstVisitorConstructor();
5
+ export const REFERENCE_PATTERN = /@([a-zA-Z_][\w]*(?:\.[a-zA-Z_][\w]*)*)/g;
6
+ export function parseConstraint(raw) {
7
+ const parts = [];
8
+ let lastIndex = 0;
9
+ let match;
10
+ while ((match = REFERENCE_PATTERN.exec(raw)) !== null) {
11
+ if (match.index > lastIndex) {
12
+ parts.push({ kind: 'ConstraintText', text: raw.slice(lastIndex, match.index) });
13
+ }
14
+ parts.push({ kind: 'ConstraintReference', name: match[1] });
15
+ lastIndex = match.index + match[0].length;
16
+ }
17
+ if (lastIndex < raw.length) {
18
+ parts.push({ kind: 'ConstraintText', text: raw.slice(lastIndex) });
19
+ }
20
+ return { raw, parts };
21
+ }
5
22
  export class SpexParserVisitor extends BaseSpexVisitor {
6
23
  constructor() {
7
24
  super();
@@ -12,6 +29,9 @@ export class SpexParserVisitor extends BaseSpexVisitor {
12
29
  return { kind: 'SpexFile', declarations };
13
30
  }
14
31
  declaration(ctx) {
32
+ if (ctx.packageDeclaration) {
33
+ return this.visit(ctx.packageDeclaration);
34
+ }
15
35
  if (ctx.objectDeclaration) {
16
36
  return this.visit(ctx.objectDeclaration);
17
37
  }
@@ -94,11 +114,11 @@ export class SpexParserVisitor extends BaseSpexVisitor {
94
114
  }
95
115
  subObject(ctx) {
96
116
  const rawText = ctx.SelectBlock[0].image;
97
- const constraint = rawText.slice(1, -1).trim();
117
+ const rawConstraint = rawText.slice(1, -1).trim();
98
118
  return {
99
119
  kind: 'SubObject',
100
120
  base: this.visit(ctx.base),
101
- constraint,
121
+ constraint: parseConstraint(rawConstraint),
102
122
  };
103
123
  }
104
124
  importDeclaration(ctx) {
@@ -134,6 +154,15 @@ export class SpexParserVisitor extends BaseSpexVisitor {
134
154
  name: ctx.Identifier[0].image,
135
155
  };
136
156
  }
157
+ packageDeclaration(ctx) {
158
+ const packageType = ctx.ExecutableTok ? 'EXECUTABLE' : 'MODULE';
159
+ return {
160
+ kind: 'PackageDeclaration',
161
+ packageType,
162
+ name: ctx.Identifier[0].image,
163
+ objectName: this.visit(ctx.objectExpression),
164
+ };
165
+ }
137
166
  generateDeclaration(ctx) {
138
167
  return {
139
168
  kind: 'GenerateDeclaration',
@@ -1 +1 @@
1
- {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "spex-parser",
3
3
  "repository": "github:Freelansys/spex-parser",
4
- "version": "0.1.1",
4
+ "version": "0.1.3",
5
5
  "description": "A parser for Spex, a language designed for programming with LLMs",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
package/src/ast.ts CHANGED
@@ -8,6 +8,16 @@ export type Declaration =
8
8
  | ImportDeclaration
9
9
  | ExportDeclaration
10
10
  | GenerateDeclaration
11
+ | PackageDeclaration
12
+
13
+ export type PackageKind = 'EXECUTABLE' | 'MODULE'
14
+
15
+ export type PackageDeclaration = {
16
+ kind: 'PackageDeclaration'
17
+ packageType: PackageKind
18
+ name: string
19
+ objectName: ObjectExpression
20
+ }
11
21
 
12
22
  export type ObjectDeclaration = {
13
23
  kind: 'ObjectDeclaration'
@@ -55,10 +65,27 @@ export type ExponentialObject = {
55
65
  exponent: ObjectExpression
56
66
  }
57
67
 
68
+ export type ConstraintReference = {
69
+ kind: 'ConstraintReference'
70
+ name: string
71
+ }
72
+
73
+ export type ConstraintText = {
74
+ kind: 'ConstraintText'
75
+ text: string
76
+ }
77
+
78
+ export type ConstraintPart = ConstraintReference | ConstraintText
79
+
80
+ export type Constraint = {
81
+ raw: string
82
+ parts: ConstraintPart[]
83
+ }
84
+
58
85
  export type SubObject = {
59
86
  kind: 'SubObject'
60
87
  base: ObjectExpression
61
- constraint: string
88
+ constraint: Constraint
62
89
  }
63
90
 
64
91
  export type ArrayObject = {
package/src/index.ts CHANGED
@@ -10,4 +10,10 @@ export type {
10
10
  ProductObject,
11
11
  ExponentialObject,
12
12
  SubObject,
13
+ PackageDeclaration,
14
+ PackageKind,
15
+ Constraint,
16
+ ConstraintPart,
17
+ ConstraintReference,
18
+ ConstraintText,
13
19
  } from './ast.js'
package/src/lexer.ts CHANGED
@@ -35,6 +35,18 @@ export const ExportTok = createToken({
35
35
  name: 'ExportTok',
36
36
  pattern: /export\b/i,
37
37
  })
38
+ export const PackageTok = createToken({
39
+ name: 'PackageTok',
40
+ pattern: /package\b/i,
41
+ })
42
+ export const ExecutableTok = createToken({
43
+ name: 'ExecutableTok',
44
+ pattern: /executable\b/i,
45
+ })
46
+ export const ModuleTok = createToken({
47
+ name: 'ModuleTok',
48
+ pattern: /module\b/i,
49
+ })
38
50
 
39
51
  // Symbols
40
52
  export const ArrowTok = createToken({ name: 'ArrowTok', pattern: /->/ })
@@ -95,6 +107,9 @@ export const allTokens = [
95
107
  GenerateTok,
96
108
  ImportTok,
97
109
  ExportTok,
110
+ PackageTok,
111
+ ExecutableTok,
112
+ ModuleTok,
98
113
 
99
114
  ArrowTok,
100
115
  SelectBlock,
package/src/parser.ts CHANGED
@@ -8,6 +8,9 @@ import {
8
8
  GenerateTok,
9
9
  ImportTok,
10
10
  ExportTok,
11
+ PackageTok,
12
+ ExecutableTok,
13
+ ModuleTok,
11
14
  ArrowTok,
12
15
  SelectBlock,
13
16
  LBracket,
@@ -40,6 +43,10 @@ export class SpexParser extends CstParser {
40
43
 
41
44
  private declaration = this.RULE('declaration', () => {
42
45
  this.OR([
46
+ {
47
+ GATE: this.BACKTRACK(this.packageDeclaration),
48
+ ALT: () => this.SUBRULE(this.packageDeclaration),
49
+ },
43
50
  {
44
51
  GATE: this.BACKTRACK(this.objectDeclaration),
45
52
  ALT: () => this.SUBRULE(this.objectDeclaration),
@@ -167,4 +174,13 @@ export class SpexParser extends CstParser {
167
174
  this.CONSUME(Identifier)
168
175
  this.CONSUME(Semicolon)
169
176
  })
177
+
178
+ private packageDeclaration = this.RULE('packageDeclaration', () => {
179
+ this.CONSUME(PackageTok)
180
+ this.OR([{ ALT: () => this.CONSUME(ExecutableTok) }, { ALT: () => this.CONSUME(ModuleTok) }])
181
+ this.CONSUME(Identifier)
182
+ this.CONSUME(AsTok)
183
+ this.SUBRULE(this.objectExpression)
184
+ this.CONSUME(Semicolon)
185
+ })
170
186
  }
package/src/visitor.ts CHANGED
@@ -6,11 +6,15 @@ import type {
6
6
  ImportDeclaration,
7
7
  ExportDeclaration,
8
8
  GenerateDeclaration,
9
+ PackageDeclaration,
9
10
  ObjectExpression,
10
11
  NamedObject,
11
12
  ProductObject,
12
13
  SubObject,
13
14
  ArrayObject,
15
+ Constraint,
16
+ ConstraintPart,
17
+ ConstraintReference,
14
18
  } from './ast.js'
15
19
  import { SpexLexer } from './lexer.js'
16
20
  import { SpexParser } from './parser.js'
@@ -18,6 +22,28 @@ import { SpexParser } from './parser.js'
18
22
  const parserInstance = new SpexParser()
19
23
  const BaseSpexVisitor = parserInstance.getBaseCstVisitorConstructor()
20
24
 
25
+ export const REFERENCE_PATTERN = /@([a-zA-Z_][\w]*(?:\.[a-zA-Z_][\w]*)*)/g
26
+
27
+ export function parseConstraint(raw: string): Constraint {
28
+ const parts: ConstraintPart[] = []
29
+ let lastIndex = 0
30
+ let match: RegExpExecArray | null
31
+
32
+ while ((match = REFERENCE_PATTERN.exec(raw)) !== null) {
33
+ if (match.index > lastIndex) {
34
+ parts.push({ kind: 'ConstraintText', text: raw.slice(lastIndex, match.index) })
35
+ }
36
+ parts.push({ kind: 'ConstraintReference', name: match[1]! })
37
+ lastIndex = match.index + match[0].length
38
+ }
39
+
40
+ if (lastIndex < raw.length) {
41
+ parts.push({ kind: 'ConstraintText', text: raw.slice(lastIndex) })
42
+ }
43
+
44
+ return { raw, parts }
45
+ }
46
+
21
47
  export class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<any, any> {
22
48
  constructor() {
23
49
  super()
@@ -30,6 +56,9 @@ export class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<an
30
56
  }
31
57
 
32
58
  declaration(ctx: any): Declaration {
59
+ if (ctx.packageDeclaration) {
60
+ return this.visit(ctx.packageDeclaration)
61
+ }
33
62
  if (ctx.objectDeclaration) {
34
63
  return this.visit(ctx.objectDeclaration)
35
64
  }
@@ -112,11 +141,11 @@ export class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<an
112
141
 
113
142
  subObject(ctx: any): SubObject {
114
143
  const rawText: string = ctx.SelectBlock[0].image
115
- const constraint = rawText.slice(1, -1).trim()
144
+ const rawConstraint = rawText.slice(1, -1).trim()
116
145
  return {
117
146
  kind: 'SubObject',
118
147
  base: this.visit(ctx.base),
119
- constraint,
148
+ constraint: parseConstraint(rawConstraint),
120
149
  }
121
150
  }
122
151
 
@@ -157,6 +186,16 @@ export class SpexParserVisitor extends BaseSpexVisitor implements ICstVisitor<an
157
186
  }
158
187
  }
159
188
 
189
+ packageDeclaration(ctx: any): PackageDeclaration {
190
+ const packageType = ctx.ExecutableTok ? ('EXECUTABLE' as const) : ('MODULE' as const)
191
+ return {
192
+ kind: 'PackageDeclaration',
193
+ packageType,
194
+ name: ctx.Identifier[0].image,
195
+ objectName: this.visit(ctx.objectExpression),
196
+ }
197
+ }
198
+
160
199
  generateDeclaration(ctx: any): GenerateDeclaration {
161
200
  return {
162
201
  kind: 'GenerateDeclaration',
package/tests/e2e.test.ts CHANGED
@@ -12,6 +12,6 @@ describe('end-to-end', () => {
12
12
  const code = readFileSync(join(__dirname, 'props/todo.spex'), 'utf-8')
13
13
  const ast = parseToAst(code)
14
14
  expect(ast.kind).toBe('SpexFile')
15
- expect(ast.declarations.length).toBe(14)
15
+ expect(ast.declarations.length).toBe(15)
16
16
  })
17
17
  })
@@ -4,7 +4,9 @@ import { SpexLexer } from '../src/lexer.js'
4
4
  describe('SpexLexer', () => {
5
5
  describe('tokenization', () => {
6
6
  it('should tokenize keywords', () => {
7
- const result = SpexLexer.tokenize('create as from select generate import export')
7
+ const result = SpexLexer.tokenize(
8
+ 'create as from select generate import export package executable module'
9
+ )
8
10
  expect(result.errors).toHaveLength(0)
9
11
  expect(result.tokens.map((t) => t.tokenType.name)).toEqual([
10
12
  'CreateTok',
@@ -14,11 +16,16 @@ describe('SpexLexer', () => {
14
16
  'GenerateTok',
15
17
  'ImportTok',
16
18
  'ExportTok',
19
+ 'PackageTok',
20
+ 'ExecutableTok',
21
+ 'ModuleTok',
17
22
  ])
18
23
  })
19
24
 
20
25
  it('should tokenize keywords case-insensitively', () => {
21
- const result = SpexLexer.tokenize('CREATE AS FROM SELECT GENERATE IMPORT EXPORT')
26
+ const result = SpexLexer.tokenize(
27
+ 'CREATE AS FROM SELECT GENERATE IMPORT EXPORT PACKAGE EXECUTABLE MODULE'
28
+ )
22
29
  expect(result.errors).toHaveLength(0)
23
30
  expect(result.tokens.map((t) => t.tokenType.name)).toEqual([
24
31
  'CreateTok',
@@ -28,6 +35,9 @@ describe('SpexLexer', () => {
28
35
  'GenerateTok',
29
36
  'ImportTok',
30
37
  'ExportTok',
38
+ 'PackageTok',
39
+ 'ExecutableTok',
40
+ 'ModuleTok',
31
41
  ])
32
42
  })
33
43
 
@@ -79,10 +89,10 @@ describe('SpexLexer', () => {
79
89
 
80
90
  it('should handle keywords with word boundary', () => {
81
91
  const result = SpexLexer.tokenize(
82
- 'createfoo foocreate asfoo fooas fooselect selectfoo foofrom fromfoo generatefoo foogenerate importfoo fooimport exportfoo fooexport'
92
+ 'createfoo foocreate asfoo fooas fooselect selectfoo foofrom fromfoo generatefoo foogenerate importfoo fooimport exportfoo fooexport packagefoo fopackage executablefoo foexecutable modulefoo fomodule'
83
93
  )
84
94
  expect(result.errors).toHaveLength(0)
85
- expect(result.tokens.map((t) => t.tokenType.name)).toEqual(Array(14).fill('Identifier'))
95
+ expect(result.tokens.map((t) => t.tokenType.name)).toEqual(Array(20).fill('Identifier'))
86
96
  })
87
97
 
88
98
  it('should tokenize the text between braces', () => {
@@ -212,6 +212,69 @@ describe('SpexParser', () => {
212
212
  })
213
213
  })
214
214
 
215
+ describe('package declaration', () => {
216
+ it('should parse package executable declaration', () => {
217
+ const testCase = 'package executable myapp as Main;'
218
+ const { parser } = parseInput(testCase)
219
+ expect(parser.errors).toHaveLength(0)
220
+ })
221
+
222
+ it('should parse package module declaration', () => {
223
+ const testCase = 'package module mylib as utils;'
224
+ const { parser } = parseInput(testCase)
225
+ expect(parser.errors).toHaveLength(0)
226
+ })
227
+
228
+ it('should parse package executable with exponential object', () => {
229
+ const testCase = 'package executable cli as (path: string) -> unit;'
230
+ const { parser } = parseInput(testCase)
231
+ expect(parser.errors).toHaveLength(0)
232
+ })
233
+
234
+ it('should parse package executable with dotted name', () => {
235
+ const testCase = 'package executable myapp as app.Main;'
236
+ const { parser } = parseInput(testCase)
237
+ expect(parser.errors).toHaveLength(0)
238
+ })
239
+
240
+ it('should parse package module with array type', () => {
241
+ const testCase = 'package module mylib as string[];'
242
+ const { parser } = parseInput(testCase)
243
+ expect(parser.errors).toHaveLength(0)
244
+ })
245
+
246
+ it('should parse package executable with product type', () => {
247
+ const testCase = 'package module mylib as (name: string, count: number);'
248
+ const { parser } = parseInput(testCase)
249
+ expect(parser.errors).toHaveLength(0)
250
+ })
251
+
252
+ it('should parse package executable with subobject', () => {
253
+ const testCase = 'package executable myapp as from string select { is a valid command };'
254
+ const { parser } = parseInput(testCase)
255
+ expect(parser.errors).toHaveLength(0)
256
+ })
257
+
258
+ it('should parse package declaration case-insensitively', () => {
259
+ const testCase = 'PACKAGE EXECUTABLE myapp AS Main;'
260
+ const { parser } = parseInput(testCase)
261
+ expect(parser.errors).toHaveLength(0)
262
+ })
263
+
264
+ it('should parse mixed package and generate declarations', () => {
265
+ const testCase = 'package executable myapp as Main;\ngenerate Main;'
266
+ const { parser } = parseInput(testCase)
267
+ expect(parser.errors).toHaveLength(0)
268
+ })
269
+
270
+ it('should parse package declaration with complex nested type', () => {
271
+ const testCase =
272
+ 'package module mylib as from (x: number, y: number) -> number select { computes distance };'
273
+ const { parser } = parseInput(testCase)
274
+ expect(parser.errors).toHaveLength(0)
275
+ })
276
+ })
277
+
215
278
  describe('multiple declarations', () => {
216
279
  it('should parse multiple declarations', () => {
217
280
  const testCase = `
@@ -80,4 +80,6 @@ create Main as from string[] -> unit select {
80
80
  6. print user-friendly error messages for exceptions
81
81
  };
82
82
 
83
- generate Main;
83
+ generate TodoTitle;
84
+
85
+ package executable MyTodo as Main;
@@ -1,10 +1,12 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { parseToAst } from '../src/visitor.js'
2
+ import { parseToAst, parseConstraint } from '../src/visitor.js'
3
3
  import type {
4
4
  ObjectDeclaration,
5
5
  ImportDeclaration,
6
6
  ExportDeclaration,
7
7
  GenerateDeclaration,
8
+ PackageDeclaration,
9
+ Constraint,
8
10
  } from '../src/ast.js'
9
11
 
10
12
  describe('SpexParserVisitor', () => {
@@ -92,7 +94,10 @@ describe('SpexParserVisitor', () => {
92
94
  p: {
93
95
  kind: 'SubObject',
94
96
  base: { kind: 'NamedObject', name: 'Number' },
95
- constraint: 'value is positive',
97
+ constraint: {
98
+ raw: 'value is positive',
99
+ parts: [{ kind: 'ConstraintText', text: 'value is positive' }],
100
+ },
96
101
  },
97
102
  n: { kind: 'NamedObject', name: 'Number' },
98
103
  },
@@ -178,12 +183,18 @@ describe('SpexParserVisitor', () => {
178
183
  exponent: {
179
184
  kind: 'SubObject',
180
185
  base: { kind: 'NamedObject', name: 'Number' },
181
- constraint: 'value is positive',
186
+ constraint: {
187
+ raw: 'value is positive',
188
+ parts: [{ kind: 'ConstraintText', text: 'value is positive' }],
189
+ },
182
190
  },
183
191
  base: {
184
192
  kind: 'SubObject',
185
193
  base: { kind: 'NamedObject', name: 'Number' },
186
- constraint: 'value is positive',
194
+ constraint: {
195
+ raw: 'value is positive',
196
+ parts: [{ kind: 'ConstraintText', text: 'value is positive' }],
197
+ },
187
198
  },
188
199
  },
189
200
  })
@@ -199,7 +210,10 @@ describe('SpexParserVisitor', () => {
199
210
  object: {
200
211
  kind: 'SubObject',
201
212
  base: { kind: 'NamedObject', name: 'Number' },
202
- constraint: 'isPositive',
213
+ constraint: {
214
+ raw: 'isPositive',
215
+ parts: [{ kind: 'ConstraintText', text: 'isPositive' }],
216
+ },
203
217
  },
204
218
  })
205
219
  })
@@ -214,7 +228,10 @@ describe('SpexParserVisitor', () => {
214
228
  object: {
215
229
  kind: 'SubObject',
216
230
  base: { kind: 'NamedObject', name: 'Number' },
217
- constraint: 'the number is positive',
231
+ constraint: {
232
+ raw: 'the number is positive',
233
+ parts: [{ kind: 'ConstraintText', text: 'the number is positive' }],
234
+ },
218
235
  },
219
236
  })
220
237
  })
@@ -236,7 +253,13 @@ describe('SpexParserVisitor', () => {
236
253
  s: { kind: 'NamedObject', name: 'String' },
237
254
  },
238
255
  },
239
- constraint: '@n is positive',
256
+ constraint: {
257
+ raw: '@n is positive',
258
+ parts: [
259
+ { kind: 'ConstraintReference', name: 'n' },
260
+ { kind: 'ConstraintText', text: ' is positive' },
261
+ ],
262
+ },
240
263
  },
241
264
  })
242
265
  })
@@ -262,7 +285,10 @@ describe('SpexParserVisitor', () => {
262
285
  },
263
286
  base: { kind: 'NamedObject', name: 'Bool' },
264
287
  },
265
- constraint: 'logs the given input',
288
+ constraint: {
289
+ raw: 'logs the given input',
290
+ parts: [{ kind: 'ConstraintText', text: 'logs the given input' }],
291
+ },
266
292
  },
267
293
  })
268
294
  })
@@ -280,9 +306,15 @@ describe('SpexParserVisitor', () => {
280
306
  base: {
281
307
  kind: 'SubObject',
282
308
  base: { kind: 'NamedObject', name: 'Number' },
283
- constraint: 'value is positive',
309
+ constraint: {
310
+ raw: 'value is positive',
311
+ parts: [{ kind: 'ConstraintText', text: 'value is positive' }],
312
+ },
313
+ },
314
+ constraint: {
315
+ raw: 'value is odd',
316
+ parts: [{ kind: 'ConstraintText', text: 'value is odd' }],
284
317
  },
285
- constraint: 'value is odd',
286
318
  },
287
319
  })
288
320
  })
@@ -460,4 +492,195 @@ describe('SpexParserVisitor', () => {
460
492
  })
461
493
  })
462
494
  })
495
+
496
+ describe('parseConstraint', () => {
497
+ it('should parse plain text constraint with no references', () => {
498
+ const result = parseConstraint('value is positive')
499
+ expect(result).toEqual<Constraint>({
500
+ raw: 'value is positive',
501
+ parts: [{ kind: 'ConstraintText', text: 'value is positive' }],
502
+ })
503
+ })
504
+
505
+ it('should parse constraint with single reference', () => {
506
+ const result = parseConstraint('@n is positive')
507
+ expect(result).toEqual<Constraint>({
508
+ raw: '@n is positive',
509
+ parts: [
510
+ { kind: 'ConstraintReference', name: 'n' },
511
+ { kind: 'ConstraintText', text: ' is positive' },
512
+ ],
513
+ })
514
+ })
515
+
516
+ it('should parse constraint with reference in the middle', () => {
517
+ const result = parseConstraint('use @path for storage')
518
+ expect(result).toEqual<Constraint>({
519
+ raw: 'use @path for storage',
520
+ parts: [
521
+ { kind: 'ConstraintText', text: 'use ' },
522
+ { kind: 'ConstraintReference', name: 'path' },
523
+ { kind: 'ConstraintText', text: ' for storage' },
524
+ ],
525
+ })
526
+ })
527
+
528
+ it('should parse constraint with dotted references', () => {
529
+ const result = parseConstraint('return @z.real^2 + @z.imag^2')
530
+ expect(result).toEqual<Constraint>({
531
+ raw: 'return @z.real^2 + @z.imag^2',
532
+ parts: [
533
+ { kind: 'ConstraintText', text: 'return ' },
534
+ { kind: 'ConstraintReference', name: 'z.real' },
535
+ { kind: 'ConstraintText', text: '^2 + ' },
536
+ { kind: 'ConstraintReference', name: 'z.imag' },
537
+ { kind: 'ConstraintText', text: '^2' },
538
+ ],
539
+ })
540
+ })
541
+
542
+ it('should parse constraint with multiple references', () => {
543
+ const result = parseConstraint('call @LoadTodos using @path')
544
+ expect(result).toEqual<Constraint>({
545
+ raw: 'call @LoadTodos using @path',
546
+ parts: [
547
+ { kind: 'ConstraintText', text: 'call ' },
548
+ { kind: 'ConstraintReference', name: 'LoadTodos' },
549
+ { kind: 'ConstraintText', text: ' using ' },
550
+ { kind: 'ConstraintReference', name: 'path' },
551
+ ],
552
+ })
553
+ })
554
+
555
+ it('should parse constraint with reference at start', () => {
556
+ const result = parseConstraint('@validate the input')
557
+ expect(result).toEqual<Constraint>({
558
+ raw: '@validate the input',
559
+ parts: [
560
+ { kind: 'ConstraintReference', name: 'validate' },
561
+ { kind: 'ConstraintText', text: ' the input' },
562
+ ],
563
+ })
564
+ })
565
+
566
+ it('should parse constraint with no @ symbols', () => {
567
+ const result = parseConstraint('the user is authenticated')
568
+ expect(result).toEqual<Constraint>({
569
+ raw: 'the user is authenticated',
570
+ parts: [{ kind: 'ConstraintText', text: 'the user is authenticated' }],
571
+ })
572
+ })
573
+
574
+ it('should parse constraint with underscore in reference', () => {
575
+ const result = parseConstraint('@todo_item is valid')
576
+ expect(result).toEqual<Constraint>({
577
+ raw: '@todo_item is valid',
578
+ parts: [
579
+ { kind: 'ConstraintReference', name: 'todo_item' },
580
+ { kind: 'ConstraintText', text: ' is valid' },
581
+ ],
582
+ })
583
+ })
584
+
585
+ it('should parse empty constraint', () => {
586
+ const result = parseConstraint('')
587
+ expect(result).toEqual<Constraint>({
588
+ raw: '',
589
+ parts: [],
590
+ })
591
+ })
592
+
593
+ it('should preserve raw text exactly', () => {
594
+ const result = parseConstraint(' @foo ')
595
+ expect(result.raw).toBe(' @foo ')
596
+ })
597
+ })
598
+
599
+ describe('package declaration', () => {
600
+ it('should convert package executable declaration to AST', () => {
601
+ const testCase = 'package executable myapp as Main;'
602
+ const ast = parseToAst(testCase)
603
+ const decl = ast.declarations[0] as PackageDeclaration
604
+ expect(decl).toEqual({
605
+ kind: 'PackageDeclaration',
606
+ packageType: 'EXECUTABLE',
607
+ name: 'myapp',
608
+ objectName: { kind: 'NamedObject', name: 'Main' },
609
+ })
610
+ })
611
+
612
+ it('should convert package module declaration to AST', () => {
613
+ const testCase = 'package module mylib as utils;'
614
+ const ast = parseToAst(testCase)
615
+ const decl = ast.declarations[0] as PackageDeclaration
616
+ expect(decl).toEqual({
617
+ kind: 'PackageDeclaration',
618
+ packageType: 'MODULE',
619
+ name: 'mylib',
620
+ objectName: { kind: 'NamedObject', name: 'utils' },
621
+ })
622
+ })
623
+
624
+ it('should convert package executable with complex object to AST', () => {
625
+ const testCase = 'package executable cli as (path: string) -> unit;'
626
+ const ast = parseToAst(testCase)
627
+ const decl = ast.declarations[0] as PackageDeclaration
628
+ expect(decl).toEqual({
629
+ kind: 'PackageDeclaration',
630
+ packageType: 'EXECUTABLE',
631
+ name: 'cli',
632
+ objectName: {
633
+ kind: 'ExponentialObject',
634
+ exponent: {
635
+ kind: 'ProductObject',
636
+ fields: { path: { kind: 'NamedObject', name: 'string' } },
637
+ },
638
+ base: { kind: 'NamedObject', name: 'unit' },
639
+ },
640
+ })
641
+ })
642
+
643
+ it('should convert package executable with dotted name to AST', () => {
644
+ const testCase = 'package executable myapp as app.Main;'
645
+ const ast = parseToAst(testCase)
646
+ const decl = ast.declarations[0] as PackageDeclaration
647
+ expect(decl).toEqual({
648
+ kind: 'PackageDeclaration',
649
+ packageType: 'EXECUTABLE',
650
+ name: 'myapp',
651
+ objectName: { kind: 'NamedObject', name: 'app.Main' },
652
+ })
653
+ })
654
+
655
+ it('should convert package executable with array type to AST', () => {
656
+ const testCase = 'package module mylib as string[];'
657
+ const ast = parseToAst(testCase)
658
+ const decl = ast.declarations[0] as PackageDeclaration
659
+ expect(decl).toEqual({
660
+ kind: 'PackageDeclaration',
661
+ packageType: 'MODULE',
662
+ name: 'mylib',
663
+ objectName: { kind: 'ArrayObject', base: { kind: 'NamedObject', name: 'string' } },
664
+ })
665
+ })
666
+
667
+ it('should convert mixed declarations with package to AST', () => {
668
+ const testCase = 'create Main as Number;\npackage executable myapp as Main;'
669
+ const ast = parseToAst(testCase)
670
+ expect(ast.declarations).toHaveLength(2)
671
+ const createDecl = ast.declarations[0] as ObjectDeclaration
672
+ expect(createDecl).toEqual({
673
+ kind: 'ObjectDeclaration',
674
+ name: 'Main',
675
+ object: { kind: 'NamedObject', name: 'Number' },
676
+ })
677
+ const packageDecl = ast.declarations[1] as PackageDeclaration
678
+ expect(packageDecl).toEqual({
679
+ kind: 'PackageDeclaration',
680
+ packageType: 'EXECUTABLE',
681
+ name: 'myapp',
682
+ objectName: { kind: 'NamedObject', name: 'Main' },
683
+ })
684
+ })
685
+ })
463
686
  })