litedbmodel 2.0.0 → 2.0.2

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.
Files changed (163) hide show
  1. package/dist/scp/authoring-sql.d.ts +78 -0
  2. package/dist/scp/authoring-sql.d.ts.map +1 -1
  3. package/dist/scp/authoring-sql.js +110 -2
  4. package/dist/scp/authoring-sql.js.map +1 -1
  5. package/dist/scp/catalog.d.ts +5 -2
  6. package/dist/scp/catalog.d.ts.map +1 -1
  7. package/dist/scp/catalog.js +32 -1
  8. package/dist/scp/catalog.js.map +1 -1
  9. package/dist/scp/codegen.d.ts +143 -85
  10. package/dist/scp/codegen.d.ts.map +1 -1
  11. package/dist/scp/codegen.js +374 -90
  12. package/dist/scp/codegen.js.map +1 -1
  13. package/dist/scp/coltype.d.ts +41 -0
  14. package/dist/scp/coltype.d.ts.map +1 -0
  15. package/dist/scp/coltype.js +188 -0
  16. package/dist/scp/coltype.js.map +1 -0
  17. package/dist/scp/dialect.d.ts +12 -3
  18. package/dist/scp/dialect.d.ts.map +1 -1
  19. package/dist/scp/dialect.js +12 -3
  20. package/dist/scp/dialect.js.map +1 -1
  21. package/dist/scp/find-filter-guard.d.ts +68 -0
  22. package/dist/scp/find-filter-guard.d.ts.map +1 -0
  23. package/dist/scp/find-filter-guard.js +88 -0
  24. package/dist/scp/find-filter-guard.js.map +1 -0
  25. package/dist/scp/fragment/assemble.d.ts +61 -0
  26. package/dist/scp/fragment/assemble.d.ts.map +1 -0
  27. package/dist/scp/fragment/assemble.js +156 -0
  28. package/dist/scp/fragment/assemble.js.map +1 -0
  29. package/dist/scp/fragment/compile-pg.d.ts +107 -0
  30. package/dist/scp/fragment/compile-pg.d.ts.map +1 -0
  31. package/dist/scp/fragment/compile-pg.js +142 -0
  32. package/dist/scp/fragment/compile-pg.js.map +1 -0
  33. package/dist/scp/fragment/index.d.ts +16 -0
  34. package/dist/scp/fragment/index.d.ts.map +1 -0
  35. package/dist/scp/fragment/index.js +34 -0
  36. package/dist/scp/fragment/index.js.map +1 -0
  37. package/dist/scp/fragment/model.d.ts +119 -0
  38. package/dist/scp/fragment/model.d.ts.map +1 -0
  39. package/dist/scp/fragment/model.js +66 -0
  40. package/dist/scp/fragment/model.js.map +1 -0
  41. package/dist/scp/fragment/pg-array-type.d.ts +13 -0
  42. package/dist/scp/fragment/pg-array-type.d.ts.map +1 -0
  43. package/dist/scp/fragment/pg-array-type.js +34 -0
  44. package/dist/scp/fragment/pg-array-type.js.map +1 -0
  45. package/dist/scp/guard.d.ts +2 -6
  46. package/dist/scp/guard.d.ts.map +1 -1
  47. package/dist/scp/guard.js +19 -22
  48. package/dist/scp/guard.js.map +1 -1
  49. package/dist/scp/index.cjs +18695 -3921
  50. package/dist/scp/index.d.ts +41 -24
  51. package/dist/scp/index.d.ts.map +1 -1
  52. package/dist/scp/index.js +134 -49
  53. package/dist/scp/index.js.map +1 -1
  54. package/dist/scp/index.mjs +4830 -1432
  55. package/dist/scp/makesql/authoring-compile.d.ts +90 -0
  56. package/dist/scp/makesql/authoring-compile.d.ts.map +1 -0
  57. package/dist/scp/makesql/authoring-compile.js +494 -0
  58. package/dist/scp/makesql/authoring-compile.js.map +1 -0
  59. package/dist/scp/makesql/compile-crud.d.ts +133 -0
  60. package/dist/scp/makesql/compile-crud.d.ts.map +1 -0
  61. package/dist/scp/makesql/compile-crud.js +288 -0
  62. package/dist/scp/makesql/compile-crud.js.map +1 -0
  63. package/dist/scp/makesql/compile-relation.d.ts +157 -0
  64. package/dist/scp/makesql/compile-relation.d.ts.map +1 -0
  65. package/dist/scp/makesql/compile-relation.js +425 -0
  66. package/dist/scp/makesql/compile-relation.js.map +1 -0
  67. package/dist/scp/makesql/compile-select.d.ts +52 -0
  68. package/dist/scp/makesql/compile-select.d.ts.map +1 -0
  69. package/dist/scp/makesql/compile-select.js +58 -0
  70. package/dist/scp/makesql/compile-select.js.map +1 -0
  71. package/dist/scp/makesql/compile.d.ts +63 -0
  72. package/dist/scp/makesql/compile.d.ts.map +1 -0
  73. package/dist/scp/makesql/compile.js +99 -0
  74. package/dist/scp/makesql/compile.js.map +1 -0
  75. package/dist/scp/makesql/handler.d.ts +58 -0
  76. package/dist/scp/makesql/handler.d.ts.map +1 -0
  77. package/dist/scp/makesql/handler.js +113 -0
  78. package/dist/scp/makesql/handler.js.map +1 -0
  79. package/dist/scp/makesql/index.d.ts +33 -0
  80. package/dist/scp/makesql/index.d.ts.map +1 -0
  81. package/dist/scp/makesql/index.js +114 -0
  82. package/dist/scp/makesql/index.js.map +1 -0
  83. package/dist/scp/makesql/ir.d.ts +42 -0
  84. package/dist/scp/makesql/ir.d.ts.map +1 -0
  85. package/dist/scp/makesql/ir.js +66 -0
  86. package/dist/scp/makesql/ir.js.map +1 -0
  87. package/dist/scp/makesql/json-array.d.ts +84 -0
  88. package/dist/scp/makesql/json-array.d.ts.map +1 -0
  89. package/dist/scp/makesql/json-array.js +118 -0
  90. package/dist/scp/makesql/json-array.js.map +1 -0
  91. package/dist/scp/makesql/json-batch.d.ts +102 -0
  92. package/dist/scp/makesql/json-batch.d.ts.map +1 -0
  93. package/dist/scp/makesql/json-batch.js +269 -0
  94. package/dist/scp/makesql/json-batch.js.map +1 -0
  95. package/dist/scp/makesql/makesql.d.ts +99 -0
  96. package/dist/scp/makesql/makesql.d.ts.map +1 -0
  97. package/dist/scp/makesql/makesql.js +122 -0
  98. package/dist/scp/makesql/makesql.js.map +1 -0
  99. package/dist/scp/makesql/outtype.d.ts +44 -0
  100. package/dist/scp/makesql/outtype.d.ts.map +1 -0
  101. package/dist/scp/makesql/outtype.js +197 -0
  102. package/dist/scp/makesql/outtype.js.map +1 -0
  103. package/dist/scp/makesql/pool-executor.d.ts +47 -0
  104. package/dist/scp/makesql/pool-executor.d.ts.map +1 -0
  105. package/dist/scp/makesql/pool-executor.js +50 -0
  106. package/dist/scp/makesql/pool-executor.js.map +1 -0
  107. package/dist/scp/makesql/static-bundle.d.ts +187 -0
  108. package/dist/scp/makesql/static-bundle.d.ts.map +1 -0
  109. package/dist/scp/makesql/static-bundle.js +1113 -0
  110. package/dist/scp/makesql/static-bundle.js.map +1 -0
  111. package/dist/scp/makesql/tx.d.ts +216 -0
  112. package/dist/scp/makesql/tx.d.ts.map +1 -0
  113. package/dist/scp/makesql/tx.js +788 -0
  114. package/dist/scp/makesql/tx.js.map +1 -0
  115. package/dist/scp/makesql/writeouttype.d.ts +66 -0
  116. package/dist/scp/makesql/writeouttype.d.ts.map +1 -0
  117. package/dist/scp/makesql/writeouttype.js +195 -0
  118. package/dist/scp/makesql/writeouttype.js.map +1 -0
  119. package/dist/scp/relation.d.ts +86 -74
  120. package/dist/scp/relation.d.ts.map +1 -1
  121. package/dist/scp/relation.js +186 -120
  122. package/dist/scp/relation.js.map +1 -1
  123. package/dist/scp/runtime.d.ts +158 -211
  124. package/dist/scp/runtime.d.ts.map +1 -1
  125. package/dist/scp/runtime.js +250 -515
  126. package/dist/scp/runtime.js.map +1 -1
  127. package/dist/scp/typed-object.d.ts +12 -1
  128. package/dist/scp/typed-object.d.ts.map +1 -1
  129. package/dist/scp/typed-object.js +25 -4
  130. package/dist/scp/typed-object.js.map +1 -1
  131. package/docs/proposal/litedbmodel-v2-scp-architecture.md +51 -0
  132. package/docs/proposal/v0-coverage-matrix.md +157 -0
  133. package/docs/proposal/v2-completeness-plan.md +90 -0
  134. package/docs/proposal/v2-sql-parity-checklist.md +162 -0
  135. package/package.json +3 -3
  136. package/dist/scp/bridge.d.ts +0 -64
  137. package/dist/scp/bridge.d.ts.map +0 -1
  138. package/dist/scp/bridge.js +0 -329
  139. package/dist/scp/bridge.js.map +0 -1
  140. package/dist/scp/compile-dialect.d.ts +0 -39
  141. package/dist/scp/compile-dialect.d.ts.map +0 -1
  142. package/dist/scp/compile-dialect.js +0 -62
  143. package/dist/scp/compile-dialect.js.map +0 -1
  144. package/dist/scp/compile-sqlite.d.ts +0 -114
  145. package/dist/scp/compile-sqlite.d.ts.map +0 -1
  146. package/dist/scp/compile-sqlite.js +0 -149
  147. package/dist/scp/compile-sqlite.js.map +0 -1
  148. package/dist/scp/ir.d.ts +0 -92
  149. package/dist/scp/ir.d.ts.map +0 -1
  150. package/dist/scp/ir.js +0 -28
  151. package/dist/scp/ir.js.map +0 -1
  152. package/dist/scp/render.d.ts +0 -40
  153. package/dist/scp/render.d.ts.map +0 -1
  154. package/dist/scp/render.js +0 -170
  155. package/dist/scp/render.js.map +0 -1
  156. package/dist/scp/write-plan.d.ts +0 -161
  157. package/dist/scp/write-plan.d.ts.map +0 -1
  158. package/dist/scp/write-plan.js +0 -528
  159. package/dist/scp/write-plan.js.map +0 -1
  160. package/dist/scp/write-runtime.d.ts +0 -80
  161. package/dist/scp/write-runtime.d.ts.map +0 -1
  162. package/dist/scp/write-runtime.js +0 -167
  163. package/dist/scp/write-runtime.js.map +0 -1
