bonescript-compiler 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/dist/algorithm_catalog.js +166 -166
- package/dist/cli.d.ts +1 -2
- package/dist/cli.js +543 -75
- package/dist/cli.js.map +1 -1
- package/dist/emit_capability.d.ts +0 -13
- package/dist/emit_capability.js +134 -296
- package/dist/emit_capability.js.map +1 -1
- package/dist/emit_composition.js +3 -37
- package/dist/emit_composition.js.map +1 -1
- package/dist/emit_deploy.js +167 -165
- package/dist/emit_deploy.js.map +1 -1
- package/dist/emit_events.d.ts +0 -1
- package/dist/emit_events.js +275 -325
- package/dist/emit_events.js.map +1 -1
- package/dist/emit_extras.js +5 -3
- package/dist/emit_extras.js.map +1 -1
- package/dist/emit_full.js +112 -272
- package/dist/emit_full.js.map +1 -1
- package/dist/emit_maintenance.js +249 -249
- package/dist/emit_runtime.d.ts +11 -17
- package/dist/emit_runtime.js +688 -29
- package/dist/emit_runtime.js.map +1 -1
- package/dist/emit_sourcemap.js +66 -66
- package/dist/emit_tests.js +12 -47
- package/dist/emit_tests.js.map +1 -1
- package/dist/emit_websocket.js +3 -0
- package/dist/emit_websocket.js.map +1 -1
- package/dist/emitter.js +49 -94
- package/dist/emitter.js.map +1 -1
- package/dist/extension_manager.d.ts +2 -2
- package/dist/extension_manager.js +20 -9
- package/dist/extension_manager.js.map +1 -1
- package/dist/ir.d.ts +0 -4
- package/dist/lowering.d.ts +14 -5
- package/dist/lowering.js +417 -66
- package/dist/lowering.js.map +1 -1
- package/dist/module_loader.d.ts +2 -2
- package/dist/module_loader.js +23 -20
- package/dist/module_loader.js.map +1 -1
- package/dist/optimizer.js +3 -6
- package/dist/optimizer.js.map +1 -1
- package/dist/scaffold.d.ts +2 -2
- package/dist/scaffold.js +319 -315
- package/dist/scaffold.js.map +1 -1
- package/dist/solver.js +1 -1
- package/dist/solver.js.map +1 -1
- package/dist/source_map.js.map +1 -0
- package/dist/test.js.map +1 -0
- package/dist/test_typechecker.d.ts +5 -0
- package/dist/test_typechecker.js +126 -0
- package/dist/test_typechecker.js.map +1 -0
- package/dist/typechecker.d.ts +0 -7
- package/dist/typechecker.js +16 -103
- package/dist/typechecker.js.map +1 -1
- package/dist/verifier.d.ts +1 -5
- package/dist/verifier.js +38 -142
- package/dist/verifier.js.map +1 -1
- package/package.json +52 -62
- package/src/algorithm_catalog.ts +345 -345
- package/src/ast.d.ts +244 -0
- package/src/ast.ts +334 -334
- package/src/cli.ts +624 -98
- package/src/emit_batch.ts +140 -140
- package/src/emit_capability.ts +436 -613
- package/src/emit_composition.ts +196 -229
- package/src/emit_deploy.ts +190 -187
- package/src/emit_events.ts +307 -362
- package/src/emit_extras.ts +240 -237
- package/src/emit_full.ts +309 -472
- package/src/emit_maintenance.ts +459 -459
- package/src/emit_runtime.ts +730 -17
- package/src/emit_sourcemap.ts +140 -140
- package/src/emit_tests.ts +205 -243
- package/src/emit_websocket.ts +229 -226
- package/src/emitter.ts +578 -626
- package/src/extension_manager.ts +187 -177
- package/src/formatter.ts +297 -297
- package/src/index.ts +88 -88
- package/src/ir.ts +215 -216
- package/src/lexer.d.ts +195 -0
- package/src/lexer.ts +630 -630
- package/src/lowering.ts +556 -168
- package/src/module_loader.ts +114 -112
- package/src/optimizer.ts +196 -199
- package/src/parse_decls.d.ts +13 -0
- package/src/parse_decls.ts +409 -409
- package/src/parse_decls2.d.ts +13 -0
- package/src/parse_decls2.ts +244 -244
- package/src/parse_expr.d.ts +7 -0
- package/src/parse_expr.ts +197 -197
- package/src/parse_types.d.ts +6 -0
- package/src/parse_types.ts +54 -54
- package/src/parser.d.ts +10 -0
- package/src/parser.ts +1 -1
- package/src/parser_base.d.ts +19 -0
- package/src/parser_base.ts +57 -57
- package/src/parser_recovery.ts +153 -153
- package/src/scaffold.ts +375 -371
- package/src/solver.ts +330 -330
- package/src/typechecker.d.ts +52 -0
- package/src/typechecker.ts +591 -700
- package/src/types.d.ts +38 -0
- package/src/types.ts +122 -122
- package/src/verifier.ts +49 -154
- package/README.md +0 -382
- package/dist/commands/check.d.ts +0 -5
- package/dist/commands/check.js +0 -34
- package/dist/commands/check.js.map +0 -1
- package/dist/commands/compile.d.ts +0 -5
- package/dist/commands/compile.js +0 -215
- package/dist/commands/compile.js.map +0 -1
- package/dist/commands/debug.d.ts +0 -5
- package/dist/commands/debug.js +0 -59
- package/dist/commands/debug.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -5
- package/dist/commands/diff.js +0 -123
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/fmt.d.ts +0 -5
- package/dist/commands/fmt.js +0 -49
- package/dist/commands/fmt.js.map +0 -1
- package/dist/commands/init.d.ts +0 -5
- package/dist/commands/init.js +0 -96
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/ir.d.ts +0 -5
- package/dist/commands/ir.js +0 -27
- package/dist/commands/ir.js.map +0 -1
- package/dist/commands/lex.d.ts +0 -5
- package/dist/commands/lex.js +0 -21
- package/dist/commands/lex.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -5
- package/dist/commands/parse.js +0 -30
- package/dist/commands/parse.js.map +0 -1
- package/dist/commands/test.d.ts +0 -5
- package/dist/commands/test.js +0 -61
- package/dist/commands/test.js.map +0 -1
- package/dist/commands/verify_determinism.d.ts +0 -5
- package/dist/commands/verify_determinism.js +0 -64
- package/dist/commands/verify_determinism.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -5
- package/dist/commands/watch.js +0 -50
- package/dist/commands/watch.js.map +0 -1
- package/dist/emit_auth.d.ts +0 -18
- package/dist/emit_auth.js +0 -507
- package/dist/emit_auth.js.map +0 -1
- package/dist/emit_database.d.ts +0 -7
- package/dist/emit_database.js +0 -72
- package/dist/emit_database.js.map +0 -1
- package/dist/emit_index.d.ts +0 -6
- package/dist/emit_index.js +0 -202
- package/dist/emit_index.js.map +0 -1
- package/dist/emit_models.d.ts +0 -12
- package/dist/emit_models.js +0 -171
- package/dist/emit_models.js.map +0 -1
- package/dist/emit_openapi.d.ts +0 -9
- package/dist/emit_openapi.js +0 -306
- package/dist/emit_openapi.js.map +0 -1
- package/dist/emit_package.d.ts +0 -7
- package/dist/emit_package.js +0 -68
- package/dist/emit_package.js.map +0 -1
- package/dist/emit_router.d.ts +0 -12
- package/dist/emit_router.js +0 -389
- package/dist/emit_router.js.map +0 -1
- package/dist/lowering_channels.d.ts +0 -11
- package/dist/lowering_channels.js +0 -103
- package/dist/lowering_channels.js.map +0 -1
- package/dist/lowering_entities.d.ts +0 -11
- package/dist/lowering_entities.js +0 -232
- package/dist/lowering_entities.js.map +0 -1
- package/dist/lowering_helpers.d.ts +0 -13
- package/dist/lowering_helpers.js +0 -76
- package/dist/lowering_helpers.js.map +0 -1
- package/src/commands/check.ts +0 -33
- package/src/commands/compile.ts +0 -191
- package/src/commands/debug.ts +0 -33
- package/src/commands/diff.ts +0 -105
- package/src/commands/fmt.ts +0 -22
- package/src/commands/init.ts +0 -72
- package/src/commands/ir.ts +0 -23
- package/src/commands/lex.ts +0 -17
- package/src/commands/parse.ts +0 -24
- package/src/commands/test.ts +0 -36
- package/src/commands/verify_determinism.ts +0 -66
- package/src/commands/watch.ts +0 -25
- package/src/emit_auth.ts +0 -513
- package/src/emit_database.ts +0 -72
- package/src/emit_index.ts +0 -210
- package/src/emit_models.ts +0 -176
- package/src/emit_openapi.ts +0 -315
- package/src/emit_package.ts +0 -66
- package/src/emit_router.ts +0 -408
- package/src/lowering_channels.ts +0 -108
- package/src/lowering_entities.ts +0 -258
- package/src/lowering_helpers.ts +0 -75
package/README.md
DELETED
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
# bonescript-compiler
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/bonescript-compiler)
|
|
4
|
-
[](https://github.com/Doorman11991/BoneScript/blob/main/compiler/LICENSE)
|
|
5
|
-
[](https://www.npmjs.com/package/bonescript-compiler)
|
|
6
|
-
|
|
7
|
-
A declarative language that compiles system descriptions into complete, runnable Node.js backends. Write the bones, get the whole skeleton.
|
|
8
|
-
|
|
9
|
-
```bone
|
|
10
|
-
system Shop {
|
|
11
|
-
entity Product {
|
|
12
|
-
owns: [name: string, price: uint, stock: uint]
|
|
13
|
-
constraints: [price > 0, stock >= 0]
|
|
14
|
-
states: available -> sold_out | archived
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
capability purchase(buyer: User, product: Product, qty: uint) {
|
|
18
|
-
requires: [product.stock >= qty, buyer.balance >= product.price * qty]
|
|
19
|
-
effects: [product.stock -= qty, buyer.balance -= product.price * qty]
|
|
20
|
-
emits: OrderPlaced
|
|
21
|
-
sync: transactional
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
event OrderPlaced {
|
|
25
|
-
payload: { order_id: uuid, buyer_id: uuid, total: uint }
|
|
26
|
-
delivery: exactly_once
|
|
27
|
-
ttl: 90d
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Run `bonec compile shop.bone` and get back a complete Express API with PostgreSQL, auth middleware, state machine enforcement, transactional SQL, durable events, health checks, migrations, WebSocket support, a Dockerfile, and a GitHub Actions CI pipeline. No LLMs. Deterministic — same input always produces identical output.
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Install
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npm install -g bonescript-compiler
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Or run without installing:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
npx bonescript-compiler compile shop.bone
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Requires Node.js 18 or later.
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## Quick Start
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
# 1. Scaffold a new project
|
|
56
|
-
bonec init my-app --domain saas_platform
|
|
57
|
-
|
|
58
|
-
# 2. Compile
|
|
59
|
-
bonec compile my-app/my-app.bone
|
|
60
|
-
|
|
61
|
-
# 3. Configure
|
|
62
|
-
cp my-app/output/.env.example my-app/output/.env
|
|
63
|
-
# Edit .env — set JWT_SECRET, DATABASE_URL, etc.
|
|
64
|
-
|
|
65
|
-
# 4. Run
|
|
66
|
-
cd my-app/output
|
|
67
|
-
npm install
|
|
68
|
-
docker compose up -d # starts Postgres + Redis
|
|
69
|
-
npm run migrate
|
|
70
|
-
npm run dev
|
|
71
|
-
# → http://localhost:3000
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## What Gets Generated
|
|
77
|
-
|
|
78
|
-
From a single `.bone` file, the compiler produces a complete Node.js project:
|
|
79
|
-
|
|
80
|
-
```
|
|
81
|
-
output/
|
|
82
|
-
├── src/
|
|
83
|
-
│ ├── index.ts Express server, all routes wired
|
|
84
|
-
│ ├── db.ts Postgres connection pool
|
|
85
|
-
│ ├── auth.ts JWT / OAuth2 / API key middleware (domain-selected)
|
|
86
|
-
│ ├── events.ts Durable event bus (transactional outbox)
|
|
87
|
-
│ ├── publishers.ts Typed event publisher functions
|
|
88
|
-
│ ├── health.ts /health/live, /health/ready, /health/metrics
|
|
89
|
-
│ ├── logger.ts Structured JSON logging
|
|
90
|
-
│ ├── metrics.ts Prometheus-style counters/histograms
|
|
91
|
-
│ ├── failure_rules.ts Rule-based remediation
|
|
92
|
-
│ ├── flows.ts Saga runtime with backward compensation
|
|
93
|
-
│ ├── websocket.ts WebSocket server (if channels declared)
|
|
94
|
-
│ ├── channel_filters.ts Channel filter predicates (if filters declared)
|
|
95
|
-
│ ├── algorithms.ts Algorithm implementations (only what's used)
|
|
96
|
-
│ ├── extensions.ts Extension point stubs (preserved on recompile)
|
|
97
|
-
│ ├── routes/ One file per entity — CRUD + capabilities
|
|
98
|
-
│ ├── state_machines/ One file per entity with states
|
|
99
|
-
│ ├── models/ TypeScript interfaces + Zod validators
|
|
100
|
-
│ └── derived/ Derived field helpers (if derived fields declared)
|
|
101
|
-
├── migrations/ SQL schemas, indexes, triggers, FK constraints
|
|
102
|
-
│ ├── <entity>.sql
|
|
103
|
-
│ ├── event_outbox.sql
|
|
104
|
-
│ └── api_keys.sql (apikey auth domains only)
|
|
105
|
-
├── openapi.json OpenAPI 3.0 schema
|
|
106
|
-
├── Dockerfile
|
|
107
|
-
├── docker-compose.yaml Postgres + Redis for local dev
|
|
108
|
-
├── k8s/deployment.yaml Kubernetes deployment manifest
|
|
109
|
-
├── .github/workflows/ CI/CD pipeline
|
|
110
|
-
└── src/tests.ts Generated regression tests
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Language Features
|
|
116
|
-
|
|
117
|
-
### Entities
|
|
118
|
-
|
|
119
|
-
Stateful data objects with fields, constraints, state machines, and relations.
|
|
120
|
-
|
|
121
|
-
```bone
|
|
122
|
-
entity Order {
|
|
123
|
-
owns: [buyer_id: uuid, total: uint, status: string]
|
|
124
|
-
constraints: [total > 0, status in ["pending", "paid", "shipped"]]
|
|
125
|
-
states: pending -> paid -> shipped -> delivered | cancelled
|
|
126
|
-
relation buyer: belongs_to User
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
Auto-generated fields on every entity: `id: uuid`, `created_at: timestamp`, `updated_at: timestamp`.
|
|
131
|
-
|
|
132
|
-
### Capabilities
|
|
133
|
-
|
|
134
|
-
Named operations with preconditions, effects, and event emissions.
|
|
135
|
-
|
|
136
|
-
```bone
|
|
137
|
-
capability ship_order(seller: Seller, order: Order) {
|
|
138
|
-
requires: [order.status == "paid", order.seller_id == seller.id]
|
|
139
|
-
effects: [order.status = "shipped"]
|
|
140
|
-
emits: OrderShipped
|
|
141
|
-
sync: transactional
|
|
142
|
-
timeout: 10s
|
|
143
|
-
retry: { max_attempts: 3, backoff: exponential, interval: 1s }
|
|
144
|
-
}
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
`sync` modes: `transactional` (BEGIN/COMMIT), `eventual` (outbox), `realtime` (WebSocket broadcast), `batch` (queued).
|
|
148
|
-
|
|
149
|
-
### Events
|
|
150
|
-
|
|
151
|
-
Immutable records with delivery guarantees.
|
|
152
|
-
|
|
153
|
-
```bone
|
|
154
|
-
event OrderShipped {
|
|
155
|
-
payload: { order_id: uuid, shipped_at: timestamp }
|
|
156
|
-
delivery: exactly_once // transactional outbox + deduplication
|
|
157
|
-
ttl: 30d
|
|
158
|
-
}
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### Channels
|
|
162
|
-
|
|
163
|
-
Real-time WebSocket communication with optional filter predicates.
|
|
164
|
-
|
|
165
|
-
```bone
|
|
166
|
-
channel game_lobby {
|
|
167
|
-
transport: websocket
|
|
168
|
-
ordering: causal
|
|
169
|
-
participants: set<Player>
|
|
170
|
-
persistence: last_100
|
|
171
|
-
filter: event.room_id == participant.room_id
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Stores
|
|
176
|
-
|
|
177
|
-
Explicit persistence declarations that generate SQL migrations.
|
|
178
|
-
|
|
179
|
-
```bone
|
|
180
|
-
store AuditLog {
|
|
181
|
-
engine: postgresql
|
|
182
|
-
schema: {
|
|
183
|
-
actor_id: uuid,
|
|
184
|
-
action: string,
|
|
185
|
-
occurred_at: timestamp
|
|
186
|
-
}
|
|
187
|
-
retention: 90d
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
Supported engines: `postgresql`, `redis`.
|
|
192
|
-
|
|
193
|
-
### Pipelines
|
|
194
|
-
|
|
195
|
-
Multi-step operations with automatic rollback.
|
|
196
|
-
|
|
197
|
-
```bone
|
|
198
|
-
capability checkout(buyer: Buyer, cart: Cart) {
|
|
199
|
-
pipeline: {
|
|
200
|
-
validate_inventory(cart)
|
|
201
|
-
charge_payment(buyer, cart.total) as payment
|
|
202
|
-
create_order(buyer, cart, payment)
|
|
203
|
-
on_error: rollback
|
|
204
|
-
}
|
|
205
|
-
sync: transactional
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### Flows (Sagas)
|
|
210
|
-
|
|
211
|
-
Multi-service orchestration with backward compensation.
|
|
212
|
-
|
|
213
|
-
```bone
|
|
214
|
-
flow place_order {
|
|
215
|
-
step reserve: reserve_inventory(order)
|
|
216
|
-
compensate: release_inventory(order)
|
|
217
|
-
step charge: charge_buyer(order)
|
|
218
|
-
compensate: refund_buyer(order)
|
|
219
|
-
step notify: send_confirmation(order)
|
|
220
|
-
}
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
### Algorithms
|
|
224
|
-
|
|
225
|
-
Named implementations from a built-in catalog.
|
|
226
|
-
|
|
227
|
-
```bone
|
|
228
|
-
capability find_route(start: string, end: string) {
|
|
229
|
-
algorithm: shortest_path using { graph: road_network, source: start, target: end }
|
|
230
|
-
returns: json
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
Available: `shortest_path`, `topological_sort`, `binary_search`, `bipartite_matching`, `round_robin`, `weighted_average`, `percentile`, `rank_by`, `consistent_hash`.
|
|
235
|
-
|
|
236
|
-
### Extension Points
|
|
237
|
-
|
|
238
|
-
Escape hatches for custom logic that survive recompilation.
|
|
239
|
-
|
|
240
|
-
```bone
|
|
241
|
-
extension_point calculate_fee(order: Order) {
|
|
242
|
-
returns: uint
|
|
243
|
-
stable: true // compilation fails if not implemented
|
|
244
|
-
}
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## Auth Strategies
|
|
250
|
-
|
|
251
|
-
Selected automatically based on domain. Override with `auth:` on any entity.
|
|
252
|
-
|
|
253
|
-
| Strategy | Trigger | Generated code |
|
|
254
|
-
|----------|---------|----------------|
|
|
255
|
-
| `jwt` | default / `multiplayer_game` / `realtime_collaboration` | Bearer token middleware, `issueToken()` helper |
|
|
256
|
-
| `oauth2` | `saas_platform` / `marketplace` / `social_network` | Full Authorization Code + PKCE flow, `/auth/login`, `/auth/callback`, `/auth/refresh`, `/auth/logout` |
|
|
257
|
-
| `apikey` | `iot_system` | `X-API-Key` header, SHA-256 hashed keys, LRU cache, `/auth/keys` CRUD routes, `api_keys.sql` migration |
|
|
258
|
-
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
## Commands
|
|
262
|
-
|
|
263
|
-
| Command | Description |
|
|
264
|
-
|---------|-------------|
|
|
265
|
-
| `bonec compile <file>` | Full 7-stage compilation → runnable project |
|
|
266
|
-
| `bonec check <file>` | Validate without generating code |
|
|
267
|
-
| `bonec fmt <file>` | Format in place |
|
|
268
|
-
| `bonec watch <file>` | Recompile on save |
|
|
269
|
-
| `bonec init <name> --domain <d>` | Scaffold from a domain template |
|
|
270
|
-
| `bonec diff <old> <new>` | Show schema migration diff |
|
|
271
|
-
| `bonec test [output-dir]` | Run generated regression tests |
|
|
272
|
-
| `bonec debug <file>` | Generate source maps |
|
|
273
|
-
| `bonec ir <file>` | Print the IR as JSON |
|
|
274
|
-
| `bonec lex <file>` | Print the token stream |
|
|
275
|
-
| `bonec parse <file>` | Print the AST |
|
|
276
|
-
| `bonec verify-determinism <file>` | Confirm two compilations are identical |
|
|
277
|
-
|
|
278
|
-
### Domain Templates
|
|
279
|
-
|
|
280
|
-
`bonec init my-app --domain <name>`
|
|
281
|
-
|
|
282
|
-
| Domain | Auth | Sync |
|
|
283
|
-
|--------|------|------|
|
|
284
|
-
| `multiplayer_game` | JWT | realtime |
|
|
285
|
-
| `saas_platform` | OAuth2 | eventual |
|
|
286
|
-
| `iot_system` | API key | eventual |
|
|
287
|
-
| `social_network` | OAuth2 | eventual |
|
|
288
|
-
| `marketplace` | OAuth2 | transactional |
|
|
289
|
-
| `realtime_collaboration` | JWT | realtime |
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## Type Errors
|
|
294
|
-
|
|
295
|
-
The compiler reports structured errors with codes:
|
|
296
|
-
|
|
297
|
-
| Code | Meaning |
|
|
298
|
-
|------|---------|
|
|
299
|
-
| T001 | Undefined type reference |
|
|
300
|
-
| T003 | Type mismatch in assignment |
|
|
301
|
-
| T005 | Expression must type to bool |
|
|
302
|
-
| T006 | Undeclared parameter type |
|
|
303
|
-
| T008 | Invalid set/numeric operator |
|
|
304
|
-
| T009 | Duplicate field name |
|
|
305
|
-
| T010 | Undefined state in transition |
|
|
306
|
-
| T011 | Emitted event not declared |
|
|
307
|
-
| T012 | Flow has fewer than 2 steps |
|
|
308
|
-
| T013 | Entity name used as capability call |
|
|
309
|
-
| T014 | Unsupported store engine |
|
|
310
|
-
| T015 | Invalid policy value |
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
314
|
-
## Compilation Pipeline
|
|
315
|
-
|
|
316
|
-
Every stage is deterministic — same `.bone` file always produces bitwise-identical output.
|
|
317
|
-
|
|
318
|
-
```
|
|
319
|
-
.bone source
|
|
320
|
-
↓ Lex tokens
|
|
321
|
-
↓ Parse AST (with error recovery)
|
|
322
|
-
↓ Type Check validated AST + structured errors
|
|
323
|
-
↓ Lower Architecture IR
|
|
324
|
-
↓ Optimize dead module elimination, deduplication
|
|
325
|
-
↓ Solve constraint propagation → concrete decisions
|
|
326
|
-
↓ Emit TypeScript + SQL + YAML + JSON
|
|
327
|
-
↓ Verify IR consistency + generated code checks
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
---
|
|
331
|
-
|
|
332
|
-
## Programmatic API
|
|
333
|
-
|
|
334
|
-
```typescript
|
|
335
|
-
import { compile } from "bonescript-compiler";
|
|
336
|
-
|
|
337
|
-
const { files, errors, warnings } = await compile(`
|
|
338
|
-
system Shop {
|
|
339
|
-
entity Product { owns: [name: string, price: uint] }
|
|
340
|
-
}
|
|
341
|
-
`);
|
|
342
|
-
|
|
343
|
-
for (const file of files) {
|
|
344
|
-
console.log(file.path, file.language);
|
|
345
|
-
}
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
Individual pipeline stages are also exported:
|
|
349
|
-
|
|
350
|
-
```typescript
|
|
351
|
-
import {
|
|
352
|
-
Lexer, Parser, TypeChecker,
|
|
353
|
-
Lowering, optimize, ConstraintSolver,
|
|
354
|
-
FullEmitter, Verifier, Formatter,
|
|
355
|
-
scaffold, ModuleLoader,
|
|
356
|
-
} from "bonescript-compiler";
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
---
|
|
360
|
-
|
|
361
|
-
## VS Code Extension
|
|
362
|
-
|
|
363
|
-
Install from the repo:
|
|
364
|
-
|
|
365
|
-
```bash
|
|
366
|
-
.\install-extension.ps1
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
Features: real-time diagnostics, context-aware completions, hover docs, go-to-definition, document outline, signature help, quick fixes for all error codes, cross-file rename.
|
|
370
|
-
|
|
371
|
-
---
|
|
372
|
-
|
|
373
|
-
## Contributing
|
|
374
|
-
|
|
375
|
-
Issues and PRs welcome at [github.com/Doorman11991/BoneScript](https://github.com/Doorman11991/BoneScript).
|
|
376
|
-
|
|
377
|
-
```bash
|
|
378
|
-
cd compiler
|
|
379
|
-
npm test # run all tests
|
|
380
|
-
npm run test:jest:unit # lexer, parser, typechecker
|
|
381
|
-
npm run test:jest:integration # emitter, integration
|
|
382
|
-
```
|
package/dist/commands/check.d.ts
DELETED
package/dist/commands/check.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* bonec check <file>
|
|
4
|
-
* Lex + parse + type check without code generation.
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.runCheck = void 0;
|
|
8
|
-
const lexer_1 = require("../lexer");
|
|
9
|
-
const parser_recovery_1 = require("../parser_recovery");
|
|
10
|
-
const typechecker_1 = require("../typechecker");
|
|
11
|
-
function runCheck(source) {
|
|
12
|
-
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
13
|
-
const result = new parser_recovery_1.RecoveringParser(tokens).parse();
|
|
14
|
-
let totalErrors = 0;
|
|
15
|
-
for (const e of result.errors) {
|
|
16
|
-
console.error(` parse: ${e.message}`);
|
|
17
|
-
totalErrors++;
|
|
18
|
-
}
|
|
19
|
-
if (result.ast) {
|
|
20
|
-
for (const err of new typechecker_1.TypeChecker().check(result.ast)) {
|
|
21
|
-
console.error(` type: ${err.code} at ${err.loc.line}:${err.loc.column}: ${err.message}`);
|
|
22
|
-
totalErrors++;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
if (totalErrors === 0) {
|
|
26
|
-
console.log("v Check passed (0 errors)");
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
console.log(`x ${totalErrors} error(s) found.`);
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
exports.runCheck = runCheck;
|
|
34
|
-
//# sourceMappingURL=check.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,oCAAiC;AACjC,wDAAsD;AACtD,gDAA6C;AAE7C,SAAgB,QAAQ,CAAC,MAAc;IACrC,MAAM,MAAM,GAAG,IAAI,aAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,kCAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IACpD,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,KAAK,MAAM,GAAG,IAAI,IAAI,yBAAW,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3F,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,kBAAkB,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAvBD,4BAuBC"}
|
package/dist/commands/compile.js
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* bonec compile <file>
|
|
4
|
-
* Full 7-stage compilation pipeline → runnable project.
|
|
5
|
-
*/
|
|
6
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
-
if (k2 === undefined) k2 = k;
|
|
8
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
-
}
|
|
12
|
-
Object.defineProperty(o, k2, desc);
|
|
13
|
-
}) : (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
o[k2] = m[k];
|
|
16
|
-
}));
|
|
17
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
23
|
-
if (mod && mod.__esModule) return mod;
|
|
24
|
-
var result = {};
|
|
25
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
26
|
-
__setModuleDefault(result, mod);
|
|
27
|
-
return result;
|
|
28
|
-
};
|
|
29
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.runCompile = void 0;
|
|
31
|
-
const fs = __importStar(require("fs"));
|
|
32
|
-
const path = __importStar(require("path"));
|
|
33
|
-
const crypto_1 = require("crypto");
|
|
34
|
-
const lexer_1 = require("../lexer");
|
|
35
|
-
const typechecker_1 = require("../typechecker");
|
|
36
|
-
const lowering_1 = require("../lowering");
|
|
37
|
-
const solver_1 = require("../solver");
|
|
38
|
-
const emit_full_1 = require("../emit_full");
|
|
39
|
-
const verifier_1 = require("../verifier");
|
|
40
|
-
const module_loader_1 = require("../module_loader");
|
|
41
|
-
const extension_manager_1 = require("../extension_manager");
|
|
42
|
-
const optimizer_1 = require("../optimizer");
|
|
43
|
-
async function runCompile(source, resolved) {
|
|
44
|
-
try {
|
|
45
|
-
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
46
|
-
console.log(` [1/7] Lexed: ${tokens.length} tokens`);
|
|
47
|
-
const loader = new module_loader_1.ModuleLoader();
|
|
48
|
-
const loadResult = await loader.load(resolved);
|
|
49
|
-
if (loadResult.errors.length > 0) {
|
|
50
|
-
console.log(` [2/7] Parse: ${loadResult.errors.length} error(s)`);
|
|
51
|
-
for (const e of loadResult.errors.slice(0, 10)) {
|
|
52
|
-
console.log(` ${path.basename(e.file)}: ${e.error.message}`);
|
|
53
|
-
}
|
|
54
|
-
if (!loadResult.ast)
|
|
55
|
-
process.exit(1);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
const sysCount = loadResult.ast?.systems.length || 0;
|
|
59
|
-
console.log(` [2/7] Parsed: ${sysCount} system(s) from ${loadResult.loadedFiles.length} file(s)`);
|
|
60
|
-
}
|
|
61
|
-
const ast = loadResult.ast;
|
|
62
|
-
for (const sys of ast.systems) {
|
|
63
|
-
console.log(` System '${sys.name}':`);
|
|
64
|
-
const counts = {};
|
|
65
|
-
for (const d of sys.declarations)
|
|
66
|
-
counts[d.kind] = (counts[d.kind] || 0) + 1;
|
|
67
|
-
for (const [kind, count] of Object.entries(counts)) {
|
|
68
|
-
console.log(` ${kind}: ${count}`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
// Stage 3: Type Check
|
|
72
|
-
const typeErrors = new typechecker_1.TypeChecker().check(ast);
|
|
73
|
-
if (typeErrors.length > 0) {
|
|
74
|
-
console.log(` [3/7] Type check: ${typeErrors.length} error(s)`);
|
|
75
|
-
for (const err of typeErrors) {
|
|
76
|
-
console.log(` ${err.code} at ${err.loc.line}:${err.loc.column}: ${err.message}`);
|
|
77
|
-
}
|
|
78
|
-
process.exit(1);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
console.log(` [3/7] Type check: v (0 errors)`);
|
|
82
|
-
}
|
|
83
|
-
// Stage 4: Lower to IR
|
|
84
|
-
const sourceHash = (0, crypto_1.createHash)("sha256").update(source).digest("hex").slice(0, 16);
|
|
85
|
-
const irSystems = new lowering_1.Lowering().lower(ast, sourceHash);
|
|
86
|
-
const totalModules = irSystems.reduce((sum, s) => sum + s.modules.length, 0);
|
|
87
|
-
const totalEvents = irSystems.reduce((sum, s) => sum + s.events.length, 0);
|
|
88
|
-
const totalFlows = irSystems.reduce((sum, s) => sum + s.flows.length, 0);
|
|
89
|
-
console.log(` [4/7] Lower to IR: ${totalModules} modules, ${totalEvents} events, ${totalFlows} flows`);
|
|
90
|
-
for (const sys of irSystems) {
|
|
91
|
-
for (const mod of sys.modules) {
|
|
92
|
-
const methodCount = mod.interfaces.reduce((s, i) => s + i.methods.length, 0);
|
|
93
|
-
console.log(` ${mod.kind.padEnd(16)} ${mod.name.padEnd(24)} (${methodCount} methods, ${mod.models.length} models)`);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Stage 4.5: IR Optimization
|
|
97
|
-
for (let i = 0; i < irSystems.length; i++) {
|
|
98
|
-
const result = (0, optimizer_1.optimize)(irSystems[i]);
|
|
99
|
-
irSystems[i] = result.system;
|
|
100
|
-
if (result.log.length > 0) {
|
|
101
|
-
console.log(` [4.5] IR optimize: ${result.modulesRemoved} modules removed, ${result.eventsDeduped} events deduped, ${result.depsRemoved} deps minimized`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// Stage 5: Constraint Solve
|
|
105
|
-
const solver = new solver_1.ConstraintSolver();
|
|
106
|
-
let totalResolved = 0;
|
|
107
|
-
let solverFailed = false;
|
|
108
|
-
for (const sys of irSystems) {
|
|
109
|
-
const result = solver.solve(sys);
|
|
110
|
-
sys.resolution = result.resolution;
|
|
111
|
-
totalResolved += Object.keys(result.resolution).length;
|
|
112
|
-
if (result.errors.length > 0) {
|
|
113
|
-
solverFailed = true;
|
|
114
|
-
console.log(` [5/7] Constraint solve: ${result.errors.length} error(s)`);
|
|
115
|
-
for (const err of result.errors)
|
|
116
|
-
console.log(` x ${err}`);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
console.log(` [5/7] Constraint solve: v (${totalResolved} resolved, ${result.assumptions.length} assumptions)`);
|
|
120
|
-
for (const a of result.assumptions.slice(0, 5))
|
|
121
|
-
console.log(` ${a}`);
|
|
122
|
-
if (result.assumptions.length > 5)
|
|
123
|
-
console.log(` ... and ${result.assumptions.length - 5} more`);
|
|
124
|
-
}
|
|
125
|
-
// Back-propagate resolved values into module configs so emitters pick them up.
|
|
126
|
-
// The solver resolves keys like "APIGateway.rate_limit" → write back to mod.config.
|
|
127
|
-
for (const mod of sys.modules) {
|
|
128
|
-
for (const [key, value] of Object.entries(result.resolution)) {
|
|
129
|
-
const prefix = `${mod.name}.`;
|
|
130
|
-
if (key.startsWith(prefix)) {
|
|
131
|
-
const prop = key.slice(prefix.length);
|
|
132
|
-
// Only overwrite if the module config doesn't already have an explicit value
|
|
133
|
-
if (mod.config[prop] === undefined || mod.config[prop] === null) {
|
|
134
|
-
const numVal = Number(value);
|
|
135
|
-
mod.config[prop] = isNaN(numVal) ? value : numVal;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (solverFailed)
|
|
142
|
-
process.exit(1);
|
|
143
|
-
// Stage 6: Code Emit
|
|
144
|
-
const emitter = new emit_full_1.FullEmitter();
|
|
145
|
-
const allFiles = [];
|
|
146
|
-
for (const sys of irSystems)
|
|
147
|
-
allFiles.push(...emitter.emit(sys));
|
|
148
|
-
console.log(` [6/7] Code emit: ${allFiles.length} files generated`);
|
|
149
|
-
const byLang = {};
|
|
150
|
-
for (const f of allFiles)
|
|
151
|
-
byLang[f.language] = (byLang[f.language] || 0) + 1;
|
|
152
|
-
for (const [lang, count] of Object.entries(byLang)) {
|
|
153
|
-
console.log(` ${lang}: ${count} file(s)`);
|
|
154
|
-
}
|
|
155
|
-
// Stage 7: Verify — check ALL systems, not just the first
|
|
156
|
-
let verifyFailed = false;
|
|
157
|
-
let totalVerifyErrors = 0;
|
|
158
|
-
let totalVerifyWarnings = 0;
|
|
159
|
-
for (const sys of irSystems) {
|
|
160
|
-
const verifyResult = new verifier_1.Verifier().verify(sys, allFiles);
|
|
161
|
-
const errCount = verifyResult.issues.filter(i => i.severity === "error").length;
|
|
162
|
-
const warnCount = verifyResult.issues.filter(i => i.severity === "warning").length;
|
|
163
|
-
totalVerifyErrors += errCount;
|
|
164
|
-
totalVerifyWarnings += warnCount;
|
|
165
|
-
if (!verifyResult.passed)
|
|
166
|
-
verifyFailed = true;
|
|
167
|
-
for (const issue of verifyResult.issues.slice(0, 10)) {
|
|
168
|
-
console.log(` ${issue.severity === "error" ? "x" : "!"} ${issue.code}: ${issue.message}`);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
if (verifyFailed) {
|
|
172
|
-
console.log(` [7/7] Verify: FAILED (${totalVerifyErrors} errors, ${totalVerifyWarnings} warnings)`);
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
console.log(` [7/7] Verify: v (${allFiles.length} files, ${totalVerifyWarnings} warnings)`);
|
|
176
|
-
}
|
|
177
|
-
// Abort before writing output if verification failed
|
|
178
|
-
if (verifyFailed)
|
|
179
|
-
process.exit(1);
|
|
180
|
-
// Write output — all writes in parallel per directory
|
|
181
|
-
const outputDir = path.resolve(path.dirname(resolved), "output");
|
|
182
|
-
const allExtensions = irSystems.flatMap(s => s.extension_points || []);
|
|
183
|
-
const extensionErrors = [];
|
|
184
|
-
// Collect unique directories and create them all first
|
|
185
|
-
const dirs = new Set(allFiles.map(f => path.dirname(path.join(outputDir, f.path))));
|
|
186
|
-
await Promise.all([...dirs].map(dir => fs.promises.mkdir(dir, { recursive: true })));
|
|
187
|
-
// Write all files (extensions.ts merged, rest written directly)
|
|
188
|
-
await Promise.all(allFiles.map(async (f) => {
|
|
189
|
-
const outPath = path.join(outputDir, f.path);
|
|
190
|
-
if (f.path === "src/extensions.ts" && allExtensions.length > 0) {
|
|
191
|
-
const astExtensions = ast.systems.flatMap(s => s.declarations.filter((d) => d.kind === "ExtensionPointDecl"));
|
|
192
|
-
const { content, validationErrors } = await (0, extension_manager_1.mergeWithExisting)(f.content, outPath, astExtensions);
|
|
193
|
-
for (const e of validationErrors)
|
|
194
|
-
extensionErrors.push(e.message);
|
|
195
|
-
await fs.promises.writeFile(outPath, content, "utf-8");
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
await fs.promises.writeFile(outPath, f.content, "utf-8");
|
|
199
|
-
}
|
|
200
|
-
}));
|
|
201
|
-
if (extensionErrors.length > 0) {
|
|
202
|
-
console.log(`\n Extension point errors:`);
|
|
203
|
-
for (const e of extensionErrors)
|
|
204
|
-
console.log(` x ${e}`);
|
|
205
|
-
process.exit(1);
|
|
206
|
-
}
|
|
207
|
-
console.log(`\nv Compilation complete. ${allFiles.length} files written to output/`);
|
|
208
|
-
}
|
|
209
|
-
catch (e) {
|
|
210
|
-
console.error(`x ${e.message}`);
|
|
211
|
-
process.exit(1);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
exports.runCompile = runCompile;
|
|
215
|
-
//# sourceMappingURL=compile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
|