bonescript-compiler 0.7.0 → 0.8.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.
@@ -0,0 +1,539 @@
1
+ "use strict";
2
+ /**
3
+ * BoneScript SQLite Target Emitter
4
+ *
5
+ * Generates a SQLite-flavored project: same shape as the Express target but
6
+ * with a SQLite type map, no triggers, and the better-sqlite3 driver in place
7
+ * of pg.
8
+ *
9
+ * SQLite differences from PostgreSQL that this emitter handles:
10
+ * - No JSONB / no native UUID — TEXT for both
11
+ * - No CREATE OR REPLACE FUNCTION / no triggers needed (we do updated_at in app code)
12
+ * - Parameter style is ? not $1, $2 — but better-sqlite3 also supports named (:name)
13
+ * - No SKIP LOCKED, no transactional outbox locking semantics — outbox uses simpler ordering
14
+ * - No CHECK constraints with subqueries — basic CHECK only
15
+ *
16
+ * Strategy: keep the SQL flat and portable. Use better-sqlite3's prepared
17
+ * statements. Keep the public interface identical to the Postgres target so
18
+ * route handlers and capability bodies don't need to change.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.SqliteEmitter = exports.emitSqlitePackageJson = exports.emitSqliteMigration = exports.emitSqliteDbClient = exports.emitSqliteAuditSchema = exports.emitSqliteOutboxSchema = exports.emitSqliteSchema = exports.toSqliteType = void 0;
22
+ function toSnakeCase(s) {
23
+ return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
24
+ }
25
+ // ─── SQLite type mapping ──────────────────────────────────────────────────────
26
+ const SQLITE_TYPE_MAP = {
27
+ string: "TEXT",
28
+ uint: "INTEGER",
29
+ int: "INTEGER",
30
+ float: "REAL",
31
+ bool: "INTEGER", // 0 / 1
32
+ timestamp: "TEXT", // ISO 8601 string
33
+ uuid: "TEXT",
34
+ bytes: "BLOB",
35
+ json: "TEXT", // JSON-encoded text
36
+ };
37
+ function toSqliteType(irType) {
38
+ if (SQLITE_TYPE_MAP[irType])
39
+ return SQLITE_TYPE_MAP[irType];
40
+ if (irType.startsWith("list<") || irType.startsWith("set<") || irType.startsWith("map<"))
41
+ return "TEXT";
42
+ if (irType.startsWith("optional<"))
43
+ return toSqliteType(irType.slice(9, -1));
44
+ return "TEXT";
45
+ }
46
+ exports.toSqliteType = toSqliteType;
47
+ // ─── Schema emission ──────────────────────────────────────────────────────────
48
+ function emitSqliteSchema(model, mod, system) {
49
+ const tableName = toSnakeCase(model.name) + "s";
50
+ const lines = [];
51
+ lines.push(`-- Generated by BoneScript compiler. DO NOT EDIT.`);
52
+ lines.push(`-- Source: ${system.source_hash}`);
53
+ lines.push(`-- Module: ${mod.name}`);
54
+ lines.push(`-- Engine: sqlite`);
55
+ lines.push(``);
56
+ lines.push(`CREATE TABLE IF NOT EXISTS ${tableName} (`);
57
+ const fieldLines = [];
58
+ for (const field of model.fields) {
59
+ let line = ` ${field.name} ${toSqliteType(field.type)}`;
60
+ if (!field.nullable)
61
+ line += " NOT NULL";
62
+ // SQLite default value handling. The Postgres-flavored defaults need translation.
63
+ if (field.default_value) {
64
+ if (field.default_value === "gen_random_uuid()" || field.default_value === "uuid()") {
65
+ // SQLite has no built-in UUID generator. We rely on app code to fill `id`
66
+ // before insert. No DEFAULT clause emitted.
67
+ }
68
+ else if (field.default_value === "now()") {
69
+ line += " DEFAULT (datetime('now'))";
70
+ }
71
+ else if (field.default_value.startsWith("GENERATED ALWAYS AS")) {
72
+ // Generated columns — supported in SQLite 3.31+
73
+ line += ` ${field.default_value}`;
74
+ }
75
+ else {
76
+ line += ` DEFAULT ${field.default_value}`;
77
+ }
78
+ }
79
+ else if (field.name === "created_at" || field.name === "updated_at") {
80
+ line += " DEFAULT (datetime('now'))";
81
+ }
82
+ if (field.name === model.primary_key)
83
+ line += " PRIMARY KEY";
84
+ fieldLines.push(line);
85
+ }
86
+ // Unique constraints (declared inline in CREATE TABLE)
87
+ for (const c of model.constraints) {
88
+ if (c.kind === "unique") {
89
+ fieldLines.push(` CONSTRAINT ${tableName}_${c.target}_unique UNIQUE (${c.target})`);
90
+ }
91
+ }
92
+ // Foreign keys for belongs_to relations
93
+ for (const rel of mod.relations || []) {
94
+ if (rel.kind === "belongs_to") {
95
+ fieldLines.push(` FOREIGN KEY (${rel.foreign_key}) REFERENCES ${rel.to_table}(id) ON DELETE CASCADE`);
96
+ }
97
+ }
98
+ lines.push(fieldLines.join(",\n"));
99
+ lines.push(`);`);
100
+ lines.push(``);
101
+ // Indexes
102
+ for (const idx of model.indexes) {
103
+ const idxName = `idx_${tableName}_${idx.fields.join("_")}`;
104
+ const unique = idx.unique ? "UNIQUE " : "";
105
+ lines.push(`CREATE ${unique}INDEX IF NOT EXISTS ${idxName} ON ${tableName} (${idx.fields.join(", ")});`);
106
+ }
107
+ // FK indexes for belongs_to relations
108
+ for (const rel of mod.relations || []) {
109
+ if (rel.kind === "belongs_to") {
110
+ lines.push(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${rel.foreign_key} ON ${tableName} (${rel.foreign_key});`);
111
+ }
112
+ }
113
+ // Junction tables for many_to_many
114
+ for (const rel of mod.relations || []) {
115
+ if (rel.kind === "many_to_many" && rel.junction_table) {
116
+ lines.push(``);
117
+ lines.push(`CREATE TABLE IF NOT EXISTS ${rel.junction_table} (`);
118
+ lines.push(` ${rel.from_table.slice(0, -1)}_id TEXT NOT NULL REFERENCES ${rel.from_table}(id) ON DELETE CASCADE,`);
119
+ lines.push(` ${rel.to_table.slice(0, -1)}_id TEXT NOT NULL REFERENCES ${rel.to_table}(id) ON DELETE CASCADE,`);
120
+ lines.push(` created_at TEXT NOT NULL DEFAULT (datetime('now')),`);
121
+ lines.push(` PRIMARY KEY (${rel.from_table.slice(0, -1)}_id, ${rel.to_table.slice(0, -1)}_id)`);
122
+ lines.push(`);`);
123
+ }
124
+ }
125
+ // Note: No triggers for updated_at in SQLite. The DB client wrapper handles
126
+ // it on every UPDATE by interpolating the current timestamp.
127
+ return {
128
+ path: `migrations/${toSnakeCase(model.name)}.sql`,
129
+ content: lines.join("\n") + "\n",
130
+ language: "sql",
131
+ source_module: mod.id,
132
+ };
133
+ }
134
+ exports.emitSqliteSchema = emitSqliteSchema;
135
+ // ─── Outbox / audit infra schemas (SQLite flavor) ─────────────────────────────
136
+ function emitSqliteOutboxSchema() {
137
+ return `-- BoneScript: Transactional Outbox (SQLite)
138
+ -- Generated by BoneScript compiler. DO NOT EDIT.
139
+
140
+ CREATE TABLE IF NOT EXISTS event_outbox (
141
+ id TEXT PRIMARY KEY,
142
+ event_type TEXT NOT NULL,
143
+ payload TEXT NOT NULL,
144
+ source TEXT NOT NULL,
145
+ correlation_id TEXT,
146
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
147
+ scheduled_at TEXT NOT NULL DEFAULT (datetime('now')),
148
+ delivered_at TEXT,
149
+ attempts INTEGER NOT NULL DEFAULT 0,
150
+ last_error TEXT,
151
+ status TEXT NOT NULL DEFAULT 'pending'
152
+ CHECK (status IN ('pending', 'delivered', 'failed', 'dead_letter'))
153
+ );
154
+
155
+ CREATE INDEX IF NOT EXISTS idx_event_outbox_status ON event_outbox (status, scheduled_at);
156
+ CREATE INDEX IF NOT EXISTS idx_event_outbox_created ON event_outbox (created_at);
157
+
158
+ CREATE TABLE IF NOT EXISTS event_processed (
159
+ event_id TEXT PRIMARY KEY,
160
+ event_type TEXT NOT NULL,
161
+ processed_at TEXT NOT NULL DEFAULT (datetime('now'))
162
+ );
163
+
164
+ CREATE INDEX IF NOT EXISTS idx_event_processed_type ON event_processed (event_type, processed_at);
165
+ `;
166
+ }
167
+ exports.emitSqliteOutboxSchema = emitSqliteOutboxSchema;
168
+ function emitSqliteAuditSchema() {
169
+ return `-- BoneScript: Audit log (SQLite)
170
+ -- Generated by BoneScript compiler. DO NOT EDIT.
171
+
172
+ CREATE TABLE IF NOT EXISTS audit_log (
173
+ id TEXT PRIMARY KEY,
174
+ actor_id TEXT,
175
+ action TEXT NOT NULL,
176
+ entity_type TEXT,
177
+ entity_id TEXT,
178
+ payload TEXT,
179
+ ip_address TEXT,
180
+ user_agent TEXT,
181
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
182
+ );
183
+
184
+ CREATE INDEX IF NOT EXISTS idx_audit_log_actor ON audit_log (actor_id, created_at);
185
+ CREATE INDEX IF NOT EXISTS idx_audit_log_entity ON audit_log (entity_type, entity_id);
186
+ CREATE INDEX IF NOT EXISTS idx_audit_log_action ON audit_log (action, created_at);
187
+ `;
188
+ }
189
+ exports.emitSqliteAuditSchema = emitSqliteAuditSchema;
190
+ // ─── DB client (SQLite flavor, drop-in API replacement for the pg client) ─────
191
+ function emitSqliteDbClient(system) {
192
+ return [
193
+ `// Generated by BoneScript compiler. DO NOT EDIT.`,
194
+ `// SQLite database client. API-compatible with the Postgres client so route`,
195
+ `// handlers don't need to change between targets.`,
196
+ `import Database from "better-sqlite3";`,
197
+ `import * as path from "path";`,
198
+ ``,
199
+ `let _db: Database.Database | null = null;`,
200
+ ``,
201
+ `function getDb(): Database.Database {`,
202
+ ` if (!_db) {`,
203
+ ` const dbPath = process.env.SQLITE_PATH || path.resolve(process.cwd(), "${toSnakeCase(system.name)}.db");`,
204
+ ` _db = new Database(dbPath);`,
205
+ ` _db.pragma("journal_mode = WAL");`,
206
+ ` _db.pragma("foreign_keys = ON");`,
207
+ ` _db.pragma("synchronous = NORMAL");`,
208
+ ` }`,
209
+ ` return _db;`,
210
+ `}`,
211
+ ``,
212
+ `// Translate Postgres-style $1, $2, ... placeholders to SQLite ? placeholders.`,
213
+ `// The generated route handlers use $N because the Postgres backend is the`,
214
+ `// canonical target; this keeps the surface uniform.`,
215
+ `function translateSql(sql: string): string {`,
216
+ ` return sql.replace(/\\$(\\d+)/g, "?");`,
217
+ `}`,
218
+ ``,
219
+ `// Strip Postgres-only RETURNING * — better-sqlite3 returns the inserted/updated`,
220
+ `// row separately via .get(). We post-process by looking up the row by id.`,
221
+ `function stripReturning(sql: string): { sql: string; hadReturning: boolean } {`,
222
+ ` const m = sql.match(/^(.*?)\\s+RETURNING\\s+\\*\\s*;?\\s*$/is);`,
223
+ ` if (m) return { sql: m[1], hadReturning: true };`,
224
+ ` return { sql, hadReturning: false };`,
225
+ `}`,
226
+ ``,
227
+ `// Extract table name from an INSERT or UPDATE for RETURNING * emulation.`,
228
+ `function extractTable(sql: string): string | null {`,
229
+ ` const ins = sql.match(/INSERT\\s+INTO\\s+([\\w]+)/i);`,
230
+ ` if (ins) return ins[1];`,
231
+ ` const upd = sql.match(/UPDATE\\s+([\\w]+)/i);`,
232
+ ` if (upd) return upd[1];`,
233
+ ` return null;`,
234
+ `}`,
235
+ ``,
236
+ `export async function query<T = any>(text: string, params: any[] = []): Promise<T[]> {`,
237
+ ` const db = getDb();`,
238
+ ` const { sql: stripped, hadReturning } = stripReturning(text);`,
239
+ ` const sql = translateSql(stripped);`,
240
+ ` const trimmed = sql.trim().toUpperCase();`,
241
+ ` if (trimmed.startsWith("SELECT") || trimmed.startsWith("WITH")) {`,
242
+ ` return db.prepare(sql).all(...params) as T[];`,
243
+ ` }`,
244
+ ` // INSERT / UPDATE / DELETE`,
245
+ ` const stmt = db.prepare(sql);`,
246
+ ` const info = stmt.run(...params);`,
247
+ ` if (hadReturning) {`,
248
+ ` const table = extractTable(sql);`,
249
+ ` if (!table) return [];`,
250
+ ` if (trimmed.startsWith("INSERT")) {`,
251
+ ` // Look up by id (which is in params[0] for our generated INSERT shape)`,
252
+ ` const id = params[0];`,
253
+ ` const row = db.prepare(\`SELECT * FROM \${table} WHERE id = ?\`).get(id);`,
254
+ ` return row ? [row as T] : [];`,
255
+ ` }`,
256
+ ` if (trimmed.startsWith("UPDATE")) {`,
257
+ ` // The id parameter for our generated UPDATE shape is params[0] (WHERE id = $1).`,
258
+ ` const id = params[0];`,
259
+ ` const row = db.prepare(\`SELECT * FROM \${table} WHERE id = ?\`).get(id);`,
260
+ ` return row ? [row as T] : [];`,
261
+ ` }`,
262
+ ` }`,
263
+ ` // Fall back to changes count expressed as a single-row response`,
264
+ ` return [{ rowCount: info.changes } as unknown as T];`,
265
+ `}`,
266
+ ``,
267
+ `export async function queryOne<T = any>(text: string, params: any[] = []): Promise<T | null> {`,
268
+ ` const rows = await query<T>(text, params);`,
269
+ ` return rows[0] || null;`,
270
+ `}`,
271
+ ``,
272
+ `export async function execute(text: string, params: any[] = []): Promise<number> {`,
273
+ ` const db = getDb();`,
274
+ ` const { sql: stripped } = stripReturning(text);`,
275
+ ` const sql = translateSql(stripped);`,
276
+ ` const info = db.prepare(sql).run(...params);`,
277
+ ` return info.changes;`,
278
+ `}`,
279
+ ``,
280
+ `export async function transaction<T>(fn: (client: any) => Promise<T>): Promise<T> {`,
281
+ ` const db = getDb();`,
282
+ ` // better-sqlite3 transactions are synchronous; we adapt with deasync-style`,
283
+ ` // immediate execution. The fn here uses query/execute which read the same db.`,
284
+ ` const txn = db.transaction(async () => await fn({ query: query, execute: execute }));`,
285
+ ` return await txn();`,
286
+ `}`,
287
+ ``,
288
+ `// Compatibility shim: the Postgres path uses pool.connect()/release() for nested`,
289
+ `// transactions. SQLite has no pool. We expose a no-op client wrapper so generated`,
290
+ `// route handlers can call __client.query() / __client.release() unchanged.`,
291
+ `export const pool = {`,
292
+ ` async connect() {`,
293
+ ` const db = getDb();`,
294
+ ` let inTxn = false;`,
295
+ ` return {`,
296
+ ` async query(text: string, params: any[] = []) {`,
297
+ ` const upper = text.trim().toUpperCase();`,
298
+ ` if (upper === "BEGIN") { db.prepare("BEGIN").run(); inTxn = true; return { rows: [] }; }`,
299
+ ` if (upper === "COMMIT") { db.prepare("COMMIT").run(); inTxn = false; return { rows: [] }; }`,
300
+ ` if (upper === "ROLLBACK") { try { db.prepare("ROLLBACK").run(); } catch {} inTxn = false; return { rows: [] }; }`,
301
+ ` const rows = await query(text, params);`,
302
+ ` return { rows, rowCount: rows.length };`,
303
+ ` },`,
304
+ ` release() { /* no-op for sqlite */ },`,
305
+ ` };`,
306
+ ` },`,
307
+ ` async query(text: string, params: any[] = []) {`,
308
+ ` const rows = await query(text, params);`,
309
+ ` return { rows, rowCount: rows.length };`,
310
+ ` },`,
311
+ ` async end() { if (_db) { _db.close(); _db = null; } },`,
312
+ ` on() { /* no-op */ },`,
313
+ `};`,
314
+ ``,
315
+ ].join("\n");
316
+ }
317
+ exports.emitSqliteDbClient = emitSqliteDbClient;
318
+ // ─── Migration runner (SQLite flavor) ─────────────────────────────────────────
319
+ function emitSqliteMigration(_system, schemas) {
320
+ // Build deterministic blocks just like the Postgres path does.
321
+ const lines = [];
322
+ lines.push(`// Generated by BoneScript compiler. DO NOT EDIT.`);
323
+ lines.push(`// SQLite migration runner with a schema_migrations ledger.`);
324
+ lines.push(`require("dotenv").config();`);
325
+ lines.push(`import * as fs from "fs";`);
326
+ lines.push(`import * as path from "path";`);
327
+ lines.push(`import { createHash } from "crypto";`);
328
+ lines.push(`import Database from "better-sqlite3";`);
329
+ lines.push(``);
330
+ lines.push(`interface Block { id: string; checksum: string; sql: string; }`);
331
+ lines.push(``);
332
+ lines.push(`const GENERATED_BLOCKS: Block[] = [`);
333
+ // Use the same deterministic ordering as the Postgres migrate emitter
334
+ schemas.forEach((sql, i) => {
335
+ const checksum = require("crypto").createHash("sha256").update(sql).digest("hex");
336
+ const tableMatch = sql.match(/CREATE TABLE IF NOT EXISTS\s+(\w+)/i);
337
+ const slug = (tableMatch?.[1] || `block_${i}`).toLowerCase();
338
+ const id = `${String(i).padStart(4, "0")}_${slug}`;
339
+ const escaped = sql.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$/g, "\\$");
340
+ lines.push(` { id: ${JSON.stringify(id)}, checksum: ${JSON.stringify(checksum)}, sql: \`${escaped}\` },`);
341
+ });
342
+ lines.push(`];`);
343
+ lines.push(``);
344
+ lines.push(`function loadManualBlocks(): Block[] {`);
345
+ lines.push(` const dir = path.resolve(__dirname, "..", "migrations", "_manual");`);
346
+ lines.push(` if (!fs.existsSync(dir)) return [];`);
347
+ lines.push(` return fs.readdirSync(dir)`);
348
+ lines.push(` .filter(f => f.endsWith(".sql"))`);
349
+ lines.push(` .sort()`);
350
+ lines.push(` .map(f => {`);
351
+ lines.push(` const sql = fs.readFileSync(path.join(dir, f), "utf-8");`);
352
+ lines.push(` return { id: "manual_" + f.replace(/\\.sql$/, ""), checksum: createHash("sha256").update(sql).digest("hex"), sql };`);
353
+ lines.push(` });`);
354
+ lines.push(`}`);
355
+ lines.push(``);
356
+ lines.push(`async function migrate() {`);
357
+ lines.push(` const dbPath = process.env.SQLITE_PATH || path.resolve(process.cwd(), "app.db");`);
358
+ lines.push(` const db = new Database(dbPath);`);
359
+ lines.push(` db.pragma("foreign_keys = ON");`);
360
+ lines.push(``);
361
+ lines.push(` db.exec(\`CREATE TABLE IF NOT EXISTS schema_migrations (`);
362
+ lines.push(` id TEXT PRIMARY KEY,`);
363
+ lines.push(` checksum TEXT NOT NULL,`);
364
+ lines.push(` applied_at TEXT NOT NULL DEFAULT (datetime('now')),`);
365
+ lines.push(` duration_ms INTEGER NOT NULL DEFAULT 0`);
366
+ lines.push(` );\`);`);
367
+ lines.push(``);
368
+ lines.push(` const all = [...GENERATED_BLOCKS, ...loadManualBlocks()];`);
369
+ lines.push(` const existing = db.prepare("SELECT id, checksum FROM schema_migrations").all() as Array<{ id: string; checksum: string }>;`);
370
+ lines.push(` const seen = new Map(existing.map(r => [r.id, r.checksum]));`);
371
+ lines.push(``);
372
+ lines.push(` let applied = 0, skipped = 0;`);
373
+ lines.push(` for (const block of all) {`);
374
+ lines.push(` const prior = seen.get(block.id);`);
375
+ lines.push(` if (prior === block.checksum) { skipped++; continue; }`);
376
+ lines.push(` if (prior && prior !== block.checksum) {`);
377
+ lines.push(` throw new Error(\`Migration \${block.id} was previously applied with a different checksum.\`);`);
378
+ lines.push(` }`);
379
+ lines.push(` const start = Date.now();`);
380
+ lines.push(` db.exec("BEGIN");`);
381
+ lines.push(` try {`);
382
+ lines.push(` db.exec(block.sql);`);
383
+ lines.push(` db.prepare("INSERT INTO schema_migrations (id, checksum, duration_ms) VALUES (?, ?, ?)")`);
384
+ lines.push(` .run(block.id, block.checksum, Date.now() - start);`);
385
+ lines.push(` db.exec("COMMIT");`);
386
+ lines.push(` console.log(\` applied \${block.id} (\${Date.now() - start}ms)\`);`);
387
+ lines.push(` applied++;`);
388
+ lines.push(` } catch (e) {`);
389
+ lines.push(` try { db.exec("ROLLBACK"); } catch {}`);
390
+ lines.push(` throw e;`);
391
+ lines.push(` }`);
392
+ lines.push(` }`);
393
+ lines.push(` console.log(\`Migrations complete: \${applied} applied, \${skipped} already up to date.\`);`);
394
+ lines.push(` db.close();`);
395
+ lines.push(`}`);
396
+ lines.push(``);
397
+ lines.push(`migrate().catch(e => { console.error(e); process.exit(1); });`);
398
+ return lines.join("\n");
399
+ }
400
+ exports.emitSqliteMigration = emitSqliteMigration;
401
+ // ─── Package.json (SQLite flavor) ─────────────────────────────────────────────
402
+ function emitSqlitePackageJson(system) {
403
+ const pkg = {
404
+ name: toSnakeCase(system.name),
405
+ version: system.version,
406
+ private: true,
407
+ scripts: {
408
+ build: "tsc",
409
+ start: "node dist/index.js",
410
+ dev: "ts-node src/index.ts",
411
+ migrate: "ts-node src/migrate.ts",
412
+ },
413
+ dependencies: {
414
+ express: "4.22.2",
415
+ "better-sqlite3": "11.5.0",
416
+ uuid: "10.0.0",
417
+ cors: "2.8.5",
418
+ helmet: "8.0.0",
419
+ "express-rate-limit": "7.5.0",
420
+ jsonwebtoken: "9.0.2",
421
+ dotenv: "16.4.7",
422
+ "node-cron": "3.0.3",
423
+ zod: "3.23.8",
424
+ },
425
+ devDependencies: {
426
+ "@types/express": "4.17.21",
427
+ "@types/node": "20.14.0",
428
+ "@types/better-sqlite3": "7.6.11",
429
+ "@types/cors": "2.8.17",
430
+ "@types/jsonwebtoken": "9.0.7",
431
+ "@types/uuid": "10.0.0",
432
+ "@types/node-cron": "3.0.11",
433
+ typescript: "5.6.3",
434
+ "ts-node": "10.9.2",
435
+ },
436
+ };
437
+ return JSON.stringify(pkg, null, 2);
438
+ }
439
+ exports.emitSqlitePackageJson = emitSqlitePackageJson;
440
+ // ─── Top-level emitter ────────────────────────────────────────────────────────
441
+ class SqliteEmitter {
442
+ emit(system) {
443
+ const files = [];
444
+ // 1. Package + tsconfig
445
+ files.push({ path: "package.json", content: emitSqlitePackageJson(system), language: "json", source_module: "root" });
446
+ files.push({ path: "tsconfig.json", content: this.emitTsConfig(), language: "json", source_module: "root" });
447
+ files.push({ path: ".env.example", content: this.emitEnvExample(system), language: "yaml", source_module: "root" });
448
+ // 2. Schema files + collect for migration runner
449
+ const schemas = [];
450
+ const seenPaths = new Set();
451
+ for (const mod of system.modules) {
452
+ if (mod.kind === "data_store" || mod.kind === "api_service") {
453
+ for (const model of mod.models) {
454
+ const file = emitSqliteSchema(model, mod, system);
455
+ if (seenPaths.has(file.path))
456
+ continue;
457
+ seenPaths.add(file.path);
458
+ files.push(file);
459
+ schemas.push(file.content);
460
+ }
461
+ }
462
+ }
463
+ // 3. Outbox + audit infra schemas
464
+ files.push({ path: "migrations/event_outbox.sql", content: emitSqliteOutboxSchema(), language: "sql", source_module: "infra" });
465
+ files.push({ path: "migrations/audit_log.sql", content: emitSqliteAuditSchema(), language: "sql", source_module: "infra" });
466
+ schemas.push(emitSqliteOutboxSchema());
467
+ schemas.push(emitSqliteAuditSchema());
468
+ // 4. DB client
469
+ files.push({ path: "src/db.ts", content: emitSqliteDbClient(system), language: "typescript", source_module: "infra" });
470
+ // 5. Migration runner
471
+ files.push({ path: "src/migrate.ts", content: emitSqliteMigration(system, schemas), language: "typescript", source_module: "infra" });
472
+ // 6. README
473
+ files.push({ path: "README.md", content: this.emitReadme(system), language: "yaml", source_module: "root" });
474
+ return files;
475
+ }
476
+ emitTsConfig() {
477
+ const cfg = {
478
+ compilerOptions: {
479
+ target: "ES2020",
480
+ module: "commonjs",
481
+ lib: ["ES2020", "DOM"],
482
+ outDir: "./dist",
483
+ rootDir: "./src",
484
+ strict: true,
485
+ esModuleInterop: true,
486
+ skipLibCheck: true,
487
+ forceConsistentCasingInFileNames: true,
488
+ declaration: true,
489
+ sourceMap: true,
490
+ },
491
+ include: ["src/**/*"],
492
+ exclude: ["node_modules", "dist"],
493
+ };
494
+ return JSON.stringify(cfg, null, 2);
495
+ }
496
+ emitEnvExample(system) {
497
+ return `# ${system.name} (SQLite target)
498
+
499
+ # Path to the SQLite database file. Defaults to ./<system_name>.db
500
+ SQLITE_PATH=./${toSnakeCase(system.name)}.db
501
+
502
+ PORT=3000
503
+ NODE_ENV=development
504
+
505
+ JWT_SECRET=
506
+ EVENT_MODE=in_process
507
+ `;
508
+ }
509
+ emitReadme(system) {
510
+ return `# ${system.name} (SQLite target)
511
+
512
+ Generated by BoneScript compiler. Source hash: ${system.source_hash}
513
+
514
+ ## Quick Start
515
+
516
+ \`\`\`bash
517
+ npm install
518
+ npm run migrate
519
+ npm run dev
520
+ \`\`\`
521
+
522
+ The database file will be created at \`./${toSnakeCase(system.name)}.db\` by default.
523
+ Override with the \`SQLITE_PATH\` environment variable.
524
+
525
+ ## Why SQLite
526
+
527
+ This target produces a self-contained backend with no external services:
528
+ - No Postgres / Redis to start
529
+ - No Docker
530
+ - The whole database is one file you can copy, version, or back up easily
531
+
532
+ It's ideal for local development, demos, integration tests, and small
533
+ single-node deployments. For production multi-writer workloads, use the
534
+ default Express target which generates a Postgres-backed project.
535
+ `;
536
+ }
537
+ }
538
+ exports.SqliteEmitter = SqliteEmitter;
539
+ //# sourceMappingURL=emit_sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit_sqlite.js","sourceRoot":"","sources":["../src/emit_sqlite.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export type { SolverResult } from "./solver";
15
15
  export { FullEmitter } from "./emit_full";
