@supalive/core 1.12.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 (203) 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-DZhReQWB.d.ts +2288 -0
  15. package/dist/index-DZhReQWB.d.ts.map +1 -0
  16. package/dist/index-DlG8HDCO.d.ts +2215 -0
  17. package/dist/index-DlG8HDCO.d.ts.map +1 -0
  18. package/dist/index-Wgi_dGzj.d.ts +2215 -0
  19. package/dist/index-Wgi_dGzj.d.ts.map +1 -0
  20. package/dist/index-j3YTMNlF.d.ts +2223 -0
  21. package/dist/index-j3YTMNlF.d.ts.map +1 -0
  22. package/dist/mysql-BBbilD4I.js +614 -0
  23. package/dist/mysql-BBbilD4I.js.map +1 -0
  24. package/dist/mysql-BHJ2mrwZ.d.ts +113 -0
  25. package/dist/mysql-BHJ2mrwZ.d.ts.map +1 -0
  26. package/dist/mysql-BQbHJ_rK.js +617 -0
  27. package/dist/mysql-BQbHJ_rK.js.map +1 -0
  28. package/dist/mysql-BXoAON7c.d.ts +113 -0
  29. package/dist/mysql-BXoAON7c.d.ts.map +1 -0
  30. package/dist/mysql-BgfCUYGt.d.ts +113 -0
  31. package/dist/mysql-BgfCUYGt.d.ts.map +1 -0
  32. package/dist/mysql-Br7MqUXg.js +620 -0
  33. package/dist/mysql-Br7MqUXg.js.map +1 -0
  34. package/dist/mysql-BrueWtO9.d.ts +113 -0
  35. package/dist/mysql-BrueWtO9.d.ts.map +1 -0
  36. package/dist/mysql-CCo--z6n.d.ts +113 -0
  37. package/dist/mysql-CCo--z6n.d.ts.map +1 -0
  38. package/dist/mysql-CQcbcZB8.d.ts +113 -0
  39. package/dist/mysql-CQcbcZB8.d.ts.map +1 -0
  40. package/dist/mysql-CbgCY89y.d.ts +113 -0
  41. package/dist/mysql-CbgCY89y.d.ts.map +1 -0
  42. package/dist/mysql-CqD1ZnNY.js +619 -0
  43. package/dist/mysql-CqD1ZnNY.js.map +1 -0
  44. package/dist/mysql-D3Db2q3_.js +619 -0
  45. package/dist/mysql-D3Db2q3_.js.map +1 -0
  46. package/dist/mysql-DBrhTmYm.js +619 -0
  47. package/dist/mysql-DBrhTmYm.js.map +1 -0
  48. package/dist/mysql-DX7YA7IS.d.ts +113 -0
  49. package/dist/mysql-DX7YA7IS.d.ts.map +1 -0
  50. package/dist/mysql-DZ0_Rsjc.js +614 -0
  51. package/dist/mysql-DZ0_Rsjc.js.map +1 -0
  52. package/dist/mysql-Dko1MJqQ.js +619 -0
  53. package/dist/mysql-Dko1MJqQ.js.map +1 -0
  54. package/dist/mysql-F831ycnw.d.ts +113 -0
  55. package/dist/mysql-F831ycnw.d.ts.map +1 -0
  56. package/dist/mysql-TLPG62tv.js +618 -0
  57. package/dist/mysql-TLPG62tv.js.map +1 -0
  58. package/dist/mysql-e-ii74yG.js +613 -0
  59. package/dist/mysql-e-ii74yG.js.map +1 -0
  60. package/dist/overlap-checker-BBkqRdcs.js +259 -0
  61. package/dist/overlap-checker-BBkqRdcs.js.map +1 -0
  62. package/dist/overlap-checker-DHUJe-Yy.js +259 -0
  63. package/dist/overlap-checker-DHUJe-Yy.js.map +1 -0
  64. package/dist/overlap-checker-DWeQLpSD.js +259 -0
  65. package/dist/overlap-checker-DWeQLpSD.js.map +1 -0
  66. package/dist/overlap-checker-Kz7B_jsp.js +259 -0
  67. package/dist/overlap-checker-Kz7B_jsp.js.map +1 -0
  68. package/dist/postgres-7hJuQX4Y.d.ts +117 -0
  69. package/dist/postgres-7hJuQX4Y.d.ts.map +1 -0
  70. package/dist/postgres-B4H78IkW.js +864 -0
  71. package/dist/postgres-B4H78IkW.js.map +1 -0
  72. package/dist/postgres-B4h8D5U2.d.ts +117 -0
  73. package/dist/postgres-B4h8D5U2.d.ts.map +1 -0
  74. package/dist/postgres-BXFPamkP.js +864 -0
  75. package/dist/postgres-BXFPamkP.js.map +1 -0
  76. package/dist/postgres-CoR3TUMd.js +865 -0
  77. package/dist/postgres-CoR3TUMd.js.map +1 -0
  78. package/dist/postgres-D-RsG12a.d.ts +117 -0
  79. package/dist/postgres-D-RsG12a.d.ts.map +1 -0
  80. package/dist/postgres-D5Z1S3J9.d.ts +117 -0
  81. package/dist/postgres-D5Z1S3J9.d.ts.map +1 -0
  82. package/dist/postgres-DHs89iWT.js +864 -0
  83. package/dist/postgres-DHs89iWT.js.map +1 -0
  84. package/dist/postgres-DvBIRnYA.d.ts +117 -0
  85. package/dist/postgres-DvBIRnYA.d.ts.map +1 -0
  86. package/dist/postgres-Eo-lpUiX.d.ts +117 -0
  87. package/dist/postgres-Eo-lpUiX.d.ts.map +1 -0
  88. package/dist/postgres-VLAGIFLR.d.ts +117 -0
  89. package/dist/postgres-VLAGIFLR.d.ts.map +1 -0
  90. package/dist/postgres-hrQmDPUp.d.ts +117 -0
  91. package/dist/postgres-hrQmDPUp.d.ts.map +1 -0
  92. package/dist/postgres-pXrP9Fx0.d.ts +117 -0
  93. package/dist/postgres-pXrP9Fx0.d.ts.map +1 -0
  94. package/dist/query-BuOs9w-U.js +730 -0
  95. package/dist/query-BuOs9w-U.js.map +1 -0
  96. package/dist/query-Xw2hi6TB.js +730 -0
  97. package/dist/query-Xw2hi6TB.js.map +1 -0
  98. package/dist/read-routing-BUcQAwnd.js +62 -0
  99. package/dist/read-routing-BUcQAwnd.js.map +1 -0
  100. package/dist/read-routing-BXflWzQI.js +61 -0
  101. package/dist/read-routing-BXflWzQI.js.map +1 -0
  102. package/dist/read-routing-CcsLp0ow.js +61 -0
  103. package/dist/read-routing-CcsLp0ow.js.map +1 -0
  104. package/dist/realtime_db-B70vqtRZ.js +272 -0
  105. package/dist/realtime_db-B70vqtRZ.js.map +1 -0
  106. package/dist/realtime_db-BMysrWym.js +312 -0
  107. package/dist/realtime_db-BMysrWym.js.map +1 -0
  108. package/dist/realtime_db-Bi7S938D.js +312 -0
  109. package/dist/realtime_db-Bi7S938D.js.map +1 -0
  110. package/dist/realtime_db-CVze3gM0.js +312 -0
  111. package/dist/realtime_db-CVze3gM0.js.map +1 -0
  112. package/dist/realtime_db-DMipkUmD.js +312 -0
  113. package/dist/realtime_db-DMipkUmD.js.map +1 -0
  114. package/dist/realtime_db-XWzuq2JS.js +272 -0
  115. package/dist/realtime_db-XWzuq2JS.js.map +1 -0
  116. package/dist/router-Kgrlci8X.js +337 -0
  117. package/dist/router-Kgrlci8X.js.map +1 -0
  118. package/dist/router-g8qSQb8m.js +314 -0
  119. package/dist/router-g8qSQb8m.js.map +1 -0
  120. package/dist/schema-DLue3K2s.js +134 -0
  121. package/dist/schema-DLue3K2s.js.map +1 -0
  122. package/dist/schema-DfowI0ip.js +134 -0
  123. package/dist/schema-DfowI0ip.js.map +1 -0
  124. package/dist/schema-fKldWzwc.js +134 -0
  125. package/dist/schema-fKldWzwc.js.map +1 -0
  126. package/dist/src/client/index.d.ts +1 -1
  127. package/dist/src/client/index.js +69 -29
  128. package/dist/src/client/index.js.map +1 -1
  129. package/dist/src/exports/mysql.d.ts +1 -1
  130. package/dist/src/exports/mysql.js +1 -1
  131. package/dist/src/exports/postgres.d.ts +1 -1
  132. package/dist/src/exports/postgres.js +1 -1
  133. package/dist/src/exports/procedure.d.ts +1 -1
  134. package/dist/src/exports/procedure.js +5 -6
  135. package/dist/src/exports/procedure.js.map +1 -1
  136. package/dist/src/exports/schema-sql.d.ts +18 -1
  137. package/dist/src/exports/schema-sql.d.ts.map +1 -1
  138. package/dist/src/exports/schema-sql.js +91 -15
  139. package/dist/src/exports/schema-sql.js.map +1 -1
  140. package/dist/src/exports/server.d.ts +11 -4
  141. package/dist/src/exports/server.d.ts.map +1 -1
  142. package/dist/src/exports/server.js +136 -59
  143. package/dist/src/exports/server.js.map +1 -1
  144. package/dist/src/exports/sub-manager-worker-entry.js +1 -1
  145. package/dist/src/exports/types.d.ts +2 -2
  146. package/dist/src/exports/types.js +4 -4
  147. package/dist/sub-worker-dispatch-CO9nVdSG.js +813 -0
  148. package/dist/sub-worker-dispatch-CO9nVdSG.js.map +1 -0
  149. package/dist/sub-worker-dispatch-CQBknEL7.js +813 -0
  150. package/dist/sub-worker-dispatch-CQBknEL7.js.map +1 -0
  151. package/dist/sub-worker-dispatch-CQHeit6D.js +813 -0
  152. package/dist/sub-worker-dispatch-CQHeit6D.js.map +1 -0
  153. package/dist/sub-worker-dispatch-CmEW10it.js +813 -0
  154. package/dist/sub-worker-dispatch-CmEW10it.js.map +1 -0
  155. package/dist/sub-worker-dispatch-CunxuOPT.js +823 -0
  156. package/dist/sub-worker-dispatch-CunxuOPT.js.map +1 -0
  157. package/dist/sub-worker-dispatch-CvvFm40r.js +817 -0
  158. package/dist/sub-worker-dispatch-CvvFm40r.js.map +1 -0
  159. package/dist/sub-worker-dispatch-D15UHo1g.js +813 -0
  160. package/dist/sub-worker-dispatch-D15UHo1g.js.map +1 -0
  161. package/dist/sub-worker-dispatch-D8DY56ry.js +817 -0
  162. package/dist/sub-worker-dispatch-D8DY56ry.js.map +1 -0
  163. package/dist/sub-worker-dispatch-DJgWxtSQ.js +823 -0
  164. package/dist/sub-worker-dispatch-DJgWxtSQ.js.map +1 -0
  165. package/dist/sub-worker-dispatch-Dplqeubd.js +813 -0
  166. package/dist/sub-worker-dispatch-Dplqeubd.js.map +1 -0
  167. package/dist/sub-worker-dispatch-dXjUmSMN.js +813 -0
  168. package/dist/sub-worker-dispatch-dXjUmSMN.js.map +1 -0
  169. package/dist/table-id-BJdmctEQ.js +91 -0
  170. package/dist/table-id-BJdmctEQ.js.map +1 -0
  171. package/dist/table-id-DyrJBKAQ.js +105 -0
  172. package/dist/table-id-DyrJBKAQ.js.map +1 -0
  173. package/dist/types_client_rpc-BGMwPJst.js +123 -0
  174. package/dist/types_client_rpc-BGMwPJst.js.map +1 -0
  175. package/dist/types_client_rpc-ByGwoRCL.js +132 -0
  176. package/dist/types_client_rpc-ByGwoRCL.js.map +1 -0
  177. package/dist/types_db-BsR02Sph.js +171 -0
  178. package/dist/types_db-BsR02Sph.js.map +1 -0
  179. package/dist/types_db-CgGlOMmr.js +187 -0
  180. package/dist/types_db-CgGlOMmr.js.map +1 -0
  181. package/dist/types_db-OUou3o2Z.js +172 -0
  182. package/dist/types_db-OUou3o2Z.js.map +1 -0
  183. package/dist/types_server-B3z8hi-Z.d.ts +523 -0
  184. package/dist/types_server-B3z8hi-Z.d.ts.map +1 -0
  185. package/dist/types_server-BXBvz4T8.d.ts +523 -0
  186. package/dist/types_server-BXBvz4T8.d.ts.map +1 -0
  187. package/dist/types_server-BhC19R2a.js +27 -0
  188. package/dist/types_server-BhC19R2a.js.map +1 -0
  189. package/dist/types_server-CClUPZn1.d.ts +521 -0
  190. package/dist/types_server-CClUPZn1.d.ts.map +1 -0
  191. package/dist/types_server-CnYTSPhM.d.ts +523 -0
  192. package/dist/types_server-CnYTSPhM.d.ts.map +1 -0
  193. package/dist/types_server-DHpGUHB_.d.ts +521 -0
  194. package/dist/types_server-DHpGUHB_.d.ts.map +1 -0
  195. package/dist/types_server-Ded1u3bL.d.ts +521 -0
  196. package/dist/types_server-Ded1u3bL.d.ts.map +1 -0
  197. package/dist/types_server-fons7nmo.d.ts +523 -0
  198. package/dist/types_server-fons7nmo.d.ts.map +1 -0
  199. package/dist/types_server-okvBG4v_.d.ts +521 -0
  200. package/dist/types_server-okvBG4v_.d.ts.map +1 -0
  201. package/dist/types_server-pD8DiI7s.d.ts +521 -0
  202. package/dist/types_server-pD8DiI7s.d.ts.map +1 -0
  203. package/package.json +1 -1
