bonescript-compiler 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,262 +0,0 @@
1
- "use strict";
2
- /**
3
- * SQLite target end-to-end test.
4
- *
5
- * Compiles a small .bone program to the SQLite target, installs better-sqlite3,
6
- * runs the generated migrations, then performs CRUD against the generated
7
- * db.ts API surface to confirm:
8
- * - schema applies cleanly
9
- * - generated query() handles SELECT / INSERT / UPDATE / DELETE
10
- * - $1, $2 placeholder translation works
11
- * - RETURNING * emulation returns the inserted/updated row
12
- * - ledger prevents re-running the same migration
13
- */
14
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- var desc = Object.getOwnPropertyDescriptor(m, k);
17
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
- desc = { enumerable: true, get: function() { return m[k]; } };
19
- }
20
- Object.defineProperty(o, k2, desc);
21
- }) : (function(o, m, k, k2) {
22
- if (k2 === undefined) k2 = k;
23
- o[k2] = m[k];
24
- }));
25
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
- Object.defineProperty(o, "default", { enumerable: true, value: v });
27
- }) : function(o, v) {
28
- o["default"] = v;
29
- });
30
- var __importStar = (this && this.__importStar) || function (mod) {
31
- if (mod && mod.__esModule) return mod;
32
- var result = {};
33
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
34
- __setModuleDefault(result, mod);
35
- return result;
36
- };
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- const fs = __importStar(require("fs"));
39
- const path = __importStar(require("path"));
40
- const os = __importStar(require("os"));
41
- const child_process_1 = require("child_process");
42
- const crypto_1 = require("crypto");
43
- const lexer_1 = require("./lexer");
44
- const parser_1 = require("./parser");
45
- const lowering_1 = require("./lowering");
46
- const emit_sqlite_1 = require("./emit_sqlite");
47
- const SAMPLE = `
48
- system TestStore {
49
- domain: saas_platform
50
-
51
- entity Item {
52
- owns: [name: string, quantity: uint, available: bool]
53
- constraints: [quantity >= 0]
54
- }
55
- }
56
- `;
57
- let passed = 0;
58
- let failed = 0;
59
- function ok(name) { console.log(" v " + name); passed++; }
60
- function fail(name, err) {
61
- const msg = err instanceof Error ? err.message : String(err);
62
- console.log(" x " + name + ": " + msg);
63
- failed++;
64
- }
65
- function run() {
66
- console.log("BoneScript SQLite Target Tests\n");
67
- // 1. Compile sample to SQLite target into a temp dir
68
- const tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "bonescript-sqlite-"));
69
- const outDir = path.join(tmpRoot, "out");
70
- fs.mkdirSync(outDir);
71
- try {
72
- const tokens = new lexer_1.Lexer(SAMPLE).tokenize();
73
- const ast = new parser_1.Parser(tokens).parse();
74
- const hash = (0, crypto_1.createHash)("sha256").update(SAMPLE).digest("hex").slice(0, 16);
75
- const ir = new lowering_1.Lowering().lower(ast, hash);
76
- const emitter = new emit_sqlite_1.SqliteEmitter();
77
- const files = emitter.emit(ir[0]);
78
- for (const f of files) {
79
- const target = path.join(outDir, f.path);
80
- fs.mkdirSync(path.dirname(target), { recursive: true });
81
- fs.writeFileSync(target, f.content, "utf-8");
82
- }
83
- ok("Emitter produced " + files.length + " file(s)");
84
- }
85
- catch (e) {
86
- fail("Compile to SQLite target", e);
87
- return;
88
- }
89
- // 2. Verify expected files exist
90
- for (const expected of ["package.json", "src/db.ts", "src/migrate.ts", "migrations/event_outbox.sql", "migrations/audit_log.sql"]) {
91
- if (fs.existsSync(path.join(outDir, expected)))
92
- ok("Generated " + expected);
93
- else {
94
- fail("Missing " + expected, "file not emitted");
95
- return;
96
- }
97
- }
98
- // 3. Run migrations against an actual sqlite db
99
- // We do this by directly using better-sqlite3 from the compiler's node_modules
100
- // (it's already a transitive dep of ts-node tooling) — install only if missing.
101
- const compilerNodeModules = path.resolve(__dirname, "..", "node_modules");
102
- const sqliteModule = path.join(compilerNodeModules, "better-sqlite3");
103
- if (!fs.existsSync(sqliteModule)) {
104
- console.log("\n (installing better-sqlite3 — first run only)");
105
- try {
106
- (0, child_process_1.execSync)("npm install better-sqlite3@11.5.0 --no-save", {
107
- cwd: path.resolve(__dirname, ".."),
108
- stdio: "pipe",
109
- });
110
- }
111
- catch (e) {
112
- fail("Install better-sqlite3", e);
113
- // Skip the runtime tests but the emitter itself produced output.
114
- summary();
115
- return;
116
- }
117
- }
118
- // Load better-sqlite3 dynamically
119
- let Database;
120
- try {
121
- Database = require("better-sqlite3");
122
- ok("Loaded better-sqlite3");
123
- }
124
- catch (e) {
125
- fail("Load better-sqlite3", e);
126
- summary();
127
- return;
128
- }
129
- const dbPath = path.join(outDir, "test.db");
130
- let db;
131
- try {
132
- db = new Database(dbPath);
133
- db.pragma("foreign_keys = ON");
134
- ok("Opened SQLite database");
135
- }
136
- catch (e) {
137
- fail("Open SQLite", e);
138
- summary();
139
- return;
140
- }
141
- // 4. Apply each migration block sequentially
142
- try {
143
- const migrations = fs.readdirSync(path.join(outDir, "migrations"))
144
- .filter(f => f.endsWith(".sql"))
145
- .sort();
146
- for (const m of migrations) {
147
- const sql = fs.readFileSync(path.join(outDir, "migrations", m), "utf-8");
148
- db.exec(sql);
149
- }
150
- ok("Applied " + migrations.length + " migration file(s)");
151
- }
152
- catch (e) {
153
- fail("Apply migrations", e);
154
- summary();
155
- return;
156
- }
157
- // 5. Verify the items table exists with the expected columns
158
- try {
159
- const cols = db.prepare("PRAGMA table_info(items)").all();
160
- const names = cols.map(c => c.name).sort();
161
- const expected = ["available", "created_at", "id", "name", "quantity", "updated_at"];
162
- for (const e of expected) {
163
- if (!names.includes(e))
164
- throw new Error("missing column " + e + " (have: " + names.join(",") + ")");
165
- }
166
- ok("items table has expected columns");
167
- }
168
- catch (e) {
169
- fail("Inspect items table", e);
170
- summary();
171
- return;
172
- }
173
- // 6. CRUD smoke test via direct sqlite access (proxy for what the generated
174
- // route handlers will do once compiled and run).
175
- try {
176
- const id = "11111111-1111-1111-1111-111111111111";
177
- db.prepare("INSERT INTO items (id, name, quantity, available) VALUES (?, ?, ?, ?)")
178
- .run(id, "Widget", 5, 1);
179
- const row = db.prepare("SELECT * FROM items WHERE id = ?").get(id);
180
- if (!row)
181
- throw new Error("row not inserted");
182
- if (row.name !== "Widget")
183
- throw new Error("wrong name: " + row.name);
184
- if (row.quantity !== 5)
185
- throw new Error("wrong quantity: " + row.quantity);
186
- ok("INSERT + SELECT round-trips correctly");
187
- db.prepare("UPDATE items SET quantity = ? WHERE id = ?").run(3, id);
188
- const after = db.prepare("SELECT quantity FROM items WHERE id = ?").get(id);
189
- if (after.quantity !== 3)
190
- throw new Error("UPDATE did not apply");
191
- ok("UPDATE applies correctly");
192
- const cnt = db.prepare("DELETE FROM items WHERE id = ?").run(id).changes;
193
- if (cnt !== 1)
194
- throw new Error("DELETE returned " + cnt);
195
- const gone = db.prepare("SELECT * FROM items WHERE id = ?").get(id);
196
- if (gone)
197
- throw new Error("row not deleted");
198
- ok("DELETE removes the row");
199
- }
200
- catch (e) {
201
- fail("CRUD round-trip", e);
202
- summary();
203
- return;
204
- }
205
- // 7. Confirm CHECK constraint from quantity >= 0 still works on event_outbox
206
- // (which has a status CHECK clause)
207
- try {
208
- let threw = false;
209
- try {
210
- db.prepare("INSERT INTO event_outbox (id, event_type, payload, source, status) VALUES (?, ?, ?, ?, ?)")
211
- .run("e1", "T", "{}", "test", "bogus_status");
212
- }
213
- catch {
214
- threw = true;
215
- }
216
- if (!threw)
217
- throw new Error("CHECK constraint did not fire");
218
- ok("event_outbox CHECK constraint is enforced");
219
- }
220
- catch (e) {
221
- fail("Constraint enforcement", e);
222
- summary();
223
- return;
224
- }
225
- // 8. Test the generated db.ts placeholder translation by exercising it via a
226
- // short hand-rolled script. We avoid running it in-process because db.ts uses
227
- // `import Database from "better-sqlite3"` which doesn't match our runtime
228
- // shape. Instead we read the file and assert key behaviors statically.
229
- try {
230
- const dbTs = fs.readFileSync(path.join(outDir, "src/db.ts"), "utf-8");
231
- if (!dbTs.includes("translateSql"))
232
- throw new Error("missing $N placeholder translation");
233
- if (!dbTs.includes("RETURNING"))
234
- throw new Error("missing RETURNING * shim");
235
- if (!dbTs.includes("better-sqlite3"))
236
- throw new Error("not using better-sqlite3");
237
- if (!dbTs.includes("journal_mode = WAL"))
238
- throw new Error("WAL mode not configured");
239
- ok("Generated db.ts has placeholder translation, RETURNING shim, and WAL pragma");
240
- }
241
- catch (e) {
242
- fail("Inspect db.ts", e);
243
- summary();
244
- return;
245
- }
246
- // Cleanup
247
- try {
248
- db.close();
249
- fs.rmSync(tmpRoot, { recursive: true, force: true });
250
- }
251
- catch { }
252
- summary();
253
- }
254
- function summary() {
255
- console.log("\n" + "═".repeat(40));
256
- console.log("Results: " + passed + " passed, " + failed + " failed");
257
- console.log("═".repeat(40));
258
- if (failed > 0)
259
- process.exit(1);
260
- }
261
- run();
262
- //# sourceMappingURL=test_sqlite.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test_sqlite.js","sourceRoot":"","sources":["../src/test_sqlite.ts"],"names":[],"mappings":"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"}