16
16
  export { NakamaEmitter } from "./emit_nakama";
17
17
  export { PrismaEmitter } from "./emit_prisma";
18
+ export { SqliteEmitter } from "./emit_sqlite";
18
19
  export type { NakamaEmittedFile } from "./emit_nakama";
19
20
  export type { EmittedFile } from "./emitter";
20
21
  export { Verifier } from "./verifier";
@@ -32,6 +33,7 @@ export { lookupAlgorithm, listAlgorithms, listByCategory } from "./algorithm_cat
32
33
  export { mergeWithExisting, extractImplementations, validateExtensions } from "./extension_manager";
33
34
  export { emitOpenApiSpec, emitOpenApiJson } from "./emit_openapi";
34
35
  export { emitTypescriptSdk, emitSdkPackageJson } from "./emit_sdk";
36
+ export { emitReactHooks } from "./emit_react";
35
37
  export { emitZodSchemas } from "./emit_zod";
36
38
  export { emitPostmanCollection } from "./emit_postman";
37
39
  export { emitSeedFile } from "./emit_seed";
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
27
27
  return result;
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.compile = exports.emitGraphQLSchema = exports.emitCronJobs = exports.emitNotifyService = exports.emitAdminPanel = exports.emitAuditMiddleware = exports.emitAuditSchema = exports.emitSeedFile = exports.emitPostmanCollection = exports.emitZodSchemas = exports.emitSdkPackageJson = exports.emitTypescriptSdk = exports.emitOpenApiJson = exports.emitOpenApiSpec = exports.validateExtensions = exports.extractImplementations = exports.mergeWithExisting = exports.listByCategory = exports.listAlgorithms = exports.lookupAlgorithm = exports.IR = exports.AST = exports.scaffold = exports.Formatter = exports.ModuleLoader = exports.optimize = exports.Verifier = exports.PrismaEmitter = exports.NakamaEmitter = exports.FullEmitter = exports.ConstraintSolver = exports.Lowering = exports.TypeChecker = exports.RecoveringParser = exports.ParseError = exports.Parser = exports.TokenKind = exports.LexerError = exports.Lexer = void 0;
30
+ exports.compile = exports.emitGraphQLSchema = exports.emitCronJobs = exports.emitNotifyService = exports.emitAdminPanel = exports.emitAuditMiddleware = exports.emitAuditSchema = exports.emitSeedFile = exports.emitPostmanCollection = exports.emitZodSchemas = exports.emitReactHooks = exports.emitSdkPackageJson = exports.emitTypescriptSdk = exports.emitOpenApiJson = exports.emitOpenApiSpec = exports.validateExtensions = exports.extractImplementations = exports.mergeWithExisting = exports.listByCategory = exports.listAlgorithms = exports.lookupAlgorithm = exports.IR = exports.AST = exports.scaffold = exports.Formatter = exports.ModuleLoader = exports.optimize = exports.Verifier = exports.SqliteEmitter = exports.PrismaEmitter = exports.NakamaEmitter = exports.FullEmitter = exports.ConstraintSolver = exports.Lowering = exports.TypeChecker = exports.RecoveringParser = exports.ParseError = exports.Parser = exports.TokenKind = exports.LexerError = exports.Lexer = void 0;
31
31
  // Core pipeline