@@ -1,167 +0,0 @@
1
- "use strict";
2
- /**
3
- * litedbmodel v2 SCP — write-time transaction runtime (WS5, #25; spec §6 / §3 / §11).
4
- *
5
- * Executes a derived {@link TransactionPlan} against REAL SQLite as ONE transaction with
6
- * gate-first short-circuit (spec §6). It renders each ordered statement with the SAME normative
7
- * {@link renderOperation} the read path uses (fragment tree + Expression-IR param slots), and
8
- * drives an explicit `BEGIN` / `COMMIT` / `ROLLBACK` envelope through the SAME synchronous
9
- * driver seam ({@link SqliteDb}) the WS3 runtime uses — no mock, no separate interpreter.
10
- *
11
- * ## The transaction envelope (spec §6) — Tx is derived, not authored
12
- *
13
- * BEGIN;
14
- * for each ordered statement:
15
- * render (input + accumulated $.entity row) → execute REAL SQL
16
- * if it is a GATE and its rule FAILS → ROLLBACK and stop (remaining SQL never runs)
17
- * COMMIT; (or ROLLBACK on a driver failure / gate fail)
18
- *
19
- * The body write's RETURNING row is captured and exposed to the derive/edges/emits stages under
20
- * `$.entity.*` ({@link ENTITY_ROOT}) — the §6 example's `$.entity.id`.
21
- *
22
- * ## Gate-first is a REAL behavior (spec §6 "Gate First"), proven, not textual
23
- *
24
- * A gate statement's {@link GateRule} is evaluated on its actual driver result:
25
- * - `existsElseRollback` — `SELECT 1 …` returned ZERO rows ⇒ the required row is absent ⇒
26
- * ROLLBACK; the body + all later statements are NEVER prepared/executed (a real query-count
27
- * drop, observable via a counting driver, and the DB is unchanged).
28
- * - `insertedElseRollback` — a `unique` guard `INSERT … ON CONFLICT DO NOTHING` affected ZERO
29
- * rows ⇒ a collision ⇒ ROLLBACK.
30
- * - `insertedElseNoop` — an `idempotency` token INSERT affected ZERO rows ⇒ a DUPLICATE request
31
- * ⇒ short-circuit as a no-op: ROLLBACK the (empty-so-far) transaction, so a duplicate
32
- * `request_id` performs NO double write (idempotent).
33
- *
34
- * A short-circuit returns a structured {@link TransactionResult} (`committed:false`) rather than
35
- * throwing — the caller distinguishes a legitimate gate outcome (absent requires / unique
36
- * collision / duplicate) from a driver Failure (which IS mapped + thrown, spec §11 item 5).
37
- */
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.executeTransaction = executeTransaction;
40
- exports.countingDriver = countingDriver;
41
- const render_1 = require("./render");
42
- const errors_1 = require("./errors");
43
- const writes_1 = require("./writes");
44
- const dialect_1 = require("./dialect");
45
- /** bc evaluates ints to bigint; convert a rendered param to a driver-bindable value. */
46
- function toDriverParam(v) {
47
- if (typeof v === 'bigint') {
48
- if (v >= BigInt(Number.MIN_SAFE_INTEGER) && v <= BigInt(Number.MAX_SAFE_INTEGER))
49
- return Number(v);
50
- return v;
51
- }
52
- // An emit payload evaluates to a plain object (`{obj:{…}}`); serialize it to the outbox JSON
53
- // text column. Arrays are IN-list elements (not used in the write path); pass through.
54
- if (v !== null && typeof v === 'object' && !Array.isArray(v))
55
- return JSON.stringify(v);
56
- return v;
57
- }
58
- /**
59
- * Execute one statement's compiled op against the driver in the given scope, returning the
60
- * rows (SELECT / RETURNING) plus the affected-row count (non-returning writes). A driver error
61
- * is mapped and thrown (the caller ROLLBACKs). This is the SAME render→bind→execute pipeline as
62
- * the WS3 read/write handlers; only the transaction envelope + gate interpretation is new.
63
- */
64
- function execStatement(db, op, scope, dialect) {
65
- const rendered = (0, render_1.renderOperation)(op, scope, dialect);
66
- const params = rendered.params.map(toDriverParam);
67
- const stmt = db.prepare(rendered.sql);
68
- const hasReturn = op.component === 'Select' || /\breturning\b/i.test(rendered.sql);
69
- if (hasReturn) {
70
- const rows = stmt.all(...params);
71
- return { rows, changes: rows.length };
72
- }
73
- const info = stmt.run(...params);
74
- return { rows: [], changes: info.changes };
75
- }
76
- /** Evaluate a gate rule on a statement result → the short-circuit reason, or null to continue. */
77
- function gateShortCircuit(gate, result) {
78
- switch (gate) {
79
- case 'existsElseRollback':
80
- return result.rows.length === 0 ? 'requires_absent' : null;
81
- case 'insertedElseRollback':
82
- return result.changes === 0 ? 'unique_collision' : null;
83
- case 'insertedElseNoop':
84
- return result.changes === 0 ? 'idempotent_duplicate' : null;
85
- }
86
- }
87
- /**
88
- * Execute a derived {@link TransactionPlan} as ONE real SQLite transaction with gate-first
89
- * short-circuit (spec §6). Statements run in the plan's fixed order (requires → idempotency →
90
- * unique → body → derive → edges → emits); a failing gate ROLLBACKs and the remaining statements
91
- * are never executed. On success COMMITs and returns the `$.entity` RETURNING row.
92
- *
93
- * @param db the synchronous SQLite driver (better-sqlite3 `Database`), supporting `BEGIN` /
94
- * `COMMIT` / `ROLLBACK` via `prepare(...).run()`.
95
- * @param plan the derived transaction plan (pure JSON; from `deriveTransactionPlan` or the bundle).
96
- * @param input the Command input scope (`$.input.*` = bc flat scope).
97
- * @throws {SqlFailure} a mapped driver failure (the transaction is ROLLBACKed first, spec §11).
98
- */
99
- function executeTransaction(db, plan, input, dialect = dialect_1.SQLITE) {
100
- db.prepare('BEGIN').run();
101
- const executed = [];
102
- // The evolving scope: input names at the top level (bc flat scope) + the body RETURNING row
103
- // exposed under `__entity` once the body runs. Defaults live in the declaration/schema, so no
104
- // ad-hoc code default is injected here.
105
- const scope = { ...input };
106
- let entity = null;
107
- try {
108
- for (const stmt of plan.statements) {
109
- const result = runOne(db, stmt, scope, executed, dialect);
110
- // Gate-first: a failing gate short-circuits — ROLLBACK and STOP (tail never executes).
111
- if (stmt.gate !== undefined) {
112
- const reason = gateShortCircuit(stmt.gate, result);
113
- if (reason !== null) {
114
- db.prepare('ROLLBACK').run();
115
- return { committed: false, shortCircuit: { statementId: stmt.id, reason }, entity: null, executed };
116
- }
117
- }
118
- // Capture the SOLE body RETURNING row as `$.entity` (WS5 single-write back-compat).
119
- if (stmt.id === plan.entityFrom) {
120
- entity = result.rows.length > 0 ? result.rows[0] : null;
121
- if (entity !== null)
122
- scope[writes_1.ENTITY_ROOT] = entity;
123
- }
124
- // Composite (WS8a): bind THIS statement's RETURNING row under its `binds` name so a later
125
- // `$.ref.<binds>.<field>` resolves against it (the DAG's data-dependency edge). Self-
126
- // describing: the runtime just binds the row the plan told it to — no re-derivation.
127
- if (stmt.binds !== undefined && result.rows.length > 0) {
128
- scope[stmt.binds] = result.rows[0];
129
- }
130
- }
131
- db.prepare('COMMIT').run();
132
- return { committed: true, entity, executed };
133
- }
134
- catch (e) {
135
- // A driver failure: ROLLBACK, then map + re-throw the structured SqlFailure (spec §11).
136
- try {
137
- db.prepare('ROLLBACK').run();
138
- }
139
- catch {
140
- /* ROLLBACK best-effort; surface the original failure below */
141
- }
142
- throw (0, errors_1.mapSqliteError)(e);
143
- }
144
- }
145
- /** Render + execute one statement, recording it as executed. */
146
- function runOne(db, stmt, scope, executed, dialect) {
147
- const result = execStatement(db, stmt.op, scope, dialect);
148
- executed.push(stmt.id);
149
- return result;
150
- }
151
- /**
152
- * A counting {@link SqliteDb} wrapper: forwards every call to the wrapped driver but records
153
- * each PREPARED SQL string. Tests use it to PROVE gate-first short-circuit — after an absent
154
- * `requires`, the body/derive/edges/emits SQL is never prepared (a real, observable query-count
155
- * drop), not merely absent from a text list. This is a test aid living beside the runtime.
156
- */
157
- function countingDriver(db) {
158
- const prepared = [];
159
- const wrapped = {
160
- prepare(sql) {
161
- prepared.push(sql);
162
- return db.prepare(sql);
163
- },
164
- };
165
- return { db: wrapped, prepared };
166
- }
167
- //# sourceMappingURL=write-runtime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-runtime.js","sourceRoot":"","sources":["../../src/scp/write-runtime.ts"],"names":[],"mappings":"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"}