@supalive/core 1.11.0 → 1.13.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 (228) hide show
  1. package/dist/db-ClCicssQ.js.map +1 -1
  2. package/dist/helper-zdJT5FUc.js +58 -0
  3. package/dist/helper-zdJT5FUc.js.map +1 -0
  4. package/dist/index-BIIcgvu8.d.ts +2300 -0
  5. package/dist/index-BIIcgvu8.d.ts.map +1 -0
  6. package/dist/index-BedlCLem.d.ts +2292 -0
  7. package/dist/index-BedlCLem.d.ts.map +1 -0
  8. package/dist/index-BnV8LnOf.d.ts +2286 -0
  9. package/dist/index-BnV8LnOf.d.ts.map +1 -0
  10. package/dist/index-BziK63TZ.d.ts +2271 -0
  11. package/dist/index-BziK63TZ.d.ts.map +1 -0
  12. package/dist/index-D31hMBDE.d.ts +2288 -0
  13. package/dist/index-D31hMBDE.d.ts.map +1 -0
  14. package/dist/index-DDDAcnJj.d.ts +2208 -0
  15. package/dist/index-DDDAcnJj.d.ts.map +1 -0
  16. package/dist/index-DZhReQWB.d.ts +2288 -0
  17. package/dist/index-DZhReQWB.d.ts.map +1 -0
  18. package/dist/index-DlG8HDCO.d.ts +2215 -0
  19. package/dist/index-DlG8HDCO.d.ts.map +1 -0
  20. package/dist/index-Wgi_dGzj.d.ts +2215 -0
  21. package/dist/index-Wgi_dGzj.d.ts.map +1 -0
  22. package/dist/index-j3YTMNlF.d.ts +2223 -0
  23. package/dist/index-j3YTMNlF.d.ts.map +1 -0
  24. package/dist/mysql-BBbilD4I.js +614 -0
  25. package/dist/mysql-BBbilD4I.js.map +1 -0
  26. package/dist/mysql-BHJ2mrwZ.d.ts +113 -0
  27. package/dist/mysql-BHJ2mrwZ.d.ts.map +1 -0
  28. package/dist/mysql-BQbHJ_rK.js +617 -0
  29. package/dist/mysql-BQbHJ_rK.js.map +1 -0
  30. package/dist/mysql-BXoAON7c.d.ts +113 -0
  31. package/dist/mysql-BXoAON7c.d.ts.map +1 -0
  32. package/dist/mysql-BgfCUYGt.d.ts +113 -0
  33. package/dist/mysql-BgfCUYGt.d.ts.map +1 -0
  34. package/dist/mysql-Br7MqUXg.js +620 -0
  35. package/dist/mysql-Br7MqUXg.js.map +1 -0
  36. package/dist/mysql-BrueWtO9.d.ts +113 -0
  37. package/dist/mysql-BrueWtO9.d.ts.map +1 -0
  38. package/dist/mysql-CCo--z6n.d.ts +113 -0
  39. package/dist/mysql-CCo--z6n.d.ts.map +1 -0
  40. package/dist/mysql-CQcbcZB8.d.ts +113 -0
  41. package/dist/mysql-CQcbcZB8.d.ts.map +1 -0
  42. package/dist/mysql-CbgCY89y.d.ts +113 -0
  43. package/dist/mysql-CbgCY89y.d.ts.map +1 -0
  44. package/dist/mysql-CqD1ZnNY.js +619 -0
  45. package/dist/mysql-CqD1ZnNY.js.map +1 -0
  46. package/dist/mysql-D3Db2q3_.js +619 -0
  47. package/dist/mysql-D3Db2q3_.js.map +1 -0
  48. package/dist/mysql-DBrhTmYm.js +619 -0
  49. package/dist/mysql-DBrhTmYm.js.map +1 -0
  50. package/dist/mysql-DF8eJO-v.d.ts +113 -0
  51. package/dist/mysql-DF8eJO-v.d.ts.map +1 -0
  52. package/dist/mysql-DX7YA7IS.d.ts +113 -0
  53. package/dist/mysql-DX7YA7IS.d.ts.map +1 -0
  54. package/dist/mysql-DZ0_Rsjc.js +614 -0
  55. package/dist/mysql-DZ0_Rsjc.js.map +1 -0
  56. package/dist/mysql-Dko1MJqQ.js +619 -0
  57. package/dist/mysql-Dko1MJqQ.js.map +1 -0
  58. package/dist/mysql-F831ycnw.d.ts +113 -0
  59. package/dist/mysql-F831ycnw.d.ts.map +1 -0
  60. package/dist/mysql-TLPG62tv.js +618 -0
  61. package/dist/mysql-TLPG62tv.js.map +1 -0
  62. package/dist/mysql-XUkTkefP.js +610 -0
  63. package/dist/mysql-XUkTkefP.js.map +1 -0
  64. package/dist/mysql-e-ii74yG.js +613 -0
  65. package/dist/mysql-e-ii74yG.js.map +1 -0
  66. package/dist/overlap-checker-BBkqRdcs.js +259 -0
  67. package/dist/overlap-checker-BBkqRdcs.js.map +1 -0
  68. package/dist/overlap-checker-BdNoCPtA.js +259 -0
  69. package/dist/overlap-checker-BdNoCPtA.js.map +1 -0
  70. package/dist/overlap-checker-DHUJe-Yy.js +259 -0
  71. package/dist/overlap-checker-DHUJe-Yy.js.map +1 -0
  72. package/dist/overlap-checker-DWeQLpSD.js +259 -0
  73. package/dist/overlap-checker-DWeQLpSD.js.map +1 -0
  74. package/dist/overlap-checker-Kz7B_jsp.js +259 -0
  75. package/dist/overlap-checker-Kz7B_jsp.js.map +1 -0
  76. package/dist/postgres-7hJuQX4Y.d.ts +117 -0
  77. package/dist/postgres-7hJuQX4Y.d.ts.map +1 -0
  78. package/dist/postgres-B4H78IkW.js +864 -0
  79. package/dist/postgres-B4H78IkW.js.map +1 -0
  80. package/dist/postgres-B4h8D5U2.d.ts +117 -0
  81. package/dist/postgres-B4h8D5U2.d.ts.map +1 -0
  82. package/dist/postgres-BXFPamkP.js +864 -0
  83. package/dist/postgres-BXFPamkP.js.map +1 -0
  84. package/dist/postgres-C7CHroi9.js +865 -0
  85. package/dist/postgres-C7CHroi9.js.map +1 -0
  86. package/dist/postgres-CoR3TUMd.js +865 -0
  87. package/dist/postgres-CoR3TUMd.js.map +1 -0
  88. package/dist/postgres-D-RsG12a.d.ts +117 -0
  89. package/dist/postgres-D-RsG12a.d.ts.map +1 -0
  90. package/dist/postgres-D5Z1S3J9.d.ts +117 -0
  91. package/dist/postgres-D5Z1S3J9.d.ts.map +1 -0
  92. package/dist/postgres-DHs89iWT.js +864 -0
  93. package/dist/postgres-DHs89iWT.js.map +1 -0
  94. package/dist/postgres-DvBIRnYA.d.ts +117 -0
  95. package/dist/postgres-DvBIRnYA.d.ts.map +1 -0
  96. package/dist/postgres-EXjuHMUi.d.ts +117 -0
  97. package/dist/postgres-EXjuHMUi.d.ts.map +1 -0
  98. package/dist/postgres-Eo-lpUiX.d.ts +117 -0
  99. package/dist/postgres-Eo-lpUiX.d.ts.map +1 -0
  100. package/dist/postgres-VLAGIFLR.d.ts +117 -0
  101. package/dist/postgres-VLAGIFLR.d.ts.map +1 -0
  102. package/dist/postgres-hrQmDPUp.d.ts +117 -0
  103. package/dist/postgres-hrQmDPUp.d.ts.map +1 -0
  104. package/dist/postgres-pXrP9Fx0.d.ts +117 -0
  105. package/dist/postgres-pXrP9Fx0.d.ts.map +1 -0
  106. package/dist/query-Bpw8wO6L.js +730 -0
  107. package/dist/query-Bpw8wO6L.js.map +1 -0
  108. package/dist/query-BuOs9w-U.js +730 -0
  109. package/dist/query-BuOs9w-U.js.map +1 -0
  110. package/dist/query-Xw2hi6TB.js +730 -0
  111. package/dist/query-Xw2hi6TB.js.map +1 -0
  112. package/dist/read-routing-BUcQAwnd.js +62 -0
  113. package/dist/read-routing-BUcQAwnd.js.map +1 -0
  114. package/dist/read-routing-BXflWzQI.js +61 -0
  115. package/dist/read-routing-BXflWzQI.js.map +1 -0
  116. package/dist/read-routing-CcsLp0ow.js +61 -0
  117. package/dist/read-routing-CcsLp0ow.js.map +1 -0
  118. package/dist/realtime_db-B70vqtRZ.js +272 -0
  119. package/dist/realtime_db-B70vqtRZ.js.map +1 -0
  120. package/dist/realtime_db-BMysrWym.js +312 -0
  121. package/dist/realtime_db-BMysrWym.js.map +1 -0
  122. package/dist/realtime_db-Bi7S938D.js +312 -0
  123. package/dist/realtime_db-Bi7S938D.js.map +1 -0
  124. package/dist/realtime_db-CVze3gM0.js +312 -0
  125. package/dist/realtime_db-CVze3gM0.js.map +1 -0
  126. package/dist/realtime_db-DMipkUmD.js +312 -0
  127. package/dist/realtime_db-DMipkUmD.js.map +1 -0
  128. package/dist/realtime_db-XWzuq2JS.js +272 -0
  129. package/dist/realtime_db-XWzuq2JS.js.map +1 -0
  130. package/dist/realtime_db-e3TztUUT.js +272 -0
  131. package/dist/realtime_db-e3TztUUT.js.map +1 -0
  132. package/dist/router-Kgrlci8X.js +337 -0
  133. package/dist/router-Kgrlci8X.js.map +1 -0
  134. package/dist/router-g8qSQb8m.js +314 -0
  135. package/dist/router-g8qSQb8m.js.map +1 -0
  136. package/dist/schema-CWdfWuIj.js +105 -0
  137. package/dist/schema-CWdfWuIj.js.map +1 -0
  138. package/dist/schema-DLue3K2s.js +134 -0
  139. package/dist/schema-DLue3K2s.js.map +1 -0
  140. package/dist/schema-DfowI0ip.js +134 -0
  141. package/dist/schema-DfowI0ip.js.map +1 -0
  142. package/dist/schema-fKldWzwc.js +134 -0
  143. package/dist/schema-fKldWzwc.js.map +1 -0
  144. package/dist/src/client/index.d.ts +1 -1
  145. package/dist/src/client/index.js +69 -29
  146. package/dist/src/client/index.js.map +1 -1
  147. package/dist/src/exports/mysql.d.ts +1 -1
  148. package/dist/src/exports/mysql.js +1 -1
  149. package/dist/src/exports/postgres.d.ts +1 -1
  150. package/dist/src/exports/postgres.js +1 -1
  151. package/dist/src/exports/procedure.d.ts +1 -1
  152. package/dist/src/exports/procedure.js +5 -5
  153. package/dist/src/exports/schema-sql.d.ts +18 -1
  154. package/dist/src/exports/schema-sql.d.ts.map +1 -1
  155. package/dist/src/exports/schema-sql.js +91 -15
  156. package/dist/src/exports/schema-sql.js.map +1 -1
  157. package/dist/src/exports/server.d.ts +11 -4
  158. package/dist/src/exports/server.d.ts.map +1 -1
  159. package/dist/src/exports/server.js +136 -59
  160. package/dist/src/exports/server.js.map +1 -1
  161. package/dist/src/exports/sub-manager-worker-entry.js +1 -1
  162. package/dist/src/exports/types.d.ts +2 -2
  163. package/dist/src/exports/types.js +4 -4
  164. package/dist/sub-worker-dispatch-CO9nVdSG.js +813 -0
  165. package/dist/sub-worker-dispatch-CO9nVdSG.js.map +1 -0
  166. package/dist/sub-worker-dispatch-CQBknEL7.js +813 -0
  167. package/dist/sub-worker-dispatch-CQBknEL7.js.map +1 -0
  168. package/dist/sub-worker-dispatch-CQHeit6D.js +813 -0
  169. package/dist/sub-worker-dispatch-CQHeit6D.js.map +1 -0
  170. package/dist/sub-worker-dispatch-Cl-XnBwq.js +810 -0
  171. package/dist/sub-worker-dispatch-Cl-XnBwq.js.map +1 -0
  172. package/dist/sub-worker-dispatch-CmEW10it.js +813 -0
  173. package/dist/sub-worker-dispatch-CmEW10it.js.map +1 -0
  174. package/dist/sub-worker-dispatch-CunxuOPT.js +823 -0
  175. package/dist/sub-worker-dispatch-CunxuOPT.js.map +1 -0
  176. package/dist/sub-worker-dispatch-CvvFm40r.js +817 -0
  177. package/dist/sub-worker-dispatch-CvvFm40r.js.map +1 -0
  178. package/dist/sub-worker-dispatch-D15UHo1g.js +813 -0
  179. package/dist/sub-worker-dispatch-D15UHo1g.js.map +1 -0
  180. package/dist/sub-worker-dispatch-D8DY56ry.js +817 -0
  181. package/dist/sub-worker-dispatch-D8DY56ry.js.map +1 -0
  182. package/dist/sub-worker-dispatch-DJgWxtSQ.js +823 -0
  183. package/dist/sub-worker-dispatch-DJgWxtSQ.js.map +1 -0
  184. package/dist/sub-worker-dispatch-Dplqeubd.js +813 -0
  185. package/dist/sub-worker-dispatch-Dplqeubd.js.map +1 -0
  186. package/dist/sub-worker-dispatch-dXjUmSMN.js +813 -0
  187. package/dist/sub-worker-dispatch-dXjUmSMN.js.map +1 -0
  188. package/dist/table-id-BJdmctEQ.js +91 -0
  189. package/dist/table-id-BJdmctEQ.js.map +1 -0
  190. package/dist/table-id-DyrJBKAQ.js +105 -0
  191. package/dist/table-id-DyrJBKAQ.js.map +1 -0
  192. package/dist/table-id-x9y1eHUr.js +91 -0
  193. package/dist/table-id-x9y1eHUr.js.map +1 -0
  194. package/dist/types_client_rpc-BGMwPJst.js +123 -0
  195. package/dist/types_client_rpc-BGMwPJst.js.map +1 -0
  196. package/dist/types_client_rpc-ByGwoRCL.js +132 -0
  197. package/dist/types_client_rpc-ByGwoRCL.js.map +1 -0
  198. package/dist/types_db-BsR02Sph.js +171 -0
  199. package/dist/types_db-BsR02Sph.js.map +1 -0
  200. package/dist/types_db-CgGlOMmr.js +187 -0
  201. package/dist/types_db-CgGlOMmr.js.map +1 -0
  202. package/dist/types_db-CmxFWgU3.js +171 -0
  203. package/dist/types_db-CmxFWgU3.js.map +1 -0
  204. package/dist/types_db-OUou3o2Z.js +172 -0
  205. package/dist/types_db-OUou3o2Z.js.map +1 -0
  206. package/dist/types_server-B3z8hi-Z.d.ts +523 -0
  207. package/dist/types_server-B3z8hi-Z.d.ts.map +1 -0
  208. package/dist/types_server-BF5Y0s__.d.ts +521 -0
  209. package/dist/types_server-BF5Y0s__.d.ts.map +1 -0
  210. package/dist/types_server-BXBvz4T8.d.ts +523 -0
  211. package/dist/types_server-BXBvz4T8.d.ts.map +1 -0
  212. package/dist/types_server-BhC19R2a.js +27 -0
  213. package/dist/types_server-BhC19R2a.js.map +1 -0
  214. package/dist/types_server-CClUPZn1.d.ts +521 -0
  215. package/dist/types_server-CClUPZn1.d.ts.map +1 -0
  216. package/dist/types_server-CnYTSPhM.d.ts +523 -0
  217. package/dist/types_server-CnYTSPhM.d.ts.map +1 -0
  218. package/dist/types_server-DHpGUHB_.d.ts +521 -0
  219. package/dist/types_server-DHpGUHB_.d.ts.map +1 -0
  220. package/dist/types_server-Ded1u3bL.d.ts +521 -0
  221. package/dist/types_server-Ded1u3bL.d.ts.map +1 -0
  222. package/dist/types_server-fons7nmo.d.ts +523 -0
  223. package/dist/types_server-fons7nmo.d.ts.map +1 -0
  224. package/dist/types_server-okvBG4v_.d.ts +521 -0
  225. package/dist/types_server-okvBG4v_.d.ts.map +1 -0
  226. package/dist/types_server-pD8DiI7s.d.ts +521 -0
  227. package/dist/types_server-pD8DiI7s.d.ts.map +1 -0
  228. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { Pn as SchemaDefinition, Rn as schemaRegistry, Vn as trackSchema } from "../../index-C_Zew1wH.js";
