bonescript-compiler 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/algorithm_catalog.d.ts +32 -0
- package/dist/algorithm_catalog.js +323 -0
- package/dist/algorithm_catalog.js.map +1 -0
- package/dist/ast.d.ts +244 -0
- package/dist/ast.js +8 -0
- package/dist/ast.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +605 -0
- package/dist/cli.js.map +1 -0
- package/dist/emit_batch.d.ts +7 -0
- package/dist/emit_batch.js +133 -0
- package/dist/emit_batch.js.map +1 -0
- package/dist/emit_capability.d.ts +7 -0
- package/dist/emit_capability.js +376 -0
- package/dist/emit_capability.js.map +1 -0
- package/dist/emit_composition.d.ts +22 -0
- package/dist/emit_composition.js +184 -0
- package/dist/emit_composition.js.map +1 -0
- package/dist/emit_deploy.d.ts +9 -0
- package/dist/emit_deploy.js +191 -0
- package/dist/emit_deploy.js.map +1 -0
- package/dist/emit_events.d.ts +14 -0
- package/dist/emit_events.js +305 -0
- package/dist/emit_events.js.map +1 -0
- package/dist/emit_extras.d.ts +12 -0
- package/dist/emit_extras.js +234 -0
- package/dist/emit_extras.js.map +1 -0
- package/dist/emit_full.d.ts +13 -0
- package/dist/emit_full.js +273 -0
- package/dist/emit_full.js.map +1 -0
- package/dist/emit_maintenance.d.ts +16 -0
- package/dist/emit_maintenance.js +442 -0
- package/dist/emit_maintenance.js.map +1 -0
- package/dist/emit_runtime.d.ts +13 -0
- package/dist/emit_runtime.js +691 -0
- package/dist/emit_runtime.js.map +1 -0
- package/dist/emit_sourcemap.d.ts +29 -0
- package/dist/emit_sourcemap.js +123 -0
- package/dist/emit_sourcemap.js.map +1 -0
- package/dist/emit_tests.d.ts +15 -0
- package/dist/emit_tests.js +185 -0
- package/dist/emit_tests.js.map +1 -0
- package/dist/emit_websocket.d.ts +6 -0
- package/dist/emit_websocket.js +223 -0
- package/dist/emit_websocket.js.map +1 -0
- package/dist/emitter.d.ts +25 -0
- package/dist/emitter.js +511 -0
- package/dist/emitter.js.map +1 -0
- package/dist/extension_manager.d.ts +38 -0
- package/dist/extension_manager.js +170 -0
- package/dist/extension_manager.js.map +1 -0
- package/dist/formatter.d.ts +34 -0
- package/dist/formatter.js +317 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +113 -0
- package/dist/index.js.map +1 -0
- package/dist/ir.d.ts +168 -0
- package/dist/ir.js +10 -0
- package/dist/ir.js.map +1 -0
- package/dist/lexer.d.ts +195 -0
- package/dist/lexer.js +619 -0
- package/dist/lexer.js.map +1 -0
- package/dist/lowering.d.ts +25 -0
- package/dist/lowering.js +500 -0
- package/dist/lowering.js.map +1 -0
- package/dist/module_loader.d.ts +25 -0
- package/dist/module_loader.js +126 -0
- package/dist/module_loader.js.map +1 -0
- package/dist/optimizer.d.ts +26 -0
- package/dist/optimizer.js +158 -0
- package/dist/optimizer.js.map +1 -0
- package/dist/parse_decls.d.ts +13 -0
- package/dist/parse_decls.js +442 -0
- package/dist/parse_decls.js.map +1 -0
- package/dist/parse_decls2.d.ts +13 -0
- package/dist/parse_decls2.js +295 -0
- package/dist/parse_decls2.js.map +1 -0
- package/dist/parse_expr.d.ts +7 -0
- package/dist/parse_expr.js +197 -0
- package/dist/parse_expr.js.map +1 -0
- package/dist/parse_types.d.ts +6 -0
- package/dist/parse_types.js +51 -0
- package/dist/parse_types.js.map +1 -0
- package/dist/parser.d.ts +10 -0
- package/dist/parser.js +62 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser_base.d.ts +19 -0
- package/dist/parser_base.js +50 -0
- package/dist/parser_base.js.map +1 -0
- package/dist/parser_recovery.d.ts +26 -0
- package/dist/parser_recovery.js +140 -0
- package/dist/parser_recovery.js.map +1 -0
- package/dist/scaffold.d.ts +13 -0
- package/dist/scaffold.js +376 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/solver.d.ts +26 -0
- package/dist/solver.js +281 -0
- package/dist/solver.js.map +1 -0
- package/dist/typechecker.d.ts +52 -0
- package/dist/typechecker.js +534 -0
- package/dist/typechecker.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.js +85 -0
- package/dist/types.js.map +1 -0
- package/dist/verifier.d.ts +46 -0
- package/dist/verifier.js +307 -0
- package/dist/verifier.js.map +1 -0
- package/package.json +52 -0
- package/src/algorithm_catalog.ts +345 -0
- package/src/ast.ts +334 -0
- package/src/cli.ts +624 -0
- package/src/emit_batch.ts +140 -0
- package/src/emit_capability.ts +436 -0
- package/src/emit_composition.ts +196 -0
- package/src/emit_deploy.ts +190 -0
- package/src/emit_events.ts +307 -0
- package/src/emit_extras.ts +240 -0
- package/src/emit_full.ts +309 -0
- package/src/emit_maintenance.ts +459 -0
- package/src/emit_runtime.ts +731 -0
- package/src/emit_sourcemap.ts +140 -0
- package/src/emit_tests.ts +205 -0
- package/src/emit_websocket.ts +229 -0
- package/src/emitter.ts +566 -0
- package/src/extension_manager.ts +187 -0
- package/src/formatter.ts +297 -0
- package/src/index.ts +88 -0
- package/src/ir.ts +215 -0
- package/src/lexer.ts +630 -0
- package/src/lowering.ts +556 -0
- package/src/module_loader.ts +114 -0
- package/src/optimizer.ts +196 -0
- package/src/parse_decls.ts +409 -0
- package/src/parse_decls2.ts +244 -0
- package/src/parse_expr.ts +197 -0
- package/src/parse_types.ts +54 -0
- package/src/parser.ts +64 -0
- package/src/parser_base.ts +57 -0
- package/src/parser_recovery.ts +153 -0
- package/src/scaffold.ts +375 -0
- package/src/solver.ts +330 -0
- package/src/typechecker.ts +591 -0
- package/src/types.ts +122 -0
- package/src/verifier.ts +348 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BoneScript Durable Event System Emitter
|
|
4
|
+
*
|
|
5
|
+
* Generates two event delivery modes:
|
|
6
|
+
* in_process — default dev mode, in-memory bus (existing behavior)
|
|
7
|
+
* durable — Postgres-backed transactional outbox
|
|
8
|
+
*
|
|
9
|
+
* Durable mode guarantees:
|
|
10
|
+
* at_least_once — retry until acknowledged
|
|
11
|
+
* exactly_once — deduplicated via event_id table
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.emitDurableEventBus = exports.emitOutboxSchema = void 0;
|
|
15
|
+
// ─── Outbox SQL Schema ────────────────────────────────────────────────────────
|
|
16
|
+
function emitOutboxSchema() {
|
|
17
|
+
return `-- BoneScript: Transactional Outbox Schema
|
|
18
|
+
-- Generated by BoneScript compiler. DO NOT EDIT.
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS event_outbox (
|
|
21
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
22
|
+
event_type VARCHAR NOT NULL,
|
|
23
|
+
payload JSONB NOT NULL,
|
|
24
|
+
source VARCHAR NOT NULL,
|
|
25
|
+
correlation_id UUID,
|
|
26
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
27
|
+
scheduled_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
28
|
+
delivered_at TIMESTAMPTZ,
|
|
29
|
+
attempts INT NOT NULL DEFAULT 0,
|
|
30
|
+
last_error TEXT,
|
|
31
|
+
status VARCHAR NOT NULL DEFAULT 'pending'
|
|
32
|
+
CHECK (status IN ('pending', 'delivered', 'failed', 'dead_letter'))
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_event_outbox_status ON event_outbox (status, scheduled_at)
|
|
36
|
+
WHERE status = 'pending';
|
|
37
|
+
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_event_outbox_created ON event_outbox (created_at);
|
|
39
|
+
|
|
40
|
+
-- Deduplication table for exactly_once delivery
|
|
41
|
+
CREATE TABLE IF NOT EXISTS event_processed (
|
|
42
|
+
event_id UUID PRIMARY KEY,
|
|
43
|
+
event_type VARCHAR NOT NULL,
|
|
44
|
+
processed_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_event_processed_type ON event_processed (event_type, processed_at);
|
|
48
|
+
`;
|
|
49
|
+
}
|
|
50
|
+
exports.emitOutboxSchema = emitOutboxSchema;
|
|
51
|
+
// ─── Durable Event Bus ────────────────────────────────────────────────────────
|
|
52
|
+
function emitDurableEventBus(system) {
|
|
53
|
+
const exactlyOnceEvents = system.events
|
|
54
|
+
.filter(e => e.delivery === "exactly_once")
|
|
55
|
+
.map(e => `"${e.name}"`);
|
|
56
|
+
const atLeastOnceEvents = system.events
|
|
57
|
+
.filter(e => e.delivery === "at_least_once")
|
|
58
|
+
.map(e => `"${e.name}"`);
|
|
59
|
+
return `// Generated by BoneScript compiler. DO NOT EDIT.
|
|
60
|
+
// Durable event bus with transactional outbox pattern.
|
|
61
|
+
// Set EVENT_MODE=durable in .env to enable.
|
|
62
|
+
|
|
63
|
+
import { Pool, PoolClient } from "pg";
|
|
64
|
+
import { v4 as uuid } from "uuid";
|
|
65
|
+
import { pool } from "./db";
|
|
66
|
+
import { logger } from "./logger";
|
|
67
|
+
import { counter } from "./metrics";
|
|
68
|
+
|
|
69
|
+
export type EventDeliveryMode = "in_process" | "durable";
|
|
70
|
+
|
|
71
|
+
const MODE: EventDeliveryMode =
|
|
72
|
+
(process.env.EVENT_MODE as EventDeliveryMode) || "in_process";
|
|
73
|
+
|
|
74
|
+
// Events requiring exactly_once delivery (deduplicated)
|
|
75
|
+
const EXACTLY_ONCE_EVENTS = new Set([${exactlyOnceEvents.join(", ")}]);
|
|
76
|
+
|
|
77
|
+
// Events requiring at_least_once delivery (retried until ack)
|
|
78
|
+
const AT_LEAST_ONCE_EVENTS = new Set([${atLeastOnceEvents.join(", ")}]);
|
|
79
|
+
|
|
80
|
+
export interface EventMetadata {
|
|
81
|
+
source: string;
|
|
82
|
+
timestamp: Date;
|
|
83
|
+
correlation_id: string;
|
|
84
|
+
causation_id: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface SystemEvent {
|
|
88
|
+
type: string;
|
|
89
|
+
payload: Record<string, unknown>;
|
|
90
|
+
metadata: EventMetadata;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
type Handler = (event: SystemEvent) => Promise<void>;
|
|
94
|
+
|
|
95
|
+
// ─── In-Process Bus ──────────────────────────────────────────────────────────
|
|
96
|
+
|
|
97
|
+
class InProcessBus {
|
|
98
|
+
private handlers: Map<string, Handler[]> = new Map();
|
|
99
|
+
|
|
100
|
+
subscribe(type: string, handler: Handler): void {
|
|
101
|
+
const existing = this.handlers.get(type) || [];
|
|
102
|
+
existing.push(handler);
|
|
103
|
+
this.handlers.set(type, existing);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async publish(type: string, payload: Record<string, unknown>, source: string, correlationId?: string): Promise<void> {
|
|
107
|
+
const event: SystemEvent = {
|
|
108
|
+
type,
|
|
109
|
+
payload,
|
|
110
|
+
metadata: {
|
|
111
|
+
source,
|
|
112
|
+
timestamp: new Date(),
|
|
113
|
+
correlation_id: correlationId || uuid(),
|
|
114
|
+
causation_id: uuid(),
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
counter("event.published", { type, mode: "in_process" });
|
|
118
|
+
const handlers = this.handlers.get(type) || [];
|
|
119
|
+
for (const handler of handlers) {
|
|
120
|
+
try {
|
|
121
|
+
await handler(event);
|
|
122
|
+
counter("event.delivered", { type, mode: "in_process" });
|
|
123
|
+
} catch (e: any) {
|
|
124
|
+
counter("event.delivery_failed", { type, mode: "in_process" });
|
|
125
|
+
logger.error("event_handler_failed", { event: type, metadata: { error: e.message } });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ─── Durable Bus (Transactional Outbox) ──────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
class DurableBus {
|
|
134
|
+
private handlers: Map<string, Handler[]> = new Map();
|
|
135
|
+
|
|
136
|
+
subscribe(type: string, handler: Handler): void {
|
|
137
|
+
const existing = this.handlers.get(type) || [];
|
|
138
|
+
existing.push(handler);
|
|
139
|
+
this.handlers.set(type, existing);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Write event to outbox within the current transaction (or a new one)
|
|
143
|
+
async publish(
|
|
144
|
+
type: string,
|
|
145
|
+
payload: Record<string, unknown>,
|
|
146
|
+
source: string,
|
|
147
|
+
correlationId?: string,
|
|
148
|
+
client?: PoolClient
|
|
149
|
+
): Promise<void> {
|
|
150
|
+
const eventId = uuid();
|
|
151
|
+
const corrId = correlationId || uuid();
|
|
152
|
+
const sql = \`
|
|
153
|
+
INSERT INTO event_outbox (id, event_type, payload, source, correlation_id)
|
|
154
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
155
|
+
\`;
|
|
156
|
+
const params = [eventId, type, JSON.stringify({ ...payload, _event_id: eventId }), source, corrId];
|
|
157
|
+
|
|
158
|
+
if (client) {
|
|
159
|
+
// Write within caller's transaction — atomicity guaranteed
|
|
160
|
+
await client.query(sql, params);
|
|
161
|
+
} else {
|
|
162
|
+
await pool.query(sql, params);
|
|
163
|
+
}
|
|
164
|
+
counter("event.outboxed", { type });
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Called by the background worker
|
|
168
|
+
async flush(): Promise<void> {
|
|
169
|
+
const client = await pool.connect();
|
|
170
|
+
try {
|
|
171
|
+
await client.query("BEGIN");
|
|
172
|
+
|
|
173
|
+
// Fetch pending events (lock rows to prevent concurrent processing)
|
|
174
|
+
const { rows } = await client.query(\`
|
|
175
|
+
SELECT id, event_type, payload, source, correlation_id, attempts
|
|
176
|
+
FROM event_outbox
|
|
177
|
+
WHERE status = 'pending' AND scheduled_at <= NOW()
|
|
178
|
+
ORDER BY scheduled_at ASC
|
|
179
|
+
LIMIT 50
|
|
180
|
+
FOR UPDATE SKIP LOCKED
|
|
181
|
+
\`);
|
|
182
|
+
|
|
183
|
+
for (const row of rows) {
|
|
184
|
+
try {
|
|
185
|
+
// exactly_once: check deduplication table
|
|
186
|
+
if (EXACTLY_ONCE_EVENTS.has(row.event_type)) {
|
|
187
|
+
const { rows: dup } = await client.query(
|
|
188
|
+
"SELECT 1 FROM event_processed WHERE event_id = $1",
|
|
189
|
+
[row.payload._event_id || row.id]
|
|
190
|
+
);
|
|
191
|
+
if (dup.length > 0) {
|
|
192
|
+
await client.query(
|
|
193
|
+
"UPDATE event_outbox SET status = 'delivered', delivered_at = NOW() WHERE id = $1",
|
|
194
|
+
[row.id]
|
|
195
|
+
);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const event: SystemEvent = {
|
|
201
|
+
type: row.event_type,
|
|
202
|
+
payload: row.payload,
|
|
203
|
+
metadata: {
|
|
204
|
+
source: row.source,
|
|
205
|
+
timestamp: new Date(),
|
|
206
|
+
correlation_id: row.correlation_id,
|
|
207
|
+
causation_id: uuid(),
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const handlers = this.handlers.get(row.event_type) || [];
|
|
212
|
+
for (const handler of handlers) {
|
|
213
|
+
await handler(event);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Mark delivered
|
|
217
|
+
await client.query(
|
|
218
|
+
"UPDATE event_outbox SET status = 'delivered', delivered_at = NOW(), attempts = attempts + 1 WHERE id = $1",
|
|
219
|
+
[row.id]
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
// Record for exactly_once deduplication
|
|
223
|
+
if (EXACTLY_ONCE_EVENTS.has(row.event_type)) {
|
|
224
|
+
await client.query(
|
|
225
|
+
"INSERT INTO event_processed (event_id, event_type) VALUES ($1, $2) ON CONFLICT DO NOTHING",
|
|
226
|
+
[row.payload._event_id || row.id, row.event_type]
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
counter("event.delivered", { type: row.event_type, mode: "durable" });
|
|
231
|
+
} catch (e: any) {
|
|
232
|
+
const maxAttempts = AT_LEAST_ONCE_EVENTS.has(row.event_type) ? 10 : 3;
|
|
233
|
+
const newAttempts = row.attempts + 1;
|
|
234
|
+
const status = newAttempts >= maxAttempts ? "dead_letter" : "pending";
|
|
235
|
+
const backoffMs = Math.min(1000 * Math.pow(2, newAttempts), 300000);
|
|
236
|
+
await client.query(
|
|
237
|
+
\`UPDATE event_outbox
|
|
238
|
+
SET attempts = $1, last_error = $2, status = $3,
|
|
239
|
+
scheduled_at = NOW() + ($4 || ' milliseconds')::interval
|
|
240
|
+
WHERE id = $5\`,
|
|
241
|
+
[newAttempts, e.message, status, backoffMs, row.id]
|
|
242
|
+
);
|
|
243
|
+
counter("event.delivery_failed", { type: row.event_type, mode: "durable" });
|
|
244
|
+
logger.error("event_delivery_failed", { event: row.event_type, metadata: { error: e.message, attempts: newAttempts } });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
await client.query("COMMIT");
|
|
249
|
+
} catch (e) {
|
|
250
|
+
await client.query("ROLLBACK");
|
|
251
|
+
throw e;
|
|
252
|
+
} finally {
|
|
253
|
+
client.release();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Start background worker
|
|
258
|
+
startWorker(intervalMs: number = 1000): NodeJS.Timeout {
|
|
259
|
+
logger.info("event_worker_started", { event: "startup", metadata: { interval_ms: intervalMs } });
|
|
260
|
+
return setInterval(async () => {
|
|
261
|
+
try {
|
|
262
|
+
await this.flush();
|
|
263
|
+
} catch (e: any) {
|
|
264
|
+
logger.error("event_worker_error", { event: "flush_failed", metadata: { error: e.message } });
|
|
265
|
+
}
|
|
266
|
+
}, intervalMs);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ─── Unified Interface ────────────────────────────────────────────────────────
|
|
271
|
+
|
|
272
|
+
const inProcess = new InProcessBus();
|
|
273
|
+
const durable = new DurableBus();
|
|
274
|
+
|
|
275
|
+
export const eventBus = {
|
|
276
|
+
subscribe(type: string, handler: Handler): void {
|
|
277
|
+
inProcess.subscribe(type, handler);
|
|
278
|
+
durable.subscribe(type, handler);
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
async publish(
|
|
282
|
+
type: string,
|
|
283
|
+
payload: Record<string, unknown>,
|
|
284
|
+
source: string,
|
|
285
|
+
correlationId?: string,
|
|
286
|
+
client?: PoolClient
|
|
287
|
+
): Promise<void> {
|
|
288
|
+
if (MODE === "durable") {
|
|
289
|
+
await durable.publish(type, payload, source, correlationId, client);
|
|
290
|
+
} else {
|
|
291
|
+
await inProcess.publish(type, payload, source, correlationId);
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
startWorker(intervalMs?: number): NodeJS.Timeout | null {
|
|
296
|
+
if (MODE === "durable") {
|
|
297
|
+
return durable.startWorker(intervalMs);
|
|
298
|
+
}
|
|
299
|
+
return null;
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
`;
|
|
303
|
+
}
|
|
304
|
+
exports.emitDurableEventBus = emitDurableEventBus;
|
|
305
|
+
//# sourceMappingURL=emit_events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit_events.js","sourceRoot":"","sources":["../src/emit_events.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAIH,iFAAiF;AAEjF,SAAgB,gBAAgB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BR,CAAC;AACF,CAAC;AAjCD,4CAiCC;AAED,iFAAiF;AAEjF,SAAgB,mBAAmB,CAAC,MAAmB;IACrD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAC;SAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAE3B,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,eAAe,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAE3B,OAAO;;;;;;;;;;;;;;;;uCAgB8B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;;wCAG3B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgOnE,CAAC;AACF,CAAC;AA7PD,kDA6PC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoneScript Extras Emitter
|
|
3
|
+
* Handles features that don't fit cleanly into the main emitters:
|
|
4
|
+
* - Derived fields (computed columns / virtual getters)
|
|
5
|
+
* - Channel filter expressions
|
|
6
|
+
* - Flow compensation runtime
|
|
7
|
+
*/
|
|
8
|
+
import * as IR from "./ir";
|
|
9
|
+
import * as AST from "./ast";
|
|
10
|
+
export declare function emitDerivedFields(entity: AST.EntityDeclNode): string;
|
|
11
|
+
export declare function emitChannelFilters(channels: AST.ChannelDeclNode[]): string;
|
|
12
|
+
export declare function emitFlowRuntime(system: IR.IRSystem): string;
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BoneScript Extras Emitter
|
|
4
|
+
* Handles features that don't fit cleanly into the main emitters:
|
|
5
|
+
* - Derived fields (computed columns / virtual getters)
|
|
6
|
+
* - Channel filter expressions
|
|
7
|
+
* - Flow compensation runtime
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.emitFlowRuntime = exports.emitChannelFilters = exports.emitDerivedFields = void 0;
|
|
11
|
+
function toSnakeCase(s) {
|
|
12
|
+
return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
13
|
+
}
|
|
14
|
+
// ─── Derived Field Emission ──────────────────────────────────────────────────
|
|
15
|
+
// Derived fields become PostgreSQL generated columns (when expression supports it)
|
|
16
|
+
// or TypeScript getters in the model class.
|
|
17
|
+
function emitDerivedFields(entity) {
|
|
18
|
+
if (entity.derived.length === 0)
|
|
19
|
+
return "";
|
|
20
|
+
const lines = [];
|
|
21
|
+
lines.push(`// Derived fields for ${entity.name}`);
|
|
22
|
+
lines.push(`export const ${entity.name.toUpperCase()}_DERIVED = {`);
|
|
23
|
+
for (const d of entity.derived) {
|
|
24
|
+
lines.push(` ${d.name}: (entity: any): unknown => {`);
|
|
25
|
+
lines.push(` // ${serializeExpr(d.expr)}`);
|
|
26
|
+
lines.push(` return ${jsExpr(d.expr)};`);
|
|
27
|
+
lines.push(` },`);
|
|
28
|
+
}
|
|
29
|
+
lines.push(`};`);
|
|
30
|
+
return lines.join("\n");
|
|
31
|
+
}
|
|
32
|
+
exports.emitDerivedFields = emitDerivedFields;
|
|
33
|
+
function serializeExpr(e) {
|
|
34
|
+
switch (e.kind) {
|
|
35
|
+
case "Literal":
|
|
36
|
+
if (e.type === "string")
|
|
37
|
+
return `"${e.value}"`;
|
|
38
|
+
return String(e.value);
|
|
39
|
+
case "FieldRef": return e.path.join(".");
|
|
40
|
+
case "BinaryExpr": return `${serializeExpr(e.left)} ${e.op} ${serializeExpr(e.right)}`;
|
|
41
|
+
case "UnaryExpr": return `${e.op}${serializeExpr(e.operand)}`;
|
|
42
|
+
case "CallExpr": return `${e.name}(${e.args.map(serializeExpr).join(", ")})`;
|
|
43
|
+
case "TernaryExpr": return `${serializeExpr(e.condition)} ? ${serializeExpr(e.consequent)} : ${serializeExpr(e.alternate)}`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function jsExpr(e) {
|
|
47
|
+
switch (e.kind) {
|
|
48
|
+
case "Literal":
|
|
49
|
+
if (e.type === "string")
|
|
50
|
+
return JSON.stringify(e.value);
|
|
51
|
+
if (e.type === "none")
|
|
52
|
+
return "null";
|
|
53
|
+
return String(e.value);
|
|
54
|
+
case "FieldRef":
|
|
55
|
+
return `entity.${e.path.join(".")}`;
|
|
56
|
+
case "BinaryExpr": {
|
|
57
|
+
const op = e.op === "and" ? "&&" : e.op === "or" ? "||" : e.op === "==" ? "===" : e.op === "!=" ? "!==" : e.op;
|
|
58
|
+
return `(${jsExpr(e.left)} ${op} ${jsExpr(e.right)})`;
|
|
59
|
+
}
|
|
60
|
+
case "UnaryExpr":
|
|
61
|
+
return `(${e.op === "not" ? "!" : e.op}${jsExpr(e.operand)})`;
|
|
62
|
+
case "CallExpr":
|
|
63
|
+
if (e.name === "now")
|
|
64
|
+
return "Date.now()";
|
|
65
|
+
return `${e.name}(${e.args.map(jsExpr).join(", ")})`;
|
|
66
|
+
case "TernaryExpr":
|
|
67
|
+
return `(${jsExpr(e.condition)} ? ${jsExpr(e.consequent)} : ${jsExpr(e.alternate)})`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ─── Channel Filter Emission ─────────────────────────────────────────────────
|
|
71
|
+
// Channels with filter expressions get a TypeScript predicate function attached
|
|
72
|
+
// to the WebSocket subscription logic.
|
|
73
|
+
function emitChannelFilters(channels) {
|
|
74
|
+
const filtered = channels.filter(c => c.filter);
|
|
75
|
+
if (filtered.length === 0)
|
|
76
|
+
return "";
|
|
77
|
+
const lines = [];
|
|
78
|
+
lines.push(`// Generated channel filter predicates`);
|
|
79
|
+
lines.push(`// Each filter is a deterministic function: (event, participant) -> bool`);
|
|
80
|
+
lines.push(``);
|
|
81
|
+
lines.push(`export const CHANNEL_FILTERS: Record<string, (event: any, participant: any) => boolean> = {`);
|
|
82
|
+
for (const ch of filtered) {
|
|
83
|
+
lines.push(` "${ch.name}": (event, participant) => {`);
|
|
84
|
+
lines.push(` // Filter expression: ${ch.filter ? serializeExpr(ch.filter) : "true"}`);
|
|
85
|
+
lines.push(` return ${ch.filter ? channelFilterExpr(ch.filter) : "true"};`);
|
|
86
|
+
lines.push(` },`);
|
|
87
|
+
}
|
|
88
|
+
lines.push(`};`);
|
|
89
|
+
lines.push(``);
|
|
90
|
+
lines.push(`export function shouldDeliver(channel: string, event: any, participant: any): boolean {`);
|
|
91
|
+
lines.push(` const filter = CHANNEL_FILTERS[channel];`);
|
|
92
|
+
lines.push(` return filter ? filter(event, participant) : true;`);
|
|
93
|
+
lines.push(`}`);
|
|
94
|
+
return lines.join("\n");
|
|
95
|
+
}
|
|
96
|
+
exports.emitChannelFilters = emitChannelFilters;
|
|
97
|
+
function channelFilterExpr(e) {
|
|
98
|
+
// Channel filters reference 'event' and 'participant' as implicit names
|
|
99
|
+
switch (e.kind) {
|
|
100
|
+
case "Literal":
|
|
101
|
+
if (e.type === "string")
|
|
102
|
+
return JSON.stringify(e.value);
|
|
103
|
+
if (e.type === "none")
|
|
104
|
+
return "null";
|
|
105
|
+
return String(e.value);
|
|
106
|
+
case "FieldRef": {
|
|
107
|
+
// Resolve event.* and participant.* explicitly
|
|
108
|
+
if (e.path[0] === "event" || e.path[0] === "participant") {
|
|
109
|
+
return e.path.join(".");
|
|
110
|
+
}
|
|
111
|
+
return `event.${e.path.join(".")}`;
|
|
112
|
+
}
|
|
113
|
+
case "BinaryExpr": {
|
|
114
|
+
const op = e.op === "and" ? "&&" : e.op === "or" ? "||" : e.op === "==" ? "===" : e.op === "!=" ? "!==" : e.op;
|
|
115
|
+
return `(${channelFilterExpr(e.left)} ${op} ${channelFilterExpr(e.right)})`;
|
|
116
|
+
}
|
|
117
|
+
case "UnaryExpr":
|
|
118
|
+
return `(${e.op === "not" ? "!" : e.op}${channelFilterExpr(e.operand)})`;
|
|
119
|
+
case "CallExpr":
|
|
120
|
+
return `${e.name}(${e.args.map(channelFilterExpr).join(", ")})`;
|
|
121
|
+
case "TernaryExpr":
|
|
122
|
+
return `(${channelFilterExpr(e.condition)} ? ${channelFilterExpr(e.consequent)} : ${channelFilterExpr(e.alternate)})`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ─── Flow Saga Runtime ───────────────────────────────────────────────────────
|
|
126
|
+
function emitFlowRuntime(system) {
|
|
127
|
+
if (system.flows.length === 0)
|
|
128
|
+
return "";
|
|
129
|
+
const lines = [];
|
|
130
|
+
lines.push(`// Generated by BoneScript compiler. DO NOT EDIT.`);
|
|
131
|
+
lines.push(`// Saga runtime — implements flow declarations with backward compensation.`);
|
|
132
|
+
lines.push(`//`);
|
|
133
|
+
lines.push(`// On step failure, executes compensations for ALL completed steps in reverse order.`);
|
|
134
|
+
lines.push(``);
|
|
135
|
+
lines.push(`import { logger } from "./logger";`);
|
|
136
|
+
lines.push(`import { counter } from "./metrics";`);
|
|
137
|
+
lines.push(``);
|
|
138
|
+
lines.push(`export interface FlowStep {`);
|
|
139
|
+
lines.push(` name: string;`);
|
|
140
|
+
lines.push(` action: (ctx: any) => Promise<void>;`);
|
|
141
|
+
lines.push(` compensation: ((ctx: any) => Promise<void>) | null;`);
|
|
142
|
+
lines.push(`}`);
|
|
143
|
+
lines.push(``);
|
|
144
|
+
lines.push(`export interface FlowResult {`);
|
|
145
|
+
lines.push(` ok: boolean;`);
|
|
146
|
+
lines.push(` failed_step?: string;`);
|
|
147
|
+
lines.push(` compensated: string[];`);
|
|
148
|
+
lines.push(` error?: string;`);
|
|
149
|
+
lines.push(`}`);
|
|
150
|
+
lines.push(``);
|
|
151
|
+
lines.push(`export async function executeFlow(name: string, steps: FlowStep[], ctx: any): Promise<FlowResult> {`);
|
|
152
|
+
lines.push(` const completed: { step: string; compensation: ((c: any) => Promise<void>) | null }[] = [];`);
|
|
153
|
+
lines.push(``);
|
|
154
|
+
lines.push(` for (const step of steps) {`);
|
|
155
|
+
lines.push(` try {`);
|
|
156
|
+
lines.push(` logger.info("flow_step_started", { event: name + "." + step.name });`);
|
|
157
|
+
lines.push(` await step.action(ctx);`);
|
|
158
|
+
lines.push(` completed.push({ step: step.name, compensation: step.compensation });`);
|
|
159
|
+
lines.push(` counter("flow.step_completed", { flow: name, step: step.name });`);
|
|
160
|
+
lines.push(` } catch (e: any) {`);
|
|
161
|
+
lines.push(` logger.error("flow_step_failed", { event: name + "." + step.name, metadata: { error: e.message } });`);
|
|
162
|
+
lines.push(` counter("flow.step_failed", { flow: name, step: step.name });`);
|
|
163
|
+
lines.push(``);
|
|
164
|
+
lines.push(` // Backward compensation in reverse order`);
|
|
165
|
+
lines.push(` const compensated: string[] = [];`);
|
|
166
|
+
lines.push(` for (const c of [...completed].reverse()) {`);
|
|
167
|
+
lines.push(` if (!c.compensation) continue;`);
|
|
168
|
+
lines.push(` try {`);
|
|
169
|
+
lines.push(` await c.compensation(ctx);`);
|
|
170
|
+
lines.push(` compensated.push(c.step);`);
|
|
171
|
+
lines.push(` logger.info("flow_compensated", { event: name + "." + c.step });`);
|
|
172
|
+
lines.push(` } catch (compErr: any) {`);
|
|
173
|
+
lines.push(` logger.error("flow_compensation_failed", { event: name + "." + c.step, metadata: { error: compErr.message } });`);
|
|
174
|
+
lines.push(` // Continue with other compensations even if one fails`);
|
|
175
|
+
lines.push(` }`);
|
|
176
|
+
lines.push(` }`);
|
|
177
|
+
lines.push(``);
|
|
178
|
+
lines.push(` return { ok: false, failed_step: step.name, compensated, error: e.message };`);
|
|
179
|
+
lines.push(` }`);
|
|
180
|
+
lines.push(` }`);
|
|
181
|
+
lines.push(``);
|
|
182
|
+
lines.push(` counter("flow.completed", { flow: name });`);
|
|
183
|
+
lines.push(` return { ok: true, compensated: [] };`);
|
|
184
|
+
lines.push(`}`);
|
|
185
|
+
lines.push(``);
|
|
186
|
+
// Emit each flow's step definitions
|
|
187
|
+
for (const flow of system.flows) {
|
|
188
|
+
lines.push(`// Flow: ${flow.name}`);
|
|
189
|
+
lines.push(`// ctx must contain: { req, res, auth, client? } for transactional flows`);
|
|
190
|
+
lines.push(`export async function execute_${flow.name}(ctx: { req: any; res: any; auth: any; client?: any }): Promise<FlowResult> {`);
|
|
191
|
+
lines.push(` const steps: FlowStep[] = [`);
|
|
192
|
+
for (const step of flow.steps) {
|
|
193
|
+
// Parse the action string: "capabilityName(arg1, arg2)"
|
|
194
|
+
const actionMatch = step.action.match(/^(\w+)\((.*)\)$/);
|
|
195
|
+
const actionFn = actionMatch ? actionMatch[1] : step.action;
|
|
196
|
+
const actionArgs = actionMatch ? actionMatch[2] : "";
|
|
197
|
+
lines.push(` {`);
|
|
198
|
+
lines.push(` name: "${step.name}",`);
|
|
199
|
+
lines.push(` action: async (ctx) => {`);
|
|
200
|
+
lines.push(` // Calls capability: ${step.action}`);
|
|
201
|
+
lines.push(` const response = await fetch(\`\${process.env.SERVICE_BASE_URL || "http://localhost:3000"}/${toSnakeCase(actionFn).replace(/_/g, "-")}\`, {`);
|
|
202
|
+
lines.push(` method: "POST",`);
|
|
203
|
+
lines.push(` headers: { "Content-Type": "application/json", "Authorization": ctx.req.headers.authorization || "" },`);
|
|
204
|
+
lines.push(` body: JSON.stringify(ctx.req.body),`);
|
|
205
|
+
lines.push(` });`);
|
|
206
|
+
lines.push(` if (!response.ok) throw new Error(\`Step ${step.name} failed: \${await response.text()}\`);`);
|
|
207
|
+
lines.push(` ctx.${step.name}_result = await response.json();`);
|
|
208
|
+
lines.push(` },`);
|
|
209
|
+
if (step.compensation) {
|
|
210
|
+
const compMatch = step.compensation.match(/^(\w+)\((.*)\)$/);
|
|
211
|
+
const compFn = compMatch ? compMatch[1] : step.compensation;
|
|
212
|
+
lines.push(` compensation: async (ctx) => {`);
|
|
213
|
+
lines.push(` // Compensates: ${step.compensation}`);
|
|
214
|
+
lines.push(` await fetch(\`\${process.env.SERVICE_BASE_URL || "http://localhost:3000"}/${toSnakeCase(compFn).replace(/_/g, "-")}\`, {`);
|
|
215
|
+
lines.push(` method: "POST",`);
|
|
216
|
+
lines.push(` headers: { "Content-Type": "application/json", "Authorization": ctx.req.headers.authorization || "" },`);
|
|
217
|
+
lines.push(` body: JSON.stringify({ ...ctx.req.body, _compensating: true }),`);
|
|
218
|
+
lines.push(` });`);
|
|
219
|
+
lines.push(` },`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
lines.push(` compensation: null,`);
|
|
223
|
+
}
|
|
224
|
+
lines.push(` },`);
|
|
225
|
+
}
|
|
226
|
+
lines.push(` ];`);
|
|
227
|
+
lines.push(` return executeFlow("${flow.name}", steps, ctx);`);
|
|
228
|
+
lines.push(`}`);
|
|
229
|
+
lines.push(``);
|
|
230
|
+
}
|
|
231
|
+
return lines.join("\n");
|
|
232
|
+
}
|
|
233
|
+
exports.emitFlowRuntime = emitFlowRuntime;
|
|
234
|
+
//# sourceMappingURL=emit_extras.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit_extras.js","sourceRoot":"","sources":["../src/emit_extras.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoneScript Full Emitter  Produces a complete, runnable project.
|
|
3
|
+
* Combines schema generation with runtime service code.
|
|
4
|
+
*/
|
|
5
|
+
import * as IR from "./ir";
|
|
6
|
+
import { EmittedFile } from "./emitter";
|
|
7
|
+
export declare class FullEmitter {
|
|
8
|
+
private schemaEmitter;
|
|
9
|
+
emit(system: IR.IRSystem): EmittedFile[];
|
|
10
|
+
private emitEnvExample;
|
|
11
|
+
private emitDockerCompose;
|
|
12
|
+
private emitReadme;
|
|
13
|
+
}
|