@@ -0,0 +1,134 @@
1
+ import { a as unwrapZodType, n as tableNameToId, r as commitTsCodec } from "./table-id-BJdmctEQ.js";
2
+ import { z as z$1 } from "zod";
3
+ //#region src/db/schema.ts
4
+ function defineComputedField(config) {
5
+ return config;
6
+ }
7
+ /**
8
+ * Read the effective max length declared on a Zod string (via `.max(n)` /
9
+ * `.length(n)`), unwrapping optional/nullable/default wrappers. Returns
10
+ * undefined for non-strings or unconstrained strings. Mirrors the reader in
11
+ * schema-sql.ts (kept local to avoid a schema <-> schema-sql import cycle) and
12
+ * is used to carry a primary-key id's length into the injected id column so the
13
+ * SQL generator can emit `VARCHAR(n)` instead of an (invalid-as-a-MySQL-PK)
14
+ * `TEXT`.
15
+ */
16
+ function readZodStringMax(field) {
17
+ const unwrapped = unwrapZodType(field);
18
+ if (!(unwrapped instanceof z$1.ZodString)) return void 0;
19
+ const checks = unwrapped.def?.checks ?? [];
20
+ let maxLength;
21
+ for (const check of checks) {
22
+ const c = check?._zod?.def ?? check;
23
+ if (c?.check === "length_equals" || c?.check === "size_equals") {
24
+ const len = c.length ?? c.size;
25
+ if (typeof len === "number") maxLength = maxLength === void 0 ? len : Math.min(maxLength, len);
26
+ }
27
+ if (c?.check === "max_length" || c?.check === "max_size") {
28
+ const len = c.maximum ?? c.max;
29
+ if (typeof len === "number") maxLength = maxLength === void 0 ? len : Math.min(maxLength, len);
30
+ }
31
+ }
32
+ return maxLength;
33
+ }
34
+ const schemaRegistry = /* @__PURE__ */ new Map();
35
+ let shouldTrackSchema = false;
36
+ function trackSchema() {
37
+ shouldTrackSchema = true;
38
+ }
39
+ function getAutoIdCodec(idMeta, userCodec) {
40
+ if (userCodec) return void 0;
41
+ const rawType = idMeta.pgType ?? idMeta.mysqlType;
42
+ if (!rawType) return void 0;
43
+ const upper = rawType.toUpperCase().replace(/\(.*\)/, "").trim();
44
+ if ([
45
+ "BIGINT",
46
+ "INT8",
47
+ "SERIAL8"
48
+ ].includes(upper)) return {
49
+ encode: (v) => BigInt(v),
50
+ decode: (v) => String(v)
51
+ };
52
+ if ([
53
+ "INTEGER",
54
+ "INT",
55
+ "SERIAL",
56
+ "INT4",
57
+ "SMALLINT",
58
+ "INT2"
59
+ ].includes(upper)) return {
60
+ encode: (v) => Number(v),
61
+ decode: (v) => String(v)
62
+ };
63
+ if ([
64
+ "DECIMAL",
65
+ "NUMERIC",
66
+ "FLOAT",
67
+ "REAL",
68
+ "DOUBLE",
69
+ "FLOAT8",
70
+ "FLOAT4"
71
+ ].includes(upper)) return {
72
+ encode: (v) => Number(v),
73
+ decode: (v) => String(v)
74
+ };
75
+ if (upper === "BOOLEAN" || upper === "BOOL" || upper.startsWith("TINYINT") && rawType.toUpperCase().includes("(1)")) return {
76
+ encode: (v) => v === "true" || v === "1",
77
+ decode: (v) => String(v)
78
+ };
79
+ }
80
+ function defineSchema(config) {
81
+ const columns = {};
82
+ if (config.columns) Object.assign(columns, {
83
+ "id": "id",
84
+ "commitTs": "commit_ts",
85
+ ...config.columns
86
+ });
87
+ else {
88
+ for (const key of Object.keys(config.schema)) columns[key] = key;
89
+ columns["id"] = "id";
90
+ columns["commitTs"] = "commit_ts";
91
+ }
92
+ const idMeta = {};
93
+ if ("id" in config.schema) {
94
+ const userMeta = config.schema.id?.meta?.();
95
+ if (userMeta) for (const k of Object.keys(userMeta)) {
96
+ if (k === "primaryKey") continue;
97
+ idMeta[k] = userMeta[k];
98
+ }
99
+ }
100
+ const userIdMax = "id" in config.schema ? readZodStringMax(config.schema.id) : void 0;
101
+ const idColumn = userIdMax !== void 0 ? z$1.string().max(userIdMax) : z$1.string();
102
+ const augmentedShape = {
103
+ ...config.schema,
104
+ id: idColumn.meta({
105
+ primaryKey: true,
106
+ ...idMeta
107
+ }),
108
+ commitTs: z$1.coerce.bigint()
109
+ };
110
+ const userCodecs = config.options?.codecs;
111
+ const autoIdCodec = getAutoIdCodec(idMeta, userCodecs?.id);
112
+ const mergedCodecs = {
113
+ ...autoIdCodec ? { id: autoIdCodec } : {},
114
+ ...userCodecs,
115
+ commitTs: commitTsCodec
116
+ };
117
+ const result = {
118
+ tableId: tableNameToId(config.name),
119
+ table: config.name,
120
+ schema: z$1.object(augmentedShape),
121
+ columnsOptions: {
122
+ ...config.options,
123
+ codecs: mergedCodecs
124
+ },
125
+ columns,
126
+ indexes: config.indexes ?? []
127
+ };
128
+ if (shouldTrackSchema) schemaRegistry.set(config.name, result);
129
+ return result;
130
+ }
131
+ //#endregion
132
+ export { trackSchema as a, shouldTrackSchema as i, defineSchema as n, schemaRegistry as r, defineComputedField as t };
133
+
134
+ //# sourceMappingURL=schema-DfowI0ip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-DfowI0ip.js","names":["z"],"sources":["../src/db/schema.ts"],"sourcesContent":["import { z, ZodRawShape } from \"zod\";\nimport { commitTsCodec, unwrapZodType } from \"./codec\";\nimport { LiveQueryHandle } from \"../client\";\nimport { tableNameToId } from \"./table-id\";\n\nexport interface ColumnCodec<TData = unknown, TDriver = unknown> {\n encode?: (value: TData) => TDriver;\n decode?: (value: TDriver) => TData;\n}\n\n// Constrain a codec's decoded type to match the schema field's inferred type.\n// Without this, `decode` could return any value (e.g. a string outside an enum)\n// and silently override the schema's declared type at the type level.\ntype SchemaCodecField<TSchema extends ZodRawShape, K extends PropertyKey> =\n K extends keyof TSchema\n ? TSchema[K] extends z.ZodTypeAny ? z.infer<TSchema[K]> : unknown\n : K extends keyof BaseSchema\n ? BaseSchema[K] extends z.ZodTypeAny ? z.infer<BaseSchema[K]> : unknown\n : unknown;\n\nexport type SchemaCodecs<TSchema extends ZodRawShape> = Partial<{\n [K in keyof (TSchema & BaseSchema)]: ColumnCodec<SchemaCodecField<TSchema, K>, any>;\n}>;\n\nexport interface SchemaColumnsOptions<TSchema extends ZodRawShape = ZodRawShape> {\n codecs?: SchemaCodecs<TSchema>;\n}\n\nexport interface SchemaColumnMapping {\n [key: string]: string;\n}\n\nexport interface DeclarativeIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: \"btree\" | \"hash\" | \"gin\" | \"gist\" | \"spgist\" | \"brin\";\n where?: string;\n using?: string;\n options?: string;\n tablespace?: string;\n}\n\nexport type IndexDefinition = string | DeclarativeIndex;\n\nexport interface DefineSchemaConfig<TSchema extends ZodRawShape> {\n name: string;\n schema: TSchema;\n options?: SchemaColumnsOptions<TSchema>;\n columns?: SchemaColumnMapping;\n indexes?: IndexDefinition[];\n}\n\n// Tuple-wrap the `undefined` checks so they don't fall through to the\n// object-shape conditionals when consumers compile under `strict: false`\n// (without `strictNullChecks`, `undefined` is assignable to object types and\n// would otherwise match `{ decode: ... }` / `ColumnCodec<...>` with all\n// `infer`s collapsing to `unknown`).\ntype CodecDataType<TCodec, TFallback> =\n [TCodec] extends [undefined] ? TFallback\n : TCodec extends { decode: (...args: any[]) => infer TDecoded } ? TDecoded\n : TCodec extends ColumnCodec<infer TData, unknown> ? TData\n : TFallback;\n\ntype ZodOutput<TZod> =\n [TZod] extends [undefined] ? unknown\n : TZod extends z.ZodTypeAny ? z.infer<TZod>\n : unknown;\nexport type ComputedDataType<TCodec, TZod> = CodecDataType<TCodec, ZodOutput<TZod>>;\nexport type ComputedCodec<TData, TDriver> = ColumnCodec<TData, TDriver>;\nexport type OverrideField<TObj, TKey extends PropertyKey, TValue> = Omit<TObj, TKey> & { [K in TKey]: TValue };\nexport interface ComputedFieldConfig<\n TField extends string,\n TDecoded = unknown,\n TDriver = unknown,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n> {\n field: TField;\n sql: string;\n alias?: string;\n type?: TZodType;\n codec?: {\n decode: (value: TDriver) => TDecoded;\n encode?: (value: TDecoded) => TDriver;\n };\n}\n\nexport type ComputedField = {\n field: string;\n sql: string;\n alias: string;\n codec?: ColumnCodec<any, any>;\n};\n\nexport function defineComputedField<\n TField extends string,\n TDecoded = unknown,\n TDriver = unknown,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n>(\n config: ComputedFieldConfig<TField, TDecoded, TDriver, TZodType>\n): ComputedFieldConfig<TField, TDecoded, TDriver, TZodType> {\n return config;\n}\n\nexport type Prettify<T> = { [K in keyof T]: T[K] } & {};\n\ntype ApplySchemaCodecs<TBase, TCodecs> = {\n [K in keyof TBase]: K extends keyof TCodecs ? CodecDataType<TCodecs[K], TBase[K]> : TBase[K];\n};\n\n// Only apply codecs when `options.codecs` is explicitly provided. Without this\n// guard, the default constraint (`SchemaColumnsOptions<TSchema>`) makes\n// `TOptions[\"codecs\"]` infer as `Partial<{ [K]: ColumnCodec<any, any> }>`,\n// which collapses every field to `any` inside `ApplySchemaCodecs`.\ntype ResolveSchemaType<\n TSchema extends ZodRawShape,\n TOptions extends SchemaColumnsOptions<TSchema>\n> = TOptions extends { codecs: infer TCodecs }\n ? Prettify<ApplySchemaCodecs<z.infer<z.ZodObject<TSchema & BaseSchema>>, TCodecs>>\n : Prettify<z.infer<z.ZodObject<TSchema & BaseSchema>>>;\n\n// Helper to detect if a Zod type is optional or nullable\ntype IsOptionalField<T> =\n T extends z.ZodOptional<any> ? true :\n T extends z.ZodNullable<any> ? true :\n T extends z.ZodDefault<any> ? true :\n false;\n\n// Split schema keys into required vs optional\ntype OptionalKeys<TZod extends ZodRawShape> = {\n [K in keyof TZod]: IsOptionalField<TZod[K]> extends true ? K : never\n}[keyof TZod];\n\ntype RequiredKeys<TZod extends ZodRawShape> = {\n [K in keyof TZod]: IsOptionalField<TZod[K]> extends true ? never : K\n}[keyof TZod];\n\n// Add a base shape type that all schemas will include\ntype BaseSchema = {\n id: z.ZodString;\n commitTs: z.ZodCoercedBigInt;\n};\n\n/**\n * Read the effective max length declared on a Zod string (via `.max(n)` /\n * `.length(n)`), unwrapping optional/nullable/default wrappers. Returns\n * undefined for non-strings or unconstrained strings. Mirrors the reader in\n * schema-sql.ts (kept local to avoid a schema <-> schema-sql import cycle) and\n * is used to carry a primary-key id's length into the injected id column so the\n * SQL generator can emit `VARCHAR(n)` instead of an (invalid-as-a-MySQL-PK)\n * `TEXT`.\n */\nfunction readZodStringMax(field: unknown): number | undefined {\n const unwrapped = unwrapZodType(field);\n if (!(unwrapped instanceof z.ZodString)) return undefined;\n\n const checks = unwrapped.def?.checks ?? [];\n let maxLength: number | undefined;\n for (const check of checks) {\n const c = check?._zod?.def ?? check;\n if (c?.check === \"length_equals\" || c?.check === \"size_equals\") {\n const len = (c as any).length ?? (c as any).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 as any).maximum ?? (c as any).max;\n if (typeof len === \"number\") maxLength = maxLength === undefined ? len : Math.min(maxLength, len);\n }\n }\n return maxLength;\n}\n\nexport const schemaRegistry = new Map<string, SchemaDefinition<string, any, any>>();\nexport let shouldTrackSchema = false;\n\nexport function trackSchema(): void {\n shouldTrackSchema = true;\n}\n\nfunction getAutoIdCodec(idMeta: Record<string, unknown>, userCodec: unknown): ColumnCodec<any, any> | undefined {\n if (userCodec) return undefined;\n const rawType = (idMeta.pgType as string | undefined) ?? (idMeta.mysqlType as string | undefined);\n if (!rawType) return undefined;\n\n const upper = rawType.toUpperCase().replace(/\\(.*\\)/, \"\").trim();\n if ([\"BIGINT\", \"INT8\", \"SERIAL8\"].includes(upper)) {\n return {\n encode: (v: string) => BigInt(v),\n decode: (v: unknown) => String(v),\n };\n }\n if ([\"INTEGER\", \"INT\", \"SERIAL\", \"INT4\", \"SMALLINT\", \"INT2\"].includes(upper)) {\n return {\n encode: (v: string) => Number(v),\n decode: (v: unknown) => String(v),\n };\n }\n if ([\"DECIMAL\", \"NUMERIC\", \"FLOAT\", \"REAL\", \"DOUBLE\", \"FLOAT8\", \"FLOAT4\"].includes(upper)) {\n return {\n encode: (v: string) => Number(v),\n decode: (v: unknown) => String(v),\n };\n }\n if (upper === \"BOOLEAN\" || upper === \"BOOL\" || (upper.startsWith(\"TINYINT\") && rawType.toUpperCase().includes(\"(1)\"))) {\n return {\n encode: (v: string) => v === \"true\" || v === \"1\",\n decode: (v: unknown) => String(v),\n };\n }\n return undefined;\n}\n\nexport function defineSchema<\n TSchema extends ZodRawShape,\n TName extends string,\n TOptions extends SchemaColumnsOptions<TSchema> = SchemaColumnsOptions<TSchema>\n>(\n config: DefineSchemaConfig<TSchema> & { name: TName; options?: TOptions }\n): SchemaDefinition<TName, Prettify<TSchema & BaseSchema>, ResolveSchemaType<TSchema, TOptions>> {\n const columns: Record<string, string> = {};\n\n if (config.columns) {\n Object.assign(columns, { 'id': 'id', 'commitTs': 'commit_ts', ...config.columns });\n } else {\n // Default: use field name as column name\n for (const key of Object.keys(config.schema)) {\n columns[key] = key;\n }\n columns['id'] = 'id';\n columns['commitTs'] = 'commit_ts';\n }\n\n // Preserve user's id meta (pgType, mysqlType, etc.) so the SQL generator\n // can emit the correct raw type. primaryKey is always forced true.\n const idMeta: Record<string, unknown> = {};\n if (\"id\" in config.schema) {\n const userMeta = (config.schema.id as any)?.meta?.();\n if (userMeta) {\n for (const k of Object.keys(userMeta)) {\n if (k === \"primaryKey\") continue; // always forced true\n idMeta[k] = userMeta[k];\n }\n }\n }\n\n // Preserve the user's id length constraint (`zodPrimaryIdColumn().max(32)`)\n // so the SQL generator emits `VARCHAR(n)`. `.max()` is a Zod *check*, not\n // metadata, so it isn't captured by `idMeta` above and must be re-applied to\n // the injected id — otherwise the PK renders as `TEXT`, which MySQL cannot\n // use as a primary key.\n const userIdMax = \"id\" in config.schema ? readZodStringMax(config.schema.id) : undefined;\n const idColumn = userIdMax !== undefined ? z.string().max(userIdMax) : z.string();\n\n // Merge id/commitTs into the Zod schema, user-defined fields win for everything else,\n // but id/commitTs are always forced to their correct types\n const augmentedShape = {\n ...config.schema,\n // always string, even if user defined it differently\n id: idColumn.meta({ primaryKey: true, ...idMeta }),\n // always bigint, mapped to commit_ts column\n commitTs: z.coerce.bigint(),\n };\n\n const userCodecs = config.options?.codecs;\n const autoIdCodec = getAutoIdCodec(idMeta, userCodecs?.id);\n const mergedCodecs = {\n ...(autoIdCodec ? { id: autoIdCodec } : {}),\n ...userCodecs,\n commitTs: commitTsCodec,\n };\n\n const result = {\n tableId: tableNameToId(config.name),\n table: config.name,\n schema: z.object(augmentedShape),\n columnsOptions: {\n ...config.options,\n codecs: mergedCodecs,\n },\n columns,\n indexes: config.indexes ?? [],\n } as SchemaDefinition<TName, TSchema & BaseSchema, ResolveSchemaType<TSchema, TOptions>>;\n\n if (shouldTrackSchema) {\n schemaRegistry.set(config.name, result);\n }\n\n return result\n}\n\n// tableNameToId now lives in ./table-id (leaf module, also home to the memoized\n// tableIdOf). Re-exported here so existing `from \"./schema\"` imports still resolve.\nexport { tableNameToId };\n\n// Stored codec map is intentionally loose: the strict per-field constraint is\n// enforced on the input (`DefineSchemaConfig.options`), but storing the strict\n// type here would break variance when assigning a specific schema to a generic\n// `SchemaDefinition<string, ZodRawShape>` constraint (ColumnCodec.encode is\n// contravariant in its data type).\nexport interface StoredSchemaColumnsOptions {\n codecs?: Record<string, ColumnCodec<any, any>>;\n}\n\nexport interface SchemaDefinition<\n TTable extends string,\n TZod extends ZodRawShape,\n TData = z.infer<z.ZodObject<TZod>>\n> {\n tableId: Uint8Array;\n table: TTable;\n schema: z.ZodObject<TZod>;\n columnsOptions: StoredSchemaColumnsOptions;\n columns: Record<string, string>;\n indexes: IndexDefinition[];\n _dataType?: TData;\n}\n\nexport type InferSchema<T extends SchemaDefinition<string, ZodRawShape, any>> =\n T extends SchemaDefinition<string, ZodRawShape, infer TData> ? TData : never;\n\nexport type InsertData<T extends SchemaDefinition<string, ZodRawShape, any>> =\n T extends SchemaDefinition<string, infer TZod, infer TData>\n ? {\n [K in RequiredKeys<TZod> as K extends \"id\" | \"commitTs\" ? never : K]:\n Extract<K, string> extends keyof TData ? TData[Extract<K, string>] : never\n } & {\n [K in OptionalKeys<TZod> as K extends \"id\" | \"commitTs\" ? never : K]?:\n Extract<K, string> extends keyof TData ? TData[Extract<K, string>] : never\n }\n : never;\n\nexport interface Model {\n table: string;\n tableId: Uint8Array,\n columns: Record<string, string>;\n reverseColumns: Record<string, string>;\n types: Record<string, string>;\n codecs: Record<string, ColumnCodec<any, any>>;\n}\n\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type ReturnLiveQuery<\n TLiveQueryFn extends (...args: any[]) => MaybePromise<LiveQueryHandle<any>>\n> =\n Awaited<ReturnType<TLiveQueryFn>> extends LiveQueryHandle<infer T>\n ? T\n : never;\n\nexport type ReturnQuery<TQueryFn extends (...args: any[]) => any> =\n Awaited<ReturnType<TQueryFn>>;\n\nexport type QueryArgs<TQueryFn extends (...args: any[]) => any> =\n Parameters<TQueryFn>[0];\n\nexport type MutationArgs<TMutationFn extends (...args: any[]) => any> =\n Parameters<TMutationFn>[0];\n\nexport type ActionArgs<TActionFn extends (...args: any[]) => any> =\n Parameters<TActionFn>[0];"],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { a as unwrapZodType, n as tableNameToId, r as commitTsCodec } from "./table-id-x9y1eHUr.js";
2
+ import { z as z$1 } from "zod";
3
+ //#region src/db/schema.ts
4
+ function defineComputedField(config) {
5
+ return config;
6
+ }
7
+ /**
8
+ * Read the effective max length declared on a Zod string (via `.max(n)` /
9
+ * `.length(n)`), unwrapping optional/nullable/default wrappers. Returns
10
+ * undefined for non-strings or unconstrained strings. Mirrors the reader in
11
+ * schema-sql.ts (kept local to avoid a schema <-> schema-sql import cycle) and
12
+ * is used to carry a primary-key id's length into the injected id column so the
13
+ * SQL generator can emit `VARCHAR(n)` instead of an (invalid-as-a-MySQL-PK)
14
+ * `TEXT`.
15
+ */
16
+ function readZodStringMax(field) {
17
+ const unwrapped = unwrapZodType(field);
18
+ if (!(unwrapped instanceof z$1.ZodString)) return void 0;
19
+ const checks = unwrapped.def?.checks ?? [];
20
+ let maxLength;
21
+ for (const check of checks) {
22
+ const c = check?._zod?.def ?? check?.def ?? check;
23
+ if (c?.check === "length_equals" || c?.check === "size_equals") {
24
+ const len = c.length ?? c.size;
25
+ if (typeof len === "number") maxLength = maxLength === void 0 ? len : Math.min(maxLength, len);
26
+ }
27
+ if (c?.check === "max_length" || c?.check === "max_size") {
28
+ const len = c.maximum ?? c.max;
29
+ if (typeof len === "number") maxLength = maxLength === void 0 ? len : Math.min(maxLength, len);
30
+ }
31
+ }
32
+ return maxLength;
33
+ }
34
+ const schemaRegistry = /* @__PURE__ */ new Map();
35
+ let shouldTrackSchema = false;
36
+ function trackSchema() {
37
+ shouldTrackSchema = true;
38
+ }
39
+ function getAutoIdCodec(idMeta, userCodec) {
40
+ if (userCodec) return void 0;
41
+ const rawType = idMeta.pgType ?? idMeta.mysqlType;
42
+ if (!rawType) return void 0;
43
+ const upper = rawType.toUpperCase().replace(/\(.*\)/, "").trim();
44
+ if ([
45
+ "BIGINT",
46
+ "INT8",
47
+ "SERIAL8"
48
+ ].includes(upper)) return {
49
+ encode: (v) => BigInt(v),
50
+ decode: (v) => String(v)
51
+ };
52
+ if ([
53
+ "INTEGER",
54
+ "INT",
55
+ "SERIAL",
56
+ "INT4",
57
+ "SMALLINT",
58
+ "INT2"
59
+ ].includes(upper)) return {
60
+ encode: (v) => Number(v),
61
+ decode: (v) => String(v)
62
+ };
63
+ if ([
64
+ "DECIMAL",
65
+ "NUMERIC",
66
+ "FLOAT",
67
+ "REAL",
68
+ "DOUBLE",
69
+ "FLOAT8",
70
+ "FLOAT4"
71
+ ].includes(upper)) return {
72
+ encode: (v) => Number(v),
73
+ decode: (v) => String(v)
74
+ };
75
+ if (upper === "BOOLEAN" || upper === "BOOL" || upper.startsWith("TINYINT") && rawType.toUpperCase().includes("(1)")) return {
76
+ encode: (v) => v === "true" || v === "1",
77
+ decode: (v) => String(v)
78
+ };
79
+ }
80
+ function defineSchema(config) {
81
+ const columns = {};
82
+ if (config.columns) Object.assign(columns, {
83
+ "id": "id",
84
+ "commitTs": "commit_ts",
85
+ ...config.columns
86
+ });
87
+ else {
88
+ for (const key of Object.keys(config.schema)) columns[key] = key;
89
+ columns["id"] = "id";
90
+ columns["commitTs"] = "commit_ts";
91
+ }
92
+ const idMeta = {};
93
+ if ("id" in config.schema) {
94
+ const userMeta = config.schema.id?.meta?.();
95
+ if (userMeta) for (const k of Object.keys(userMeta)) {
96
+ if (k === "primaryKey") continue;
97
+ idMeta[k] = userMeta[k];
98
+ }
99
+ }
100
+ const userIdMax = "id" in config.schema ? readZodStringMax(config.schema.id) : void 0;
101
+ const idColumn = userIdMax !== void 0 ? z$1.string().max(userIdMax) : z$1.string();
102
+ const augmentedShape = {
103
+ ...config.schema,
104
+ id: idColumn.meta({
105
+ primaryKey: true,
106
+ ...idMeta
107
+ }),
108
+ commitTs: z$1.coerce.bigint()
109
+ };
110
+ const userCodecs = config.options?.codecs;
111
+ const autoIdCodec = getAutoIdCodec(idMeta, userCodecs?.id);
112
+ const mergedCodecs = {
113
+ ...autoIdCodec ? { id: autoIdCodec } : {},
114
+ ...userCodecs,
115
+ commitTs: commitTsCodec
116
+ };
117
+ const result = {
118
+ tableId: tableNameToId(config.name),
119
+ table: config.name,
120
+ schema: z$1.object(augmentedShape),
121
+ columnsOptions: {
122
+ ...config.options,
123
+ codecs: mergedCodecs
124
+ },
125
+ columns,
126
+ indexes: config.indexes ?? []
127
+ };
128
+ if (shouldTrackSchema) schemaRegistry.set(config.name, result);
129
+ return result;
130
+ }
131
+ //#endregion
132
+ export { trackSchema as a, shouldTrackSchema as i, defineSchema as n, schemaRegistry as r, defineComputedField as t };
133
+
134
+ //# sourceMappingURL=schema-fKldWzwc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-fKldWzwc.js","names":["z"],"sources":["../src/db/schema.ts"],"sourcesContent":["import { z, ZodRawShape } from \"zod\";\nimport { commitTsCodec, unwrapZodType } from \"./codec\";\nimport { LiveQueryHandle } from \"../client\";\nimport { tableNameToId } from \"./table-id\";\n\nexport interface ColumnCodec<TData = unknown, TDriver = unknown> {\n encode?: (value: TData) => TDriver;\n decode?: (value: TDriver) => TData;\n}\n\n// Constrain a codec's decoded type to match the schema field's inferred type.\n// Without this, `decode` could return any value (e.g. a string outside an enum)\n// and silently override the schema's declared type at the type level.\ntype SchemaCodecField<TSchema extends ZodRawShape, K extends PropertyKey> =\n K extends keyof TSchema\n ? TSchema[K] extends z.ZodTypeAny ? z.infer<TSchema[K]> : unknown\n : K extends keyof BaseSchema\n ? BaseSchema[K] extends z.ZodTypeAny ? z.infer<BaseSchema[K]> : unknown\n : unknown;\n\nexport type SchemaCodecs<TSchema extends ZodRawShape> = Partial<{\n [K in keyof (TSchema & BaseSchema)]: ColumnCodec<SchemaCodecField<TSchema, K>, any>;\n}>;\n\nexport interface SchemaColumnsOptions<TSchema extends ZodRawShape = ZodRawShape> {\n codecs?: SchemaCodecs<TSchema>;\n}\n\nexport interface SchemaColumnMapping {\n [key: string]: string;\n}\n\nexport interface DeclarativeIndex {\n name: string;\n columns: string[];\n unique?: boolean;\n type?: \"btree\" | \"hash\" | \"gin\" | \"gist\" | \"spgist\" | \"brin\";\n where?: string;\n using?: string;\n options?: string;\n tablespace?: string;\n}\n\nexport type IndexDefinition = string | DeclarativeIndex;\n\nexport interface DefineSchemaConfig<TSchema extends ZodRawShape> {\n name: string;\n schema: TSchema;\n options?: SchemaColumnsOptions<TSchema>;\n columns?: SchemaColumnMapping;\n indexes?: IndexDefinition[];\n}\n\n// Tuple-wrap the `undefined` checks so they don't fall through to the\n// object-shape conditionals when consumers compile under `strict: false`\n// (without `strictNullChecks`, `undefined` is assignable to object types and\n// would otherwise match `{ decode: ... }` / `ColumnCodec<...>` with all\n// `infer`s collapsing to `unknown`).\ntype CodecDataType<TCodec, TFallback> =\n [TCodec] extends [undefined] ? TFallback\n : TCodec extends { decode: (...args: any[]) => infer TDecoded } ? TDecoded\n : TCodec extends ColumnCodec<infer TData, unknown> ? TData\n : TFallback;\n\ntype ZodOutput<TZod> =\n [TZod] extends [undefined] ? unknown\n : TZod extends z.ZodTypeAny ? z.infer<TZod>\n : unknown;\nexport type ComputedDataType<TCodec, TZod> = CodecDataType<TCodec, ZodOutput<TZod>>;\nexport type ComputedCodec<TData, TDriver> = ColumnCodec<TData, TDriver>;\nexport type OverrideField<TObj, TKey extends PropertyKey, TValue> = Omit<TObj, TKey> & { [K in TKey]: TValue };\nexport interface ComputedFieldConfig<\n TField extends string,\n TDecoded = unknown,\n TDriver = unknown,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n> {\n field: TField;\n sql: string;\n alias?: string;\n type?: TZodType;\n codec?: {\n decode: (value: TDriver) => TDecoded;\n encode?: (value: TDecoded) => TDriver;\n };\n}\n\nexport type ComputedField = {\n field: string;\n sql: string;\n alias: string;\n codec?: ColumnCodec<any, any>;\n};\n\nexport function defineComputedField<\n TField extends string,\n TDecoded = unknown,\n TDriver = unknown,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n>(\n config: ComputedFieldConfig<TField, TDecoded, TDriver, TZodType>\n): ComputedFieldConfig<TField, TDecoded, TDriver, TZodType> {\n return config;\n}\n\nexport type Prettify<T> = { [K in keyof T]: T[K] } & {};\n\ntype ApplySchemaCodecs<TBase, TCodecs> = {\n [K in keyof TBase]: K extends keyof TCodecs ? CodecDataType<TCodecs[K], TBase[K]> : TBase[K];\n};\n\n// Only apply codecs when `options.codecs` is explicitly provided. Without this\n// guard, the default constraint (`SchemaColumnsOptions<TSchema>`) makes\n// `TOptions[\"codecs\"]` infer as `Partial<{ [K]: ColumnCodec<any, any> }>`,\n// which collapses every field to `any` inside `ApplySchemaCodecs`.\ntype ResolveSchemaType<\n TSchema extends ZodRawShape,\n TOptions extends SchemaColumnsOptions<TSchema>\n> = TOptions extends { codecs: infer TCodecs }\n ? Prettify<ApplySchemaCodecs<z.infer<z.ZodObject<TSchema & BaseSchema>>, TCodecs>>\n : Prettify<z.infer<z.ZodObject<TSchema & BaseSchema>>>;\n\n// Helper to detect if a Zod type is optional or nullable\ntype IsOptionalField<T> =\n T extends z.ZodOptional<any> ? true :\n T extends z.ZodNullable<any> ? true :\n T extends z.ZodDefault<any> ? true :\n false;\n\n// Split schema keys into required vs optional\ntype OptionalKeys<TZod extends ZodRawShape> = {\n [K in keyof TZod]: IsOptionalField<TZod[K]> extends true ? K : never\n}[keyof TZod];\n\ntype RequiredKeys<TZod extends ZodRawShape> = {\n [K in keyof TZod]: IsOptionalField<TZod[K]> extends true ? never : K\n}[keyof TZod];\n\n// Add a base shape type that all schemas will include\ntype BaseSchema = {\n id: z.ZodString;\n commitTs: z.ZodCoercedBigInt;\n};\n\n/**\n * Read the effective max length declared on a Zod string (via `.max(n)` /\n * `.length(n)`), unwrapping optional/nullable/default wrappers. Returns\n * undefined for non-strings or unconstrained strings. Mirrors the reader in\n * schema-sql.ts (kept local to avoid a schema <-> schema-sql import cycle) and\n * is used to carry a primary-key id's length into the injected id column so the\n * SQL generator can emit `VARCHAR(n)` instead of an (invalid-as-a-MySQL-PK)\n * `TEXT`.\n */\nfunction readZodStringMax(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 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 return maxLength;\n}\n\nexport const schemaRegistry = new Map<string, SchemaDefinition<string, any, any>>();\nexport let shouldTrackSchema = false;\n\nexport function trackSchema(): void {\n shouldTrackSchema = true;\n}\n\nfunction getAutoIdCodec(idMeta: Record<string, unknown>, userCodec: unknown): ColumnCodec<any, any> | undefined {\n if (userCodec) return undefined;\n const rawType = (idMeta.pgType as string | undefined) ?? (idMeta.mysqlType as string | undefined);\n if (!rawType) return undefined;\n\n const upper = rawType.toUpperCase().replace(/\\(.*\\)/, \"\").trim();\n if ([\"BIGINT\", \"INT8\", \"SERIAL8\"].includes(upper)) {\n return {\n encode: (v: string) => BigInt(v),\n decode: (v: unknown) => String(v),\n };\n }\n if ([\"INTEGER\", \"INT\", \"SERIAL\", \"INT4\", \"SMALLINT\", \"INT2\"].includes(upper)) {\n return {\n encode: (v: string) => Number(v),\n decode: (v: unknown) => String(v),\n };\n }\n if ([\"DECIMAL\", \"NUMERIC\", \"FLOAT\", \"REAL\", \"DOUBLE\", \"FLOAT8\", \"FLOAT4\"].includes(upper)) {\n return {\n encode: (v: string) => Number(v),\n decode: (v: unknown) => String(v),\n };\n }\n if (upper === \"BOOLEAN\" || upper === \"BOOL\" || (upper.startsWith(\"TINYINT\") && rawType.toUpperCase().includes(\"(1)\"))) {\n return {\n encode: (v: string) => v === \"true\" || v === \"1\",\n decode: (v: unknown) => String(v),\n };\n }\n return undefined;\n}\n\nexport function defineSchema<\n TSchema extends ZodRawShape,\n TName extends string,\n TOptions extends SchemaColumnsOptions<TSchema> = SchemaColumnsOptions<TSchema>\n>(\n config: DefineSchemaConfig<TSchema> & { name: TName; options?: TOptions }\n): SchemaDefinition<TName, Prettify<TSchema & BaseSchema>, ResolveSchemaType<TSchema, TOptions>> {\n const columns: Record<string, string> = {};\n\n if (config.columns) {\n Object.assign(columns, { 'id': 'id', 'commitTs': 'commit_ts', ...config.columns });\n } else {\n // Default: use field name as column name\n for (const key of Object.keys(config.schema)) {\n columns[key] = key;\n }\n columns['id'] = 'id';\n columns['commitTs'] = 'commit_ts';\n }\n\n // Preserve user's id meta (pgType, mysqlType, etc.) so the SQL generator\n // can emit the correct raw type. primaryKey is always forced true.\n const idMeta: Record<string, unknown> = {};\n if (\"id\" in config.schema) {\n const userMeta = (config.schema.id as any)?.meta?.();\n if (userMeta) {\n for (const k of Object.keys(userMeta)) {\n if (k === \"primaryKey\") continue; // always forced true\n idMeta[k] = userMeta[k];\n }\n }\n }\n\n // Preserve the user's id length constraint (`zodPrimaryIdColumn().max(32)`)\n // so the SQL generator emits `VARCHAR(n)`. `.max()` is a Zod *check*, not\n // metadata, so it isn't captured by `idMeta` above and must be re-applied to\n // the injected id — otherwise the PK renders as `TEXT`, which MySQL cannot\n // use as a primary key.\n const userIdMax = \"id\" in config.schema ? readZodStringMax(config.schema.id) : undefined;\n const idColumn = userIdMax !== undefined ? z.string().max(userIdMax) : z.string();\n\n // Merge id/commitTs into the Zod schema, user-defined fields win for everything else,\n // but id/commitTs are always forced to their correct types\n const augmentedShape = {\n ...config.schema,\n // always string, even if user defined it differently\n id: idColumn.meta({ primaryKey: true, ...idMeta }),\n // always bigint, mapped to commit_ts column\n commitTs: z.coerce.bigint(),\n };\n\n const userCodecs = config.options?.codecs;\n const autoIdCodec = getAutoIdCodec(idMeta, userCodecs?.id);\n const mergedCodecs = {\n ...(autoIdCodec ? { id: autoIdCodec } : {}),\n ...userCodecs,\n commitTs: commitTsCodec,\n };\n\n const result = {\n tableId: tableNameToId(config.name),\n table: config.name,\n schema: z.object(augmentedShape),\n columnsOptions: {\n ...config.options,\n codecs: mergedCodecs,\n },\n columns,\n indexes: config.indexes ?? [],\n } as SchemaDefinition<TName, TSchema & BaseSchema, ResolveSchemaType<TSchema, TOptions>>;\n\n if (shouldTrackSchema) {\n schemaRegistry.set(config.name, result);\n }\n\n return result\n}\n\n// tableNameToId now lives in ./table-id (leaf module, also home to the memoized\n// tableIdOf). Re-exported here so existing `from \"./schema\"` imports still resolve.\nexport { tableNameToId };\n\n// Stored codec map is intentionally loose: the strict per-field constraint is\n// enforced on the input (`DefineSchemaConfig.options`), but storing the strict\n// type here would break variance when assigning a specific schema to a generic\n// `SchemaDefinition<string, ZodRawShape>` constraint (ColumnCodec.encode is\n// contravariant in its data type).\nexport interface StoredSchemaColumnsOptions {\n codecs?: Record<string, ColumnCodec<any, any>>;\n}\n\nexport interface SchemaDefinition<\n TTable extends string,\n TZod extends ZodRawShape,\n TData = z.infer<z.ZodObject<TZod>>\n> {\n tableId: Uint8Array;\n table: TTable;\n schema: z.ZodObject<TZod>;\n columnsOptions: StoredSchemaColumnsOptions;\n columns: Record<string, string>;\n indexes: IndexDefinition[];\n _dataType?: TData;\n}\n\nexport type InferSchema<T extends SchemaDefinition<string, ZodRawShape, any>> =\n T extends SchemaDefinition<string, ZodRawShape, infer TData> ? TData : never;\n\nexport type InsertData<T extends SchemaDefinition<string, ZodRawShape, any>> =\n T extends SchemaDefinition<string, infer TZod, infer TData>\n ? {\n [K in RequiredKeys<TZod> as K extends \"id\" | \"commitTs\" ? never : K]:\n Extract<K, string> extends keyof TData ? TData[Extract<K, string>] : never\n } & {\n [K in OptionalKeys<TZod> as K extends \"id\" | \"commitTs\" ? never : K]?:\n Extract<K, string> extends keyof TData ? TData[Extract<K, string>] : never\n }\n : never;\n\nexport interface Model {\n table: string;\n tableId: Uint8Array,\n columns: Record<string, string>;\n reverseColumns: Record<string, string>;\n types: Record<string, string>;\n codecs: Record<string, ColumnCodec<any, any>>;\n}\n\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type ReturnLiveQuery<\n TLiveQueryFn extends (...args: any[]) => MaybePromise<LiveQueryHandle<any>>\n> =\n Awaited<ReturnType<TLiveQueryFn>> extends LiveQueryHandle<infer T>\n ? T\n : never;\n\nexport type ReturnQuery<TQueryFn extends (...args: any[]) => any> =\n Awaited<ReturnType<TQueryFn>>;\n\nexport type QueryArgs<TQueryFn extends (...args: any[]) => any> =\n Parameters<TQueryFn>[0];\n\nexport type MutationArgs<TMutationFn extends (...args: any[]) => any> =\n Parameters<TMutationFn>[0];\n\nexport type ActionArgs<TActionFn extends (...args: any[]) => any> =\n Parameters<TActionFn>[0];"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { $ as ProcedureNames, $r as WriteEntry, $t as TxContext, Ar as OccConflictError, Br as QueryCacheMetadataSchema, Cn as InsertData, Cr as DEFAULT_RETRY, Ct as QueryFn, Dr as MutationResult, Er as LiveResult, Et as createActionBuilder, Fr as Predicate, G as RPCError, Gr as RawPointReadSchema, Gt as DefsToMap, Hr as RangeRead, Ht as SupaliveDb, In as defineComputedField, Ir as PredicateSchema, J as ActionProcedures, Jr as RawReadEntry, Jt as ResultOf, K as WSClientOptions, Kr as RawRangeRead, Kt as ParamsOf, Ln as defineSchema, Lr as QueryCacheEntry, Mr as OrPredicateSchema, Nn as SchemaColumnsOptions, Nr as PointRead, Or as NO_RETRY, Ot as createMutationBuilder, Pn as SchemaDefinition, Pr as PointReadSchema, Q as MutationProcedures, Qr as RetryConfig, Qt as DbWriter, Rr as QueryCacheEntrySchema, Sn as InferSchema, Sr as CompareOperatorSchema, St as QueryCtx, Tr as LeafPredicateSchema, Tt as TypeOf, U as ClientPublicState, Un as Database, Ur as RangeReadSchema, Ut as sleep, Vr as QuerySpec, W as HeartbeatOptions, Wn as DbQueryResult, Wr as RawPointRead, Wt as AnyQueryDef, Xr as ReadEntry, Xt as defineQuery, Y as AppRouter, Yn as RawClient, Yr as RawReadEntrySchema, Yt as _resetGlobalDefs, Zr as ReadEntrySchema, Zt as DbReader, _r as CachedPgMetadata, _t as MutationCtx, a as CallOptions, ai as normalizeToBytes, at as router, br as CommitTs, bt as OutputOf, c as LiveQueryHandle, ct as ActionFn, d as WSClientMethods, dt as ContextOf, ei as WriteEntrySchema, et as PublicProcedures, f as createClient, fn as matchesPredicate, gr as BigIntSchema, gt as MutationConfig, hr as AndPredicateSchema, i as createCaller, ii as normalizeIdToBytes, jn as SchemaCodecs, jr as OrPredicate, kr as OccAbortError, kt as createQueryBuilder, l as LiveQueryState, lt as ActionProcedure, mn as ColumnCodec, mr as AndPredicate, n as CallerFromRouter, ni as WriteOpSchema, nt as RegisteredProcedure, o as ClientFromProcedures, ot as ActionConfig, q as WsClientManager, qn as PooledClient, qr as RawRangeReadSchema, qt as QueryDefinition, r as CallerOptions, ri as bytesFromJson, rt as Router, s as ClientOptions, st as ActionCtx, t as CallerFromProcedures, ti as WriteOp, tt as QueryProcedures, u as LiveQueryStatus, ut as AnyProcedure, vn as ComputedFieldConfig, vr as CachedPgMetadataSchema, vt as MutationFn, wn as Model, wr as LeafPredicate, wt as QueryProcedure, xr as CompareOperator, xt as QueryConfig, yr as CommitLogEntry, yt as MutationProcedure, zr as QueryCacheMetadata } from "../../index-DDDAcnJj.js";
1
+ import { $ as ProcedureNames, $r as WriteEntry, $t as TxContext, Ar as OccConflictError, Br as QueryCacheMetadataSchema, Cn as InsertData, Cr as DEFAULT_RETRY, Ct as QueryFn, Dr as MutationResult, Er as LiveResult, Et as createActionBuilder, Fr as Predicate, G as RPCError, Gr as RawPointReadSchema, Gt as DefsToMap, Hr as RangeRead, Ht as SupaliveDb, In as defineComputedField, Ir as PredicateSchema, J as ActionProcedures, Jr as RawReadEntry, Jt as ResultOf, K as WSClientOptions, Kr as RawRangeRead, Kt as ParamsOf, Ln as defineSchema, Lr as QueryCacheEntry, Mr as OrPredicateSchema, Nn as SchemaColumnsOptions, Nr as PointRead, Or as NO_RETRY, Ot as createMutationBuilder, Pn as SchemaDefinition, Pr as PointReadSchema, Q as MutationProcedures, Qr as RetryConfig, Qt as DbWriter, Rr as QueryCacheEntrySchema, Sn as InferSchema, Sr as CompareOperatorSchema, St as QueryCtx, Tr as LeafPredicateSchema, Tt as TypeOf, U as ClientPublicState, Un as Database, Ur as RangeReadSchema, Ut as sleep, Vr as QuerySpec, W as HeartbeatOptions, Wn as DbQueryResult, Wr as RawPointRead, Wt as AnyQueryDef, Xr as ReadEntry, Xt as defineQuery, Y as AppRouter, Yn as RawClient, Yr as RawReadEntrySchema, Yt as _resetGlobalDefs, Zr as ReadEntrySchema, Zt as DbReader, _r as CachedPgMetadata, _t as MutationCtx, a as CallOptions, ai as normalizeToBytes, at as router, br as CommitTs, bt as OutputOf, c as LiveQueryHandle, ct as ActionFn, d as WSClientMethods, dt as ContextOf, ei as WriteEntrySchema, et as PublicProcedures, f as createClient, fn as matchesPredicate, gr as BigIntSchema, gt as MutationConfig, hr as AndPredicateSchema, i as createCaller, ii as normalizeIdToBytes, jn as SchemaCodecs, jr as OrPredicate, kr as OccAbortError, kt as createQueryBuilder, l as LiveQueryState, lt as ActionProcedure, mn as ColumnCodec, mr as AndPredicate, n as CallerFromRouter, ni as WriteOpSchema, nt as RegisteredProcedure, o as ClientFromProcedures, ot as ActionConfig, q as WsClientManager, qn as PooledClient, qr as RawRangeReadSchema, qt as QueryDefinition, r as CallerOptions, ri as bytesFromJson, rt as Router, s as ClientOptions, st as ActionCtx, t as CallerFromProcedures, ti as WriteOp, tt as QueryProcedures, u as LiveQueryStatus, ut as AnyProcedure, vn as ComputedFieldConfig, vr as CachedPgMetadataSchema, vt as MutationFn, wn as Model, wr as LeafPredicate, wt as QueryProcedure, xr as CompareOperator, xt as QueryConfig, yr as CommitLogEntry, yt as MutationProcedure, zr as QueryCacheMetadata } from "../../index-BedlCLem.js";
2
2
  export { type ActionConfig, type ActionCtx, type ActionFn, type ActionProcedure, type ActionProcedures, AndPredicate, AndPredicateSchema, type AnyProcedure, type AnyQueryDef, type AppRouter, BigIntSchema, CachedPgMetadata, CachedPgMetadataSchema, type CallOptions, CallerFromProcedures, CallerFromRouter, CallerOptions, type ClientFromProcedures, type ClientOptions, type ClientPublicState, type ColumnCodec, CommitLogEntry, CommitTs, CompareOperator, CompareOperatorSchema, type ComputedFieldConfig, type ContextOf, DEFAULT_RETRY, type Database, type DbQueryResult, DbReader, DbReader as ReadContext, DbWriter, DbWriter as WritableContext, type DefsToMap, type HeartbeatOptions, type InferSchema, type InsertData, LeafPredicate, LeafPredicateSchema, type LiveQueryHandle, type LiveQueryState, type LiveQueryStatus, LiveResult, type Model, type MutationConfig, type MutationCtx, type MutationFn, type MutationProcedure, type MutationProcedures, MutationResult, NO_RETRY, OccAbortError, OccConflictError, OrPredicate, OrPredicateSchema, type OutputOf, type ParamsOf, PointRead, PointReadSchema, type PooledClient, Predicate, PredicateSchema, type ProcedureNames, type PublicProcedures, QueryCacheEntry, QueryCacheEntrySchema, QueryCacheMetadata, QueryCacheMetadataSchema, type QueryConfig, type QueryCtx, type QueryDefinition, type QueryFn, type QueryProcedure, type QueryProcedures, QuerySpec, RPCError, RangeRead, RangeReadSchema, type RawClient, RawPointRead, RawPointReadSchema, RawRangeRead, RawRangeReadSchema, RawReadEntry, RawReadEntrySchema, ReadEntry, ReadEntrySchema, type RegisteredProcedure, type ResultOf, RetryConfig, type Router, type SchemaCodecs, type SchemaColumnsOptions, type SchemaDefinition, SupaliveDb, TxContext, type TypeOf, type WSClientMethods, type WSClientOptions, WriteEntry, WriteEntrySchema, WriteOp, WriteOpSchema, WsClientManager, _resetGlobalDefs, bytesFromJson, createActionBuilder, createCaller, createClient, createMutationBuilder, createQueryBuilder, defineComputedField, defineQuery, defineSchema, matchesPredicate, normalizeIdToBytes, normalizeToBytes, router, sleep };
