okmodel 0.7.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.
Files changed (258) hide show
  1. package/README.md +14 -0
  2. package/dist/adapters/capabilities.d.ts +32 -0
  3. package/dist/adapters/failure.d.ts +1 -1
  4. package/dist/adapters/pg/bun-sql.d.ts +53 -0
  5. package/dist/adapters/pg/bunsql-extra.d.ts +1 -1
  6. package/dist/adapters/pg/bunsql.d.ts +1 -1
  7. package/dist/adapters/pg/neon-extra.d.ts +18 -0
  8. package/dist/adapters/pg/neon.d.ts +104 -0
  9. package/dist/adapters/pg/no-inflight-timeout.d.ts +1 -1
  10. package/dist/contracts/error.d.ts +1 -1
  11. package/dist/dialects/pg/ext/btree-gin.d.ts +26 -0
  12. package/dist/dialects/pg/ext/btree-gin.js +20 -0
  13. package/dist/dialects/pg/ext/btree-gist.d.ts +26 -0
  14. package/dist/dialects/pg/ext/btree-gist.js +20 -0
  15. package/dist/dialects/pg/ext/call.d.ts +53 -0
  16. package/dist/dialects/pg/ext/citext.js +1 -1
  17. package/dist/dialects/pg/ext/feature.d.ts +26 -0
  18. package/dist/dialects/pg/ext/fuzzystrmatch.d.ts +34 -0
  19. package/dist/dialects/pg/ext/fuzzystrmatch.js +33 -0
  20. package/dist/dialects/pg/ext/hstore.d.ts +41 -0
  21. package/dist/dialects/pg/ext/hstore.js +29 -0
  22. package/dist/dialects/pg/ext/index.d.ts +56 -0
  23. package/dist/dialects/pg/ext/index.js +1 -1
  24. package/dist/dialects/pg/ext/ltree.d.ts +41 -0
  25. package/dist/dialects/pg/ext/ltree.js +29 -0
  26. package/dist/dialects/pg/ext/pg-trgm.js +4 -13
  27. package/dist/dialects/pg/ext/pgcrypto.d.ts +33 -0
  28. package/dist/dialects/pg/ext/pgcrypto.js +33 -0
  29. package/dist/dialects/pg/ext/unaccent.d.ts +26 -0
  30. package/dist/dialects/pg/ext/unaccent.js +21 -0
  31. package/dist/dialects/pg/ext/using.d.ts +23 -0
  32. package/dist/dialects/pg/ext/versions.d.ts +36 -0
  33. package/dist/dialects/pg/external.d.ts +19 -0
  34. package/dist/dialects/pg/fn/index.d.ts +39 -1
  35. package/dist/dialects/pg/fn/index.js +118 -26
  36. package/dist/dialects/pg/index.d.ts +3 -0
  37. package/dist/dialects/pg/index.js +394 -14
  38. package/dist/dialects/pg/introspect.d.ts +11 -0
  39. package/dist/dialects/pg/operators.d.ts +1 -1
  40. package/dist/dialects/pg/ops/fragment.d.ts +119 -0
  41. package/dist/dialects/pg/ops/lane.d.ts +49 -0
  42. package/dist/dialects/pg/view/client.d.ts +14 -6
  43. package/dist/dialects/pg/view/index.d.ts +73 -1
  44. package/dist/dialects/pg/view/index.js +156 -5
  45. package/dist/dialects/pg/view/scratch.d.ts +11 -5
  46. package/dist/runtime/artifact-file.d.ts +22 -0
  47. package/dist/runtime/client.d.ts +10 -0
  48. package/dist/runtime/drift-detail.d.ts +2 -1
  49. package/dist/runtime/drift.d.ts +3 -10
  50. package/dist/runtime/otel.d.ts +105 -0
  51. package/dist/runtime/otel.js +97 -0
  52. package/dist/runtime/pg/bun.js +4 -4
  53. package/dist/runtime/pg/neon.d.ts +38 -0
  54. package/dist/runtime/pg/neon.js +64 -0
  55. package/dist/runtime/pg/pg.js +4 -4
  56. package/dist/runtime/pg/pglite.js +4 -4
  57. package/dist/runtime/pg/postgresjs.js +4 -4
  58. package/dist/runtime/plan.d.ts +1 -1
  59. package/dist/runtime/server-check.d.ts +36 -6
  60. package/dist/runtime/sql-fragment.d.ts +43 -0
  61. package/dist/runtime/tenancy/index.js +10 -10
  62. package/dist/runtime/topology.d.ts +1 -1
  63. package/dist/runtime/traits/index.js +16 -17
  64. package/dist/runtime/types.d.ts +15 -1
  65. package/dist/runtime/validate/index.js +4 -4
  66. package/dist/shared/{81ebdx9p.js → 0j6qe91y.js} +4 -4
  67. package/dist/shared/{qq3899ht.js → 12z7aznj.js} +243 -14
  68. package/dist/shared/{gzaveazc.js → 1d9q9cv2.js} +29 -2
  69. package/dist/shared/{w79hsckn.js → 1mxm04fy.js} +5 -5
  70. package/dist/shared/{7k9grvf6.js → 2szgv6yj.js} +5 -5
  71. package/dist/shared/{gs74dbj5.js → 2zdxkt7b.js} +933 -111
  72. package/dist/shared/{m6p12kbr.js → 3456242y.js} +23 -23
  73. package/dist/shared/3bb7wsqt.js +99 -0
  74. package/dist/shared/{y6njgyda.js → 3t6kw83m.js} +2 -2
  75. package/dist/shared/{xhfsfkgk.js → 4vbf83xx.js} +9 -2
  76. package/dist/shared/{pt94kz7f.js → 5kyb3tqx.js} +1 -1
  77. package/dist/shared/61bmrmhr.js +35 -0
  78. package/dist/shared/{x933k9a3.js → 62b603gr.js} +10 -10
  79. package/dist/shared/{jgqj11w4.js → 6f0z3hzh.js} +4 -0
  80. package/dist/shared/{tsvww22q.js → 6nae0spm.js} +156 -95
  81. package/dist/shared/{mtaszv5a.js → 71n0jmhc.js} +102 -4
  82. package/dist/shared/{5e3tf63j.js → 760ppr76.js} +14 -6
  83. package/dist/shared/7ba5h6pb.js +17 -0
  84. package/dist/shared/{sfz1ksn6.js → 8jesqsrk.js} +2 -2
  85. package/dist/shared/{5v3xf80k.js → 8n688yjg.js} +1 -1
  86. package/dist/shared/{rs73fca9.js → 8qzkd9f3.js} +6 -6
  87. package/dist/shared/{ax7qv55k.js → 90sg0w5a.js} +202 -25
  88. package/dist/shared/{zm0ptry0.js → 99qp9vtg.js} +1 -1
  89. package/dist/shared/{xnxsed62.js → 9dr2qnx7.js} +14 -14
  90. package/dist/shared/{1w508jbr.js → 9dtgn1z2.js} +21 -17
  91. package/dist/shared/{h15jx9bc.js → 9dvh1dr6.js} +1 -1
  92. package/dist/shared/{q5c6ngn3.js → a62rb2da.js} +1 -1
  93. package/dist/shared/{te5as7z7.js → aksb89mn.js} +3 -3
  94. package/dist/shared/{bz84tkzm.js → bphrgwz9.js} +2 -2
  95. package/dist/shared/bsek72fg.js +225 -0
  96. package/dist/shared/{7mnme5tn.js → c3mvnq7a.js} +1 -1
  97. package/dist/shared/{p6qc5gcp.js → ccsmhv9r.js} +25 -7
  98. package/dist/shared/{pbp1ss85.js → cexb7z6b.js} +2 -2
  99. package/dist/shared/{ab9gmbwy.js → cf8zdz5p.js} +5 -5
  100. package/dist/shared/{jvd0mqag.js → ckz05z15.js} +5 -5
  101. package/dist/shared/{dk8v79p3.js → d5nmj7vv.js} +1 -1
  102. package/dist/shared/{14vx95q4.js → dd5pmnky.js} +7 -7
  103. package/dist/shared/{vb6qfyve.js → ds229x4r.js} +2 -2
  104. package/dist/shared/{1qa0qajz.js → e275q7sd.js} +1 -1
  105. package/dist/shared/{zp9fmend.js → ebhz8vh6.js} +4 -4
  106. package/dist/shared/{hyh73qk6.js → ecn8mfdq.js} +5 -5
  107. package/dist/shared/{je4axnm8.js → fdsz3w80.js} +2 -2
  108. package/dist/shared/{9s0ypp87.js → fk9vef30.js} +85 -74
  109. package/dist/shared/{g6evj1j3.js → g89fmz5s.js} +1 -1
  110. package/dist/shared/{aytqh5y2.js → ghqzdp94.js} +2 -2
  111. package/dist/shared/h9811jjm.js +17 -0
  112. package/dist/shared/{dkxgzaqd.js → hqpxf4a4.js} +1 -1
  113. package/dist/shared/{8skf0cam.js → jpybhf98.js} +1 -1
  114. package/dist/shared/{67txcrcw.js → kgwp4jdd.js} +4 -4
  115. package/dist/shared/kzgrnckd.js +29 -0
  116. package/dist/shared/mazpbcdj.js +233 -0
  117. package/dist/shared/{kb2sdhfb.js → mfvx6kjx.js} +17 -1
  118. package/dist/shared/{svncdeh5.js → mgaq2sd3.js} +11 -8
  119. package/dist/shared/{5mtf6cj3.js → mvmm3xpb.js} +5 -2
  120. package/dist/shared/{b5pftnn2.js → myk8fswx.js} +66 -21
  121. package/dist/shared/{2shdbn8q.js → n306gqkd.js} +9 -9
  122. package/dist/shared/{n816peh1.js → n454kcnw.js} +1 -1
  123. package/dist/shared/n5whk3mt.js +665 -0
  124. package/dist/shared/n7kg8mmx.js +61 -0
  125. package/dist/shared/{vqrjpcqn.js → nmnsgj7x.js} +1 -1
  126. package/dist/shared/{tbrvgw6z.js → npdftanb.js} +19 -26
  127. package/dist/shared/{ek2wt2dz.js → pg4ezgyf.js} +11 -30
  128. package/dist/shared/{5fe3kbsh.js → pgsak1yw.js} +1 -1
  129. package/dist/shared/{bm22fvzr.js → qfw14tna.js} +2 -2
  130. package/dist/shared/{wa07eas9.js → qvwwp1mp.js} +62 -41
  131. package/dist/shared/rbxt795q.js +1766 -0
  132. package/dist/shared/{xjk7hnn5.js → s7he5e5d.js} +2 -2
  133. package/dist/shared/{w72kgg4q.js → ss2kv2rs.js} +6 -6
  134. package/dist/shared/stfa9xcw.js +450 -0
  135. package/dist/shared/{3v7t1yrv.js → th3be82n.js} +2 -2
  136. package/dist/shared/{79dt02vc.js → tr64w5p0.js} +1 -1
  137. package/dist/shared/{cn957f8d.js → tw1nvvfj.js} +3 -3
  138. package/dist/shared/{ed0b8k4s.js → typ3vy7t.js} +1 -1
  139. package/dist/shared/{9628a9xt.js → vk7rag46.js} +1 -1
  140. package/dist/shared/{ze4hxsmy.js → w9ejzaqf.js} +1 -1
  141. package/dist/shared/{vczs8gd4.js → wvtjg5m3.js} +2 -2
  142. package/dist/shared/{9y3mmmh1.js → xfhe73sb.js} +1 -1
  143. package/dist/shared/xqacq37x.js +61 -0
  144. package/dist/shared/{1est4ezg.js → xtsydxjg.js} +3 -3
  145. package/dist/shared/xv8qj97g.js +96 -0
  146. package/dist/shared/{bg3rym3g.js → xwhdcrm4.js} +2 -2
  147. package/dist/shared/{kr0jzbw2.js → yvabyg9k.js} +7 -7
  148. package/dist/shared/yybhre6n.js +136 -0
  149. package/dist/shared/zdqf8k5d.js +8 -0
  150. package/dist/shared/{jznfax0y.js → zq1he88x.js} +4 -4
  151. package/dist/tooling/cli.js +108 -23
  152. package/dist/tooling/driver-run.js +4654 -0
  153. package/dist/tooling/driver-test.d.ts +36 -0
  154. package/dist/tooling/github/comment.d.ts +50 -0
  155. package/dist/tooling/github/post-comment.d.ts +17 -0
  156. package/dist/tooling/migrate/commands.d.ts +3 -2
  157. package/dist/tooling/migrate/config.d.ts +13 -0
  158. package/dist/tooling/migrate/export.d.ts +165 -0
  159. package/dist/tooling/migrate/ext-surface.d.ts +80 -0
  160. package/dist/tooling/migrate/ext.d.ts +31 -4
  161. package/dist/tooling/migrate/import-drizzle.d.ts +40 -0
  162. package/dist/tooling/migrate/index.d.ts +3 -0
  163. package/dist/tooling/migrate/index.js +55 -10
  164. package/dist/tooling/migrate/lint-rules.d.ts +18 -1
  165. package/dist/tooling/migrate/lint.d.ts +14 -1
  166. package/dist/tooling/migrate/place.d.ts +18 -0
  167. package/dist/tooling/migrate/plan-json.d.ts +65 -0
  168. package/dist/tooling/migrate/project.d.ts +13 -1
  169. package/dist/tooling/migrate/pull-emit.d.ts +98 -0
  170. package/dist/tooling/migrate/pull-routines.d.ts +126 -0
  171. package/dist/tooling/migrate/pull-verify.d.ts +26 -0
  172. package/dist/tooling/migrate/pull.d.ts +62 -0
  173. package/dist/tooling/migrate/reprint.d.ts +32 -0
  174. package/dist/tooling/migrate/sandbox.d.ts +8 -2
  175. package/dist/tooling/migrate/schema-api.d.ts +43 -0
  176. package/dist/tooling/migrate/sql-lex.d.ts +18 -0
  177. package/dist/tooling/shared/04svnxxj.js +344 -0
  178. package/dist/tooling/shared/0j0jtse1.js +13 -0
  179. package/dist/tooling/shared/0r05zhyq.js +618 -0
  180. package/dist/tooling/shared/1800eymw.js +49 -0
  181. package/dist/tooling/shared/35zemrmf.js +12 -0
  182. package/dist/tooling/shared/3rmaz3pq.js +140 -0
  183. package/dist/tooling/shared/3yn79q5m.js +12 -0
  184. package/dist/tooling/shared/54tqkxja.js +51 -0
  185. package/dist/tooling/shared/57btdkgm.js +209 -0
  186. package/dist/tooling/shared/5bmksndh.js +118 -0
  187. package/dist/tooling/shared/5p8km5jb.js +38 -0
  188. package/dist/tooling/shared/5x3pf400.js +185 -0
  189. package/dist/tooling/shared/5zrzffnk.js +6 -0
  190. package/dist/tooling/shared/62fxpc1p.js +332 -0
  191. package/dist/tooling/shared/68tf18v4.js +20 -0
  192. package/dist/tooling/shared/6vk28rjp.js +98 -0
  193. package/dist/tooling/shared/76pv6qff.js +9 -0
  194. package/dist/tooling/shared/7aews1zg.js +311 -0
  195. package/dist/tooling/shared/7b3xp9gc.js +195 -0
  196. package/dist/tooling/shared/7kms6fvj.js +20 -0
  197. package/dist/tooling/shared/7pxncnzs.js +40 -0
  198. package/dist/tooling/shared/829fjxyw.js +198 -0
  199. package/dist/tooling/shared/8m5znpdt.js +66 -0
  200. package/dist/tooling/shared/8yr7ges1.js +211 -0
  201. package/dist/tooling/shared/96ps4g1z.js +32 -0
  202. package/dist/tooling/shared/9qr9rkbh.js +143 -0
  203. package/dist/tooling/shared/9sfbtwsk.js +49 -0
  204. package/dist/tooling/shared/9wsnsvbf.js +10 -0
  205. package/dist/tooling/shared/a2xe04bm.js +18 -0
  206. package/dist/tooling/shared/a4pzghha.js +20 -0
  207. package/dist/tooling/shared/am04v8na.js +233 -0
  208. package/dist/tooling/shared/asgr07mp.js +194 -0
  209. package/dist/tooling/shared/c0xevn1h.js +312 -0
  210. package/dist/tooling/shared/dhatassp.js +134 -0
  211. package/dist/tooling/shared/ezqn88nj.js +1696 -0
  212. package/dist/tooling/shared/f77nnfqy.js +231 -0
  213. package/dist/tooling/shared/fh07z1dt.js +15 -0
  214. package/dist/tooling/shared/gqwevek4.js +81 -0
  215. package/dist/tooling/shared/hfq3n3bd.js +4116 -0
  216. package/dist/tooling/shared/htnaj77v.js +17 -0
  217. package/dist/tooling/shared/j664qjrt.js +64 -0
  218. package/dist/tooling/shared/jpgmjsx3.js +38 -0
  219. package/dist/tooling/shared/jr2nmr81.js +497 -0
  220. package/dist/tooling/shared/jsjjz875.js +139 -0
  221. package/dist/tooling/shared/kbqnrs1x.js +1425 -0
  222. package/dist/tooling/shared/kz715295.js +94 -0
  223. package/dist/tooling/shared/m3xt8b1h.js +22 -0
  224. package/dist/tooling/shared/m4hhb8aa.js +9 -0
  225. package/dist/tooling/shared/mw5npye0.js +16 -0
  226. package/dist/tooling/shared/n4jqhpqz.js +27 -0
  227. package/dist/tooling/shared/nxq95eb6.js +42 -0
  228. package/dist/tooling/shared/qartgazh.js +70 -0
  229. package/dist/tooling/shared/rcywj2w8.js +190 -0
  230. package/dist/tooling/shared/s6qha57m.js +16 -0
  231. package/dist/tooling/shared/shjs0379.js +150 -0
  232. package/dist/tooling/shared/sjwkt1pg.js +16 -0
  233. package/dist/tooling/shared/stebqyyd.js +401 -0
  234. package/dist/tooling/shared/t4xveemq.js +250 -0
  235. package/dist/tooling/shared/t6zjeake.js +261 -0
  236. package/dist/tooling/shared/tcwpjvxe.js +9 -0
  237. package/dist/tooling/shared/tpssp7ac.js +160 -0
  238. package/dist/tooling/shared/v6j1ep6w.js +42 -0
  239. package/dist/tooling/shared/vwr2y833.js +270 -0
  240. package/dist/tooling/shared/w17sj05d.js +7 -0
  241. package/dist/tooling/shared/w5d89rb4.js +131 -0
  242. package/dist/tooling/shared/wbwq1jsa.js +157 -0
  243. package/dist/tooling/shared/wezxf3h8.js +17 -0
  244. package/dist/tooling/shared/yb4kd19s.js +12 -0
  245. package/dist/tooling/shared/ybdew6j7.js +294 -0
  246. package/dist/tooling/shared/yfedr1zb.js +6 -0
  247. package/dist/tooling/shared/yhp829bx.js +177 -0
  248. package/dist/tooling/shared/ytk1tjs0.js +604 -0
  249. package/dist/tooling/shared/zs9aymcp.js +210 -0
  250. package/dist/tooling/shared/zx3v9phv.js +8 -0
  251. package/dist/tooling/testing/index.js +3 -3
  252. package/package.json +50 -9
  253. package/dist/shared/ktz42yez.js +0 -113
  254. package/dist/shared/ttsqgp4p.js +0 -71
  255. package/dist/shared/y34a8714.js +0 -150
  256. package/dist/shared/zy8r7qvz.js +0 -116
  257. package/dist/shared/{ywr8hmey.js → 606g0nbf.js} +3 -3
  258. package/dist/shared/{rpycarcr.js → gcefca6p.js} +4 -4