1
+ import { Bn as trackSchema, Pn as SchemaDefinition, Rn as schemaRegistry } from "../../index-BedlCLem.js";
2
2
 
3
3
  //#region src/db/schema-sql.d.ts
4
4
  type SqlDialect = "postgres" | "mysql";
@@ -18,6 +18,14 @@ interface GenerateSchemaSqlOptions {
18
18
  * runtime by `initCore`, not emitted here.
19
19
  */
20
20
  includeCoreTables?: boolean;
21
+ /**
22
+ * MySQL only: override the SQL type of `commit_logs.id`. By default it is
23
+ * auto-derived as `VARBINARY(max(32, largestIdColumnLength))` — wide enough
24
+ * for the app's biggest primary key, with a 32-byte floor. Override for an
25
+ * app with fixed-width binary ids (e.g. `"BINARY(16)"`). Ignored on Postgres
26
+ * (always `BYTEA`).
27
+ */
28
+ commitLogIdType?: string;
21
29
  }
22
30
  declare function generateSchemaSql(schemas?: Map<string, SchemaDefinition<string, any, any>> | SchemaDefinition<string, any, any>[], options?: GenerateSchemaSqlOptions): string;
23
31
  //#endregion
@@ -45,6 +53,15 @@ declare function generateSchemaSql(schemas?: Map<string, SchemaDefinition<string
45
53
  interface CoreTablesSqlOptions {
46
54
  /** Emit `IF NOT EXISTS` on `CREATE TABLE`/`CREATE INDEX`/`CREATE SEQUENCE`. Default true. */
47
55
  ifNotExists?: boolean;
56
+ /**
57
+ * MySQL only: the SQL type of `commit_logs.id`, which stores the changed
58
+ * row's primary key encoded as bytes. Defaults to `VARBINARY(255)`.
59
+ * `generateSchemaSql` derives a tighter value from the app's largest id
60
+ * column; an app with fixed-width binary ids can override to e.g.
61
+ * `BINARY(16)` (but note: variable-length ids must use VARBINARY — a fixed
62
+ * BINARY column zero-pads stored values, which would break the OCC id match).
63
+ */
64
+ commitLogIdType?: string;
48
65
  }
49
66
  declare function coreTablesSql(dialect?: SqlDialect, options?: CoreTablesSqlOptions): string[];
50
67
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"schema-sql.d.ts","names":[],"sources":["../../../src/db/schema-sql.ts","../../../src/db/core_tables.ts"],"mappings":";;;KAMY,UAAA;AAAA,UA8KK,0BAAA;EACb,OAAA,GAAU,UAAU;EACpB,WAAA;AAAA;AAAA,iBAGY,mBAAA,CACZ,MAAA,EAAQ,gBAAA,oBACR,OAAA,GAAU,0BAA0B;AAAA,UAoFvB,wBAAA;EACb,OAAA,GAAU,UAAU;EACpB,WAAA;EACA,MAAA;EAzF+B;;;;;;EAgG/B,iBAAA;AAAA;AAAA,iBAGY,iBAAA,CACZ,OAAA,GAAU,GAAA,SAAY,gBAAA,sBAAsC,gBAAA,sBAC5D,OAAA,GAAU,wBAAA;;;;;AAxRd;;;;AAAsB;AA8KtB;;;;;;;;AAEe;AAGf;;;;UClKiB,oBAAA;EDmKb;ECjKA,WAAW;AAAA;AAAA,iBAGC,aAAA,CACZ,OAAA,GAAS,UAAA,EACT,OAAA,GAAU,oBAAoB"}
1
+ {"version":3,"file":"schema-sql.d.ts","names":[],"sources":["../../../src/db/schema-sql.ts","../../../src/db/core_tables.ts"],"mappings":";;;KAMY,UAAA;AAAA,UAyOK,0BAAA;EACb,OAAA,GAAU,UAAU;EACpB,WAAA;AAAA;AAAA,iBAGY,mBAAA,CACZ,MAAA,EAAQ,gBAAA,oBACR,OAAA,GAAU,0BAA0B;AAAA,UAmIvB,wBAAA;EACb,OAAA,GAAU,UAAU;EACpB,WAAA;EACA,MAAA;EAtIoC;;;;;;EA6IpC,iBAAA;EAVa;;;;;;;EAkBb,eAAA;AAAA;AAAA,iBAkBY,iBAAA,CACZ,OAAA,GAAU,GAAA,SAAY,gBAAA,sBAAsC,gBAAA,sBAC5D,OAAA,GAAU,wBAAA;;;;;AAzZd;;;;AAAsB;AAyOtB;;;;;;;;AAEe;AAGf;;;;UC7NiB,oBAAA;ED8Nb;EC5NA,WAAA;ED6NA;;AAAoC;AAmIxC;;;;;ECvVI,eAAe;AAAA;AAAA,iBAGH,aAAA,CACZ,OAAA,GAAS,UAAA,EACT,OAAA,GAAU,oBAAoB"}
@@ -1,15 +1,16 @@
1
- import { r as unwrapZodType } from "../../codec-BHAmGEIQ.js";
2
- import { o as trackSchema, r as schemaRegistry } from "../../schema-Dd7u0A1L.js";
1
+ import { a as unwrapZodType } from "../../table-id-DyrJBKAQ.js";
2
+ import { a as trackSchema, r as schemaRegistry } from "../../schema-DLue3K2s.js";
3
3
  import { z as z$1 } from "zod";