32
32
  var lexer_1 = require("./lexer");
33
33
  Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return lexer_1.Lexer; } });
@@ -50,6 +50,8 @@ var emit_nakama_1 = require("./emit_nakama");
50
50
  Object.defineProperty(exports, "NakamaEmitter", { enumerable: true, get: function () { return emit_nakama_1.NakamaEmitter; } });
51
51
  var emit_prisma_1 = require("./emit_prisma");
52
52
  Object.defineProperty(exports, "PrismaEmitter", { enumerable: true, get: function () { return emit_prisma_1.PrismaEmitter; } });
53
+ var emit_sqlite_1 = require("./emit_sqlite");
54
+ Object.defineProperty(exports, "SqliteEmitter", { enumerable: true, get: function () { return emit_sqlite_1.SqliteEmitter; } });
53
55
  var verifier_1 = require("./verifier");
54
56
  Object.defineProperty(exports, "Verifier", { enumerable: true, get: function () { return verifier_1.Verifier; } });
55
57
  var optimizer_1 = require("./optimizer");
@@ -81,6 +83,8 @@ Object.defineProperty(exports, "emitOpenApiJson", { enumerable: true, get: funct
81
83
  var emit_sdk_1 = require("./emit_sdk");
82
84
  Object.defineProperty(exports, "emitTypescriptSdk", { enumerable: true, get: function () { return emit_sdk_1.emitTypescriptSdk; } });
83
85
  Object.defineProperty(exports, "emitSdkPackageJson", { enumerable: true, get: function () { return emit_sdk_1.emitSdkPackageJson; } });
86
+ var emit_react_1 = require("./emit_react");
87
+ Object.defineProperty(exports, "emitReactHooks", { enumerable: true, get: function () { return emit_react_1.emitReactHooks; } });
84
88
  var emit_zod_1 = require("./emit_zod");
85
89
  Object.defineProperty(exports, "emitZodSchemas", { enumerable: true, get: function () { return emit_zod_1.emitZodSchemas; } });
86
90
  var emit_postman_1 = require("./emit_postman");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Notification service tests.
3
+ *
4
+ * Generates the notify.ts file from a sample IR and verifies:
5
+ * - webhook is in the provider union
6
+ * - HMAC signing helper is emitted
7
+ * - URL validation rejects non-http(s) protocols
8
+ * - sendWebhook signs requests when NOTIFY_WEBHOOK_SECRET is set
9
+ * - sendWebhook posts to NOTIFY_WEBHOOK_URL with the right shape
10
+ */
11
+ export {};