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,528 +0,0 @@
1
- "use strict";
2
- /**
3
- * litedbmodel v2 SCP — write-time relations → ordered SQL transaction plan (WS5, #25; spec §6).
4
- *
5
- * Derives a declarative {@link LifecycleContract} (the §6 effect arrays) + a base write op
6
- * (the Command's `Insert`/`Update`/`Delete`, e.g. `Insert(Post, {onWrite: Post.writes.create})`)
7
- * into ONE ordered, gate-first multi-statement transaction plan — exactly the §6 example:
8
- *
9
- * ```
10
- * BEGIN;
11
- * -- Gate First (short-circuit + ROLLBACK before any body write)
12
- * requires: SELECT 1 FROM users WHERE id = :author_id; -- absent ⇒ fail
13
- * idempotency: INSERT INTO idem(token) VALUES(:request_id); -- duplicate ⇒ short-circuit
14
- * unique: INSERT INTO uniq(...) ON CONFLICT DO NOTHING; … -- collision ⇒ fail
15
- * -- Body
16
- * INSERT INTO posts(author_id,title) VALUES(:author_id,:title) RETURNING id;
17
- * derive: UPDATE users SET post_count = post_count + 1 WHERE id = :author_id;
18
- * edges: … (M:N intermediate INSERT/DELETE or 1:N FK UPDATE) …
19
- * emits: INSERT INTO outbox(type,payload) VALUES('PostCreated', :payload);
20
- * COMMIT;
21
- * ```
22
- *
23
- * The plan is PURE JSON (each statement is a WS1 {@link CompiledOperation} rendered by the
24
- * SAME {@link import('./render').renderOperation}), so it serializes into the §8 bundle and a
25
- * thin per-language runtime honors the SAME ordering + gate-first (no re-derivation, spec §6:
26
- * "多言語 runtime は同一計画を honor"). `Transaction` は公開仕様にしない — this plan is DERIVED
27
- * from the Command's declared intent, never authored.
28
- *
29
- * ## Gate-first is a real execution behavior, not a text ordering (spec §6 "Gate First")
30
- *
31
- * Each gate statement carries a {@link GateRule} the runtime evaluates AFTER executing it: a
32
- * failing gate short-circuits — the remaining statements (body + derive + edges + emits) never
33
- * execute and the transaction ROLLBACKs. This is semantically-invariant early termination
34
- * ({@link import('./write-runtime').executeTransaction} proves it with real query counts + DB state).
35
- *
36
- * ## Path lowering (spec §6) — `$.input.*` / `$.entity.*` → closed-set Expression IR
37
- *
38
- * A `$.input.<field>` value lowers to `{ref:['<field>']}` (bc flat input scope); a
39
- * `$.entity.<field>` value lowers to `{ref:['__entity','<field>']}` (the body write's
40
- * RETURNING row, exposed to the derive/edges/emits stages under {@link ENTITY_ROOT}). Only
41
- * bc's closed operator set (`ref`) is emitted — no invented opcode (hard rule).
42
- *
43
- * ## Transaction derivation (spec §6 / §14) — tx-DAG + gate-first
44
- *
45
- * A Command carries one or more named base writes, each with its §6 effects. Statements form a
46
- * data-dependency DAG (`$.ref.<writeName>.<field>` consumes an earlier write's RETURNING row,
47
- * exposed via `TxStatement.binds`), with a gate-first constraint (every gate precedes every
48
- * body/derive/edge/emit). The DAG is topologically ordered (Kahn, stable ascending declaration
49
- * `seq` tie-break) into a single-transaction statement plan. Underivable shapes (dependency
50
- * cycle, dangling `$.ref`, referenced write without RETURNING, duplicate bind, composite
51
- * `$.entity`) are LOUD rejects — never a silently mis-ordered plan.
52
- */
53
- Object.defineProperty(exports, "__esModule", { value: true });
54
- exports.deriveTransactionPlan = deriveTransactionPlan;
55
- const ir_1 = require("./ir");
56
- const guard_1 = require("./guard");
57
- const dialect_1 = require("./dialect");
58
- const writes_1 = require("./writes");
59
- // ── Path → Expression IR ref (closed-set only) ────────────────────────────────
60
- /**
61
- * Lower a path-rooted write-relation value to a bc closed-set `ref` Expression IR node:
62
- * - `$.input.<f>` → `{ref:['<f>']}` (bc flat input scope).
63
- * - `$.entity.<f>` → `{ref:['__entity','<f>']}` (the sole body RETURNING row).
64
- * - `$.ref.<write>.<f>` → `{ref:['<write>','<f>']}` (a named upstream write's RETURNING
65
- * row, bound under `<write>` via
66
- * {@link TxStatement.binds}).
67
- * Only bc's closed `ref` operator is emitted — no invented opcode (hard rule).
68
- */
69
- function pathToRef(value) {
70
- const p = (0, writes_1.parseEffectPath)(value);
71
- if (p.root === 'input')
72
- return { ref: [p.field] };
73
- if (p.root === 'entity')
74
- return { ref: [writes_1.ENTITY_ROOT, p.field] };
75
- return { ref: [p.writeName, p.field] }; // 'ref' → named upstream write row
76
- }
77
- function makeIdGen() {
78
- let n = 0;
79
- return (role) => `tx_${role}_${n++}`;
80
- }
81
- /**
82
- * `requires` → a gate-first existence probe: `SELECT 1 FROM <table> WHERE k1 = ? AND …`.
83
- * ZERO rows ⇒ ROLLBACK. Key columns are ordered deterministically (declaration key order).
84
- */
85
- function compileRequires(e, nextId) {
86
- const cols = Object.keys(e.keys);
87
- if (cols.length === 0)
88
- throw new Error(`write-plan: requires on '${e.table}' declares no keys`);
89
- const whereSql = cols.map((c) => `${c} = ?`).join(' AND ');
90
- const params = cols.map((c) => pathToRef(e.keys[c]));
91
- const op = {
92
- component: 'Select',
93
- sql: `SELECT 1 FROM ${e.table} WHERE ${whereSql}`,
94
- where: null,
95
- params,
96
- assembly: { shape: 'items' },
97
- };
98
- return { id: nextId('requires'), role: 'gate:requires', op, gate: 'existsElseRollback', label: `requires ${e.table}` };
99
- }
100
- /**
101
- * `idempotency` → a gate-first token INSERT: `INSERT INTO <table>(<col>) VALUES(?) ON CONFLICT
102
- * DO NOTHING`. ZERO affected ⇒ DUPLICATE ⇒ short-circuit (no double write). Runs FIRST-among-
103
- * gates after requires, per the §6 example ordering.
104
- */
105
- function compileIdempotency(e, nextId, dialect) {
106
- // A bare do-nothing guard INSERT (no conflict-column target): SQLite/Postgres emit
107
- // `… ON CONFLICT DO NOTHING`; MySQL emits `INSERT IGNORE INTO …`. Routed through the SSoT.
108
- const op = {
109
- component: 'Insert',
110
- sql: dialect.guardInsert(e.table, [e.column], '?'),
111
- where: null,
112
- params: [pathToRef(e.token)],
113
- assembly: { shape: 'items' },
114
- };
115
- return { id: nextId('idem'), role: 'gate:idempotency', op, gate: 'insertedElseNoop', label: `idempotency ${e.table}` };
116
- }
117
- /**
118
- * `unique` → a gate-first guard-row INSERT: `INSERT INTO <guardTable>(name, s1, …, f1, …)
119
- * VALUES(?, …) ON CONFLICT DO NOTHING`. ZERO affected ⇒ COLLISION ⇒ ROLLBACK. The guard row
120
- * columns are `[name] + scope + fields` (deterministic order); `name` is a literal discriminator
121
- * bound as a param via a closed-set string literal (not SQL-inlined) to keep the render path uniform.
122
- */
123
- function compileUnique(e, nextId, dialect) {
124
- const scopeCols = e.scope.map((_, i) => `s${i}`);
125
- const fieldCols = e.fields.map((_, i) => `f${i}`);
126
- const cols = ['name', ...scopeCols, ...fieldCols];
127
- const placeholders = cols.map(() => '?').join(', ');
128
- const params = [
129
- e.name, // literal discriminator (a closed-set string literal)
130
- ...e.scope.map(pathToRef),
131
- ...e.fields.map(pathToRef),
132
- ];
133
- const op = {
134
- component: 'Insert',
135
- sql: dialect.guardInsert(e.guardTable, cols, placeholders),
136
- where: null,
137
- params,
138
- assembly: { shape: 'items' },
139
- };
140
- return { id: nextId('unique'), role: 'gate:unique', op, gate: 'insertedElseRollback', label: `unique ${e.name}` };
141
- }
142
- /**
143
- * `derive` → a cascade counter update: `UPDATE <table> SET <attr> = <attr> + ? WHERE k = ?`.
144
- * The increment amount is bound as a closed-set literal param (the declaration IS the SSoT —
145
- * no hardcoded default). A negative amount renders `attr = attr + ?` with a negative bound value
146
- * (byte-identical text regardless of sign; matches v1's parameterized increment).
147
- */
148
- function compileDerive(e, nextId) {
149
- const keyCols = Object.keys(e.keys);
150
- if (keyCols.length === 0)
151
- throw new Error(`write-plan: derive on '${e.table}' declares no keys`);
152
- // SET clause `?` (the increment amount) is the single pre-WHERE static param; the key `?`s
153
- // live on the WHERE fragment tree (so render's pre/post `{where}` partition stays correct).
154
- const op = {
155
- component: 'Update',
156
- sql: `UPDATE ${e.table} SET ${e.attribute} = ${e.attribute} + ?${ir_1.WHERE_SLOT}`,
157
- where: {
158
- connector: 'AND',
159
- fragments: keyCols.map((c) => ({ always: true, sql: `${c} = ?`, params: [pathToRef(e.keys[c])] })),
160
- },
161
- params: [e.amount],
162
- assembly: { shape: 'items' },
163
- };
164
- return { id: nextId('derive'), role: 'derive', op, label: `derive ${e.table}.${e.attribute}` };
165
- }
166
- /**
167
- * `edges` → M:N intermediate INSERT/DELETE or 1:N FK UPDATE (spec §6 table row `edges`).
168
- * - `m2m` + `set` → `INSERT INTO <join>(c1,…) VALUES(?,…)` (link).
169
- * - `m2m` + `unset` → `DELETE FROM <join> WHERE c1 = ? AND …` (unlink).
170
- * - `fk` + `set` → `UPDATE <related> SET <fkCol> = ? WHERE <keyCols…>` (attach).
171
- * - `fk` + `unset` → `UPDATE <related> SET <fkCol> = NULL WHERE <keyCols…>` (detach).
172
- */
173
- function compileEdge(e, nextId) {
174
- if (e.relation === 'm2m') {
175
- const cols = Object.keys(e.columns);
176
- if (e.action === 'set') {
177
- const placeholders = cols.map(() => '?').join(', ');
178
- const op = {
179
- component: 'Insert',
180
- sql: `INSERT INTO ${e.table} (${cols.join(', ')}) VALUES (${placeholders})`,
181
- where: null,
182
- params: cols.map((c) => pathToRef(e.columns[c])),
183
- assembly: { shape: 'items' },
184
- };
185
- return { id: nextId('edge'), role: 'edge', op, label: `edge m2m link ${e.table}` };
186
- }
187
- // unset → DELETE FROM join WHERE all columns match
188
- const op = {
189
- component: 'Delete',
190
- sql: `DELETE FROM ${e.table}${ir_1.WHERE_SLOT}`,
191
- where: { connector: 'AND', fragments: cols.map((c) => ({ always: true, sql: `${c} = ?`, params: [pathToRef(e.columns[c])] })) },
192
- params: [],
193
- assembly: { shape: 'items' },
194
- };
195
- return { id: nextId('edge'), role: 'edge', op, label: `edge m2m unlink ${e.table}` };
196
- }
197
- // fk: UPDATE <related> SET <fkCol> = ? (or NULL) WHERE <where keys…>
198
- const setCols = Object.keys(e.columns);
199
- const whereCols = Object.keys(e.where);
200
- const setClauses = setCols.map((c) => (e.action === 'set' ? `${c} = ?` : `${c} = NULL`));
201
- const setParams = e.action === 'set' ? setCols.map((c) => pathToRef(e.columns[c])) : [];
202
- const op = {
203
- component: 'Update',
204
- sql: `UPDATE ${e.table} SET ${setClauses.join(', ')}${ir_1.WHERE_SLOT}`,
205
- where: { connector: 'AND', fragments: whereCols.map((c) => ({ always: true, sql: `${c} = ?`, params: [pathToRef(e.where[c])] })) },
206
- params: setParams,
207
- assembly: { shape: 'items' },
208
- };
209
- return { id: nextId('edge'), role: 'edge', op, label: `edge fk ${e.action} ${e.table}` };
210
- }
211
- /**
212
- * `emits` → an outbox INSERT (same tx): `INSERT INTO <outbox>(type, payload) VALUES(?, ?)`.
213
- * `type` is the literal event name; `payload` is a bc `{obj:{…}}` of the path-rooted values,
214
- * serialized to a JSON text column by the runtime (the outbox `payload` column). Emitting the
215
- * payload as a single `obj` param keeps the SQL text stable (two `?` slots).
216
- *
217
- * Single-field payloads (`{obj:{one:…}}`) are fully supported: the portability guard treats
218
- * the `obj` arg as a FIELD MAP (its keys are data field names, not opcodes) and recurses into
219
- * the field values only — the same semantics as bc's guard/evaluator. (Fixed in #38; the guard
220
- * previously misread the lone field name as an unknown opcode.)
221
- */
222
- function compileEmit(e, nextId) {
223
- const payloadObj = {};
224
- for (const [k, v] of Object.entries(e.payload))
225
- payloadObj[k] = pathToRef(v);
226
- const op = {
227
- component: 'Insert',
228
- sql: `INSERT INTO ${e.outboxTable} (type, payload) VALUES (?, ?)`,
229
- where: null,
230
- params: [e.name, { obj: payloadObj }],
231
- assembly: { shape: 'items' },
232
- };
233
- return { id: nextId('emit'), role: 'emit', op, label: `emit ${e.name}` };
234
- }
235
- /**
236
- * Compile ONE base write + its effects into an ordered node group: its gate statements, its body
237
- * (which `binds` the write name for composite scope), then its derive/edges/emits. `seqBase` is
238
- * the group's starting declaration index; the returned nodes carry contiguous `seq` values so the
239
- * topo tie-break is a stable, insertion-independent total order.
240
- */
241
- function compileWriteGroup(base, lifecycle, nextId, dialect, seqRef) {
242
- const e = lifecycle.effects;
243
- const nodes = [];
244
- const mk = (stmt, isGate) => {
245
- const consumes = refHeadsOf(stmt).filter((h) => h !== writes_1.ENTITY_ROOT && !isInputHead(h, stmt));
246
- return { stmt, seq: seqRef.n++, consumes, produces: stmt.binds ?? null, isGate };
247
- };
248
- for (const r of e.requires ?? [])
249
- nodes.push(mk(compileRequires(r, nextId), true));
250
- if (e.idempotency !== undefined)
251
- nodes.push(mk(compileIdempotency(e.idempotency, nextId, dialect), true));
252
- for (const u of e.unique ?? [])
253
- nodes.push(mk(compileUnique(u, nextId, dialect), true));
254
- const bodyId = nextId('body');
255
- const bodyStmt = {
256
- id: bodyId,
257
- role: 'body',
258
- op: base.op,
259
- label: base.label,
260
- ...(base.name !== undefined ? { binds: base.name } : {}),
261
- };
262
- nodes.push(mk(bodyStmt, false));
263
- for (const d of e.derive ?? [])
264
- nodes.push(mk(compileDerive(d, nextId), false));
265
- for (const ed of e.edges ?? [])
266
- nodes.push(mk(compileEdge(ed, nextId), false));
267
- for (const em of e.emits ?? [])
268
- nodes.push(mk(compileEmit(em, nextId), false));
269
- return { nodes, bodyId };
270
- }
271
- /**
272
- * Topologically order the DAG nodes into the executable statement sequence (spec §6 / §14 "write-
273
- * time tx DAG 導出"). Edges:
274
- * 1. DATA dependency — a node consuming `$.ref.<w>.*` runs AFTER the node that produces `<w>`.
275
- * 2. GATE-FIRST — every gate runs before every non-gate (a semantic invariant: a gate must be
276
- * able to short-circuit BEFORE any dependent body/derive/edge/emit work; spec §6 "Gate First").
277
- * Determinism: a Kahn topo sort whose ready-set is drained in ascending `seq` (declaration order),
278
- * so the SAME input always yields the SAME order → byte-identical SQL (the golden bar). A cycle
279
- * (data dependency vs gate-first, or a mutual `$.ref` cycle) is UNRESOLVABLE — ESCALATE loudly
280
- * rather than pick a silent order (hard rule: no guessed default on a genuine ambiguity).
281
- */
282
- function topoOrder(nodes) {
283
- const byName = new Map();
284
- for (const n of nodes) {
285
- if (n.produces !== null) {
286
- if (byName.has(n.produces)) {
287
- throw new Error(`write-plan: two writes both bind the name '${n.produces}' — write names must be unique in a composite Command.`);
288
- }
289
- byName.set(n.produces, n);
290
- }
291
- }
292
- // Build the edge set producer→consumer + gate→non-gate. `preds` counts in-edges per node.
293
- const idOf = new Map();
294
- for (const n of nodes)
295
- idOf.set(n, n.stmt.id);
296
- const succ = new Map(); // stmt id → dependent stmt ids
297
- const indeg = new Map();
298
- const nodeById = new Map();
299
- for (const n of nodes) {
300
- nodeById.set(n.stmt.id, n);
301
- succ.set(n.stmt.id, new Set());
302
- indeg.set(n.stmt.id, 0);
303
- }
304
- const addEdge = (fromId, toId) => {
305
- if (fromId === toId)
306
- return;
307
- const s = succ.get(fromId);
308
- if (!s.has(toId)) {
309
- s.add(toId);
310
- indeg.set(toId, indeg.get(toId) + 1);
311
- }
312
- };
313
- // 1. data-dependency edges (producer → each consumer).
314
- for (const n of nodes) {
315
- for (const dep of n.consumes) {
316
- const producer = byName.get(dep);
317
- if (producer === undefined) {
318
- throw new Error(`write-plan: statement '${n.stmt.label}' references '$.ref.${dep}.*' but no write in this ` +
319
- `Command binds the name '${dep}' — a dangling write reference (fail-closed; no silent skip).`);
320
- }
321
- addEdge(producer.stmt.id, n.stmt.id);
322
- }
323
- }
324
- // 2. gate-first edges (every gate → every non-gate).
325
- const gates = nodes.filter((n) => n.isGate);
326
- const nonGates = nodes.filter((n) => !n.isGate);
327
- for (const g of gates)
328
- for (const b of nonGates)
329
- addEdge(g.stmt.id, b.stmt.id);
330
- // Kahn's algorithm; the ready frontier is drained in ascending declaration `seq` (stable).
331
- const ordered = [];
332
- const ready = nodes.filter((n) => indeg.get(n.stmt.id) === 0).sort((a, b) => a.seq - b.seq);
333
- while (ready.length > 0) {
334
- const n = ready.shift();
335
- ordered.push(n.stmt);
336
- for (const depId of succ.get(n.stmt.id)) {
337
- indeg.set(depId, indeg.get(depId) - 1);
338
- if (indeg.get(depId) === 0) {
339
- const dn = nodeById.get(depId);
340
- // insert keeping the frontier sorted by seq (stable deterministic drain)
341
- let lo = 0;
342
- while (lo < ready.length && ready[lo].seq < dn.seq)
343
- lo++;
344
- ready.splice(lo, 0, dn);
345
- }
346
- }
347
- }
348
- if (ordered.length !== nodes.length) {
349
- const stuck = nodes.filter((n) => !ordered.includes(n.stmt)).map((n) => n.stmt.label);
350
- throw new Error(`write-plan: the write-time transaction DAG has a CYCLE (unresolvable ordering among ` +
351
- `[${stuck.join(', ')}]). This is either a mutual '$.ref' data dependency or a gate that ` +
352
- `depends on a body row (a gate cannot depend on a not-yet-written row). ESCALATE: the ` +
353
- `Command's write dependencies are contradictory — no order satisfies both the data ` +
354
- `dependencies and gate-first. (Fail-closed; the derivation never guesses an order.)`);
355
- }
356
- return ordered;
357
- }
358
- /**
359
- * Derive the ORDERED, gate-first {@link TransactionPlan} from a Command's base write(s) + its
360
- * lifecycle save contract (spec §6 / §14).
361
- *
362
- * ## Single base write (WS5 scope)
363
- *
364
- * One base write + a top-level `lifecycle`; the order is the fixed §6 group
365
- * (requires → idempotency → unique → BODY → derive → edges → emits). `$.entity.*` references in
366
- * derive/edges/emits require the body write to RETURN the entity row (else a loud build error).
367
- *
368
- * ## Composite / nested write (WS8a scope) — real DAG derivation
369
- *
370
- * Multiple base writes, each carrying its OWN {@link BaseWrite.effects} and a `name`. A later
371
- * write references an earlier write's RETURNING row via `$.ref.<name>.<field>` (e.g. a child
372
- * INSERT keyed by the parent's returned id). The derivation builds the data-dependency graph
373
- * (statement → the writes it references) + the gate-first constraint, TOPOLOGICALLY orders it
374
- * (deterministic, stable tie-break), and emits ONE ordered gate-first transaction plan. A cycle
375
- * or dangling reference is ESCALATED (no silent mis-derivation).
376
- *
377
- * @throws if a `$.entity.*` reference lacks a RETURNING body, a `$.ref.*` is dangling, two writes
378
- * bind the same name, or the dependency graph has a cycle.
379
- */
380
- function deriveTransactionPlan(phase, bases, lifecycle, dialect = dialect_1.SQLITE) {
381
- if (bases.length === 0) {
382
- throw new Error('write-plan: a Command must declare at least one base write (Insert/Update/Delete).');
383
- }
384
- const nextId = makeIdGen();
385
- const seqRef = { n: 0 };
386
- const composite = bases.length > 1;
387
- // Each base write contributes a node group. In single-base WS5 scope the lifecycle is the
388
- // top-level arg; in composite scope each base carries its own `effects` (the shared top-level
389
- // `lifecycle` still applies to the FIRST base — the Command body — for backward-compatible
390
- // single-write callers that pass effects there).
391
- const allNodes = [];
392
- const bodyIds = [];
393
- bases.forEach((base, i) => {
394
- const lc = base.effects !== undefined ? { effects: base.effects } : i === 0 ? lifecycle : { effects: {} };
395
- const { nodes, bodyId } = compileWriteGroup(base, lc, nextId, dialect, seqRef);
396
- allNodes.push(...nodes);
397
- bodyIds.push(bodyId);
398
- });
399
- const statements = topoOrder(allNodes);
400
- // `$.entity.*` back-compat: the SOLE base write's RETURNING row is exposed under __entity.
401
- const soleBody = bases[0];
402
- const soleBodyId = bodyIds[0];
403
- const usesEntity = referencesHead(statements, writes_1.ENTITY_ROOT);
404
- const soleBodyReturns = /\breturning\b/i.test(soleBody.op.sql);
405
- if (usesEntity && composite) {
406
- throw new Error(`write-plan: a composite (multi-write) Command uses '$.entity.*' — ambiguous which write it ` +
407
- `denotes. Address each write's row by name via '$.ref.<writeName>.<field>' (fail-closed).`);
408
- }
409
- if (usesEntity && !soleBodyReturns) {
410
- throw new Error(`write-plan: a derive/edges/emits stage references '$.entity.*' but the body write ` +
411
- `('${soleBody.label}') has no RETURNING clause — the written row cannot be exposed to later ` +
412
- `stages. Add a RETURNING to the base write (fail-closed; no absent-entity default).`);
413
- }
414
- const entityFrom = usesEntity || (!composite && soleBodyReturns) ? soleBodyId : null;
415
- // Every write that a later statement references via `$.ref.<name>.*` MUST RETURN its row.
416
- for (const base of bases) {
417
- if (base.name === undefined)
418
- continue;
419
- if (referencesHead(statements, base.name) && !/\breturning\b/i.test(base.op.sql)) {
420
- throw new Error(`write-plan: write '${base.name}' is referenced as '$.ref.${base.name}.*' by a later ` +
421
- `statement but its op has no RETURNING clause — its row cannot be bound for downstream ` +
422
- `writes. Add a RETURNING to write '${base.name}' (fail-closed; no absent-row default).`);
423
- }
424
- }
425
- // Hard rule: every param slot in the plan is closed-set Expression IR only. Fail-closed.
426
- for (const s of statements)
427
- (0, guard_1.assertOperationPortable)(s.op);
428
- return { phase, entityFrom, statements, onIdempotentHit: 'rollback' };
429
- }
430
- /** Collect the ref-heads (`ref[0]`) a statement's params + where reference. */
431
- function refHeadsOf(stmt) {
432
- const heads = new Set();
433
- collectRefHeads(stmt.op.params, heads);
434
- if (stmt.op.where !== null)
435
- collectWhereHeads(stmt.op.where, heads);
436
- return [...heads];
437
- }
438
- /**
439
- * True if a ref-head is an INPUT head (a bare `$.input.<f>` → `{ref:['<f>']}`), i.e. NOT a
440
- * cross-statement dependency. An input head is a single-element `ref` path whose head is a plain
441
- * field. We distinguish it from a write-name head (`$.ref.<w>.<f>` → `{ref:['<w>','<f>']}`, a
442
- * 2-element path) and the sole-entity head (`__entity`). A 2-element `ref` whose head is neither
443
- * `__entity` nor a declared write name would be a dangling reference (caught in {@link topoOrder}).
444
- */
445
- function isInputHead(head, stmt) {
446
- // An input ref is a 1-element path `{ref:[head]}`; a dependency ref is 2-element `{ref:[w,f]}`.
447
- return refPathLengthFor(stmt, head) === 1;
448
- }
449
- /** The (max) path length of a `ref` node whose head equals `head`, within a statement's op. */
450
- function refPathLengthFor(stmt, head) {
451
- let maxLen = 0;
452
- const walk = (node) => {
453
- if (node === null || typeof node !== 'object')
454
- return;
455
- if (Array.isArray(node)) {
456
- for (const el of node)
457
- walk(el);
458
- return;
459
- }
460
- const keys = Object.keys(node);
461
- if (keys.length === 1 && keys[0] === 'ref') {
462
- const path = node.ref;
463
- if (Array.isArray(path) && path[0] === head)
464
- maxLen = Math.max(maxLen, path.length);
465
- return;
466
- }
467
- for (const k of keys)
468
- walk(node[k]);
469
- };
470
- walk(stmt.op.params);
471
- if (stmt.op.where !== null) {
472
- const collectWhere = (node) => {
473
- if (node === null || typeof node !== 'object')
474
- return;
475
- const n = node;
476
- if ('connector' in n && Array.isArray(n.fragments)) {
477
- for (const f of n.fragments)
478
- collectWhere(f);
479
- return;
480
- }
481
- if (Array.isArray(n.params))
482
- walk(n.params);
483
- };
484
- collectWhere(stmt.op.where);
485
- }
486
- return maxLen;
487
- }
488
- /** True if any statement's compiled op references a `{ref:[head, …]}` head. */
489
- function referencesHead(statements, head) {
490
- const heads = new Set();
491
- for (const s of statements) {
492
- collectRefHeads(s.op.params, heads);
493
- if (s.op.where !== null)
494
- collectWhereHeads(s.op.where, heads);
495
- }
496
- return heads.has(head);
497
- }
498
- function collectRefHeads(node, heads) {
499
- if (node === null || typeof node !== 'object')
500
- return;
501
- if (Array.isArray(node)) {
502
- for (const el of node)
503
- collectRefHeads(el, heads);
504
- return;
505
- }
506
- const keys = Object.keys(node);
507
- if (keys.length === 1 && keys[0] === 'ref') {
508
- const path = node.ref;
509
- if (Array.isArray(path) && typeof path[0] === 'string')
510
- heads.add(path[0]);
511
- return;
512
- }
513
- for (const k of keys)
514
- collectRefHeads(node[k], heads);
515
- }
516
- function collectWhereHeads(node, heads) {
517
- if (node === null || typeof node !== 'object')
518
- return;
519
- const n = node;
520
- if ('connector' in n && Array.isArray(n.fragments)) {
521
- for (const f of n.fragments)
522
- collectWhereHeads(f, heads);
523
- return;
524
- }
525
- if (Array.isArray(n.params))
526
- collectRefHeads(n.params, heads);
527
- }
528
- //# sourceMappingURL=write-plan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-plan.js","sourceRoot":"","sources":["../../src/scp/write-plan.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;;AA8dH,sDAgEC;AA3hBD,6BAAkC;AAClC,mCAAkD;AAClD,uCAAiD;AACjD,qCAYkB;AAwElB,iFAAiF;AAEjF;;;;;;;;GAQG;AACH,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,CAAC,GAAG,IAAA,wBAAe,EAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAc,CAAC;IAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAW,EAAE,CAAC,CAAC,KAAK,CAAC,EAAc,CAAC;IAC5E,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAU,EAAE,CAAC,CAAC,KAAK,CAAC,EAAc,CAAC,CAAC,mCAAmC;AAC1F,CAAC;AAWD,SAAS,SAAS;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,CAAiB,EAAE,MAAa;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,GAAsB;QAC5B,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,iBAAiB,CAAC,CAAC,KAAK,UAAU,QAAQ,EAAE;QACjD,KAAK,EAAE,IAAI;QACX,MAAM;QACN,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC7B,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;AACzH,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,CAAoB,EAAE,MAAa,EAAE,OAAgB;IAC/E,mFAAmF;IACnF,2FAA2F;IAC3F,MAAM,EAAE,GAAsB;QAC5B,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC;QAClD,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC7B,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;AACzH,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,CAAe,EAAE,MAAa,EAAE,OAAgB;IACrE,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,MAAM,GAAe;QACzB,CAAC,CAAC,IAA2B,EAAE,sDAAsD;QACrF,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QACzB,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;KAC3B,CAAC;IACF,MAAM,EAAE,GAAsB;QAC5B,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC;QAC1D,KAAK,EAAE,IAAI;QACX,MAAM;QACN,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC7B,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AACpH,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,CAAe,EAAE,MAAa;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC;IACjG,2FAA2F;IAC3F,4FAA4F;IAC5F,MAAM,EAAE,GAAsB;QAC5B,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,UAAU,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,SAAS,OAAO,eAAU,EAAE;QAC7E,KAAK,EAAE;YACL,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACnG;QACD,MAAM,EAAE,CAAC,CAAC,CAAC,MAA6B,CAAC;QACzC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC7B,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;AACjG,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,CAAa,EAAE,MAAa;IAC/C,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,EAAE,GAAsB;gBAC5B,SAAS,EAAE,QAAQ;gBACnB,GAAG,EAAE,eAAe,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,GAAG;gBAC3E,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;aAC7B,CAAC;YACF,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACrF,CAAC;QACD,mDAAmD;QACnD,MAAM,EAAE,GAAsB;YAC5B,SAAS,EAAE,QAAQ;YACnB,GAAG,EAAE,eAAe,CAAC,CAAC,KAAK,GAAG,eAAU,EAAE;YAC1C,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAC/H,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;SAC7B,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IACvF,CAAC;IACD,qEAAqE;IACrE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACzF,MAAM,SAAS,GAAe,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,MAAM,EAAE,GAAsB;QAC5B,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,UAAU,CAAC,CAAC,KAAK,QAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,eAAU,EAAE;QAClE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACnI,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC7B,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;AAC3F,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CAAC,CAAa,EAAE,MAAa;IAC/C,MAAM,UAAU,GAA6B,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,EAAE,GAAsB;QAC5B,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,eAAe,CAAC,CAAC,WAAW,gCAAgC;QACjE,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,CAAC,CAAC,IAA2B,EAAE,EAAE,GAAG,EAAE,UAAU,EAAyB,CAAC;QACnF,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC7B,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC3E,CAAC;AA+CD;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,IAAe,EACf,SAA4B,EAC5B,MAAa,EACb,OAAgB,EAChB,MAAqB;IAErB,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;IAC5B,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,CAAC,IAAiB,EAAE,MAAe,EAAW,EAAE;QACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,oBAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5F,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;IACnF,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1G,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAExF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAgB;QAC5B,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAChF,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/E,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/E,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,SAAS,CAAC,KAAyB;IAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,QAAQ,wDAAwD,CAAC,CAAC;YACpI,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC,CAAC,+BAA+B;IAC5E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,IAAY,EAAQ,EAAE;QACrD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACZ,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC;IAEF,uDAAuD;IACvD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,0BAA0B,CAAC,CAAC,IAAI,CAAC,KAAK,uBAAuB,GAAG,2BAA2B;oBACzF,2BAA2B,GAAG,+DAA+D,CAChG,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,qDAAqD;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE/E,2FAA2F;IAC3F,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAc,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACvG,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAE,EAAE,CAAC;YACzC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAE,GAAG,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;gBAChC,yEAAyE;gBACzE,IAAI,EAAE,GAAG,CAAC,CAAC;gBACX,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG;oBAAE,EAAE,EAAE,CAAC;gBACzD,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtF,MAAM,IAAI,KAAK,CACb,sFAAsF;YACpF,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qEAAqE;YACzF,uFAAuF;YACvF,oFAAoF;YACpF,oFAAoF,CACvF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,qBAAqB,CACnC,KAA0B,EAC1B,KAA2B,EAC3B,SAA4B,EAC5B,UAAmB,gBAAM;IAEzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACxB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAEnC,0FAA0F;IAC1F,8FAA8F;IAC9F,2FAA2F;IAC3F,iDAAiD;IACjD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,EAAE,GAAsB,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC7H,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEvC,2FAA2F;IAC3F,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,oBAAW,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,6FAA6F;YAC3F,0FAA0F,CAC7F,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,oFAAoF;YAClF,KAAK,QAAQ,CAAC,KAAK,0EAA0E;YAC7F,oFAAoF,CACvF,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,UAAU,IAAI,CAAC,CAAC,SAAS,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAErF,0FAA0F;IAC1F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACtC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,IAAI,6BAA6B,IAAI,CAAC,IAAI,iBAAiB;gBACpF,wFAAwF;gBACxF,qCAAqC,IAAI,CAAC,IAAI,yCAAyC,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yFAAyF;IACzF,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,IAAA,+BAAuB,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE1D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;AACxE,CAAC;AAED,+EAA+E;AAC/E,SAAS,UAAU,CAAC,IAAiB;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI;QAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,IAAiB;IAClD,gGAAgG;IAChG,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,+FAA+F;AAC/F,SAAS,gBAAgB,CAAC,IAAiB,EAAE,IAAY;IACvD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,IAAI,GAAG,CAAC,IAAa,EAAQ,EAAE;QACnC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,EAAE,IAAI,IAAI;gBAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAI,IAAgC,CAAC,GAAG,CAAC;YACnD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAE,IAAgC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACrB,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,CAAC,IAAa,EAAQ,EAAE;YAC3C,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAO;YACtD,MAAM,CAAC,GAAG,IAAyE,CAAC;YACpF,IAAI,WAAW,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS;oBAAE,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,SAAS,cAAc,CAAC,UAAkC,EAAE,IAAY;IACtE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI;YAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,eAAe,CAAC,IAAa,EAAE,KAAkB;IACxD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IACtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,EAAE,IAAI,IAAI;YAAE,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAI,IAAgC,CAAC,GAAG,CAAC;QACnD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,eAAe,CAAE,IAAgC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAA6D,EAAE,KAAkB;IAC1G,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IACtD,MAAM,CAAC,GAAG,IAAyE,CAAC;IACpF,IAAI,WAAW,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS;YAAE,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC"}
@@ -1,80 +0,0 @@
1
- /**
2
- * litedbmodel v2 SCP — write-time transaction runtime (WS5, #25; spec §6 / §3 / §11).
3
- *
4
- * Executes a derived {@link TransactionPlan} against REAL SQLite as ONE transaction with
5
- * gate-first short-circuit (spec §6). It renders each ordered statement with the SAME normative
6
- * {@link renderOperation} the read path uses (fragment tree + Expression-IR param slots), and
7
- * drives an explicit `BEGIN` / `COMMIT` / `ROLLBACK` envelope through the SAME synchronous
8
- * driver seam ({@link SqliteDb}) the WS3 runtime uses — no mock, no separate interpreter.
9
- *
10
- * ## The transaction envelope (spec §6) — Tx is derived, not authored
11
- *
12
- * BEGIN;
13
- * for each ordered statement:
14
- * render (input + accumulated $.entity row) → execute REAL SQL
15
- * if it is a GATE and its rule FAILS → ROLLBACK and stop (remaining SQL never runs)
16
- * COMMIT; (or ROLLBACK on a driver failure / gate fail)
17
- *
18
- * The body write's RETURNING row is captured and exposed to the derive/edges/emits stages under
19
- * `$.entity.*` ({@link ENTITY_ROOT}) — the §6 example's `$.entity.id`.
20
- *
21
- * ## Gate-first is a REAL behavior (spec §6 "Gate First"), proven, not textual
22
- *
23
- * A gate statement's {@link GateRule} is evaluated on its actual driver result:
24
- * - `existsElseRollback` — `SELECT 1 …` returned ZERO rows ⇒ the required row is absent ⇒
25
- * ROLLBACK; the body + all later statements are NEVER prepared/executed (a real query-count
26
- * drop, observable via a counting driver, and the DB is unchanged).
27
- * - `insertedElseRollback` — a `unique` guard `INSERT … ON CONFLICT DO NOTHING` affected ZERO
28
- * rows ⇒ a collision ⇒ ROLLBACK.
29
- * - `insertedElseNoop` — an `idempotency` token INSERT affected ZERO rows ⇒ a DUPLICATE request
30
- * ⇒ short-circuit as a no-op: ROLLBACK the (empty-so-far) transaction, so a duplicate
31
- * `request_id` performs NO double write (idempotent).
32
- *
33
- * A short-circuit returns a structured {@link TransactionResult} (`committed:false`) rather than
34
- * throwing — the caller distinguishes a legitimate gate outcome (absent requires / unique
35
- * collision / duplicate) from a driver Failure (which IS mapped + thrown, spec §11 item 5).
36
- */
37
- import type { Scope } from 'behavior-contracts';
38
- import { type Dialect } from './dialect';
39
- import type { TransactionPlan } from './write-plan';
40
- import type { SqliteDb } from './runtime';
41
- /** Why a transaction did not commit (a gate short-circuit outcome; not a driver error). */
42
- export type ShortCircuitReason = 'requires_absent' | 'unique_collision' | 'idempotent_duplicate';
43
- /** The structured outcome of executing a {@link TransactionPlan}. */
44
- export interface TransactionResult {
45
- /** Whether the transaction COMMITted (`true`) or short-circuited + ROLLBACKed (`false`). */
46
- readonly committed: boolean;
47
- /** When short-circuited: which gate stopped it (and thus which later SQL never ran). */
48
- readonly shortCircuit?: {
49
- readonly statementId: string;
50
- readonly reason: ShortCircuitReason;
51
- };
52
- /** The body write's RETURNING row (`$.entity`), or null when the tx short-circuited/omitted RETURNING. */
53
- readonly entity: Record<string, unknown> | null;
54
- /** The ordered ids of the statements actually EXECUTED (gate-first short-circuit drops the tail). */
55
- readonly executed: readonly string[];
56
- }
57
- /**
58
- * Execute a derived {@link TransactionPlan} as ONE real SQLite transaction with gate-first
59
- * short-circuit (spec §6). Statements run in the plan's fixed order (requires → idempotency →
60
- * unique → body → derive → edges → emits); a failing gate ROLLBACKs and the remaining statements
61
- * are never executed. On success COMMITs and returns the `$.entity` RETURNING row.
62
- *
63
- * @param db the synchronous SQLite driver (better-sqlite3 `Database`), supporting `BEGIN` /
64
- * `COMMIT` / `ROLLBACK` via `prepare(...).run()`.
65
- * @param plan the derived transaction plan (pure JSON; from `deriveTransactionPlan` or the bundle).
66
- * @param input the Command input scope (`$.input.*` = bc flat scope).
67
- * @throws {SqlFailure} a mapped driver failure (the transaction is ROLLBACKed first, spec §11).
68
- */
69
- export declare function executeTransaction(db: SqliteDb, plan: TransactionPlan, input: Scope, dialect?: Dialect): TransactionResult;
70
- /**
71
- * A counting {@link SqliteDb} wrapper: forwards every call to the wrapped driver but records
72
- * each PREPARED SQL string. Tests use it to PROVE gate-first short-circuit — after an absent
73
- * `requires`, the body/derive/edges/emits SQL is never prepared (a real, observable query-count
74
- * drop), not merely absent from a text list. This is a test aid living beside the runtime.
75
- */
76
- export declare function countingDriver(db: SqliteDb): {
77
- db: SqliteDb;
78
- prepared: string[];
79
- };
80
- //# sourceMappingURL=write-runtime.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-runtime.d.ts","sourceRoot":"","sources":["../../src/scp/write-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,oBAAoB,CAAC;AAKvD,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAY,eAAe,EAAe,MAAM,cAAc,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,2FAA2F;AAC3F,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AAEjG,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,4FAA4F;IAC5F,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,wFAAwF;IACxF,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC9F,0GAA0G;IAC1G,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,qGAAqG;IACrG,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAkDD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,OAAgB,GAAG,iBAAiB,CA6ClI;AAeD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CASjF"}