4
4
  //#region src/db/core_tables.ts
5
5
  function coreTablesSql(dialect = "postgres", options) {
6
6
  const ifNotExists = options?.ifNotExists ?? true;
7
7
  const t = ifNotExists ? "IF NOT EXISTS " : "";
8
8
  const i = ifNotExists ? "IF NOT EXISTS " : "";
9
+ const commitLogIdType = options?.commitLogIdType ?? "VARBINARY(255)";
9
10
  if (dialect === "mysql") return [
10
- `CREATE TABLE ${t}global_commit_ts (\n id BIGINT NOT NULL\n) ENGINE=InnoDB;`,
11
- `CREATE TABLE ${t}commit_logs (\n id BINARY(16) NOT NULL,\n ts BIGINT NOT NULL,\n table_id BINARY(16) NOT NULL,\n data LONGBLOB NOT NULL,\n PRIMARY KEY (ts, table_id, id),\n INDEX commit_logs_by_table_and_id (table_id, id, ts)\n) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;`,
12
- `CREATE TABLE ${t}metadata (\n meta_key VARCHAR(255) PRIMARY KEY,\n meta_value BIGINT NOT NULL\n) ENGINE=InnoDB;`
11
+ `CREATE TABLE ${t}global_commit_ts (\n id BIGINT NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`,
12
+ `CREATE TABLE ${t}commit_logs (\n id ${commitLogIdType} NOT NULL,\n ts BIGINT NOT NULL,\n table_id BINARY(16) NOT NULL,\n data LONGBLOB NOT NULL,\n PRIMARY KEY (ts, table_id, id),\n INDEX commit_logs_by_table_and_id (table_id, id, ts)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;`,
13
+ `CREATE TABLE ${t}metadata (\n meta_key VARCHAR(64) NOT NULL PRIMARY KEY,\n meta_value BIGINT NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`
13
14
  ];
14
15
  return [
15
16
  `CREATE SEQUENCE ${t}global_commit_ts START 1 INCREMENT 1 NO CYCLE;`,
@@ -77,6 +78,13 @@ const VARCHAR_MAX = 65535;
77
78
  function jsonType(dialect) {
78
79
  return dialect === "mysql" ? "JSON" : "JSONB";
79
80
  }
81
+ function getEnumValues(en) {
82
+ const e = en;
83
+ if (Array.isArray(e?.options)) return e.options.filter((v) => typeof v === "string");
84
+ const entries = e?.def?.entries ?? e?._def?.entries ?? e?.def?.values;
85
+ if (entries && typeof entries === "object") return Object.values(entries).filter((v) => typeof v === "string");
86
+ return [];
87
+ }
80
88
  function getScalarSqlType(unwrapped, field, dialect) {
81
89
  if (unwrapped instanceof z$1.ZodString) {
82
90
  const maxLen = getStringMaxLength(field);
@@ -87,7 +95,11 @@ function getScalarSqlType(unwrapped, field, dialect) {
87
95
  if (unwrapped instanceof z$1.ZodBoolean) return dialect === "mysql" ? "TINYINT(1)" : "BOOLEAN";
88
96
  if (unwrapped instanceof z$1.ZodDate) return dialect === "mysql" ? "DATETIME(3)" : "TIMESTAMPTZ";
89
97
  if (unwrapped instanceof z$1.ZodBigInt) return "BIGINT";
90
- if (unwrapped instanceof z$1.ZodEnum) return "TEXT";
98
+ if (unwrapped instanceof z$1.ZodEnum) {
99
+ const maxLen = getEnumValues(unwrapped).reduce((m, v) => Math.max(m, v.length), 0);
100
+ if (maxLen > 0 && maxLen <= VARCHAR_MAX) return `VARCHAR(${maxLen})`;
101
+ return "VARCHAR(30)";
102
+ }
91
103
  }
92
104
  function getArrayElement(arr) {
93
105
  return arr.element ?? arr.def?.element ?? arr.def?.type;
@@ -130,6 +142,29 @@ function getDefaultValue(field) {
130
142
  }
131
143
  return getDefaultFromZod(field);
132
144
  }
145
+ function hasCommitTsIndex(schema) {
146
+ const commitCol = schema.columns["commitTs"] ?? "commit_ts";
147
+ const autoName = `${schema.table}_commit_ts_idx`;
148
+ return (schema.indexes ?? []).some((idx) => {
149
+ if (typeof idx === "string") return idx.includes(autoName);
150
+ if (idx.name === autoName) return true;
151
+ return idx.columns.length === 1 && (idx.columns[0] === "commitTs" || idx.columns[0] === commitCol);
152
+ });
153
+ }
154
+ function mysqlInlineIndexLines(schema) {
155
+ const columns = schema.columns;
156
+ const lines = [];
157
+ for (const idx of schema.indexes ?? []) {
158
+ if (typeof idx === "string") continue;
159
+ const cols = idx.columns.map((c) => columns[c] ?? c).join(", ");
160
+ lines.push(` ${idx.unique ? "UNIQUE KEY" : "KEY"} ${idx.name} (${cols})`);
161
+ }
162
+ if (!hasCommitTsIndex(schema)) {
163
+ const commitCol = columns["commitTs"] ?? "commit_ts";
164
+ lines.push(` KEY ${schema.table}_commit_ts_idx (${commitCol})`);
165
+ }
166
+ return lines;
167
+ }
133
168
  function schemaToCreateTable(schema, options) {
134
169
  const dialect = options?.dialect ?? "postgres";
135
170
  const ifNotExists = options?.ifNotExists ?? true;
@@ -147,21 +182,40 @@ function schemaToCreateTable(schema, options) {
147
182
  if (!field) continue;
148
183
  const colName = columns[fieldName] ?? fieldName;
149
184
  if (!colName) continue;
150
- const sqlType = getSqlType(field, dialect);
185
+ let sqlType = getSqlType(field, dialect);
151
186
  const notNull = !isOptional(field);
152
187
  const pk = isPrimaryKey(field);
153
- const defaultVal = fieldName === "commitTs" ? "0" : getDefaultValue(field);
188
+ let defaultVal = fieldName === "commitTs" ? "0" : getDefaultValue(field);
189
+ if (pk && dialect === "mysql" && sqlType === "TEXT") sqlType = "VARCHAR(255)";
190
+ if (dialect === "mysql" && defaultVal) {
191
+ const dt = /^(?:DATETIME|TIMESTAMP)(?:\((\d+)\))?$/i.exec(sqlType.trim());
192
+ const isNowLike = /^(?:now\(\s*\d*\s*\)|current_timestamp(?:\(\s*\d*\s*\))?)$/i.test(defaultVal.trim());
193
+ if (dt && isNowLike) {
194
+ const precision = dt[1];
195
+ defaultVal = precision !== void 0 ? `CURRENT_TIMESTAMP(${precision})` : "CURRENT_TIMESTAMP";
196
+ }
197
+ }
198
+ if (dialect === "mysql" && defaultVal !== void 0) {
199
+ const dv = defaultVal.trim();
200
+ if (/^-?\d+$/.test(dv)) defaultVal = `'${dv}'`;
201
+ else if (/^true$/i.test(dv)) defaultVal = "'1'";
202
+ else if (/^false$/i.test(dv)) defaultVal = "'0'";
203
+ }
154
204
  let line = ` ${colName} ${sqlType}`;
155
205
  if (notNull) line += " NOT NULL";
156
206
  if (pk) line += " PRIMARY KEY";
157
207
  if (defaultVal !== void 0) line += ` DEFAULT ${defaultVal}`;
158
208
  lines.push(line);
159
209
  }
160
- return `CREATE TABLE ${ifNotExists ? "IF NOT EXISTS " : ""}${tableName} (\n${lines.join(",\n")}\n);`;
210
+ if (dialect === "mysql") lines.push(...mysqlInlineIndexLines(schema));
211
+ const ifNot = ifNotExists ? "IF NOT EXISTS " : "";
212
+ const tableOptions = dialect === "mysql" ? " ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" : "";
213
+ return `CREATE TABLE ${ifNot}${tableName} (\n${lines.join(",\n")}\n)${tableOptions};`;
161
214
  }
162
- function formatDeclarativeIndex(idx, tableName, columns) {
215
+ function formatDeclarativeIndex(idx, tableName, columns, options) {
216
+ const ifNot = options?.ifNotExists ?? true ? "IF NOT EXISTS " : "";
163
217
  const colNames = idx.columns.map((c) => columns[c] ?? c).join(", ");
164
- let sql = `CREATE ${idx.unique ? "UNIQUE " : ""}INDEX IF NOT EXISTS ${idx.name} ON ${tableName}`;
218
+ let sql = `CREATE ${idx.unique ? "UNIQUE " : ""}INDEX ${ifNot}${idx.name} ON ${tableName}`;
165
219
  if (idx.type) sql += ` USING ${idx.type}`;
166
220
  sql += ` (${colNames})`;
167
221
  if (idx.where) sql += ` WHERE ${idx.where}`;
@@ -170,7 +224,7 @@ function formatDeclarativeIndex(idx, tableName, columns) {
170
224
  function schemaIndexes(schema, options) {
171
225
  const out = (schema.indexes ?? []).map((idx) => {
172
226
  if (typeof idx === "string") return idx;
173
- return formatDeclarativeIndex(idx, schema.table, schema.columns);
227
+ return formatDeclarativeIndex(idx, schema.table, schema.columns, { ifNotExists: options?.ifNotExists });
174
228
  });
175
229
  const commitCol = schema.columns["commitTs"] ?? "commit_ts";
176
230
  const autoName = `${schema.table}_commit_ts_idx`;
@@ -184,6 +238,20 @@ function schemaIndexes(schema, options) {
184
238
  }
185
239
  return out;
186
240
  }
241
+ /**
242
+ * The largest declared primary-key string length across `schemas` (via the id
243
+ * column's `.max(n)`), or undefined when none declare one. Used to size the
244
+ * MySQL `commit_logs.id` column so it can hold any row's encoded id.
245
+ */
246
+ function maxPrimaryKeyLength(schemas) {
247
+ let max;
248
+ for (const schema of schemas) {
249
+ const idField = schema.schema?.shape?.id;
250
+ const len = getStringMaxLength(idField);
251
+ if (typeof len === "number") max = max === void 0 ? len : Math.max(max, len);
252
+ }
253
+ return max;
254
+ }
187
255
  function generateSchemaSql(schemas, options) {
188
256
  const dialect = options?.dialect ?? "postgres";
189
257
  const header = options?.header ?? true;
@@ -202,8 +270,12 @@ function generateSchemaSql(schemas, options) {
202
270
  parts.push("");
203
271
  }
204
272
  if (includeCoreTables) {
273
+ const commitLogIdType = dialect === "mysql" ? options?.commitLogIdType ?? `VARBINARY(${Math.max(32, maxPrimaryKeyLength(list) ?? 0)})` : options?.commitLogIdType;
205
274
  parts.push("-- Core tables (framework-owned)");
206
- for (const stmt of coreTablesSql(dialect, { ifNotExists: options?.ifNotExists })) parts.push(stmt);
275
+ for (const stmt of coreTablesSql(dialect, {
276
+ ifNotExists: options?.ifNotExists,
277
+ commitLogIdType
278
+ })) parts.push(stmt);
207
279
  parts.push("");
208
280
  }
209
281
  for (const schema of list) {
@@ -211,8 +283,12 @@ function generateSchemaSql(schemas, options) {
211
283
  ...options,
212
284
  dialect
213
285
  }));
214
- const indexStmts = schemaIndexes(schema, { ifNotExists: options?.ifNotExists });
215
- for (const stmt of indexStmts) parts.push(stmt);
286
+ if (dialect === "mysql") {
287
+ for (const idx of schema.indexes ?? []) if (typeof idx === "string") parts.push(idx);
288
+ } else {
289
+ const indexStmts = schemaIndexes(schema, { ifNotExists: options?.ifNotExists });
290
+ for (const stmt of indexStmts) parts.push(stmt);
291
+ }
216
292
  parts.push("");
217
293
  }
218
294
  return parts.join("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"schema-sql.js","names":["z"],"sources":["../../../src/db/core_tables.ts","../../../src/db/schema-sql.ts"],"sourcesContent":["import type { SqlDialect } from \"./schema-sql\";\n\n/**\n * DDL for the core, framework-owned database objects that every Supalive\n * database must have alongside the user's own tables:\n *\n * - `commit_logs` — the append-only OCC change log (+ its lookup indexes).\n * - `metadata` — the small key/value table holding the OCC watermarks\n * (`latest_committed_ts`, `min_retained_ts`) and the\n * core schema version (`core_version`).\n * - `global_commit_ts` — the monotonic commit-timestamp source: a SEQUENCE on\n * Postgres, a single-row `BIGINT` counter table on MySQL.\n *\n * These are all pure schema (DDL), so they belong in the generated `schema.sql`\n * (see {@link generateSchemaSql}, which prepends them by default) and get\n * migrated ahead of runtime by your normal migration pipeline — a single\n * generated file fully describes the database.\n *\n * Data seeding (the `metadata` rows and the MySQL counter's initial `0`) and\n * any runtime-only schema changes live in `initCore` — see\n * {@link file://./init_db.ts}.\n */\n\nexport interface CoreTablesSqlOptions {\n /** Emit `IF NOT EXISTS` on `CREATE TABLE`/`CREATE INDEX`/`CREATE SEQUENCE`. Default true. */\n ifNotExists?: boolean;\n}\n\nexport function coreTablesSql(\n dialect: SqlDialect = \"postgres\",\n options?: CoreTablesSqlOptions,\n): string[] {\n const ifNotExists = options?.ifNotExists ?? true;\n const t = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n const i = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n\n if (dialect === \"mysql\") {\n return [\n // MySQL has no sequences: a single-row counter table advanced via\n // LAST_INSERT_ID (see MySqlDatabase.getNextTimestamp). Seeded to 0\n // by initCore.\n `CREATE TABLE ${t}global_commit_ts (\\n` +\n ` id BIGINT NOT NULL\\n` +\n `) ENGINE=InnoDB;`,\n `CREATE TABLE ${t}commit_logs (\\n` +\n ` id BINARY(16) NOT NULL,\\n` +\n ` ts BIGINT NOT NULL,\\n` +\n ` table_id BINARY(16) NOT NULL,\\n` +\n ` data LONGBLOB NOT NULL,\\n` +\n ` PRIMARY KEY (ts, table_id, id),\\n` +\n ` INDEX commit_logs_by_table_and_id (table_id, id, ts)\\n` +\n `) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;`,\n `CREATE TABLE ${t}metadata (\\n` +\n ` meta_key VARCHAR(255) PRIMARY KEY,\\n` +\n ` meta_value BIGINT NOT NULL\\n` +\n `) ENGINE=InnoDB;`,\n ];\n }\n\n return [\n // Monotonic OCC commit-timestamp source (see PgDatabase.getNextTimestamp).\n `CREATE SEQUENCE ${t}global_commit_ts START 1 INCREMENT 1 NO CYCLE;`,\n `CREATE TABLE ${t}commit_logs (\\n` +\n ` id BYTEA NOT NULL,\\n` +\n ` ts BIGINT NOT NULL,\\n` +\n ` table_id BYTEA NOT NULL,\\n` +\n ` data BYTEA NOT NULL,\\n` +\n ` PRIMARY KEY (ts, table_id, id)\\n` +\n `);`,\n `CREATE INDEX ${i}commit_logs_by_table_and_id ON commit_logs (table_id, id, ts);`,\n `CREATE INDEX ${i}commit_logs_by_table_ts_and_id ON commit_logs (table_id, ts, id);`,\n `CREATE TABLE ${t}metadata (\\n` +\n ` meta_key TEXT PRIMARY KEY,\\n` +\n ` meta_value BIGINT NOT NULL\\n` +\n `);`,\n ];\n}\n","import { z } from \"zod\";\nimport { SchemaDefinition, schemaRegistry } from \"./schema\";\nimport type { DeclarativeIndex } from \"./schema\";\nimport { unwrapZodType } from \"./codec\";\nimport { coreTablesSql } from \"./core_tables\";\n\nexport type SqlDialect = \"postgres\" | \"mysql\";\n\nfunction getFieldMeta(field: unknown): Record<string, unknown> | undefined {\n const f = field as any;\n const meta = typeof f.meta === \"function\" ? f.meta() : undefined;\n if (meta) return meta;\n\n const unwrapped = unwrapZodType(field);\n if (unwrapped !== field) {\n const innerMeta = typeof (unwrapped as any).meta === \"function\" ? (unwrapped as any).meta() : undefined;\n if (innerMeta) return innerMeta;\n }\n\n return undefined;\n}\n\nfunction getStringMaxLength(field: unknown): number | undefined {\n const unwrapped = unwrapZodType(field);\n if (!(unwrapped instanceof z.ZodString)) return undefined;\n\n const checks: any[] = (unwrapped as any).def?.checks ?? [];\n let maxLength: number | undefined;\n\n for (const check of checks) {\n const c = check._zod?.def ?? check.def ?? check;\n if (c.check === \"length_equals\" || c.check === \"size_equals\") {\n const len = c.length ?? c.size;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n if (c.check === \"max_length\" || c.check === \"max_size\") {\n const len = c.maximum ?? c.max;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n }\n\n return maxLength;\n}\n\nfunction isOptional(field: unknown): boolean {\n return (\n field instanceof z.ZodOptional ||\n field instanceof z.ZodNullable\n );\n}\n\nfunction escapeSQLString(s: string): string {\n return `'${s.replace(/'/g, \"''\")}'`;\n}\n\nfunction getDefaultFromZod(field: unknown): string | undefined {\n if (!(field instanceof z.ZodDefault)) return undefined;\n\n try {\n const f = field as any;\n let value = f.defaultValue;\n if (value === undefined) value = f.def?.defaultValue;\n if (typeof value === \"function\") value = value();\n\n if (value === undefined) return undefined;\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return escapeSQLString(value);\n if (typeof value === \"number\") return value.toString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"bigint\") return value.toString();\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nconst VARCHAR_MAX = 65535;\n\nfunction jsonType(dialect: SqlDialect): string {\n return dialect === \"mysql\" ? \"JSON\" : \"JSONB\";\n}\n\n// Maps a scalar (non-collection) Zod type to a native SQL column type.\n// Returns undefined for types that don't have a simple scalar mapping\n// (objects, records, nested arrays, unknown types), so callers can decide\n// how to fall back. `field` is the original (possibly wrapped) node used to\n// read length constraints; `unwrapped` is the underlying scalar type.\nfunction getScalarSqlType(unwrapped: unknown, field: unknown, dialect: SqlDialect): string | undefined {\n if (unwrapped instanceof z.ZodString) {\n const maxLen = getStringMaxLength(field);\n if (maxLen !== undefined && maxLen <= VARCHAR_MAX) return `VARCHAR(${maxLen})`;\n return \"TEXT\";\n }\n\n if (unwrapped instanceof z.ZodNumber) return \"BIGINT\";\n\n if (unwrapped instanceof z.ZodBoolean) {\n return dialect === \"mysql\" ? \"TINYINT(1)\" : \"BOOLEAN\";\n }\n\n if (unwrapped instanceof z.ZodDate) {\n return dialect === \"mysql\" ? \"DATETIME(3)\" : \"TIMESTAMPTZ\";\n }\n\n if (unwrapped instanceof z.ZodBigInt) return \"BIGINT\";\n\n if (unwrapped instanceof z.ZodEnum) return \"TEXT\";\n\n return undefined;\n}\n\nfunction getArrayElement(arr: z.ZodArray): unknown {\n return arr.element ?? arr.def?.element ?? arr.def?.type;\n}\n\n// Resolves the SQL type for an array field. MySQL has no native array column\n// type, so arrays are stored as JSON. Postgres supports native arrays of\n// scalar types (e.g. TEXT[], BIGINT[]); arrays of objects/records or nested\n// arrays fall back to JSONB.\nfunction getArraySqlType(arr: z.ZodArray, dialect: SqlDialect): string {\n if (dialect === \"mysql\") return \"JSON\";\n\n const rawElement = getArrayElement(arr);\n const element = unwrapZodType(rawElement);\n\n // Honor an explicit SQL type declared on the element's meta.\n const elementMeta = getFieldMeta(rawElement);\n if (elementMeta) {\n if (typeof elementMeta.pgType === \"string\") return `${elementMeta.pgType}[]`;\n }\n\n const scalar = getScalarSqlType(element, rawElement, dialect);\n if (scalar !== undefined) return `${scalar}[]`;\n\n return \"JSONB\";\n}\n\nfunction getSqlType(field: unknown, dialect: SqlDialect): string {\n const meta = getFieldMeta(field);\n if (meta) {\n const dialectKey = dialect === \"mysql\" ? \"mysqlType\" : \"pgType\";\n if (typeof meta[dialectKey] === \"string\") return meta[dialectKey] as string;\n }\n\n const unwrapped = unwrapZodType(field);\n\n if (unwrapped instanceof z.ZodArray) {\n return getArraySqlType(unwrapped, dialect);\n }\n\n if (unwrapped instanceof z.ZodObject || unwrapped instanceof z.ZodRecord) {\n return jsonType(dialect);\n }\n\n return getScalarSqlType(unwrapped, field, dialect) ?? \"TEXT\";\n}\n\nfunction isPrimaryKey(field: unknown): boolean {\n const meta = getFieldMeta(field);\n return meta?.primaryKey === true;\n}\n\nfunction getDefaultValue(field: unknown): string | undefined {\n const meta = getFieldMeta(field);\n if (meta && meta.defaultValue !== undefined) {\n // A string is treated as a raw SQL expression (e.g. \"now()\") for\n // backwards compatibility; other values are converted to SQL literals.\n if (typeof meta.defaultValue === \"string\") return meta.defaultValue;\n\n const value = meta.defaultValue;\n if (value === null) return \"NULL\";\n if (typeof value === \"number\") return value.toString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"bigint\") return value.toString();\n }\n\n return getDefaultFromZod(field);\n}\n\nexport interface SchemaToCreateTableOptions {\n dialect?: SqlDialect;\n ifNotExists?: boolean;\n}\n\nexport function schemaToCreateTable(\n schema: SchemaDefinition<string, any, any>,\n options?: SchemaToCreateTableOptions,\n): string {\n const dialect = options?.dialect ?? \"postgres\";\n const ifNotExists = options?.ifNotExists ?? true;\n\n const tableName = schema.table;\n const shape = schema.schema.shape;\n const columns: Record<string, string> = schema.columns;\n\n const userKeys = Object.keys(shape).filter(k => k !== \"id\" && k !== \"commitTs\");\n const orderedKeys = [\"id\", ...userKeys, \"commitTs\"];\n\n const lines: string[] = [];\n\n for (const fieldName of orderedKeys) {\n const field = shape[fieldName];\n if (!field) continue;\n\n const colName = columns[fieldName] ?? fieldName;\n if (!colName) continue;\n\n const sqlType = getSqlType(field, dialect);\n const notNull = !isOptional(field);\n const pk = isPrimaryKey(field);\n const defaultVal = fieldName === \"commitTs\" ? \"0\" : getDefaultValue(field);\n\n let line = ` ${colName} ${sqlType}`;\n if (notNull) line += \" NOT NULL\";\n if (pk) line += \" PRIMARY KEY\";\n if (defaultVal !== undefined) line += ` DEFAULT ${defaultVal}`;\n\n lines.push(line);\n }\n\n const ifNot = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n return `CREATE TABLE ${ifNot}${tableName} (\\n${lines.join(\",\\n\")}\\n);`;\n}\n\nexport function formatDeclarativeIndex(\n idx: DeclarativeIndex,\n tableName: string,\n columns: Record<string, string>,\n): string {\n const colNames = idx.columns.map(c => columns[c] ?? c).join(\", \");\n let sql = `CREATE ${idx.unique ? \"UNIQUE \" : \"\"}INDEX IF NOT EXISTS ${idx.name} ON ${tableName}`;\n if (idx.type) sql += ` USING ${idx.type}`;\n sql += ` (${colNames})`;\n if (idx.where) sql += ` WHERE ${idx.where}`;\n return sql + \";\";\n}\n\nexport interface SchemaIndexesOptions {\n /** Emit `IF NOT EXISTS` on the auto-generated commit_ts index. Default true. */\n ifNotExists?: boolean;\n}\n\nexport function schemaIndexes(\n schema: SchemaDefinition<string, any, any>,\n options?: SchemaIndexesOptions,\n): string[] {\n const out = (schema.indexes ?? []).map(idx => {\n if (typeof idx === \"string\") return idx;\n return formatDeclarativeIndex(idx, schema.table, schema.columns);\n });\n\n // Every table has a `commit_ts` column (OCC) that is otherwise unindexed.\n // Auto-add an index on it unless the user already declared one covering\n // the commit_ts field or one with the same generated name.\n const commitCol = schema.columns[\"commitTs\"] ?? \"commit_ts\";\n const autoName = `${schema.table}_commit_ts_idx`;\n const alreadyDeclared = (schema.indexes ?? []).some(idx => {\n if (typeof idx === \"string\") return idx.includes(autoName);\n if (idx.name === autoName) return true;\n return idx.columns.length === 1 &&\n (idx.columns[0] === \"commitTs\" || idx.columns[0] === commitCol);\n });\n if (!alreadyDeclared) {\n const ifNot = (options?.ifNotExists ?? true) ? \"IF NOT EXISTS \" : \"\";\n out.push(`CREATE INDEX ${ifNot}${autoName} ON ${schema.table} (${commitCol});`);\n }\n\n return out;\n}\n\nexport interface GenerateSchemaSqlOptions {\n dialect?: SqlDialect;\n ifNotExists?: boolean;\n header?: boolean;\n /**\n * Prepend the framework-owned core tables (`commit_logs`, `metadata`) and\n * their indexes so the generated SQL fully describes the database. Default\n * true. Non-table core bootstrap (sequences, seed rows) is handled at\n * runtime by `initCore`, not emitted here.\n */\n includeCoreTables?: boolean;\n}\n\nexport function generateSchemaSql(\n schemas?: Map<string, SchemaDefinition<string, any, any>> | SchemaDefinition<string, any, any>[],\n options?: GenerateSchemaSqlOptions,\n): string {\n const dialect = options?.dialect ?? \"postgres\";\n const header = options?.header ?? true;\n const includeCoreTables = options?.includeCoreTables ?? true;\n\n let list: SchemaDefinition<string, any, any>[];\n\n if (schemas instanceof Map) {\n list = [...schemas.values()];\n } else if (Array.isArray(schemas)) {\n list = schemas;\n } else {\n list = [...schemaRegistry.values()];\n }\n\n list = list.filter(s => s?.table);\n list.sort((a, b) => a.table.localeCompare(b.table));\n\n const parts: string[] = [];\n\n if (header) {\n parts.push(\"-- Generated by Supalive Schema Generator\");\n parts.push(`-- Dialect: ${dialect}`);\n parts.push(`-- Tables: ${list.length}${includeCoreTables ? \" (+ core)\" : \"\"}`);\n parts.push(\"\");\n }\n\n if (includeCoreTables) {\n parts.push(\"-- Core tables (framework-owned)\");\n for (const stmt of coreTablesSql(dialect, { ifNotExists: options?.ifNotExists })) {\n parts.push(stmt);\n }\n parts.push(\"\");\n }\n\n for (const schema of list) {\n parts.push(schemaToCreateTable(schema, { ...options, dialect }));\n const indexStmts = schemaIndexes(schema, { ifNotExists: options?.ifNotExists });\n for (const stmt of indexStmts) {\n parts.push(stmt);\n }\n parts.push(\"\");\n }\n\n return parts.join(\"\\n\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema-sql.js","names":["z"],"sources":["../../../src/db/core_tables.ts","../../../src/db/schema-sql.ts"],"sourcesContent":["import type { SqlDialect } from \"./schema-sql\";\n\n/**\n * DDL for the core, framework-owned database objects that every Supalive\n * database must have alongside the user's own tables:\n *\n * - `commit_logs` — the append-only OCC change log (+ its lookup indexes).\n * - `metadata` — the small key/value table holding the OCC watermarks\n * (`latest_committed_ts`, `min_retained_ts`) and the\n * core schema version (`core_version`).\n * - `global_commit_ts` — the monotonic commit-timestamp source: a SEQUENCE on\n * Postgres, a single-row `BIGINT` counter table on MySQL.\n *\n * These are all pure schema (DDL), so they belong in the generated `schema.sql`\n * (see {@link generateSchemaSql}, which prepends them by default) and get\n * migrated ahead of runtime by your normal migration pipeline — a single\n * generated file fully describes the database.\n *\n * Data seeding (the `metadata` rows and the MySQL counter's initial `0`) and\n * any runtime-only schema changes live in `initCore` — see\n * {@link file://./init_db.ts}.\n */\n\nexport interface CoreTablesSqlOptions {\n /** Emit `IF NOT EXISTS` on `CREATE TABLE`/`CREATE INDEX`/`CREATE SEQUENCE`. Default true. */\n ifNotExists?: boolean;\n /**\n * MySQL only: the SQL type of `commit_logs.id`, which stores the changed\n * row's primary key encoded as bytes. Defaults to `VARBINARY(255)`.\n * `generateSchemaSql` derives a tighter value from the app's largest id\n * column; an app with fixed-width binary ids can override to e.g.\n * `BINARY(16)` (but note: variable-length ids must use VARBINARY — a fixed\n * BINARY column zero-pads stored values, which would break the OCC id match).\n */\n commitLogIdType?: string;\n}\n\nexport function coreTablesSql(\n dialect: SqlDialect = \"postgres\",\n options?: CoreTablesSqlOptions,\n): string[] {\n const ifNotExists = options?.ifNotExists ?? true;\n const t = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n const i = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n const commitLogIdType = options?.commitLogIdType ?? \"VARBINARY(255)\";\n\n if (dialect === \"mysql\") {\n return [\n // MySQL has no sequences: a single-row counter table advanced via\n // LAST_INSERT_ID (see MySqlDatabase.getNextTimestamp). Seeded to 0\n // by initCore.\n `CREATE TABLE ${t}global_commit_ts (\\n` +\n ` id BIGINT NOT NULL\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`,\n // `id` holds the changed row's primary key encoded as bytes. Row ids\n // are variable-length (a prefixed string id can exceed 16 bytes), so\n // the default is VARBINARY, mirroring Postgres' flexible BYTEA — a\n // fixed BINARY column zero-pads stored values, breaking the OCC id\n // match. Sized via `commitLogIdType` (generateSchemaSql derives it\n // from the app's largest id column). `table_id` is a fixed 16-byte\n // table hash and stays BINARY(16).\n `CREATE TABLE ${t}commit_logs (\\n` +\n ` id ${commitLogIdType} NOT NULL,\\n` +\n ` ts BIGINT NOT NULL,\\n` +\n ` table_id BINARY(16) NOT NULL,\\n` +\n ` data LONGBLOB NOT NULL,\\n` +\n ` PRIMARY KEY (ts, table_id, id),\\n` +\n ` INDEX commit_logs_by_table_and_id (table_id, id, ts)\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;`,\n `CREATE TABLE ${t}metadata (\\n` +\n ` meta_key VARCHAR(64) NOT NULL PRIMARY KEY,\\n` +\n ` meta_value BIGINT NOT NULL\\n` +\n `) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`,\n ];\n }\n\n return [\n // Monotonic OCC commit-timestamp source (see PgDatabase.getNextTimestamp).\n `CREATE SEQUENCE ${t}global_commit_ts START 1 INCREMENT 1 NO CYCLE;`,\n `CREATE TABLE ${t}commit_logs (\\n` +\n ` id BYTEA NOT NULL,\\n` +\n ` ts BIGINT NOT NULL,\\n` +\n ` table_id BYTEA NOT NULL,\\n` +\n ` data BYTEA NOT NULL,\\n` +\n ` PRIMARY KEY (ts, table_id, id)\\n` +\n `);`,\n `CREATE INDEX ${i}commit_logs_by_table_and_id ON commit_logs (table_id, id, ts);`,\n `CREATE INDEX ${i}commit_logs_by_table_ts_and_id ON commit_logs (table_id, ts, id);`,\n `CREATE TABLE ${t}metadata (\\n` +\n ` meta_key TEXT PRIMARY KEY,\\n` +\n ` meta_value BIGINT NOT NULL\\n` +\n `);`,\n ];\n}\n","import { z } from \"zod\";\nimport { SchemaDefinition, schemaRegistry } from \"./schema\";\nimport type { DeclarativeIndex } from \"./schema\";\nimport { unwrapZodType } from \"./codec\";\nimport { coreTablesSql } from \"./core_tables\";\n\nexport type SqlDialect = \"postgres\" | \"mysql\";\n\nfunction getFieldMeta(field: unknown): Record<string, unknown> | undefined {\n const f = field as any;\n const meta = typeof f.meta === \"function\" ? f.meta() : undefined;\n if (meta) return meta;\n\n const unwrapped = unwrapZodType(field);\n if (unwrapped !== field) {\n const innerMeta = typeof (unwrapped as any).meta === \"function\" ? (unwrapped as any).meta() : undefined;\n if (innerMeta) return innerMeta;\n }\n\n return undefined;\n}\n\nfunction getStringMaxLength(field: unknown): number | undefined {\n const unwrapped = unwrapZodType(field);\n if (!(unwrapped instanceof z.ZodString)) return undefined;\n\n const checks: any[] = (unwrapped as any).def?.checks ?? [];\n let maxLength: number | undefined;\n\n for (const check of checks) {\n const c = check._zod?.def ?? check.def ?? check;\n if (c.check === \"length_equals\" || c.check === \"size_equals\") {\n const len = c.length ?? c.size;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n if (c.check === \"max_length\" || c.check === \"max_size\") {\n const len = c.maximum ?? c.max;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n }\n\n return maxLength;\n}\n\nfunction isOptional(field: unknown): boolean {\n return (\n field instanceof z.ZodOptional ||\n field instanceof z.ZodNullable\n );\n}\n\nfunction escapeSQLString(s: string): string {\n return `'${s.replace(/'/g, \"''\")}'`;\n}\n\nfunction getDefaultFromZod(field: unknown): string | undefined {\n if (!(field instanceof z.ZodDefault)) return undefined;\n\n try {\n const f = field as any;\n let value = f.defaultValue;\n if (value === undefined) value = f.def?.defaultValue;\n if (typeof value === \"function\") value = value();\n\n if (value === undefined) return undefined;\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return escapeSQLString(value);\n if (typeof value === \"number\") return value.toString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"bigint\") return value.toString();\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nconst VARCHAR_MAX = 65535;\n\nfunction jsonType(dialect: SqlDialect): string {\n return dialect === \"mysql\" ? \"JSON\" : \"JSONB\";\n}\n\n// Extract the string literal values of a Zod enum across Zod v4 internal\n// shapes (`.options` array, or `.def.entries` object map).\nfunction getEnumValues(en: unknown): string[] {\n const e = en as any;\n if (Array.isArray(e?.options)) return e.options.filter((v: unknown): v is string => typeof v === \"string\");\n const entries = e?.def?.entries ?? e?._def?.entries ?? e?.def?.values;\n if (entries && typeof entries === \"object\") {\n return Object.values(entries).filter((v): v is string => typeof v === \"string\");\n }\n return [];\n}\n\n// Maps a scalar (non-collection) Zod type to a native SQL column type.\n// Returns undefined for types that don't have a simple scalar mapping\n// (objects, records, nested arrays, unknown types), so callers can decide\n// how to fall back. `field` is the original (possibly wrapped) node used to\n// read length constraints; `unwrapped` is the underlying scalar type.\nfunction getScalarSqlType(unwrapped: unknown, field: unknown, dialect: SqlDialect): string | undefined {\n if (unwrapped instanceof z.ZodString) {\n const maxLen = getStringMaxLength(field);\n if (maxLen !== undefined && maxLen <= VARCHAR_MAX) return `VARCHAR(${maxLen})`;\n return \"TEXT\";\n }\n\n if (unwrapped instanceof z.ZodNumber) return \"BIGINT\";\n\n if (unwrapped instanceof z.ZodBoolean) {\n return dialect === \"mysql\" ? \"TINYINT(1)\" : \"BOOLEAN\";\n }\n\n if (unwrapped instanceof z.ZodDate) {\n return dialect === \"mysql\" ? \"DATETIME(3)\" : \"TIMESTAMPTZ\";\n }\n\n if (unwrapped instanceof z.ZodBigInt) return \"BIGINT\";\n\n if (unwrapped instanceof z.ZodEnum) {\n // Enums are a bounded set of short string literals, so size the column\n // to the longest literal (`VARCHAR(n)`) rather than `TEXT`. This is both\n // more efficient and, crucially, indexable on MySQL — status/type enums\n // are indexed and MySQL cannot index a `TEXT` column without a prefix\n // length. Adding a longer variant later is a normal migration.\n const values = getEnumValues(unwrapped);\n const maxLen = values.reduce((m, v) => Math.max(m, v.length), 0);\n if (maxLen > 0 && maxLen <= VARCHAR_MAX) return `VARCHAR(${maxLen})`;\n return \"VARCHAR(30)\";\n }\n\n return undefined;\n}\n\nfunction getArrayElement(arr: z.ZodArray): unknown {\n return arr.element ?? arr.def?.element ?? arr.def?.type;\n}\n\n// Resolves the SQL type for an array field. MySQL has no native array column\n// type, so arrays are stored as JSON. Postgres supports native arrays of\n// scalar types (e.g. TEXT[], BIGINT[]); arrays of objects/records or nested\n// arrays fall back to JSONB.\nfunction getArraySqlType(arr: z.ZodArray, dialect: SqlDialect): string {\n if (dialect === \"mysql\") return \"JSON\";\n\n const rawElement = getArrayElement(arr);\n const element = unwrapZodType(rawElement);\n\n // Honor an explicit SQL type declared on the element's meta.\n const elementMeta = getFieldMeta(rawElement);\n if (elementMeta) {\n if (typeof elementMeta.pgType === \"string\") return `${elementMeta.pgType}[]`;\n }\n\n const scalar = getScalarSqlType(element, rawElement, dialect);\n if (scalar !== undefined) return `${scalar}[]`;\n\n return \"JSONB\";\n}\n\nfunction getSqlType(field: unknown, dialect: SqlDialect): string {\n const meta = getFieldMeta(field);\n if (meta) {\n const dialectKey = dialect === \"mysql\" ? \"mysqlType\" : \"pgType\";\n if (typeof meta[dialectKey] === \"string\") return meta[dialectKey] as string;\n }\n\n const unwrapped = unwrapZodType(field);\n\n if (unwrapped instanceof z.ZodArray) {\n return getArraySqlType(unwrapped, dialect);\n }\n\n if (unwrapped instanceof z.ZodObject || unwrapped instanceof z.ZodRecord) {\n return jsonType(dialect);\n }\n\n return getScalarSqlType(unwrapped, field, dialect) ?? \"TEXT\";\n}\n\nfunction isPrimaryKey(field: unknown): boolean {\n const meta = getFieldMeta(field);\n return meta?.primaryKey === true;\n}\n\nfunction getDefaultValue(field: unknown): string | undefined {\n const meta = getFieldMeta(field);\n if (meta && meta.defaultValue !== undefined) {\n // A string is treated as a raw SQL expression (e.g. \"now()\") for\n // backwards compatibility; other values are converted to SQL literals.\n if (typeof meta.defaultValue === \"string\") return meta.defaultValue;\n\n const value = meta.defaultValue;\n if (value === null) return \"NULL\";\n if (typeof value === \"number\") return value.toString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"bigint\") return value.toString();\n }\n\n return getDefaultFromZod(field);\n}\n\n// Does `schema` already declare an index equivalent to the auto commit_ts one\n// (same generated name, or a single-column index on commit_ts)?\nfunction hasCommitTsIndex(schema: SchemaDefinition<string, any, any>): boolean {\n const commitCol = schema.columns[\"commitTs\"] ?? \"commit_ts\";\n const autoName = `${schema.table}_commit_ts_idx`;\n return (schema.indexes ?? []).some(idx => {\n if (typeof idx === \"string\") return idx.includes(autoName);\n if (idx.name === autoName) return true;\n return idx.columns.length === 1 &&\n (idx.columns[0] === \"commitTs\" || idx.columns[0] === commitCol);\n });\n}\n\n// MySQL CREATE INDEX has no IF NOT EXISTS and — more importantly — some\n// declarative schema tools (e.g. planetscale/schemadiff) only accept indexes\n// declared INLINE in CREATE TABLE, not as standalone CREATE INDEX statements.\n// So on MySQL we fold every declarative index (plus the auto commit_ts index)\n// into `KEY` / `UNIQUE KEY` lines inside the table body. Raw-string indexes\n// can't be folded and are left for the caller to emit separately.\nfunction mysqlInlineIndexLines(schema: SchemaDefinition<string, any, any>): string[] {\n const columns: Record<string, string> = schema.columns;\n const lines: string[] = [];\n\n for (const idx of schema.indexes ?? []) {\n if (typeof idx === \"string\") continue;\n const cols = idx.columns.map(c => columns[c] ?? c).join(\", \");\n lines.push(` ${idx.unique ? \"UNIQUE KEY\" : \"KEY\"} ${idx.name} (${cols})`);\n }\n\n if (!hasCommitTsIndex(schema)) {\n const commitCol = columns[\"commitTs\"] ?? \"commit_ts\";\n lines.push(` KEY ${schema.table}_commit_ts_idx (${commitCol})`);\n }\n\n return lines;\n}\n\nexport interface SchemaToCreateTableOptions {\n dialect?: SqlDialect;\n ifNotExists?: boolean;\n}\n\nexport function schemaToCreateTable(\n schema: SchemaDefinition<string, any, any>,\n options?: SchemaToCreateTableOptions,\n): string {\n const dialect = options?.dialect ?? \"postgres\";\n const ifNotExists = options?.ifNotExists ?? true;\n\n const tableName = schema.table;\n const shape = schema.schema.shape;\n const columns: Record<string, string> = schema.columns;\n\n const userKeys = Object.keys(shape).filter(k => k !== \"id\" && k !== \"commitTs\");\n const orderedKeys = [\"id\", ...userKeys, \"commitTs\"];\n\n const lines: string[] = [];\n\n for (const fieldName of orderedKeys) {\n const field = shape[fieldName];\n if (!field) continue;\n\n const colName = columns[fieldName] ?? fieldName;\n if (!colName) continue;\n\n let sqlType = getSqlType(field, dialect);\n const notNull = !isOptional(field);\n const pk = isPrimaryKey(field);\n let defaultVal = fieldName === \"commitTs\" ? \"0\" : getDefaultValue(field);\n\n // MySQL cannot use a TEXT column as a PRIMARY KEY without a prefix\n // length. A primary key is always short and indexable, so fall back to a\n // bounded VARCHAR when no explicit length was declared.\n if (pk && dialect === \"mysql\" && sqlType === \"TEXT\") {\n sqlType = \"VARCHAR(255)\";\n }\n\n // MySQL never expresses a datetime/timestamp default as `now()` and\n // requires the default's fractional precision to match the column's. So\n // for any DATETIME/TIMESTAMP column with a now()/CURRENT_TIMESTAMP-style\n // default, emit `CURRENT_TIMESTAMP(p)` with the column's precision (or a\n // bare `CURRENT_TIMESTAMP` when the column has none) — honoring a custom\n // mysqlType (e.g. `TIMESTAMP`, `DATETIME(6)`) too. Postgres keeps `now()`.\n if (dialect === \"mysql\" && defaultVal) {\n const dt = /^(?:DATETIME|TIMESTAMP)(?:\\((\\d+)\\))?$/i.exec(sqlType.trim());\n const isNowLike = /^(?:now\\(\\s*\\d*\\s*\\)|current_timestamp(?:\\(\\s*\\d*\\s*\\))?)$/i.test(defaultVal.trim());\n if (dt && isNowLike) {\n const precision = dt[1];\n defaultVal = precision !== undefined ? `CURRENT_TIMESTAMP(${precision})` : \"CURRENT_TIMESTAMP\";\n }\n }\n\n // MySQL canonicalizes scalar column defaults as quoted strings in its\n // stored table definition (`DEFAULT '0'`, boolean → `'0'`/`'1'`). Emit\n // them the same way so a declarative diff against a live database is a\n // no-op instead of a spurious MODIFY on every run. CURRENT_TIMESTAMP(3),\n // NULL, and already-quoted string defaults are left untouched.\n if (dialect === \"mysql\" && defaultVal !== undefined) {\n const dv = defaultVal.trim();\n if (/^-?\\d+$/.test(dv)) defaultVal = `'${dv}'`;\n else if (/^true$/i.test(dv)) defaultVal = \"'1'\";\n else if (/^false$/i.test(dv)) defaultVal = \"'0'\";\n }\n\n let line = ` ${colName} ${sqlType}`;\n if (notNull) line += \" NOT NULL\";\n if (pk) line += \" PRIMARY KEY\";\n if (defaultVal !== undefined) line += ` DEFAULT ${defaultVal}`;\n\n lines.push(line);\n }\n\n // MySQL: fold indexes into the table body (see mysqlInlineIndexLines).\n if (dialect === \"mysql\") {\n lines.push(...mysqlInlineIndexLines(schema));\n }\n\n const ifNot = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n // MySQL stores an explicit ENGINE/charset in its canonical table definition;\n // emit them so a declarative diff against a live database doesn't report a\n // spurious charset change on every run (utf8mb4 is the MySQL 8 default).\n const tableOptions = dialect === \"mysql\" ? \" ENGINE=InnoDB DEFAULT CHARSET=utf8mb4\" : \"\";\n return `CREATE TABLE ${ifNot}${tableName} (\\n${lines.join(\",\\n\")}\\n)${tableOptions};`;\n}\n\nexport function formatDeclarativeIndex(\n idx: DeclarativeIndex,\n tableName: string,\n columns: Record<string, string>,\n options?: { ifNotExists?: boolean },\n): string {\n // MySQL's CREATE INDEX has no `IF NOT EXISTS`, so this must be omittable\n // (callers pass ifNotExists:false for MySQL / migration-tool input).\n const ifNot = (options?.ifNotExists ?? true) ? \"IF NOT EXISTS \" : \"\";\n const colNames = idx.columns.map(c => columns[c] ?? c).join(\", \");\n let sql = `CREATE ${idx.unique ? \"UNIQUE \" : \"\"}INDEX ${ifNot}${idx.name} ON ${tableName}`;\n if (idx.type) sql += ` USING ${idx.type}`;\n sql += ` (${colNames})`;\n if (idx.where) sql += ` WHERE ${idx.where}`;\n return sql + \";\";\n}\n\nexport interface SchemaIndexesOptions {\n /** Emit `IF NOT EXISTS` on the auto-generated commit_ts index. Default true. */\n ifNotExists?: boolean;\n}\n\nexport function schemaIndexes(\n schema: SchemaDefinition<string, any, any>,\n options?: SchemaIndexesOptions,\n): string[] {\n const out = (schema.indexes ?? []).map(idx => {\n if (typeof idx === \"string\") return idx;\n return formatDeclarativeIndex(idx, schema.table, schema.columns, { ifNotExists: options?.ifNotExists });\n });\n\n // Every table has a `commit_ts` column (OCC) that is otherwise unindexed.\n // Auto-add an index on it unless the user already declared one covering\n // the commit_ts field or one with the same generated name.\n const commitCol = schema.columns[\"commitTs\"] ?? \"commit_ts\";\n const autoName = `${schema.table}_commit_ts_idx`;\n const alreadyDeclared = (schema.indexes ?? []).some(idx => {\n if (typeof idx === \"string\") return idx.includes(autoName);\n if (idx.name === autoName) return true;\n return idx.columns.length === 1 &&\n (idx.columns[0] === \"commitTs\" || idx.columns[0] === commitCol);\n });\n if (!alreadyDeclared) {\n const ifNot = (options?.ifNotExists ?? true) ? \"IF NOT EXISTS \" : \"\";\n out.push(`CREATE INDEX ${ifNot}${autoName} ON ${schema.table} (${commitCol});`);\n }\n\n return out;\n}\n\nexport interface GenerateSchemaSqlOptions {\n dialect?: SqlDialect;\n ifNotExists?: boolean;\n header?: boolean;\n /**\n * Prepend the framework-owned core tables (`commit_logs`, `metadata`) and\n * their indexes so the generated SQL fully describes the database. Default\n * true. Non-table core bootstrap (sequences, seed rows) is handled at\n * runtime by `initCore`, not emitted here.\n */\n includeCoreTables?: boolean;\n /**\n * MySQL only: override the SQL type of `commit_logs.id`. By default it is\n * auto-derived as `VARBINARY(max(32, largestIdColumnLength))` — wide enough\n * for the app's biggest primary key, with a 32-byte floor. Override for an\n * app with fixed-width binary ids (e.g. `\"BINARY(16)\"`). Ignored on Postgres\n * (always `BYTEA`).\n */\n commitLogIdType?: string;\n}\n\n/**\n * The largest declared primary-key string length across `schemas` (via the id\n * column's `.max(n)`), or undefined when none declare one. Used to size the\n * MySQL `commit_logs.id` column so it can hold any row's encoded id.\n */\nfunction maxPrimaryKeyLength(schemas: SchemaDefinition<string, any, any>[]): number | undefined {\n let max: number | undefined;\n for (const schema of schemas) {\n const idField = (schema.schema as any)?.shape?.id;\n const len = getStringMaxLength(idField);\n if (typeof len === \"number\") max = max === undefined ? len : Math.max(max, len);\n }\n return max;\n}\n\nexport function generateSchemaSql(\n schemas?: Map<string, SchemaDefinition<string, any, any>> | SchemaDefinition<string, any, any>[],\n options?: GenerateSchemaSqlOptions,\n): string {\n const dialect = options?.dialect ?? \"postgres\";\n const header = options?.header ?? true;\n const includeCoreTables = options?.includeCoreTables ?? true;\n\n let list: SchemaDefinition<string, any, any>[];\n\n if (schemas instanceof Map) {\n list = [...schemas.values()];\n } else if (Array.isArray(schemas)) {\n list = schemas;\n } else {\n list = [...schemaRegistry.values()];\n }\n\n list = list.filter(s => s?.table);\n list.sort((a, b) => a.table.localeCompare(b.table));\n\n const parts: string[] = [];\n\n if (header) {\n parts.push(\"-- Generated by Supalive Schema Generator\");\n parts.push(`-- Dialect: ${dialect}`);\n parts.push(`-- Tables: ${list.length}${includeCoreTables ? \" (+ core)\" : \"\"}`);\n parts.push(\"\");\n }\n\n if (includeCoreTables) {\n // MySQL: size commit_logs.id to the app's largest id column (32-byte\n // floor), unless the caller overrode the type. VARBINARY (not BINARY) so\n // variable-length ids aren't zero-padded, which would break the OCC id\n // match. Ignored on Postgres (BYTEA).\n const commitLogIdType = dialect === \"mysql\"\n ? (options?.commitLogIdType ?? `VARBINARY(${Math.max(32, maxPrimaryKeyLength(list) ?? 0)})`)\n : options?.commitLogIdType;\n\n parts.push(\"-- Core tables (framework-owned)\");\n for (const stmt of coreTablesSql(dialect, { ifNotExists: options?.ifNotExists, commitLogIdType })) {\n parts.push(stmt);\n }\n parts.push(\"\");\n }\n\n for (const schema of list) {\n parts.push(schemaToCreateTable(schema, { ...options, dialect }));\n if (dialect === \"mysql\") {\n // Declarative indexes and the auto commit_ts index are folded inline\n // into the CREATE TABLE above; only raw-string (verbatim SQL) indexes\n // remain to be emitted as separate statements.\n for (const idx of schema.indexes ?? []) {\n if (typeof idx === \"string\") parts.push(idx);\n }\n } else {\n const indexStmts = schemaIndexes(schema, { ifNotExists: options?.ifNotExists });\n for (const stmt of indexStmts) {\n parts.push(stmt);\n }\n }\n parts.push(\"\");\n }\n\n return parts.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { $n as AffectedSubscription, Bt as ScheduleHandle, E as Context, Ft as IncomingJobRequest, Ht as SupaliveDb, It as JobClient, Lt as JobScheduler, Mt as DevScheduler, Nt as DevSchedulerOptions, Pt as EnqueueOptions, Qn as CacheLayer, Rt as QStashScheduler, Un as Database, Vt as ScheduledJobDef, ar as RegisterSubscriptionResult, cr as UnregisterSubscriptionResult, dr as UpdateSubscriptionReadSetParams, er as InvalidateWritesetParams, fr as UpdateSubscriptionReadSetParamsSchema, ir as RegisterSubscriptionParamsSchema, nr as InvalidateWritesetResult, or as UnregisterSubscriptionParams, pr as UpdateSubscriptionReadSetResult, rr as RegisterSubscriptionParams, rt as Router, sr as UnregisterSubscriptionParamsSchema, tr as InvalidateWritesetParamsSchema, zt as QStashSchedulerOptions } from "../../index-C_Zew1wH.js";
2
- import { t as MySqlDatabase } from "../../mysql-BXy4mk-9.js";
3
- import { t as PgDatabase } from "../../postgres-CapFFTTn.js";
4
- import { C as SubManagerLink, S as SubManagerClient, b as SupaliveServerConfig, p as DatabaseConfig, u as SubId, x as UpstashConfig, y as SubscriptionManagerConfig } from "../../types_server-SPElhjga.js";
1
+ import { $n as AffectedSubscription, Bt as ScheduleHandle, E as Context, Ft as IncomingJobRequest, Ht as SupaliveDb, It as JobClient, Lt as JobScheduler, Mt as DevScheduler, Nt as DevSchedulerOptions, Pt as EnqueueOptions, Qn as CacheLayer, Rt as QStashScheduler, Un as Database, Vt as ScheduledJobDef, ar as RegisterSubscriptionResult, cr as UnregisterSubscriptionResult, dr as UpdateSubscriptionReadSetParams, er as InvalidateWritesetParams, fr as UpdateSubscriptionReadSetParamsSchema, ir as RegisterSubscriptionParamsSchema, nr as InvalidateWritesetResult, or as UnregisterSubscriptionParams, pr as UpdateSubscriptionReadSetResult, rr as RegisterSubscriptionParams, rt as Router, sr as UnregisterSubscriptionParamsSchema, tr as InvalidateWritesetParamsSchema, zt as QStashSchedulerOptions } from "../../index-BedlCLem.js";
2
+ import { t as MySqlDatabase } from "../../mysql-BHJ2mrwZ.js";
3
+ import { t as PgDatabase } from "../../postgres-Eo-lpUiX.js";
4
+ import { C as SubManagerLink, S as SubManagerClient, b as SupaliveServerConfig, p as DatabaseConfig, u as SubId, x as UpstashConfig, y as SubscriptionManagerConfig } from "../../types_server-B3z8hi-Z.js";
5
5
  import pino, { Level } from "pino";
6
6
  import Redis$1 from "ioredis";
7
7
 
@@ -272,6 +272,13 @@ declare function initCore(db: Database): Promise<void>;
272
272
  declare const DB_QUERY_TIMEOUT_MS: number;
273
273
  type InitDbOptions = {
274
274
  DbConfig: DatabaseConfig;
275
+ /**
276
+ * Optional read-replica connection. When set, query/action reads default to
277
+ * it (see the routing in one-shot-query.ts) while all writes, the OCC
278
+ * commit-ts source, and cache-freshness scans stay on the primary. Omit to
279
+ * run everything on the primary.
280
+ */
281
+ ReplicaDbConfig?: DatabaseConfig;
275
282
  CacheLayer: CacheLayer;
276
283
  forceBootstrapReload?: boolean;
277
284
  workerId?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","names":[],"sources":["../../../src/server/supalive-server.ts","../../../src/logger.ts","../../../src/server/sub-manager.ts","../../../src/db/init_db.ts","../../../src/server/sub_hash.ts"],"mappings":";;;;;;;;;;;cA4Ha,uBAAA,kBAAyC,OAAA;EAAA,QAC5C,MAAA;EAAA,QACA,UAAA;EAAA,QAEA,UAAA;EAAA,QACA,GAAA;EAAA,QAEA,KAAA;EAAA,QACA,QAAA;EA0K2B;EAAA,iBAxKlB,iBAAA;EAAA,QACT,EAAA;EAAA,QACA,eAAA;EAAA,QACA,MAAA;EAAA,QAMA,kBAAA;EAAA,QAIA,WAAA;EAAA,QAEA,SAAA;EAAA,QACA,OAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAkpC0D;EAAA,QAhpC1D,OAAA;EAAA,QAEA,QAAA;EAAA,QACA,mBAAA;EAAA,QACA,gBAAA;EAAA,QAEA,KAAA;cAMI,MAAA,EAAQ,oBAAA,CAAqB,QAAA;EArCjC;;;;;;;;;;;;EAAA,QAiJA,qBAAA;EAAA,QAqBA,kBAAA;EAOR,cAAA,CAAe,MAAA,EAAQ,MAAA,MAAY,QAAA;EAK7B,KAAA,IAAS,OAAA;EArJP;;;;;;EAAA,QA6KM,gBAAA;EApCN;EAoDR,WAAA,CAAY,IAAA;EA7CW;;;;;EAsDjB,WAAA,CAAY,IAAA,UAAc,IAAA,WAAe,IAAA,GAAO,cAAA,GAAiB,OAAA,CAAQ,cAAA;EAT/E;EAeM,SAAA,CAAU,QAAA,WAAmB,OAAA;EAN7B;;;;EAeN,YAAA,IAAgB,SAAA;EAIV,IAAA,IAAQ,OAAA;EAUd,QAAA;;;;;;EASA,aAAA;EAnBc;;;;;EAAA,QA4BA,iBAAA;EAAA,QA6EN,sBAAA;EAAA,QAQM,gBAAA;EAAA,QAiDA,aAAA;EAAA,QAeA,cAAA;EAAA,QAiBA,UAAA;EAjBA;;;;;;;EAAA,QAoDN,eAAA;EAwVM;;;;;EAAA,QAhUA,kBAAA;EAAA,QAwBA,UAAA;EAAA,QA0GA,eAAA;EAAA,QAkHA,iBAAA;EAAA,QAuBA,gBAAA;EA2UN;;;;;;;;;;;;;;EAAA,QAtRM,qBAAA;EAAA,QAgEA,kBAAA;;;;AC/+BhB;;;UD2/BU,uBAAA;EAAA,QAmBM,oBAAA;EC7gCH;;;;AAAyC;AACtD;;;;AAAmB;AAqBnB;;;EAtBa,QD8iCG,gBAAA;EAAA,QAgBN,kBAAA;EAAA,QAOM,oBAAA;EAAA,QAgCA,sBAAA;EAAA,QAqEA,gBAAA;EAAA,QAgBN,WAAA;EAAA,QAUA,cAAA;EAAA,QAMA,SAAA;EAAA,QAIM,0BAAA;ECnrCoF;;;;;;EAAA,QDquCpF,kBAAA;ECruCkE;;;;;;EDuvC1E,mBAAA,CAAoB,MAAA,cAAoB,OAAA;ECvvCqD;;;;ACgKrG;;;;EFymCQ,iBAAA,CAAkB,OAAA,UAAiB,OAAA,WAAkB,OAAA;EAAA,QAI7C,2BAAA;EAAA,QAkCA,yBAAA;EAAA,QA0BA,yBAAA;AAAA;;;cCr2CH,aAAA;AAAA,cACA,YAAA;AAAA,cACA,MAAA,EAAM,IAAA,CAAA,MAAA;AAAA,iBAqBH,UAAA,CAAW,IAAA,WAAe,KAAK;AAAA,iBAK/B,iBAAA,wCAAyD,GAAA,EAAK,GAAA,CAAI,CAAA,EAAG,CAAA,IAAK,MAAA,CAAO,CAAA,EAAG,CAAA;;;;;;;;;;cCgKvF,mBAAA;EAAA,QACH,GAAA;EAAA,QACA,IAAA;EAAA,QACA,MAAA;EAAA,QACA,OAAA;EAAA,QACA,aAAA;EAAA,wBACgB,iBAAA;cAEZ,MAAA,EAAQ,yBAAA;EFxEZ;;;;;;EAAA,QEwHA,iBAAA;EAiCF,KAAA,IAAS,OAAA;EAuBT,IAAA,IAAQ,OAAA;EF5JN;;;;;;;EE6KR,SAAA,IAAa,cAAA;EAAA,QAaC,eAAA;;;;UA4BA,2BAAA;EAUd,WAAA;EAIA,cAAA,CAAe,KAAA;EAAA,QAIP,SAAA;EAAA,QAIA,eAAA;EAAA,QAWA,SAAA;EAAA,QAIM,oBAAA;EAAA,QAKA,yBAAA;EAAA,QAwBA,yBAAA;EAAA,QAKA,sBAAA;EAAA,QAKA,uBAAA;EAAA,QAsBA,kBAAA;AAAA;;;;AFjVhB;;;;;;;;;;cGxGa,YAAA;;;;;;;;;;iBAWS,QAAA,CAAS,EAAA,EAAI,QAAA,GAAW,OAAO;;;;;;cA6BxC,mBAAA;AAAA,KAID,aAAA;EACR,QAAA,EAAU,cAAA;EACV,UAAA,EAAY,UAAU;EACtB,oBAAA;EACA,QAAA;AAAA;AAAA,iBAGkB,YAAA,CAAa,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,UAAA;AAAA,iBAWpD,cAAA,CAAe,MAAA,EAAQ,cAAA,EAAgB,QAAA,YAAoB,UAAA,GAAa,aAAA;;;;;;;;;;;iBAgDlE,gBAAA,CAAiB,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,WAAA,aAAsB,OAAA;AAAA,KAsBpF,qBAAA;EACR,OAAA,EAAS,aAAa;EAEtB,eAAA;EAEA,iBAAA;EAEA,iBAAA;EAEA,oBAAA;EAEA,eAAA;AAAA;AAAA,iBAGY,cAAA,CAAe,MAAA,EAAQ,qBAAA;EAA0B,UAAA,EAAY,UAAA;EAAY,cAAA,GAAiB,OAAA;AAAA;;;;iBC/JpF,SAAA,CAAU,KAAA,YAAiB,OAAO;;;;;cAS3C,kBAAA;;;;;;;;;iBAgDS,sBAAA,CACpB,SAAA,UACA,KAAA,oBACA,aAAA,WACC,OAAO;;;;;;iBAWY,gBAAA,CACpB,SAAA,UACA,KAAA,oBACA,aAAA,WACC,OAAO"}
1
+ {"version":3,"file":"server.d.ts","names":[],"sources":["../../../src/server/supalive-server.ts","../../../src/logger.ts","../../../src/server/sub-manager.ts","../../../src/db/init_db.ts","../../../src/server/sub_hash.ts"],"mappings":"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"}