@@ -1,11 +1,11 @@
1
- import { i as createQueryBuilder, r as createMutationBuilder, t as createActionBuilder } from "../../procedure-DPgXC2Cm.js";
2
- import { n as getContextRegistry, r as router } from "../../router-CiWYeWUR.js";
3
- import { o as matchesPredicate } from "../../query-Bpw8wO6L.js";
4
- import { n as defineSchema, t as defineComputedField } from "../../schema-CWdfWuIj.js";
5
- import { r as supaliveStringify } from "../../helper-wGbzz6zo.js";
6
- import { C as normalizeIdToBytes, S as bytesFromJson, _ as RawRangeReadSchema, a as DEFAULT_RETRY, b as WriteEntrySchema, c as OccAbortError, d as PointReadSchema, f as PredicateSchema, g as RawPointReadSchema, h as RangeReadSchema, i as CompareOperatorSchema, l as OccConflictError, m as QueryCacheMetadataSchema, n as BigIntSchema, o as LeafPredicateSchema, p as QueryCacheEntrySchema, r as CachedPgMetadataSchema, s as NO_RETRY, t as AndPredicateSchema, u as OrPredicateSchema, v as RawReadEntrySchema, w as normalizeToBytes, x as WriteOpSchema, y as ReadEntrySchema } from "../../types_db-CmxFWgU3.js";
7
- import { l as ServerMessageSchema } from "../../types_client_rpc-CIsjQQGG.js";
8
- import { a as TxContext, i as DbWriter, n as sleep, r as DbReader, t as SupaliveDb } from "../../realtime_db-e3TztUUT.js";
1
+ import { c as parentConn, i as createActionBuilder, n as getContextRegistry, o as createMutationBuilder, r as router, s as createQueryBuilder, u as primaryOnlyConn } from "../../router-Kgrlci8X.js";
2
+ import { r as supaliveStringify } from "../../helper-zdJT5FUc.js";
3
+ import { o as matchesPredicate } from "../../query-Xw2hi6TB.js";
4
+ import { n as defineSchema, t as defineComputedField } from "../../schema-DLue3K2s.js";
5
+ import { C as normalizeIdToBytes, S as bytesFromJson, _ as RawRangeReadSchema, a as DEFAULT_RETRY, b as WriteEntrySchema, c as OccAbortError, d as PointReadSchema, f as PredicateSchema, g as RawPointReadSchema, h as RangeReadSchema, i as CompareOperatorSchema, l as OccConflictError, m as QueryCacheMetadataSchema, n as BigIntSchema, o as LeafPredicateSchema, p as QueryCacheEntrySchema, r as CachedPgMetadataSchema, s as NO_RETRY, t as AndPredicateSchema, u as OrPredicateSchema, v as RawReadEntrySchema, w as normalizeToBytes, x as WriteOpSchema, y as ReadEntrySchema } from "../../types_db-OUou3o2Z.js";
6
+ import { l as ServerMessageSchema } from "../../types_client_rpc-ByGwoRCL.js";
7
+ import { a as TxContext, i as DbWriter, n as sleep, r as DbReader, t as SupaliveDb } from "../../realtime_db-CVze3gM0.js";
8
+ import { n as resolveReadRouting, t as makeConnRouting } from "../../read-routing-BUcQAwnd.js";
9
9
  import { sha1 } from "hash-wasm";