@@ -0,0 +1,231 @@
1
+ import {
2
+ touchFields,
3
+ fieldSealed
4
+ } from "./ezqn88nj.js";
5
+ import {
6
+ throwNamed,
7
+ projectExpr,
8
+ quote,
9
+ list,
10
+ isRecord,
11
+ registerFailFix,
12
+ fail2
13
+ } from "./hfq3n3bd.js";
14
+
15
+ // src/runtime/conflict.ts
16
+ registerFailFix("OKM1104", "Set on to the columns of a unique constraint or the primary key.");
17
+ registerFailFix("OKM1190", "Remove the guarded field. Input cannot set it.");
18
+ var NO_ALLOW = new Set;
19
+ function readConflict(table, value, allow = NO_ALLOW, tenantKey) {
20
+ if (value === undefined || value === "error")
21
+ return;
22
+ if (value === "ignore")
23
+ return { kind: "ignore", columns: [], update: [] };
24
+ if (!isRecord(value)) {
25
+ fail2("OKM1120", 'onConflict must be "error", "ignore", { on, update }, or { on, return: true }.');
26
+ }
27
+ const keys = Object.keys(value);
28
+ const update = value.update;
29
+ const ret = value.return;
30
+ if (update !== undefined && ret !== undefined) {
31
+ fail2("OKM1120", "onConflict takes update or return, not both.");
32
+ }
33
+ if (ret === true) {
34
+ rejectConflictKeys(keys, ["on", "return"]);
35
+ return { kind: "return", columns: uniqueColumns(table, value.on, tenantKey), update: [] };
36
+ }
37
+ if (update !== undefined) {
38
+ rejectConflictKeys(keys, ["on", "update"]);
39
+ return {
40
+ kind: "update",
41
+ columns: uniqueColumns(table, value.on, tenantKey),
42
+ update: updateColumns(table, update, allow)
43
+ };
44
+ }
45
+ fail2("OKM1120", 'onConflict must be "error", "ignore", { on, update }, or { on, return: true }.');
46
+ }
47
+ function finishInsert(head, returning, params, plan, table) {
48
+ if (plan.kind === "ignore") {
49
+ return { text: `${head} on conflict do nothing${returning}`, params: [...params] };
50
+ }
51
+ const target = plan.columns.map((column) => quote(column.sql)).join(", ");
52
+ if (plan.kind === "update") {
53
+ const assignments = plan.update.map((column) => `${quote(column.sql)} = excluded.${quote(column.sql)}`);
54
+ const touch = touchFields(table.model);
55
+ if (touch !== undefined) {
56
+ for (const field of touch) {
57
+ const column = table.columns.get(field);
58
+ if (column !== undefined)
59
+ assignments.push(`${quote(column.sql)} = now()`);
60
+ }
61
+ }
62
+ return {
63
+ text: `${head} on conflict (${target})${conflictWhere(table, plan.columns)} do update set ${assignments.join(", ")}${returning}`,
64
+ params: [...params]
65
+ };
66
+ }
67
+ return {
68
+ text: `${head} on conflict (${target})${conflictWhere(table, plan.columns)} do nothing${returning}`,
69
+ params: [...params]
70
+ };
71
+ }
72
+ function lookupExisting(table, keys, returningColumns, keyRows) {
73
+ const params = [];
74
+ const tuples = [];
75
+ for (const row of keyRows) {
76
+ const slots = [];
77
+ for (let index = 0;index < keys.length; index += 1) {
78
+ const column = keys[index];
79
+ if (column === undefined)
80
+ continue;
81
+ params.push(row[index] ?? null);
82
+ slots.push(`$${String(params.length)}::${column.dataType}`);
83
+ }
84
+ tuples.push(keys.length === 1 ? slots[0] ?? "null" : `(${slots.join(", ")})`);
85
+ }
86
+ const left = keys.length === 1 ? `t.${quote(keys[0]?.sql ?? "")}` : `(${keys.map((column) => `t.${quote(column.sql)}`).join(", ")})`;
87
+ const projected = returningColumns.map((column) => projectExpr(`t.${quote(column.sql)}`, column.dataType)).join(", ");
88
+ const text = `select ${projected} from ${quote(table.model.sql)} t where ${left} in (${tuples.join(", ")})${activeAnd(table, keys)}`;
89
+ return { text, params };
90
+ }
91
+ function activeAnd(table, columns) {
92
+ const clause = conflictWhere(table, columns);
93
+ if (clause === "")
94
+ return "";
95
+ return ` and t.${clause.replace(/^ where /, "")}`;
96
+ }
97
+ function conflictWhere(table, columns) {
98
+ const archive = table.model.archive;
99
+ if (archive === undefined || samePrimary(table, columns))
100
+ return "";
101
+ return ` where ${quote(archive.at)} is null`;
102
+ }
103
+ function samePrimary(table, columns) {
104
+ const primary = table.model.primary;
105
+ if (columns.length !== primary.length)
106
+ return false;
107
+ for (const field of primary) {
108
+ let found = false;
109
+ for (const column of columns)
110
+ if (column.field === field)
111
+ found = true;
112
+ if (!found)
113
+ return false;
114
+ }
115
+ return true;
116
+ }
117
+ function uniqueColumns(table, on, tenantKey) {
118
+ const names = conflictNames(on);
119
+ const keys = keyList(tenantKey);
120
+ for (const unique of table.model.uniques) {
121
+ const fields = fieldsOf(unique, names, keys);
122
+ if (fields === undefined)
123
+ continue;
124
+ const columns = [];
125
+ for (const name of fields) {
126
+ const column = table.columns.get(name);
127
+ if (column === undefined) {
128
+ fail2("OKM1104", `onConflict column ${name} is not on ${table.model.name}.`);
129
+ }
130
+ columns.push(column);
131
+ }
132
+ return columns;
133
+ }
134
+ const accepted = acceptedConstraints(table.model, keys);
135
+ const implicit = keys.length === 0 ? "" : ` The tenant key ${keys.join(", ")} is part of each one and is not named here.`;
136
+ throwNamed("OKM1104", names.join(", "), accepted, `onConflict on ${table.model.name} names ${names.join(", ")}, which is not a unique constraint. Accepted: ${list(accepted)}.${implicit}`);
137
+ }
138
+ function acceptedConstraints(model, keys) {
139
+ const shown = new Set;
140
+ for (const fields of model.uniques) {
141
+ const named = keys.length === 0 ? fields : fields.filter((field) => !keys.includes(field));
142
+ if (named.length === 0)
143
+ continue;
144
+ shown.add(named.length > 1 ? `(${named.join(", ")})` : named.join(""));
145
+ }
146
+ return [...shown];
147
+ }
148
+ function updateColumns(table, value, allow) {
149
+ if (!Array.isArray(value) || value.length === 0) {
150
+ fail2("OKM1120", "onConflict update must name at least one column.");
151
+ }
152
+ const columns = [];
153
+ for (const name of value) {
154
+ if (typeof name !== "string")
155
+ fail2("OKM1120", "onConflict update must name columns.");
156
+ const column = table.columns.get(name);
157
+ if (column === undefined) {
158
+ throwNamed("OKM1120", name, table.names, `Field ${name} is not on ${table.model.name}. Accepted names: ${list(table.names)}.`);
159
+ }
160
+ if (fieldSealed(table.model, name) || column.guardUpdate || !column.writable && !(column.guarded && allow.has(name))) {
161
+ refuseWrite(table, column);
162
+ }
163
+ columns.push(column);
164
+ }
165
+ return columns;
166
+ }
167
+ function conflictNames(on) {
168
+ if (typeof on === "string")
169
+ return [on];
170
+ if (Array.isArray(on) && on.length > 0 && on.every((name) => typeof name === "string")) {
171
+ return on;
172
+ }
173
+ fail2("OKM1104", "onConflict on must name a unique constraint's columns.");
174
+ }
175
+ function fieldsOf(unique, names, tenantKeys) {
176
+ if (tenantKeys.some((key) => unique.includes(key))) {
177
+ const rest = [];
178
+ for (const field of unique) {
179
+ if (!tenantKeys.includes(field))
180
+ rest.push(field);
181
+ }
182
+ if (!same(rest, names))
183
+ return;
184
+ return unique;
185
+ }
186
+ if (!same(unique, names))
187
+ return;
188
+ return names;
189
+ }
190
+ function keyList(tenantKey) {
191
+ if (tenantKey === undefined)
192
+ return [];
193
+ if (typeof tenantKey === "string")
194
+ return [tenantKey];
195
+ return tenantKey;
196
+ }
197
+ function same(unique, names) {
198
+ if (unique.length !== names.length)
199
+ return false;
200
+ const left = [...unique].sort();
201
+ const right = [...names].sort();
202
+ for (let index = 0;index < left.length; index += 1) {
203
+ if (left[index] !== right[index])
204
+ return false;
205
+ }
206
+ return true;
207
+ }
208
+ function rejectConflictKeys(keys, accepted) {
209
+ for (const key of keys) {
210
+ if (!accepted.includes(key)) {
211
+ throwNamed("OKM1120", key, accepted, `Option ${key} is not accepted by onConflict. Accepted options: ${list(accepted)}.`);
212
+ }
213
+ }
214
+ }
215
+ function refuseWrite(table, column) {
216
+ if (fieldSealed(table.model, column.field)) {
217
+ fail2("OKM1190", `Field ${table.model.name}.${column.field} is set by a trait. Input cannot set it.`);
218
+ }
219
+ if (column.guardUpdate) {
220
+ fail2("OKM1190", `Field ${table.model.name}.${column.field} is a primary key. Input cannot change it.`);
221
+ }
222
+ if (column.guarded) {
223
+ fail2("OKM1190", `Field ${table.model.name}.${column.field} is guarded. Input cannot set it.`);
224
+ }
225
+ fail2("OKM1120", `Field ${table.model.name}.${column.field} cannot be written.`);
226
+ }
227
+ export {
228
+ finishInsert,
229
+ lookupExisting,
230
+ readConflict
231
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ OkmError
3
+ } from "./hfq3n3bd.js";
4
+
5
+ // src/runtime/validate/closed.ts
6
+ var VALIDATION_NOT_IMPORTED = "Validation is enabled but `okmodel/validate` was not imported.";
7
+ var VALIDATION_NOT_IMPORTED_FIX = 'Import "okmodel/validate" before schema().';
8
+ function refuseMissingValidation() {
9
+ throw new OkmError("OKM1201", VALIDATION_NOT_IMPORTED, {
10
+ fix: { summary: VALIDATION_NOT_IMPORTED_FIX }
11
+ });
12
+ }
13
+ export {
14
+ refuseMissingValidation
15
+ };
@@ -0,0 +1,81 @@
1
+ import {
2
+ DriverError2,
3
+ outcomeUnknown2,
4
+ mapDriverError2,
5
+ isConnectionLost
6
+ } from "./hfq3n3bd.js";
7
+
8
+ // src/adapters/pg/batch.ts
9
+ var savepointIds = 0;
10
+ async function runAtomicBatch(session, statements, watch) {
11
+ if (session.inTransaction())
12
+ return savepoint(session, statements, watch);
13
+ return transaction(session, statements, watch);
14
+ }
15
+ async function transaction(session, statements, watch) {
16
+ try {
17
+ await control(session, "BEGIN", watch);
18
+ const results = await statementsOf(session, statements, watch);
19
+ try {
20
+ await control(session, "COMMIT", watch);
21
+ } catch (error) {
22
+ if (isConnectionLost(error))
23
+ throw outcomeUnknown2(error);
24
+ throw stamp(error, null);
25
+ }
26
+ return results;
27
+ } catch (error) {
28
+ if (!isConnectionLost(error))
29
+ await rollback(session);
30
+ throw error;
31
+ }
32
+ }
33
+ async function savepoint(session, statements, watch) {
34
+ savepointIds += 1;
35
+ const name = `okm_b${String(savepointIds)}`;
36
+ try {
37
+ await control(session, `SAVEPOINT ${name}`, watch);
38
+ const results = await statementsOf(session, statements, watch);
39
+ await control(session, `RELEASE SAVEPOINT ${name}`, watch);
40
+ return results;
41
+ } catch (error) {
42
+ if (!isConnectionLost(error))
43
+ await rollback(session, `ROLLBACK TO SAVEPOINT ${name}`);
44
+ throw error;
45
+ }
46
+ }
47
+ function control(session, text, watch) {
48
+ return session.query(text, undefined, watch).then(() => {
49
+ return;
50
+ });
51
+ }
52
+ async function rollback(session, text = "ROLLBACK") {
53
+ try {
54
+ await session.query(text, undefined, undefined);
55
+ } catch {
56
+ session.abandon();
57
+ }
58
+ }
59
+ async function statementsOf(session, statements, watch) {
60
+ const results = Array.from({ length: statements.length });
61
+ for (let index = 0;index < statements.length; index += 1) {
62
+ const statement = statements[index];
63
+ if (statement === undefined)
64
+ continue;
65
+ try {
66
+ results[index] = await session.query(statement.text, statement.params, watch);
67
+ } catch (error) {
68
+ throw stamp(error, index);
69
+ }
70
+ }
71
+ return results;
72
+ }
73
+ function stamp(error, batchIndex) {
74
+ const mapped = mapDriverError2(error, batchIndex);
75
+ if (mapped instanceof DriverError2)
76
+ return mapped;
77
+ return error;
78
+ }
79
+ export {
80
+ runAtomicBatch
81
+ };