10
10
  //#region src/db/query_definition.ts
11
11
  const _globalDefs = /* @__PURE__ */ new Map();
@@ -111,6 +111,7 @@ var WsClientManager = class {
111
111
  explicitlyClosed = false;
112
112
  stateListeners = /* @__PURE__ */ new Set();
113
113
  lastPublicState = "disconnected";
114
+ highWaterTs = 0n;
114
115
  serverInactivityMs;
115
116
  lastServerMessageAt = 0;
116
117
  inactivityTimer = null;
@@ -335,10 +336,22 @@ var WsClientManager = class {
335
336
  type: "call",
336
337
  id,
337
338
  procedure,
338
- input
339
+ input,
340
+ minTs: this.highWaterTs > 0n ? this.highWaterTs.toString() : void 0
339
341
  });
340
342
  });
341
343
  }
344
+ /** Advance the read high-water from a server-returned `ts` (monotonic). */
345
+ advanceHighWater(ts) {
346
+ if (ts === void 0) return;
347
+ let parsed;
348
+ try {
349
+ parsed = BigInt(ts);
350
+ } catch {
351
+ return;
352
+ }
353
+ if (parsed > this.highWaterTs) this.highWaterTs = parsed;
354
+ }
342
355
  /**
343
356
  * Flush queued calls in FIFO order. Called once `isReady()` becomes
344
357
  * true. With the throttle enabled, dispatch the first batch
@@ -644,12 +657,18 @@ var WsClientManager = class {
644
657
  if (!pending) return;
645
658
  this.pendingRequests.delete(message.id);
646
659
  if (message.success) if (pending.subscribeResolve) pending.subscribeResolve(message.subId);
647
- else pending.resolve?.(message.data);
660
+ else {
661
+ this.advanceHighWater(message.ts);
662
+ pending.resolve?.(message.data);
663
+ }
648
664
  else pending.reject(new RPCError(message.error ?? "Unknown error", message.code));
649
665
  }
650
666
  handleSubscriptionUpdate(message) {
651
667
  const sub = this.subscriptions.get(message.subId);
652
- if (sub) sub.onUpdate(message.data);
668
+ if (sub) {
669
+ this.advanceHighWater(message.ts);
670
+ sub.onUpdate(message.data);
671
+ }
653
672
  }
654
673
  /**
655
674
  * Handles a `sub:gone` message: the server no longer tracks this
@@ -1076,6 +1095,35 @@ var LiveQueryHandleImpl = class {
1076
1095
  //#endregion
1077
1096
  //#region src/client/caller_client.ts
1078
1097
  /**
1098
+ * Run a standalone (non-transaction-joining) server-side query with replica
1099
+ * routing that DEFAULTS to the primary.
1100
+ *
1101
+ * Unlike a client one-shot query, the internal caller has no client `minTs`
1102
+ * high-water to gate replica staleness — a caller that just performed an
1103
+ * internal write and then reads back would silently read a lagging replica. So
1104
+ * the safe default here is the PRIMARY; a handler can still opt a heavy
1105
+ * reporting read onto the replica with `ctx.useReplicaConn()` (and force back
1106
+ * with `ctx.usePrimaryConn()` / `{ readOwnWrite: true }`). The connection knobs
1107
+ * use the SAME shared routing rule as the one-shot path ({@link resolveReadRouting}
1108
+ * / {@link makeConnRouting}) — the only difference is the DEFAULT connection
1109
+ * (primary here, replica-if-caught-up there). With no minTs floor, an explicit
1110
+ * `useReplicaConn()` resolves to the replica whenever one is configured. With no
1111
+ * replica configured every branch resolves to the primary.
1112
+ */
1113
+ async function runRoutedCallerQuery(db, serverCtx, fn) {
1114
+ const routing = await resolveReadRouting(db, await db.impl.getLatestSnapshotTimestamp(), 0n);
1115
+ return (await db.queryInternalOn({
1116
+ impl: routing.primaryImpl,
1117
+ beginTs: routing.primaryTs
1118
+ }, async (dbCtx) => {
1119
+ return fn({
1120
+ db: dbCtx,
1121
+ serverCtx,
1122
+ ...makeConnRouting(dbCtx, routing)
1123
+ });
1124
+ })).data;
1125
+ }
1126
+ /**
1079
1127
  * Create a server-side caller that bypasses HTTP/WebSocket.
1080
1128
  *
1081
1129
  * For in-memory calls, input validation is skipped (data is already a JS object).
@@ -1108,13 +1156,7 @@ function createCaller(options) {
1108
1156
  query: async (input, serverCtx) => {
1109
1157
  if (procedure.type !== "query") throw new Error(`Procedure "${procedureName}" is not a query`);
1110
1158
  const validatedInput = validateInput(input);
1111
- return db.query(async (dbCtx) => {
1112
- const ctx = {
1113
- db: dbCtx,
1114
- serverCtx
1115
- };
1116
- return procedure.fn(ctx, validatedInput);
1117
- });
1159
+ return runRoutedCallerQuery(db, serverCtx, (ctx) => procedure.fn(ctx, validatedInput));
1118
1160
  },
1119
1161
  runQuery: async (input, parentCtx) => {
1120
1162
  if (procedure.type !== "query") throw new Error(`Procedure "${procedureName}" is not a query`);
@@ -1122,17 +1164,12 @@ function createCaller(options) {
1122
1164
  if (parentCtx.db instanceof TxContext) {
1123
1165
  const ctx = {
1124
1166
  db: parentCtx.db,
1125
- serverCtx: parentCtx.serverCtx
1167
+ serverCtx: parentCtx.serverCtx,
1168
+ ...parentConn
1126
1169
  };
1127
1170
  return procedure.fn(ctx, validatedInput);
1128
1171
  }
1129
- return parentCtx.db.query(async (dbCtx) => {
1130
- const ctx = {
1131
- db: dbCtx,
1132
- serverCtx: parentCtx.serverCtx
1133
- };
1134
- return procedure.fn(ctx, validatedInput);
1135
- });
1172
+ return runRoutedCallerQuery(parentCtx.db, parentCtx.serverCtx, (ctx) => procedure.fn(ctx, validatedInput));
1136
1173
  },
1137
1174
  mutate: async (input, serverCtx) => {
1138
1175
  if (procedure.type !== "mutation") throw new Error(`Procedure "${procedureName}" is not a mutation`);
@@ -1140,7 +1177,8 @@ function createCaller(options) {
1140
1177
  return (await db.mutation(async (dbCtx) => {
1141
1178
  const ctx = {
1142
1179
  db: dbCtx,
1143
- serverCtx
1180
+ serverCtx,
1181
+ ...primaryOnlyConn
1144
1182
  };
1145
1183
  return procedure.fn(ctx, validatedInput);
1146
1184
  })).result;
@@ -1151,7 +1189,8 @@ function createCaller(options) {
1151
1189
  return (await (parentCtx.db instanceof TxContext ? db : parentCtx.db).mutation(async (dbCtx) => {
1152
1190
  const ctx = {
1153
1191
  db: dbCtx,
1154
- serverCtx: parentCtx.serverCtx
1192
+ serverCtx: parentCtx.serverCtx,
1193
+ ...primaryOnlyConn
1155
1194
  };
1156
1195
  if (parentCtx.db instanceof TxContext) ctx.db.appendInternalReadSet(parentCtx.db.internalGetReadSet());
1157
1196
  return procedure.fn(ctx, validatedInput);
@@ -1182,7 +1221,8 @@ function createCaller(options) {
1182
1221
  return db.liveQuery(async (dbCtx) => {
1183
1222
  const ctx = {
1184
1223
  db: dbCtx,
1185
- serverCtx
1224
+ serverCtx,
1225
+ ...primaryOnlyConn
1186
1226
  };
1187
1227
  return procedure.fn(ctx, validatedInput);
1188
1228
  });