@rocicorp/zero 1.6.2 → 1.7.0-canary.1

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 (606) hide show
  1. package/README.md +28 -3
  2. package/out/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.130.0}/helpers/usingCtx.js +1 -1
  3. package/out/analyze-query/src/analyze-cli.js +3 -3
  4. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  5. package/out/analyze-query/src/bin-analyze.js +7 -2
  6. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  7. package/out/analyze-query/src/bin-transform.js.map +1 -1
  8. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  9. package/out/ast-to-zql/src/bin.js.map +1 -1
  10. package/out/ast-to-zql/src/format.js.map +1 -1
  11. package/out/datadog/src/datadog-log-sink.js.map +1 -1
  12. package/out/otel/src/enabled.js.map +1 -1
  13. package/out/otel/src/log-options.js.map +1 -1
  14. package/out/otel/src/maybe-time.js.map +1 -1
  15. package/out/otel/src/span.js.map +1 -1
  16. package/out/replicache/src/async-iterable-to-array.js.map +1 -1
  17. package/out/replicache/src/bg-interval.js.map +1 -1
  18. package/out/replicache/src/btree/diff.js.map +1 -1
  19. package/out/replicache/src/btree/node.js.map +1 -1
  20. package/out/replicache/src/btree/read.js.map +1 -1
  21. package/out/replicache/src/btree/splice.js.map +1 -1
  22. package/out/replicache/src/btree/write.js +6 -3
  23. package/out/replicache/src/btree/write.js.map +1 -1
  24. package/out/replicache/src/call-default-fetch.js.map +1 -1
  25. package/out/replicache/src/connection-loop-delegates.js.map +1 -1
  26. package/out/replicache/src/connection-loop.js +13 -13
  27. package/out/replicache/src/connection-loop.js.map +1 -1
  28. package/out/replicache/src/cookies.js.map +1 -1
  29. package/out/replicache/src/dag/chunk.js.map +1 -1
  30. package/out/replicache/src/dag/gc.js.map +1 -1
  31. package/out/replicache/src/dag/key.js.map +1 -1
  32. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  33. package/out/replicache/src/dag/store-impl.js.map +1 -1
  34. package/out/replicache/src/dag/store.js.map +1 -1
  35. package/out/replicache/src/dag/visitor.js.map +1 -1
  36. package/out/replicache/src/db/commit.js.map +1 -1
  37. package/out/replicache/src/db/index.js.map +1 -1
  38. package/out/replicache/src/db/read.js.map +1 -1
  39. package/out/replicache/src/db/rebase.js.map +1 -1
  40. package/out/replicache/src/db/write.js.map +1 -1
  41. package/out/replicache/src/deleted-clients.js.map +1 -1
  42. package/out/replicache/src/error-responses.js.map +1 -1
  43. package/out/replicache/src/frozen-json.js.map +1 -1
  44. package/out/replicache/src/get-default-puller.js.map +1 -1
  45. package/out/replicache/src/get-default-pusher.js.map +1 -1
  46. package/out/replicache/src/get-kv-store-provider.js.map +1 -1
  47. package/out/replicache/src/hash.js.map +1 -1
  48. package/out/replicache/src/http-request-info.js.map +1 -1
  49. package/out/replicache/src/index-defs.js.map +1 -1
  50. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  51. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -1
  52. package/out/replicache/src/kv/idb-store.js.map +1 -1
  53. package/out/replicache/src/kv/mem-store.js.map +1 -1
  54. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  55. package/out/replicache/src/kv/read-impl.js.map +1 -1
  56. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  57. package/out/replicache/src/kv/sqlite-store.js +4 -1
  58. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  59. package/out/replicache/src/kv/throw-if-closed.js.map +1 -1
  60. package/out/replicache/src/kv/write-impl-base.js.map +1 -1
  61. package/out/replicache/src/kv/write-impl.js.map +1 -1
  62. package/out/replicache/src/lazy.js.map +1 -1
  63. package/out/replicache/src/log-options.js.map +1 -1
  64. package/out/replicache/src/make-idb-name.js.map +1 -1
  65. package/out/replicache/src/new-client-channel.js.map +1 -1
  66. package/out/replicache/src/on-persist-channel.js.map +1 -1
  67. package/out/replicache/src/patch-operation.js.map +1 -1
  68. package/out/replicache/src/pending-mutations.js.map +1 -1
  69. package/out/replicache/src/persist/client-gc.js.map +1 -1
  70. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  71. package/out/replicache/src/persist/client-groups.js +40 -0
  72. package/out/replicache/src/persist/client-groups.js.map +1 -1
  73. package/out/replicache/src/persist/clients.js +28 -0
  74. package/out/replicache/src/persist/clients.js.map +1 -1
  75. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  76. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
  77. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
  78. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  79. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
  80. package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
  81. package/out/replicache/src/persist/make-client-id.js.map +1 -1
  82. package/out/replicache/src/persist/persist.js.map +1 -1
  83. package/out/replicache/src/persist/refresh.js.map +1 -1
  84. package/out/replicache/src/process-scheduler.js.map +1 -1
  85. package/out/replicache/src/pusher.js.map +1 -1
  86. package/out/replicache/src/replicache-impl.js.map +1 -1
  87. package/out/replicache/src/report-error.js.map +1 -1
  88. package/out/replicache/src/request-idle.js.map +1 -1
  89. package/out/replicache/src/scan-iterator.js.map +1 -1
  90. package/out/replicache/src/scan-options.js.map +1 -1
  91. package/out/replicache/src/set-interval-with-signal.js.map +1 -1
  92. package/out/replicache/src/subscriptions.js.map +1 -1
  93. package/out/replicache/src/sync/diff.js.map +1 -1
  94. package/out/replicache/src/sync/ids.js.map +1 -1
  95. package/out/replicache/src/sync/patch.js.map +1 -1
  96. package/out/replicache/src/sync/pull-error.js.map +1 -1
  97. package/out/replicache/src/sync/pull.js.map +1 -1
  98. package/out/replicache/src/sync/push.js.map +1 -1
  99. package/out/replicache/src/sync/request-id.js.map +1 -1
  100. package/out/replicache/src/to-error.js.map +1 -1
  101. package/out/replicache/src/transaction-closed-error.js.map +1 -1
  102. package/out/replicache/src/transactions.js.map +1 -1
  103. package/out/replicache/src/with-transactions.js.map +1 -1
  104. package/out/shared/src/abort-error.js.map +1 -1
  105. package/out/shared/src/arrays.js.map +1 -1
  106. package/out/shared/src/asserts.js.map +1 -1
  107. package/out/shared/src/bigint-json.js.map +1 -1
  108. package/out/shared/src/binary-search.js.map +1 -1
  109. package/out/shared/src/broadcast-channel.js.map +1 -1
  110. package/out/shared/src/browser-env.js.map +1 -1
  111. package/out/shared/src/btree-set.js.map +1 -1
  112. package/out/shared/src/cache.js.map +1 -1
  113. package/out/shared/src/centroid.js.map +1 -1
  114. package/out/shared/src/custom-key-map.js.map +1 -1
  115. package/out/shared/src/custom-key-set.js.map +1 -1
  116. package/out/shared/src/deep-clone.js.map +1 -1
  117. package/out/shared/src/deep-merge.js.map +1 -1
  118. package/out/shared/src/document-visible.js.map +1 -1
  119. package/out/shared/src/dotenv.js.map +1 -1
  120. package/out/shared/src/enum.d.ts +1 -1
  121. package/out/shared/src/error.js.map +1 -1
  122. package/out/shared/src/hash.js.map +1 -1
  123. package/out/shared/src/iterables.d.ts +2 -0
  124. package/out/shared/src/iterables.d.ts.map +1 -1
  125. package/out/shared/src/iterables.js +9 -1
  126. package/out/shared/src/iterables.js.map +1 -1
  127. package/out/shared/src/json-schema.js.map +1 -1
  128. package/out/shared/src/json.js.map +1 -1
  129. package/out/shared/src/logging-test-utils.js.map +1 -1
  130. package/out/shared/src/logging.js.map +1 -1
  131. package/out/shared/src/map.js.map +1 -1
  132. package/out/shared/src/must.js.map +1 -1
  133. package/out/shared/src/object-traversal.js.map +1 -1
  134. package/out/shared/src/objects.js.map +1 -1
  135. package/out/shared/src/options.js.map +1 -1
  136. package/out/shared/src/parse-big-int.js.map +1 -1
  137. package/out/shared/src/promise-race.js.map +1 -1
  138. package/out/shared/src/queue.d.ts.map +1 -1
  139. package/out/shared/src/queue.js +15 -21
  140. package/out/shared/src/queue.js.map +1 -1
  141. package/out/shared/src/rand.js.map +1 -1
  142. package/out/shared/src/random-uint64.js.map +1 -1
  143. package/out/shared/src/random-values.js.map +1 -1
  144. package/out/shared/src/record-proxy.js.map +1 -1
  145. package/out/shared/src/resolved-promises.js.map +1 -1
  146. package/out/shared/src/ring-buffer.d.ts +32 -0
  147. package/out/shared/src/ring-buffer.d.ts.map +1 -0
  148. package/out/shared/src/ring-buffer.js +109 -0
  149. package/out/shared/src/ring-buffer.js.map +1 -0
  150. package/out/shared/src/sentinels.js.map +1 -1
  151. package/out/shared/src/set-utils.js.map +1 -1
  152. package/out/shared/src/size-of-value.js.map +1 -1
  153. package/out/shared/src/sleep.js.map +1 -1
  154. package/out/shared/src/sorted-entries.js.map +1 -1
  155. package/out/shared/src/string-compare.js.map +1 -1
  156. package/out/shared/src/subscribable.js.map +1 -1
  157. package/out/shared/src/tdigest-schema.js.map +1 -1
  158. package/out/shared/src/tdigest.js.map +1 -1
  159. package/out/shared/src/valita.js.map +1 -1
  160. package/out/z2s/src/compiler.js.map +1 -1
  161. package/out/z2s/src/sql.d.ts.map +1 -1
  162. package/out/z2s/src/sql.js +3 -2
  163. package/out/z2s/src/sql.js.map +1 -1
  164. package/out/zero/package.js +37 -28
  165. package/out/zero/package.js.map +1 -1
  166. package/out/zero/src/build-schema.js.map +1 -1
  167. package/out/zero/src/zero-cache-dev.js.map +1 -1
  168. package/out/zero/src/zero-out.js.map +1 -1
  169. package/out/zero/src/zero.js +1 -1
  170. package/out/zero-cache/src/auth/auth.js.map +1 -1
  171. package/out/zero-cache/src/auth/jwt.js.map +1 -1
  172. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  173. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  174. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  175. package/out/zero-cache/src/config/network.js.map +1 -1
  176. package/out/zero-cache/src/config/normalize.js.map +1 -1
  177. package/out/zero-cache/src/config/server-context.js.map +1 -1
  178. package/out/zero-cache/src/config/zero-config.js +5 -0
  179. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  180. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  181. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  182. package/out/zero-cache/src/db/create.js.map +1 -1
  183. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
  184. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  185. package/out/zero-cache/src/db/migration-lite.js +19 -0
  186. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  187. package/out/zero-cache/src/db/migration.js +19 -0
  188. package/out/zero-cache/src/db/migration.js.map +1 -1
  189. package/out/zero-cache/src/db/pg-copy-binary.js.map +1 -1
  190. package/out/zero-cache/src/db/pg-copy.js.map +1 -1
  191. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  192. package/out/zero-cache/src/db/pg-type-parser.js.map +1 -1
  193. package/out/zero-cache/src/db/run-transaction.js.map +1 -1
  194. package/out/zero-cache/src/db/specs.js.map +1 -1
  195. package/out/zero-cache/src/db/statements.js.map +1 -1
  196. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  197. package/out/zero-cache/src/db/warmup.js.map +1 -1
  198. package/out/zero-cache/src/observability/events.js.map +1 -1
  199. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  200. package/out/zero-cache/src/scripts/decommission.js.map +1 -1
  201. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  202. package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
  203. package/out/zero-cache/src/scripts/permissions.js +1 -2
  204. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  205. package/out/zero-cache/src/server/anonymous-otel-start.js +8 -7
  206. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  207. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  208. package/out/zero-cache/src/server/change-streamer.js +2 -2
  209. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  210. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  211. package/out/zero-cache/src/server/logging.js.map +1 -1
  212. package/out/zero-cache/src/server/main.js.map +1 -1
  213. package/out/zero-cache/src/server/mutator.js.map +1 -1
  214. package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -1
  215. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  216. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  217. package/out/zero-cache/src/server/priority-op.js.map +1 -1
  218. package/out/zero-cache/src/server/reaper.js.map +1 -1
  219. package/out/zero-cache/src/server/replicator.js.map +1 -1
  220. package/out/zero-cache/src/server/runner/main.js.map +1 -1
  221. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  222. package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
  223. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  224. package/out/zero-cache/src/server/shadow-syncer.js.map +1 -1
  225. package/out/zero-cache/src/server/syncer.js.map +1 -1
  226. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  227. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  228. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  229. package/out/zero-cache/src/services/analyze.js +5 -2
  230. package/out/zero-cache/src/services/analyze.js.map +1 -1
  231. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  232. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  233. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  234. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  235. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
  236. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  237. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  238. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  239. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  240. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
  241. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
  242. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  243. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
  244. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  245. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  246. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  247. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  248. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  249. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  250. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  251. package/out/zero-cache/src/services/change-source/protocol/current/data.js +2 -0
  252. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  253. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
  254. package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -1
  255. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  256. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  257. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts +46 -1
  258. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  259. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +109 -12
  260. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  261. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  262. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  263. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  264. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  265. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  266. package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +1 -1
  267. package/out/zero-cache/src/services/change-streamer/schema/init.js +21 -25
  268. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  269. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  270. package/out/zero-cache/src/services/change-streamer/snapshot.js +15 -0
  271. package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
  272. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  273. package/out/zero-cache/src/services/change-streamer/storer.js +12 -2
  274. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  275. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  276. package/out/zero-cache/src/services/heapz.js.map +1 -1
  277. package/out/zero-cache/src/services/http-service.js.map +1 -1
  278. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  279. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
  280. package/out/zero-cache/src/services/litestream/commands.d.ts +23 -0
  281. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  282. package/out/zero-cache/src/services/litestream/commands.js +89 -1
  283. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  284. package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
  285. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  286. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  287. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  288. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  289. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  290. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  291. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  292. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +1 -0
  293. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
  294. package/out/zero-cache/src/services/replicator/reporter/recorder.js +8 -0
  295. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  296. package/out/zero-cache/src/services/replicator/reporter/report-schema.js.map +1 -1
  297. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  298. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  299. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  300. package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
  301. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  302. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  303. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  304. package/out/zero-cache/src/services/run-ast.js +1 -0
  305. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  306. package/out/zero-cache/src/services/runner.js.map +1 -1
  307. package/out/zero-cache/src/services/running-state.js.map +1 -1
  308. package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -1
  309. package/out/zero-cache/src/services/statz.js.map +1 -1
  310. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
  311. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  312. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts.map +1 -1
  313. package/out/zero-cache/src/services/view-syncer/client-schema.js +10 -2
  314. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  315. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  316. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  317. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  318. package/out/zero-cache/src/services/view-syncer/cvr-store.js +2 -1
  319. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  320. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  321. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  322. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +1 -1
  323. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  324. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +2 -1
  325. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  326. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +81 -7
  327. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  328. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  329. package/out/zero-cache/src/services/view-syncer/row-set-signature.js.map +1 -1
  330. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  331. package/out/zero-cache/src/services/view-syncer/schema/init.js +97 -113
  332. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  333. package/out/zero-cache/src/services/view-syncer/schema/types.js +103 -1
  334. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  335. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  336. package/out/zero-cache/src/services/view-syncer/tracer.js.map +1 -1
  337. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
  338. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  339. package/out/zero-cache/src/services/view-syncer/view-syncer.js +13 -6
  340. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  341. package/out/zero-cache/src/types/configuration-error.js.map +1 -1
  342. package/out/zero-cache/src/types/error-with-level.js.map +1 -1
  343. package/out/zero-cache/src/types/http.js.map +1 -1
  344. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  345. package/out/zero-cache/src/types/lite.js.map +1 -1
  346. package/out/zero-cache/src/types/names.js.map +1 -1
  347. package/out/zero-cache/src/types/pg-data-type.d.ts +53 -2
  348. package/out/zero-cache/src/types/pg-data-type.d.ts.map +1 -1
  349. package/out/zero-cache/src/types/pg-data-type.js +28 -3
  350. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  351. package/out/zero-cache/src/types/pg.js.map +1 -1
  352. package/out/zero-cache/src/types/processes.js.map +1 -1
  353. package/out/zero-cache/src/types/profiler.js.map +1 -1
  354. package/out/zero-cache/src/types/row-key.js.map +1 -1
  355. package/out/zero-cache/src/types/shards.js.map +1 -1
  356. package/out/zero-cache/src/types/sql.js.map +1 -1
  357. package/out/zero-cache/src/types/state-version.js.map +1 -1
  358. package/out/zero-cache/src/types/streams.js.map +1 -1
  359. package/out/zero-cache/src/types/strings.js.map +1 -1
  360. package/out/zero-cache/src/types/subscription.js.map +1 -1
  361. package/out/zero-cache/src/types/timeout.js.map +1 -1
  362. package/out/zero-cache/src/types/url-params.js.map +1 -1
  363. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  364. package/out/zero-cache/src/types/ws.js.map +1 -1
  365. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  366. package/out/zero-cache/src/workers/connection.js.map +1 -1
  367. package/out/zero-cache/src/workers/mutator.js.map +1 -1
  368. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  369. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  370. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  371. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  372. package/out/zero-client/src/client/connection-manager.js +2 -1
  373. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  374. package/out/zero-client/src/client/connection.js.map +1 -1
  375. package/out/zero-client/src/client/context.js.map +1 -1
  376. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  377. package/out/zero-client/src/client/crud.js.map +1 -1
  378. package/out/zero-client/src/client/custom.js +2 -1
  379. package/out/zero-client/src/client/custom.js.map +1 -1
  380. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
  381. package/out/zero-client/src/client/enable-analytics.js.map +1 -1
  382. package/out/zero-client/src/client/error.js.map +1 -1
  383. package/out/zero-client/src/client/http-string.js.map +1 -1
  384. package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
  385. package/out/zero-client/src/client/inspector/client.js.map +1 -1
  386. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
  387. package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
  388. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  389. package/out/zero-client/src/client/inspector/query.js.map +1 -1
  390. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  391. package/out/zero-client/src/client/keys.js.map +1 -1
  392. package/out/zero-client/src/client/log-options.js.map +1 -1
  393. package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
  394. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  395. package/out/zero-client/src/client/metrics.js.map +1 -1
  396. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  397. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  398. package/out/zero-client/src/client/options.js.map +1 -1
  399. package/out/zero-client/src/client/query-manager.js +1 -1
  400. package/out/zero-client/src/client/query-manager.js.map +1 -1
  401. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  402. package/out/zero-client/src/client/server-option.js.map +1 -1
  403. package/out/zero-client/src/client/version.js +1 -1
  404. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
  405. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  406. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  407. package/out/zero-client/src/client/zero.js +58 -32
  408. package/out/zero-client/src/client/zero.js.map +1 -1
  409. package/out/zero-client/src/mod.d.ts +2 -2
  410. package/out/zero-client/src/mod.d.ts.map +1 -1
  411. package/out/zero-client/src/mod.js +1 -1
  412. package/out/zero-client/src/util/nanoid.js.map +1 -1
  413. package/out/{zero-schema → zero-permissions}/src/permissions.d.ts +1 -1
  414. package/out/zero-permissions/src/permissions.d.ts.map +1 -0
  415. package/out/{zero-schema → zero-permissions}/src/permissions.js +2 -2
  416. package/out/zero-permissions/src/permissions.js.map +1 -0
  417. package/out/zero-protocol/src/analyze-query-result.js +3 -0
  418. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  419. package/out/zero-protocol/src/application-error.js.map +1 -1
  420. package/out/zero-protocol/src/ast.js.map +1 -1
  421. package/out/zero-protocol/src/change-desired-queries.js +1 -0
  422. package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
  423. package/out/zero-protocol/src/client-schema.js.map +1 -1
  424. package/out/zero-protocol/src/close-connection.js.map +1 -1
  425. package/out/zero-protocol/src/connect.js +7 -0
  426. package/out/zero-protocol/src/connect.js.map +1 -1
  427. package/out/zero-protocol/src/custom-queries.js.map +1 -1
  428. package/out/zero-protocol/src/data.js.map +1 -1
  429. package/out/zero-protocol/src/delete-clients.js.map +1 -1
  430. package/out/zero-protocol/src/down.js.map +1 -1
  431. package/out/zero-protocol/src/error.js +7 -0
  432. package/out/zero-protocol/src/error.js.map +1 -1
  433. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  434. package/out/zero-protocol/src/inspect-up.js +1 -0
  435. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  436. package/out/zero-protocol/src/mutate-server.js.map +1 -1
  437. package/out/zero-protocol/src/mutation-id.js.map +1 -1
  438. package/out/zero-protocol/src/mutation.js.map +1 -1
  439. package/out/zero-protocol/src/mutations-patch.js.map +1 -1
  440. package/out/zero-protocol/src/ping.js.map +1 -1
  441. package/out/zero-protocol/src/poke.js +4 -0
  442. package/out/zero-protocol/src/poke.js.map +1 -1
  443. package/out/zero-protocol/src/pong.js.map +1 -1
  444. package/out/zero-protocol/src/primary-key.js.map +1 -1
  445. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  446. package/out/zero-protocol/src/pull.js.map +1 -1
  447. package/out/zero-protocol/src/push.js +16 -0
  448. package/out/zero-protocol/src/push.js.map +1 -1
  449. package/out/zero-protocol/src/queries-patch.js.map +1 -1
  450. package/out/zero-protocol/src/query-hash.js.map +1 -1
  451. package/out/zero-protocol/src/query-server.js.map +1 -1
  452. package/out/zero-protocol/src/row-patch.js.map +1 -1
  453. package/out/zero-protocol/src/up.js.map +1 -1
  454. package/out/zero-protocol/src/update-auth.js.map +1 -1
  455. package/out/zero-protocol/src/version.js.map +1 -1
  456. package/out/zero-react/src/use-connection-state.js.map +1 -1
  457. package/out/zero-react/src/use-query.d.ts.map +1 -1
  458. package/out/zero-react/src/use-query.js +2 -3
  459. package/out/zero-react/src/use-query.js.map +1 -1
  460. package/out/zero-react/src/use-zero-online.js.map +1 -1
  461. package/out/zero-react/src/zero-provider.js.map +1 -1
  462. package/out/zero-react/src/zero.js +1 -1
  463. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
  464. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  465. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  466. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  467. package/out/zero-schema/src/name-mapper.js.map +1 -1
  468. package/out/zero-schema/src/schema-config.js.map +1 -1
  469. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  470. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  471. package/out/zero-server/src/adapters/pg.js.map +1 -1
  472. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  473. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  474. package/out/zero-server/src/custom.js +2 -1
  475. package/out/zero-server/src/custom.js.map +1 -1
  476. package/out/zero-server/src/logging.js.map +1 -1
  477. package/out/zero-server/src/pg-query-executor.js.map +1 -1
  478. package/out/zero-server/src/process-mutations.js.map +1 -1
  479. package/out/zero-server/src/push-processor.js.map +1 -1
  480. package/out/zero-server/src/queries/process-queries.js +1 -1
  481. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  482. package/out/zero-server/src/schema.d.ts.map +1 -1
  483. package/out/zero-server/src/schema.js +1 -0
  484. package/out/zero-server/src/schema.js.map +1 -1
  485. package/out/zero-server/src/zql-database.js.map +1 -1
  486. package/out/zero-solid/src/solid-view.d.ts +42 -0
  487. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  488. package/out/zero-solid/src/solid-view.js +43 -2
  489. package/out/zero-solid/src/solid-view.js.map +1 -1
  490. package/out/zero-solid/src/use-connection-state.js.map +1 -1
  491. package/out/zero-solid/src/use-query.js +1 -1
  492. package/out/zero-solid/src/use-query.js.map +1 -1
  493. package/out/zero-solid/src/use-zero-online.js.map +1 -1
  494. package/out/zero-solid/src/use-zero.js.map +1 -1
  495. package/out/zero-solid/src/zero.js +1 -1
  496. package/out/zero-types/src/format.js.map +1 -1
  497. package/out/zero-types/src/name-mapper.js.map +1 -1
  498. package/out/zql/src/builder/builder.js.map +1 -1
  499. package/out/zql/src/builder/debug-delegate.d.ts +5 -0
  500. package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
  501. package/out/zql/src/builder/debug-delegate.js +10 -1
  502. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  503. package/out/zql/src/builder/filter.d.ts.map +1 -1
  504. package/out/zql/src/builder/filter.js +5 -4
  505. package/out/zql/src/builder/filter.js.map +1 -1
  506. package/out/zql/src/builder/like.js +1 -1
  507. package/out/zql/src/builder/like.js.map +1 -1
  508. package/out/zql/src/error.js.map +1 -1
  509. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  510. package/out/zql/src/ivm/array-view.js +5 -3
  511. package/out/zql/src/ivm/array-view.js.map +1 -1
  512. package/out/zql/src/ivm/cap.js.map +1 -1
  513. package/out/zql/src/ivm/change.js.map +1 -1
  514. package/out/zql/src/ivm/constraint.js +1 -1
  515. package/out/zql/src/ivm/constraint.js.map +1 -1
  516. package/out/zql/src/ivm/data.js.map +1 -1
  517. package/out/zql/src/ivm/exists.js.map +1 -1
  518. package/out/zql/src/ivm/fan-in.js.map +1 -1
  519. package/out/zql/src/ivm/fan-out.js.map +1 -1
  520. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  521. package/out/zql/src/ivm/filter-push.js.map +1 -1
  522. package/out/zql/src/ivm/filter.js.map +1 -1
  523. package/out/zql/src/ivm/flipped-join.d.ts +4 -8
  524. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  525. package/out/zql/src/ivm/flipped-join.js +59 -63
  526. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  527. package/out/zql/src/ivm/join-utils.js.map +1 -1
  528. package/out/zql/src/ivm/join.js.map +1 -1
  529. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  530. package/out/zql/src/ivm/memory-source.js.map +1 -1
  531. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  532. package/out/zql/src/ivm/operator.d.ts +1 -1
  533. package/out/zql/src/ivm/operator.js.map +1 -1
  534. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  535. package/out/zql/src/ivm/schema.d.ts +0 -8
  536. package/out/zql/src/ivm/schema.d.ts.map +1 -1
  537. package/out/zql/src/ivm/skip-yields.js.map +1 -1
  538. package/out/zql/src/ivm/skip.js.map +1 -1
  539. package/out/zql/src/ivm/source.js.map +1 -1
  540. package/out/zql/src/ivm/stream.js.map +1 -1
  541. package/out/zql/src/ivm/take.js.map +1 -1
  542. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  543. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  544. package/out/zql/src/ivm/view-apply-change.d.ts +57 -3
  545. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  546. package/out/zql/src/ivm/view-apply-change.js +296 -123
  547. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  548. package/out/zql/src/mutate/crud.js.map +1 -1
  549. package/out/zql/src/mutate/custom.js.map +1 -1
  550. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  551. package/out/zql/src/mutate/mutator.js.map +1 -1
  552. package/out/zql/src/planner/planner-builder.js.map +1 -1
  553. package/out/zql/src/planner/planner-connection.js.map +1 -1
  554. package/out/zql/src/planner/planner-constraint.js.map +1 -1
  555. package/out/zql/src/planner/planner-debug.js.map +1 -1
  556. package/out/zql/src/planner/planner-fan-in.js.map +1 -1
  557. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  558. package/out/zql/src/planner/planner-graph.js.map +1 -1
  559. package/out/zql/src/planner/planner-join.d.ts.map +1 -1
  560. package/out/zql/src/planner/planner-join.js +2 -1
  561. package/out/zql/src/planner/planner-join.js.map +1 -1
  562. package/out/zql/src/planner/planner-node.js.map +1 -1
  563. package/out/zql/src/planner/planner-source.js.map +1 -1
  564. package/out/zql/src/planner/planner-terminus.js.map +1 -1
  565. package/out/zql/src/query/complete-ordering.js.map +1 -1
  566. package/out/zql/src/query/create-builder.js.map +1 -1
  567. package/out/zql/src/query/error.js.map +1 -1
  568. package/out/zql/src/query/escape-like.js.map +1 -1
  569. package/out/zql/src/query/expression.js.map +1 -1
  570. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  571. package/out/zql/src/query/metrics-delegate.js.map +1 -1
  572. package/out/zql/src/query/named.js.map +1 -1
  573. package/out/zql/src/query/query-delegate-base.js +1 -3
  574. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  575. package/out/zql/src/query/query-impl.js.map +1 -1
  576. package/out/zql/src/query/query-internals.js.map +1 -1
  577. package/out/zql/src/query/query-registry.js.map +1 -1
  578. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  579. package/out/zql/src/query/static-query.js.map +1 -1
  580. package/out/zql/src/query/ttl.js.map +1 -1
  581. package/out/zql/src/query/validate-input.js.map +1 -1
  582. package/out/zqlite/src/database-storage.js.map +1 -1
  583. package/out/zqlite/src/db.d.ts.map +1 -1
  584. package/out/zqlite/src/db.js +1 -0
  585. package/out/zqlite/src/db.js.map +1 -1
  586. package/out/zqlite/src/explain-queries.js.map +1 -1
  587. package/out/zqlite/src/internal/sql-inline.js.map +1 -1
  588. package/out/zqlite/src/internal/sql.js.map +1 -1
  589. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  590. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  591. package/out/zqlite/src/query-builder.js +12 -1
  592. package/out/zqlite/src/query-builder.js.map +1 -1
  593. package/out/zqlite/src/query-delegate.js.map +1 -1
  594. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  595. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  596. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  597. package/out/zqlite/src/table-source.d.ts.map +1 -1
  598. package/out/zqlite/src/table-source.js +6 -6
  599. package/out/zqlite/src/table-source.js.map +1 -1
  600. package/package.json +45 -28
  601. package/out/zero-client/src/util/socket.d.ts +0 -3
  602. package/out/zero-client/src/util/socket.d.ts.map +0 -1
  603. package/out/zero-client/src/util/socket.js +0 -8
  604. package/out/zero-client/src/util/socket.js.map +0 -1
  605. package/out/zero-schema/src/permissions.d.ts.map +0 -1
  606. package/out/zero-schema/src/permissions.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"zero-provider.js","names":[],"sources":["../../../../zero-react/src/zero-provider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport {stringCompare} from '../../shared/src/string-compare.ts';\nimport {\n Zero,\n type BaseDefaultContext,\n type BaseDefaultSchema,\n type CustomMutatorDefs,\n type DefaultContext,\n type DefaultSchema,\n type ZeroOptions,\n} from './zero.ts';\n\n// oxlint-disable-next-line no-explicit-any\nexport const ZeroContext = createContext<Zero<any, any, any> | undefined>(\n undefined,\n);\n\nexport function useZero<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context extends BaseDefaultContext = DefaultContext,\n>(): Zero<S, MD, Context> {\n const zero = useContext(ZeroContext);\n if (zero === undefined) {\n throw new Error('useZero must be used within a ZeroProvider');\n }\n return zero as Zero<S, MD, Context>;\n}\n\n/**\n * @deprecated Use {@linkcode useZero} instead, alongside default types defined with:\n *\n * ```ts\n * declare module '@rocicorp/zero' {\n * interface DefaultTypes {\n * schema: typeof schema;\n * context: Context;\n * }\n * }\n */\nexport function createUseZero<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context extends BaseDefaultContext = DefaultContext,\n>() {\n return () => useZero<S, MD, Context>();\n}\n\nexport type ZeroProviderProps<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context extends BaseDefaultContext = DefaultContext,\n> = (ZeroOptions<S, MD, Context> | {zero: Zero<S, MD, Context>}) & {\n /**\n * Called after ZeroProvider constructs a new Zero instance.\n *\n * This runs only when the provider creates Zero from options, and is not\n * called when an existing instance is passed with `zero`.\n */\n init?: (zero: Zero<S, MD, Context>) => void;\n children: ReactNode;\n};\n\nexport function ZeroProvider<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context extends BaseDefaultContext = DefaultContext,\n>({children, init, ...props}: ZeroProviderProps<S, MD, Context>) {\n const isExternalZero = 'zero' in props;\n\n const [zero, setZero] = useState<Zero<S, MD, Context> | undefined>(\n isExternalZero ? props.zero : undefined,\n );\n const [rotationGeneration, setRotationGeneration] = useState(0);\n\n const auth = 'auth' in props ? props.auth : undefined;\n const hasAuth = typeof auth === 'string';\n const prevAuthRef = useRef<typeof auth>(auth);\n const rotationPendingRef = useRef(false);\n\n const scheduleRotation = () => {\n if (rotationPendingRef.current) {\n return;\n }\n rotationPendingRef.current = true;\n setRotationGeneration(gen => gen + 1);\n };\n\n const keysWithoutAuth = useMemo(\n () =>\n Object.entries(props)\n .filter(([key]) => key !== 'auth')\n .sort(([a], [b]) => stringCompare(a, b))\n .map(([_, value]) => value),\n [props],\n );\n\n // If Zero is not passed in, we construct it, but only client-side.\n // Zero doesn't really work SSR today so this is usually the right thing.\n // When we support Zero SSR this will either become a breaking change or\n // more likely server support will be opt-in with a new prop on this\n // component.\n useEffect(() => {\n if (isExternalZero) {\n rotationPendingRef.current = false;\n setZero(props.zero);\n return;\n }\n\n const z = new Zero({\n ...props,\n onClientStateNotFound: () => {\n if (rotationPendingRef.current) {\n return;\n }\n\n if (props.onClientStateNotFound) {\n try {\n props.onClientStateNotFound();\n return;\n } catch {\n // rotate since zero client is now closed\n }\n }\n\n scheduleRotation();\n },\n });\n prevAuthRef.current = auth;\n init?.(z);\n setZero(z);\n rotationPendingRef.current = false;\n\n return () => {\n void z.close();\n setZero(undefined);\n };\n // we intentionally don't include auth in the dependency array\n // to avoid closing zero when auth changes\n }, [hasAuth, init, rotationGeneration, ...keysWithoutAuth]);\n\n useEffect(() => {\n if (!zero || isExternalZero) return;\n\n const prevAuth = prevAuthRef.current;\n const authChanged = auth !== prevAuth;\n\n if (authChanged) {\n prevAuthRef.current = auth;\n\n if (typeof prevAuth === 'string' && typeof auth === 'string') {\n void zero.connection.connect({auth});\n }\n }\n }, [auth, zero]);\n\n return (\n zero && <ZeroContext.Provider value={zero}>{children}</ZeroContext.Provider>\n );\n}\n"],"mappings":";;;;;;AAqBA,IAAa,cAAc,cACzB,KAAA,EACD;AAED,SAAgB,UAIU;CACxB,MAAM,OAAO,WAAW,YAAY;AACpC,KAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,6CAA6C;AAE/D,QAAO;;;;;;;;;;;;;AAcT,SAAgB,gBAIZ;AACF,cAAa,SAAyB;;AAkBxC,SAAgB,aAId,EAAC,UAAU,MAAM,GAAG,SAA2C;CAC/D,MAAM,iBAAiB,UAAU;CAEjC,MAAM,CAAC,MAAM,WAAW,SACtB,iBAAiB,MAAM,OAAO,KAAA,EAC/B;CACD,MAAM,CAAC,oBAAoB,yBAAyB,SAAS,EAAE;CAE/D,MAAM,OAAO,UAAU,QAAQ,MAAM,OAAO,KAAA;CAC5C,MAAM,UAAU,OAAO,SAAS;CAChC,MAAM,cAAc,OAAoB,KAAK;CAC7C,MAAM,qBAAqB,OAAO,MAAM;CAExC,MAAM,yBAAyB;AAC7B,MAAI,mBAAmB,QACrB;AAEF,qBAAmB,UAAU;AAC7B,yBAAsB,QAAO,MAAM,EAAE;;AAiBvC,iBAAgB;AACd,MAAI,gBAAgB;AAClB,sBAAmB,UAAU;AAC7B,WAAQ,MAAM,KAAK;AACnB;;EAGF,MAAM,IAAI,IAAI,KAAK;GACjB,GAAG;GACH,6BAA6B;AAC3B,QAAI,mBAAmB,QACrB;AAGF,QAAI,MAAM,sBACR,KAAI;AACF,WAAM,uBAAuB;AAC7B;YACM;AAKV,sBAAkB;;GAErB,CAAC;AACF,cAAY,UAAU;AACtB,SAAO,EAAE;AACT,UAAQ,EAAE;AACV,qBAAmB,UAAU;AAE7B,eAAa;AACN,KAAE,OAAO;AACd,WAAQ,KAAA,EAAU;;IAInB;EAAC;EAAS;EAAM;EAAoB,GAnDf,cAEpB,OAAO,QAAQ,MAAM,CAClB,QAAQ,CAAC,SAAS,QAAQ,OAAO,CACjC,MAAM,CAAC,IAAI,CAAC,OAAO,cAAc,GAAG,EAAE,CAAC,CACvC,KAAK,CAAC,GAAG,WAAW,MAAM,EAC/B,CAAC,MAAM,CACR;EA4CyD,CAAC;AAE3D,iBAAgB;AACd,MAAI,CAAC,QAAQ,eAAgB;EAE7B,MAAM,WAAW,YAAY;AAG7B,MAFoB,SAAS,UAEZ;AACf,eAAY,UAAU;AAEtB,OAAI,OAAO,aAAa,YAAY,OAAO,SAAS,SAC7C,MAAK,WAAW,QAAQ,EAAC,MAAK,CAAC;;IAGvC,CAAC,MAAM,KAAK,CAAC;AAEhB,QACE,QAAQ,oBAAC,YAAY,UAAb;EAAsB,OAAO;EAAO;EAAgC,CAAA"}
1
+ {"version":3,"file":"zero-provider.js","names":[],"sources":["../../../../zero-react/src/zero-provider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport {stringCompare} from '../../shared/src/string-compare.ts';\nimport {\n Zero,\n type BaseDefaultContext,\n type BaseDefaultSchema,\n type CustomMutatorDefs,\n type DefaultContext,\n type DefaultSchema,\n type ZeroOptions,\n} from './zero.ts';\n\n// oxlint-disable-next-line no-explicit-any\nexport const ZeroContext = createContext<Zero<any, any, any> | undefined>(\n undefined,\n);\n\nexport function useZero<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context extends BaseDefaultContext = DefaultContext,\n>(): Zero<S, MD, Context> {\n const zero = useContext(ZeroContext);\n if (zero === undefined) {\n throw new Error('useZero must be used within a ZeroProvider');\n }\n return zero as Zero<S, MD, Context>;\n}\n\n/**\n * @deprecated Use {@linkcode useZero} instead, alongside default types defined with:\n *\n * ```ts\n * declare module '@rocicorp/zero' {\n * interface DefaultTypes {\n * schema: typeof schema;\n * context: Context;\n * }\n * }\n */\nexport function createUseZero<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context extends BaseDefaultContext = DefaultContext,\n>() {\n return () => useZero<S, MD, Context>();\n}\n\nexport type ZeroProviderProps<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context extends BaseDefaultContext = DefaultContext,\n> = (ZeroOptions<S, MD, Context> | {zero: Zero<S, MD, Context>}) & {\n /**\n * Called after ZeroProvider constructs a new Zero instance.\n *\n * This runs only when the provider creates Zero from options, and is not\n * called when an existing instance is passed with `zero`.\n */\n init?: (zero: Zero<S, MD, Context>) => void;\n children: ReactNode;\n};\n\nexport function ZeroProvider<\n S extends BaseDefaultSchema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context extends BaseDefaultContext = DefaultContext,\n>({children, init, ...props}: ZeroProviderProps<S, MD, Context>) {\n const isExternalZero = 'zero' in props;\n\n const [zero, setZero] = useState<Zero<S, MD, Context> | undefined>(\n isExternalZero ? props.zero : undefined,\n );\n const [rotationGeneration, setRotationGeneration] = useState(0);\n\n const auth = 'auth' in props ? props.auth : undefined;\n const hasAuth = typeof auth === 'string';\n const prevAuthRef = useRef<typeof auth>(auth);\n const rotationPendingRef = useRef(false);\n\n const scheduleRotation = () => {\n if (rotationPendingRef.current) {\n return;\n }\n rotationPendingRef.current = true;\n setRotationGeneration(gen => gen + 1);\n };\n\n const keysWithoutAuth = useMemo(\n () =>\n Object.entries(props)\n .filter(([key]) => key !== 'auth')\n .sort(([a], [b]) => stringCompare(a, b))\n .map(([_, value]) => value),\n [props],\n );\n\n // If Zero is not passed in, we construct it, but only client-side.\n // Zero doesn't really work SSR today so this is usually the right thing.\n // When we support Zero SSR this will either become a breaking change or\n // more likely server support will be opt-in with a new prop on this\n // component.\n useEffect(() => {\n if (isExternalZero) {\n rotationPendingRef.current = false;\n setZero(props.zero);\n return;\n }\n\n const z = new Zero({\n ...props,\n onClientStateNotFound: () => {\n if (rotationPendingRef.current) {\n return;\n }\n\n if (props.onClientStateNotFound) {\n try {\n props.onClientStateNotFound();\n return;\n } catch {\n // rotate since zero client is now closed\n }\n }\n\n scheduleRotation();\n },\n });\n prevAuthRef.current = auth;\n init?.(z);\n setZero(z);\n rotationPendingRef.current = false;\n\n return () => {\n void z.close();\n setZero(undefined);\n };\n // we intentionally don't include auth in the dependency array\n // to avoid closing zero when auth changes\n }, [hasAuth, init, rotationGeneration, ...keysWithoutAuth]);\n\n useEffect(() => {\n if (!zero || isExternalZero) return;\n\n const prevAuth = prevAuthRef.current;\n const authChanged = auth !== prevAuth;\n\n if (authChanged) {\n prevAuthRef.current = auth;\n\n if (typeof prevAuth === 'string' && typeof auth === 'string') {\n void zero.connection.connect({auth});\n }\n }\n }, [auth, zero]);\n\n return (\n zero && <ZeroContext.Provider value={zero}>{children}</ZeroContext.Provider>\n );\n}\n"],"mappings":";;;;;;AAqBA,IAAa,cAAc,cACzB,KAAA,CACF;AAEA,SAAgB,UAIU;CACxB,MAAM,OAAO,WAAW,WAAW;CACnC,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,4CAA4C;CAE9D,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,gBAIZ;CACF,aAAa,QAAwB;AACvC;AAiBA,SAAgB,aAId,EAAC,UAAU,MAAM,GAAG,SAA2C;CAC/D,MAAM,iBAAiB,UAAU;CAEjC,MAAM,CAAC,MAAM,WAAW,SACtB,iBAAiB,MAAM,OAAO,KAAA,CAChC;CACA,MAAM,CAAC,oBAAoB,yBAAyB,SAAS,CAAC;CAE9D,MAAM,OAAO,UAAU,QAAQ,MAAM,OAAO,KAAA;CAC5C,MAAM,UAAU,OAAO,SAAS;CAChC,MAAM,cAAc,OAAoB,IAAI;CAC5C,MAAM,qBAAqB,OAAO,KAAK;CAEvC,MAAM,yBAAyB;EAC7B,IAAI,mBAAmB,SACrB;EAEF,mBAAmB,UAAU;EAC7B,uBAAsB,QAAO,MAAM,CAAC;CACtC;CAgBA,gBAAgB;EACd,IAAI,gBAAgB;GAClB,mBAAmB,UAAU;GAC7B,QAAQ,MAAM,IAAI;GAClB;EACF;EAEA,MAAM,IAAI,IAAI,KAAK;GACjB,GAAG;GACH,6BAA6B;IAC3B,IAAI,mBAAmB,SACrB;IAGF,IAAI,MAAM,uBACR,IAAI;KACF,MAAM,sBAAsB;KAC5B;IACF,QAAQ,CAER;IAGF,iBAAiB;GACnB;EACF,CAAC;EACD,YAAY,UAAU;EACtB,OAAO,CAAC;EACR,QAAQ,CAAC;EACT,mBAAmB,UAAU;EAE7B,aAAa;GACX,EAAO,MAAM;GACb,QAAQ,KAAA,CAAS;EACnB;CAGF,GAAG;EAAC;EAAS;EAAM;EAAoB,GAnDf,cAEpB,OAAO,QAAQ,KAAK,EACjB,QAAQ,CAAC,SAAS,QAAQ,MAAM,EAChC,MAAM,CAAC,IAAI,CAAC,OAAO,cAAc,GAAG,CAAC,CAAC,EACtC,KAAK,CAAC,GAAG,WAAW,KAAK,GAC9B,CAAC,KAAK,CA6CkC;CAAe,CAAC;CAE1D,gBAAgB;EACd,IAAI,CAAC,QAAQ,gBAAgB;EAE7B,MAAM,WAAW,YAAY;EAG7B,IAFoB,SAAS,UAEZ;GACf,YAAY,UAAU;GAEtB,IAAI,OAAO,aAAa,YAAY,OAAO,SAAS,UAClD,KAAU,WAAW,QAAQ,EAAC,KAAI,CAAC;EAEvC;CACF,GAAG,CAAC,MAAM,IAAI,CAAC;CAEf,OACE,QAAQ,oBAAC,YAAY,UAAb;EAAsB,OAAO;EAAO;CAA+B,CAAA;AAE/E"}
@@ -8,7 +8,7 @@ import "../../zero-protocol/src/custom-queries.js";
8
8
  import "../../zero-schema/src/builder/relationship-builder.js";
9
9
  import "../../zero-schema/src/builder/table-builder.js";
10
10
  import "../../zero-schema/src/builder/schema-builder.js";
11
- import "../../zero-schema/src/permissions.js";
11
+ import "../../zero-permissions/src/permissions.js";
12
12
  import "../../zql/src/query/validate-input.js";
13
13
  import "../../zql/src/mutate/mutator.js";
14
14
  import "../../zql/src/mutate/mutator-registry.js";
@@ -1 +1 @@
1
- {"version":3,"file":"relationship-builder.js","names":[],"sources":["../../../../../zero-schema/src/builder/relationship-builder.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport type {Relationship, TableSchema} from '../table-schema.ts';\nimport type {TableBuilderWithColumns} from './table-builder.ts';\n\ntype ConnectArg<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TableBuilderWithColumns<TDest>;\n};\n\ntype ManyConnection<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TDest['name'];\n readonly cardinality: 'many';\n};\n\ntype OneConnection<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TDest['name'];\n readonly cardinality: 'one';\n};\n\ntype Prev = [-1, 0, 1, 2, 3, 4, 5, 6];\n\nexport type PreviousSchema<\n TSource extends TableSchema,\n K extends number,\n TDests extends TableSchema[],\n> = K extends 0 ? TSource : TDests[Prev[K]];\n\nexport type Relationships = {\n name: string; // table name\n relationships: Record<string, Relationship>; // relationships for that table\n};\n\n// Overloaded types for better inference\ntype ManyConnector<TSource extends TableSchema> = {\n // Single direct relationship\n <TDest extends TableSchema>(\n arg: ConnectArg<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ): [\n ManyConnection<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ];\n\n // Junction relationship (two hops)\n <TJunction extends TableSchema, TDest extends TableSchema>(\n firstHop: ConnectArg<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TJunction['columns'] & string)[],\n TJunction\n >,\n secondHop: ConnectArg<\n readonly (keyof TJunction['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ): [\n ManyConnection<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TJunction['columns'] & string)[],\n TJunction\n >,\n ManyConnection<\n readonly (keyof TJunction['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ];\n};\n\ntype OneConnector<TSource extends TableSchema> = {\n // Single direct relationship\n <TDest extends TableSchema>(\n arg: ConnectArg<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ): [\n OneConnection<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ];\n\n // Two-hop relationship (e.g., invoice_line -> invoice -> customer)\n <TIntermediate extends TableSchema, TDest extends TableSchema>(\n firstHop: ConnectArg<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TIntermediate['columns'] & string)[],\n TIntermediate\n >,\n secondHop: ConnectArg<\n readonly (keyof TIntermediate['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ): [\n OneConnection<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TIntermediate['columns'] & string)[],\n TIntermediate\n >,\n OneConnection<\n readonly (keyof TIntermediate['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ];\n};\n\nexport function relationships<\n TSource extends TableSchema,\n TRelationships extends Record<string, Relationship>,\n>(\n table: TableBuilderWithColumns<TSource>,\n cb: (connects: {\n many: ManyConnector<TSource>;\n one: OneConnector<TSource>;\n }) => TRelationships,\n): {name: TSource['name']; relationships: TRelationships} {\n const relationships = cb({many, one} as any);\n\n return {\n name: table.schema.name,\n relationships,\n };\n}\n\nfunction many(\n ...args: readonly ConnectArg<any, any, TableSchema>[]\n): ManyConnection<any, any, any>[] {\n return args.map(arg => ({\n sourceField: arg.sourceField,\n destField: arg.destField,\n destSchema: arg.destSchema.schema.name,\n cardinality: 'many',\n }));\n}\n\nfunction one(\n ...args: readonly ConnectArg<any, any, TableSchema>[]\n): OneConnection<any, any, any>[] {\n return args.map(arg => ({\n sourceField: arg.sourceField,\n destField: arg.destField,\n destSchema: arg.destSchema.schema.name,\n cardinality: 'one',\n }));\n}\n"],"mappings":";AA0HA,SAAgB,cAId,OACA,IAIwD;CACxD,MAAM,gBAAgB,GAAG;EAAC;EAAM;EAAI,CAAQ;AAE5C,QAAO;EACL,MAAM,MAAM,OAAO;EACnB;EACD;;AAGH,SAAS,KACP,GAAG,MAC8B;AACjC,QAAO,KAAK,KAAI,SAAQ;EACtB,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,YAAY,IAAI,WAAW,OAAO;EAClC,aAAa;EACd,EAAE;;AAGL,SAAS,IACP,GAAG,MAC6B;AAChC,QAAO,KAAK,KAAI,SAAQ;EACtB,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,YAAY,IAAI,WAAW,OAAO;EAClC,aAAa;EACd,EAAE"}
1
+ {"version":3,"file":"relationship-builder.js","names":[],"sources":["../../../../../zero-schema/src/builder/relationship-builder.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport type {Relationship, TableSchema} from '../table-schema.ts';\nimport type {TableBuilderWithColumns} from './table-builder.ts';\n\ntype ConnectArg<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TableBuilderWithColumns<TDest>;\n};\n\ntype ManyConnection<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TDest['name'];\n readonly cardinality: 'many';\n};\n\ntype OneConnection<TSourceField, TDestField, TDest extends TableSchema> = {\n readonly sourceField: TSourceField;\n readonly destField: TDestField;\n readonly destSchema: TDest['name'];\n readonly cardinality: 'one';\n};\n\ntype Prev = [-1, 0, 1, 2, 3, 4, 5, 6];\n\nexport type PreviousSchema<\n TSource extends TableSchema,\n K extends number,\n TDests extends TableSchema[],\n> = K extends 0 ? TSource : TDests[Prev[K]];\n\nexport type Relationships = {\n name: string; // table name\n relationships: Record<string, Relationship>; // relationships for that table\n};\n\n// Overloaded types for better inference\ntype ManyConnector<TSource extends TableSchema> = {\n // Single direct relationship\n <TDest extends TableSchema>(\n arg: ConnectArg<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ): [\n ManyConnection<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ];\n\n // Junction relationship (two hops)\n <TJunction extends TableSchema, TDest extends TableSchema>(\n firstHop: ConnectArg<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TJunction['columns'] & string)[],\n TJunction\n >,\n secondHop: ConnectArg<\n readonly (keyof TJunction['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ): [\n ManyConnection<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TJunction['columns'] & string)[],\n TJunction\n >,\n ManyConnection<\n readonly (keyof TJunction['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ];\n};\n\ntype OneConnector<TSource extends TableSchema> = {\n // Single direct relationship\n <TDest extends TableSchema>(\n arg: ConnectArg<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ): [\n OneConnection<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ];\n\n // Two-hop relationship (e.g., invoice_line -> invoice -> customer)\n <TIntermediate extends TableSchema, TDest extends TableSchema>(\n firstHop: ConnectArg<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TIntermediate['columns'] & string)[],\n TIntermediate\n >,\n secondHop: ConnectArg<\n readonly (keyof TIntermediate['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ): [\n OneConnection<\n readonly (keyof TSource['columns'] & string)[],\n readonly (keyof TIntermediate['columns'] & string)[],\n TIntermediate\n >,\n OneConnection<\n readonly (keyof TIntermediate['columns'] & string)[],\n readonly (keyof TDest['columns'] & string)[],\n TDest\n >,\n ];\n};\n\nexport function relationships<\n TSource extends TableSchema,\n TRelationships extends Record<string, Relationship>,\n>(\n table: TableBuilderWithColumns<TSource>,\n cb: (connects: {\n many: ManyConnector<TSource>;\n one: OneConnector<TSource>;\n }) => TRelationships,\n): {name: TSource['name']; relationships: TRelationships} {\n const relationships = cb({many, one} as any);\n\n return {\n name: table.schema.name,\n relationships,\n };\n}\n\nfunction many(\n ...args: readonly ConnectArg<any, any, TableSchema>[]\n): ManyConnection<any, any, any>[] {\n return args.map(arg => ({\n sourceField: arg.sourceField,\n destField: arg.destField,\n destSchema: arg.destSchema.schema.name,\n cardinality: 'many',\n }));\n}\n\nfunction one(\n ...args: readonly ConnectArg<any, any, TableSchema>[]\n): OneConnection<any, any, any>[] {\n return args.map(arg => ({\n sourceField: arg.sourceField,\n destField: arg.destField,\n destSchema: arg.destSchema.schema.name,\n cardinality: 'one',\n }));\n}\n"],"mappings":";AA0HA,SAAgB,cAId,OACA,IAIwD;CACxD,MAAM,gBAAgB,GAAG;EAAC;EAAM;CAAG,CAAQ;CAE3C,OAAO;EACL,MAAM,MAAM,OAAO;EACnB;CACF;AACF;AAEA,SAAS,KACP,GAAG,MAC8B;CACjC,OAAO,KAAK,KAAI,SAAQ;EACtB,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,YAAY,IAAI,WAAW,OAAO;EAClC,aAAa;CACf,EAAE;AACJ;AAEA,SAAS,IACP,GAAG,MAC6B;CAChC,OAAO,KAAK,KAAI,SAAQ;EACtB,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,YAAY,IAAI,WAAW,OAAO;EAClC,aAAa;CACf,EAAE;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema-builder.js","names":[],"sources":["../../../../../zero-schema/src/builder/schema-builder.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport {h64} from '../../../shared/src/hash.ts';\nimport {mapEntries} from '../../../shared/src/objects.ts';\nimport {\n normalizeClientSchema,\n type ClientSchema,\n} from '../../../zero-protocol/src/client-schema.ts';\nimport type {\n Relationship,\n Schema,\n TableSchema,\n} from '../../../zero-types/src/schema.ts';\nimport type {Relationships} from './relationship-builder.ts';\nimport {type TableBuilderWithColumns} from './table-builder.ts';\n\n/**\n * Note: the keys of the `tables` and `relationships` parameters do not matter.\n * You can assign them to any value you like. E.g.,\n *\n * ```ts\n * createSchema({rsdfgafg: table('users')...}, {sdfd: relationships(users, ...)})\n * ```\n */\nexport function createSchema<\n const TTables extends readonly TableBuilderWithColumns<TableSchema>[],\n const TRelationships extends readonly Relationships[],\n const TEnableLegacyQueries extends boolean | undefined,\n const TEnableLegacyMutators extends boolean | undefined,\n>(options: {\n readonly tables: TTables;\n readonly relationships?: TRelationships | undefined;\n /** @see Schema.enableLegacyQueries */\n readonly enableLegacyQueries?: TEnableLegacyQueries | undefined;\n /** @see Schema.enableLegacyMutators */\n readonly enableLegacyMutators?: TEnableLegacyMutators | undefined;\n}): {\n tables: {\n readonly [K in TTables[number]['schema']['name']]: Extract<\n TTables[number]['schema'],\n {name: K}\n >;\n };\n relationships: {\n readonly [K in TRelationships[number]['name']]: Extract<\n TRelationships[number],\n {name: K}\n >['relationships'];\n };\n enableLegacyQueries: TEnableLegacyQueries;\n enableLegacyMutators: TEnableLegacyMutators;\n} {\n const retTables: Record<string, TableSchema> = {};\n const retRelationships: Record<string, Record<string, Relationship>> = {};\n const serverNames = new Set<string>();\n\n options.tables.forEach(table => {\n const {serverName = table.schema.name} = table.schema;\n if (serverNames.has(serverName)) {\n throw new Error(`Multiple tables reference the name \"${serverName}\"`);\n }\n serverNames.add(serverName);\n if (Object.hasOwn(retTables, table.schema.name)) {\n throw new Error(\n `Table \"${table.schema.name}\" is defined more than once in the schema`,\n );\n }\n retTables[table.schema.name] = table.build();\n });\n options.relationships?.forEach(relationships => {\n if (retRelationships[relationships.name]) {\n throw new Error(\n `Relationships for table \"${relationships.name}\" are defined more than once in the schema`,\n );\n }\n retRelationships[relationships.name] = relationships.relationships;\n checkRelationship(\n relationships.relationships,\n relationships.name,\n retTables,\n );\n });\n\n return {\n tables: retTables,\n relationships: retRelationships,\n enableLegacyQueries: options.enableLegacyQueries,\n enableLegacyMutators: options.enableLegacyMutators,\n } as any;\n}\n\nfunction checkRelationship(\n relationships: Record<string, Relationship>,\n tableName: string,\n tables: Record<string, TableSchema>,\n) {\n // TS should be able to check this for us but something is preventing it from happening.\n Object.entries(relationships).forEach(([name, rel]) => {\n let source = tables[tableName];\n if (source.columns[name] !== undefined) {\n throw new Error(\n `Relationship \"${tableName}\".\"${name}\" cannot have the same name as the column \"${name}\" on the the table \"${source.name}\"`,\n );\n }\n rel.forEach(connection => {\n if (!tables[connection.destSchema]) {\n throw new Error(\n `For relationship \"${tableName}\".\"${name}\", destination table \"${connection.destSchema}\" is missing in the schema`,\n );\n }\n if (!source.columns[connection.sourceField[0]]) {\n throw new Error(\n `For relationship \"${tableName}\".\"${name}\", the source field \"${connection.sourceField[0]}\" is missing in the table schema \"${source.name}\"`,\n );\n }\n source = tables[connection.destSchema];\n });\n });\n}\n\nexport function clientSchemaFrom(schema: Schema): {\n clientSchema: ClientSchema;\n hash: string;\n} {\n const client = {\n tables: mapEntries(\n schema.tables,\n (name, {serverName, columns, primaryKey}) => [\n serverName ?? name,\n {\n columns: mapEntries(columns, (name, {serverName, type}) => [\n serverName ?? name,\n {type},\n ]),\n primaryKey: primaryKey.map(k => columns[k].serverName ?? k),\n },\n ],\n ),\n } satisfies ClientSchema;\n const clientSchema = normalizeClientSchema(client);\n const hash = h64(JSON.stringify(clientSchema)).toString(36);\n return {clientSchema, hash};\n}\n"],"mappings":";;;;;;;;;;;;AAuBA,SAAgB,aAKd,SAsBA;CACA,MAAM,YAAyC,EAAE;CACjD,MAAM,mBAAiE,EAAE;CACzE,MAAM,8BAAc,IAAI,KAAa;AAErC,SAAQ,OAAO,SAAQ,UAAS;EAC9B,MAAM,EAAC,aAAa,MAAM,OAAO,SAAQ,MAAM;AAC/C,MAAI,YAAY,IAAI,WAAW,CAC7B,OAAM,IAAI,MAAM,uCAAuC,WAAW,GAAG;AAEvE,cAAY,IAAI,WAAW;AAC3B,MAAI,OAAO,OAAO,WAAW,MAAM,OAAO,KAAK,CAC7C,OAAM,IAAI,MACR,UAAU,MAAM,OAAO,KAAK,2CAC7B;AAEH,YAAU,MAAM,OAAO,QAAQ,MAAM,OAAO;GAC5C;AACF,SAAQ,eAAe,SAAQ,kBAAiB;AAC9C,MAAI,iBAAiB,cAAc,MACjC,OAAM,IAAI,MACR,4BAA4B,cAAc,KAAK,4CAChD;AAEH,mBAAiB,cAAc,QAAQ,cAAc;AACrD,oBACE,cAAc,eACd,cAAc,MACd,UACD;GACD;AAEF,QAAO;EACL,QAAQ;EACR,eAAe;EACf,qBAAqB,QAAQ;EAC7B,sBAAsB,QAAQ;EAC/B;;AAGH,SAAS,kBACP,eACA,WACA,QACA;AAEA,QAAO,QAAQ,cAAc,CAAC,SAAS,CAAC,MAAM,SAAS;EACrD,IAAI,SAAS,OAAO;AACpB,MAAI,OAAO,QAAQ,UAAU,KAAA,EAC3B,OAAM,IAAI,MACR,iBAAiB,UAAU,KAAK,KAAK,6CAA6C,KAAK,sBAAsB,OAAO,KAAK,GAC1H;AAEH,MAAI,SAAQ,eAAc;AACxB,OAAI,CAAC,OAAO,WAAW,YACrB,OAAM,IAAI,MACR,qBAAqB,UAAU,KAAK,KAAK,wBAAwB,WAAW,WAAW,4BACxF;AAEH,OAAI,CAAC,OAAO,QAAQ,WAAW,YAAY,IACzC,OAAM,IAAI,MACR,qBAAqB,UAAU,KAAK,KAAK,uBAAuB,WAAW,YAAY,GAAG,oCAAoC,OAAO,KAAK,GAC3I;AAEH,YAAS,OAAO,WAAW;IAC3B;GACF;;AAGJ,SAAgB,iBAAiB,QAG/B;CAgBA,MAAM,eAAe,sBAfN,EACb,QAAQ,WACN,OAAO,SACN,MAAM,EAAC,YAAY,SAAS,iBAAgB,CAC3C,cAAc,MACd;EACE,SAAS,WAAW,UAAU,MAAM,EAAC,YAAY,WAAU,CACzD,cAAc,MACd,EAAC,MAAK,CACP,CAAC;EACF,YAAY,WAAW,KAAI,MAAK,QAAQ,GAAG,cAAc,EAAE;EAC5D,CACF,CACF,EACF,CACiD;AAElD,QAAO;EAAC;EAAc,MADT,IAAI,KAAK,UAAU,aAAa,CAAC,CAAC,SAAS,GAAG;EAChC"}
1
+ {"version":3,"file":"schema-builder.js","names":[],"sources":["../../../../../zero-schema/src/builder/schema-builder.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport {h64} from '../../../shared/src/hash.ts';\nimport {mapEntries} from '../../../shared/src/objects.ts';\nimport {\n normalizeClientSchema,\n type ClientSchema,\n} from '../../../zero-protocol/src/client-schema.ts';\nimport type {\n Relationship,\n Schema,\n TableSchema,\n} from '../../../zero-types/src/schema.ts';\nimport type {Relationships} from './relationship-builder.ts';\nimport {type TableBuilderWithColumns} from './table-builder.ts';\n\n/**\n * Note: the keys of the `tables` and `relationships` parameters do not matter.\n * You can assign them to any value you like. E.g.,\n *\n * ```ts\n * createSchema({rsdfgafg: table('users')...}, {sdfd: relationships(users, ...)})\n * ```\n */\nexport function createSchema<\n const TTables extends readonly TableBuilderWithColumns<TableSchema>[],\n const TRelationships extends readonly Relationships[],\n const TEnableLegacyQueries extends boolean | undefined,\n const TEnableLegacyMutators extends boolean | undefined,\n>(options: {\n readonly tables: TTables;\n readonly relationships?: TRelationships | undefined;\n /** @see Schema.enableLegacyQueries */\n readonly enableLegacyQueries?: TEnableLegacyQueries | undefined;\n /** @see Schema.enableLegacyMutators */\n readonly enableLegacyMutators?: TEnableLegacyMutators | undefined;\n}): {\n tables: {\n readonly [K in TTables[number]['schema']['name']]: Extract<\n TTables[number]['schema'],\n {name: K}\n >;\n };\n relationships: {\n readonly [K in TRelationships[number]['name']]: Extract<\n TRelationships[number],\n {name: K}\n >['relationships'];\n };\n enableLegacyQueries: TEnableLegacyQueries;\n enableLegacyMutators: TEnableLegacyMutators;\n} {\n const retTables: Record<string, TableSchema> = {};\n const retRelationships: Record<string, Record<string, Relationship>> = {};\n const serverNames = new Set<string>();\n\n options.tables.forEach(table => {\n const {serverName = table.schema.name} = table.schema;\n if (serverNames.has(serverName)) {\n throw new Error(`Multiple tables reference the name \"${serverName}\"`);\n }\n serverNames.add(serverName);\n if (Object.hasOwn(retTables, table.schema.name)) {\n throw new Error(\n `Table \"${table.schema.name}\" is defined more than once in the schema`,\n );\n }\n retTables[table.schema.name] = table.build();\n });\n options.relationships?.forEach(relationships => {\n if (retRelationships[relationships.name]) {\n throw new Error(\n `Relationships for table \"${relationships.name}\" are defined more than once in the schema`,\n );\n }\n retRelationships[relationships.name] = relationships.relationships;\n checkRelationship(\n relationships.relationships,\n relationships.name,\n retTables,\n );\n });\n\n return {\n tables: retTables,\n relationships: retRelationships,\n enableLegacyQueries: options.enableLegacyQueries,\n enableLegacyMutators: options.enableLegacyMutators,\n } as any;\n}\n\nfunction checkRelationship(\n relationships: Record<string, Relationship>,\n tableName: string,\n tables: Record<string, TableSchema>,\n) {\n // TS should be able to check this for us but something is preventing it from happening.\n Object.entries(relationships).forEach(([name, rel]) => {\n let source = tables[tableName];\n if (source.columns[name] !== undefined) {\n throw new Error(\n `Relationship \"${tableName}\".\"${name}\" cannot have the same name as the column \"${name}\" on the the table \"${source.name}\"`,\n );\n }\n rel.forEach(connection => {\n if (!tables[connection.destSchema]) {\n throw new Error(\n `For relationship \"${tableName}\".\"${name}\", destination table \"${connection.destSchema}\" is missing in the schema`,\n );\n }\n if (!source.columns[connection.sourceField[0]]) {\n throw new Error(\n `For relationship \"${tableName}\".\"${name}\", the source field \"${connection.sourceField[0]}\" is missing in the table schema \"${source.name}\"`,\n );\n }\n source = tables[connection.destSchema];\n });\n });\n}\n\nexport function clientSchemaFrom(schema: Schema): {\n clientSchema: ClientSchema;\n hash: string;\n} {\n const client = {\n tables: mapEntries(\n schema.tables,\n (name, {serverName, columns, primaryKey}) => [\n serverName ?? name,\n {\n columns: mapEntries(columns, (name, {serverName, type}) => [\n serverName ?? name,\n {type},\n ]),\n primaryKey: primaryKey.map(k => columns[k].serverName ?? k),\n },\n ],\n ),\n } satisfies ClientSchema;\n const clientSchema = normalizeClientSchema(client);\n const hash = h64(JSON.stringify(clientSchema)).toString(36);\n return {clientSchema, hash};\n}\n"],"mappings":";;;;;;;;;;;;AAuBA,SAAgB,aAKd,SAsBA;CACA,MAAM,YAAyC,CAAC;CAChD,MAAM,mBAAiE,CAAC;CACxE,MAAM,8BAAc,IAAI,IAAY;CAEpC,QAAQ,OAAO,SAAQ,UAAS;EAC9B,MAAM,EAAC,aAAa,MAAM,OAAO,SAAQ,MAAM;EAC/C,IAAI,YAAY,IAAI,UAAU,GAC5B,MAAM,IAAI,MAAM,uCAAuC,WAAW,EAAE;EAEtE,YAAY,IAAI,UAAU;EAC1B,IAAI,OAAO,OAAO,WAAW,MAAM,OAAO,IAAI,GAC5C,MAAM,IAAI,MACR,UAAU,MAAM,OAAO,KAAK,0CAC9B;EAEF,UAAU,MAAM,OAAO,QAAQ,MAAM,MAAM;CAC7C,CAAC;CACD,QAAQ,eAAe,SAAQ,kBAAiB;EAC9C,IAAI,iBAAiB,cAAc,OACjC,MAAM,IAAI,MACR,4BAA4B,cAAc,KAAK,2CACjD;EAEF,iBAAiB,cAAc,QAAQ,cAAc;EACrD,kBACE,cAAc,eACd,cAAc,MACd,SACF;CACF,CAAC;CAED,OAAO;EACL,QAAQ;EACR,eAAe;EACf,qBAAqB,QAAQ;EAC7B,sBAAsB,QAAQ;CAChC;AACF;AAEA,SAAS,kBACP,eACA,WACA,QACA;CAEA,OAAO,QAAQ,aAAa,EAAE,SAAS,CAAC,MAAM,SAAS;EACrD,IAAI,SAAS,OAAO;EACpB,IAAI,OAAO,QAAQ,UAAU,KAAA,GAC3B,MAAM,IAAI,MACR,iBAAiB,UAAU,KAAK,KAAK,6CAA6C,KAAK,sBAAsB,OAAO,KAAK,EAC3H;EAEF,IAAI,SAAQ,eAAc;GACxB,IAAI,CAAC,OAAO,WAAW,aACrB,MAAM,IAAI,MACR,qBAAqB,UAAU,KAAK,KAAK,wBAAwB,WAAW,WAAW,2BACzF;GAEF,IAAI,CAAC,OAAO,QAAQ,WAAW,YAAY,KACzC,MAAM,IAAI,MACR,qBAAqB,UAAU,KAAK,KAAK,uBAAuB,WAAW,YAAY,GAAG,oCAAoC,OAAO,KAAK,EAC5I;GAEF,SAAS,OAAO,WAAW;EAC7B,CAAC;CACH,CAAC;AACH;AAEA,SAAgB,iBAAiB,QAG/B;CAgBA,MAAM,eAAe,sBAAsB,EAdzC,QAAQ,WACN,OAAO,SACN,MAAM,EAAC,YAAY,SAAS,iBAAgB,CAC3C,cAAc,MACd;EACE,SAAS,WAAW,UAAU,MAAM,EAAC,YAAY,WAAU,CACzD,cAAc,MACd,EAAC,KAAI,CACP,CAAC;EACD,YAAY,WAAW,KAAI,MAAK,QAAQ,GAAG,cAAc,CAAC;CAC5D,CACF,CACF,EAEyC,CAAM;CAEjD,OAAO;EAAC;EAAc,MADT,IAAI,KAAK,UAAU,YAAY,CAAC,EAAE,SAAS,EAClC;CAAI;AAC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"table-builder.js","names":["#schema"],"sources":["../../../../../zero-schema/src/builder/table-builder.ts"],"sourcesContent":["import type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {PrimaryKey} from '../../../zero-protocol/src/primary-key.ts';\nimport type {SchemaValue, TableSchema} from '../table-schema.ts';\n\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nexport function table<TName extends string>(name: TName) {\n return new TableBuilder({\n name,\n columns: {},\n primaryKey: [] as any as PrimaryKey,\n });\n}\n\nexport function string<T extends string = string>() {\n return new ColumnBuilder({\n type: 'string',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport function number<T extends number = number>() {\n return new ColumnBuilder({\n type: 'number',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport function boolean<T extends boolean = boolean>() {\n return new ColumnBuilder({\n type: 'boolean',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport function json<T extends ReadonlyJSONValue = ReadonlyJSONValue>() {\n return new ColumnBuilder({\n type: 'json',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport function enumeration<T extends string>() {\n return new ColumnBuilder({\n type: 'string',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport const column = {\n string,\n number,\n boolean,\n json,\n enumeration,\n};\n\nexport class TableBuilder<TShape extends TableSchema> {\n readonly #schema: TShape;\n constructor(schema: TShape) {\n this.#schema = schema;\n }\n\n from<ServerName extends string>(serverName: ServerName) {\n return new TableBuilder<TShape>({\n ...this.#schema,\n // Strip the \"public.\" schema if specified, as tables in the upstream\n // \"public\" schema are created without the schema prefix on the replica.\n // See liteTableName() in zero-cache/src/types/names.ts\n serverName: serverName.startsWith('public.')\n ? serverName.substring('public.'.length)\n : serverName,\n });\n }\n\n columns<const TColumns extends Record<string, ColumnBuilder<SchemaValue>>>(\n columns: TColumns,\n ): TableBuilderWithColumns<{\n name: TShape['name'];\n columns: {[K in keyof TColumns]: TColumns[K]['schema']};\n primaryKey: TShape['primaryKey'];\n }> {\n const columnSchemas = Object.fromEntries(\n Object.entries(columns).map(([k, v]) => [k, v.schema]),\n ) as {[K in keyof TColumns]: TColumns[K]['schema']};\n return new TableBuilderWithColumns({\n ...this.#schema,\n columns: columnSchemas,\n }) as any;\n }\n}\n\nexport class TableBuilderWithColumns<TShape extends TableSchema> {\n readonly #schema: TShape;\n\n constructor(schema: TShape) {\n this.#schema = schema;\n }\n\n primaryKey<TPKColNames extends (keyof TShape['columns'])[]>(\n ...pkColumnNames: TPKColNames\n ) {\n return new TableBuilderWithColumns({\n ...this.#schema,\n primaryKey: pkColumnNames,\n });\n }\n\n get schema() {\n return this.#schema;\n }\n\n build() {\n // We can probably get the type system to throw an error if primaryKey is not called\n // before passing the schema to createSchema\n // Till then --\n if (this.#schema.primaryKey.length === 0) {\n throw new Error(`Table \"${this.#schema.name}\" is missing a primary key`);\n }\n const names = new Set<string>();\n for (const [col, {serverName}] of Object.entries(this.#schema.columns)) {\n const name = serverName ?? col;\n if (names.has(name)) {\n throw new Error(\n `Table \"${\n this.#schema.name\n }\" has multiple columns referencing \"${name}\"`,\n );\n }\n names.add(name);\n }\n return this.#schema;\n }\n}\n\nclass ColumnBuilder<TShape extends SchemaValue<any>> {\n readonly #schema: TShape;\n constructor(schema: TShape) {\n this.#schema = schema;\n }\n\n from<ServerName extends string>(serverName: ServerName) {\n return new ColumnBuilder<TShape & {serverName: string}>({\n ...this.#schema,\n serverName,\n });\n }\n\n optional(): ColumnBuilder<Omit<TShape, 'optional'> & {optional: true}> {\n return new ColumnBuilder({\n ...this.#schema,\n optional: true,\n });\n }\n\n get schema() {\n return this.#schema;\n }\n}\n\nexport type {ColumnBuilder};\n"],"mappings":";AAKA,SAAgB,MAA4B,MAAa;AACvD,QAAO,IAAI,aAAa;EACtB;EACA,SAAS,EAAE;EACX,YAAY,EAAE;EACf,CAAC;;AAGJ,SAAgB,SAAoC;AAClD,QAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;EACb,CAAC;;AAGJ,SAAgB,SAAoC;AAClD,QAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;EACb,CAAC;;AAGJ,SAAgB,UAAuC;AACrD,QAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;EACb,CAAC;;AAGJ,SAAgB,OAAwD;AACtE,QAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;EACb,CAAC;;AAGJ,SAAgB,cAAgC;AAC9C,QAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;EACb,CAAC;;AAWJ,IAAa,eAAb,MAAa,aAAyC;CACpD;CACA,YAAY,QAAgB;AAC1B,QAAA,SAAe;;CAGjB,KAAgC,YAAwB;AACtD,SAAO,IAAI,aAAqB;GAC9B,GAAG,MAAA;GAIH,YAAY,WAAW,WAAW,UAAU,GACxC,WAAW,UAAU,EAAiB,GACtC;GACL,CAAC;;CAGJ,QACE,SAKC;EACD,MAAM,gBAAgB,OAAO,YAC3B,OAAO,QAAQ,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CACvD;AACD,SAAO,IAAI,wBAAwB;GACjC,GAAG,MAAA;GACH,SAAS;GACV,CAAC;;;AAIN,IAAa,0BAAb,MAAa,wBAAoD;CAC/D;CAEA,YAAY,QAAgB;AAC1B,QAAA,SAAe;;CAGjB,WACE,GAAG,eACH;AACA,SAAO,IAAI,wBAAwB;GACjC,GAAG,MAAA;GACH,YAAY;GACb,CAAC;;CAGJ,IAAI,SAAS;AACX,SAAO,MAAA;;CAGT,QAAQ;AAIN,MAAI,MAAA,OAAa,WAAW,WAAW,EACrC,OAAM,IAAI,MAAM,UAAU,MAAA,OAAa,KAAK,4BAA4B;EAE1E,MAAM,wBAAQ,IAAI,KAAa;AAC/B,OAAK,MAAM,CAAC,KAAK,EAAC,iBAAgB,OAAO,QAAQ,MAAA,OAAa,QAAQ,EAAE;GACtE,MAAM,OAAO,cAAc;AAC3B,OAAI,MAAM,IAAI,KAAK,CACjB,OAAM,IAAI,MACR,UACE,MAAA,OAAa,KACd,sCAAsC,KAAK,GAC7C;AAEH,SAAM,IAAI,KAAK;;AAEjB,SAAO,MAAA;;;AAIX,IAAM,gBAAN,MAAM,cAA+C;CACnD;CACA,YAAY,QAAgB;AAC1B,QAAA,SAAe;;CAGjB,KAAgC,YAAwB;AACtD,SAAO,IAAI,cAA6C;GACtD,GAAG,MAAA;GACH;GACD,CAAC;;CAGJ,WAAuE;AACrE,SAAO,IAAI,cAAc;GACvB,GAAG,MAAA;GACH,UAAU;GACX,CAAC;;CAGJ,IAAI,SAAS;AACX,SAAO,MAAA"}
1
+ {"version":3,"file":"table-builder.js","names":["#schema"],"sources":["../../../../../zero-schema/src/builder/table-builder.ts"],"sourcesContent":["import type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {PrimaryKey} from '../../../zero-protocol/src/primary-key.ts';\nimport type {SchemaValue, TableSchema} from '../table-schema.ts';\n\n/* oxlint-disable @typescript-eslint/no-explicit-any */\nexport function table<TName extends string>(name: TName) {\n return new TableBuilder({\n name,\n columns: {},\n primaryKey: [] as any as PrimaryKey,\n });\n}\n\nexport function string<T extends string = string>() {\n return new ColumnBuilder({\n type: 'string',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport function number<T extends number = number>() {\n return new ColumnBuilder({\n type: 'number',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport function boolean<T extends boolean = boolean>() {\n return new ColumnBuilder({\n type: 'boolean',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport function json<T extends ReadonlyJSONValue = ReadonlyJSONValue>() {\n return new ColumnBuilder({\n type: 'json',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport function enumeration<T extends string>() {\n return new ColumnBuilder({\n type: 'string',\n optional: false,\n customType: null as unknown as T,\n });\n}\n\nexport const column = {\n string,\n number,\n boolean,\n json,\n enumeration,\n};\n\nexport class TableBuilder<TShape extends TableSchema> {\n readonly #schema: TShape;\n constructor(schema: TShape) {\n this.#schema = schema;\n }\n\n from<ServerName extends string>(serverName: ServerName) {\n return new TableBuilder<TShape>({\n ...this.#schema,\n // Strip the \"public.\" schema if specified, as tables in the upstream\n // \"public\" schema are created without the schema prefix on the replica.\n // See liteTableName() in zero-cache/src/types/names.ts\n serverName: serverName.startsWith('public.')\n ? serverName.substring('public.'.length)\n : serverName,\n });\n }\n\n columns<const TColumns extends Record<string, ColumnBuilder<SchemaValue>>>(\n columns: TColumns,\n ): TableBuilderWithColumns<{\n name: TShape['name'];\n columns: {[K in keyof TColumns]: TColumns[K]['schema']};\n primaryKey: TShape['primaryKey'];\n }> {\n const columnSchemas = Object.fromEntries(\n Object.entries(columns).map(([k, v]) => [k, v.schema]),\n ) as {[K in keyof TColumns]: TColumns[K]['schema']};\n return new TableBuilderWithColumns({\n ...this.#schema,\n columns: columnSchemas,\n }) as any;\n }\n}\n\nexport class TableBuilderWithColumns<TShape extends TableSchema> {\n readonly #schema: TShape;\n\n constructor(schema: TShape) {\n this.#schema = schema;\n }\n\n primaryKey<TPKColNames extends (keyof TShape['columns'])[]>(\n ...pkColumnNames: TPKColNames\n ) {\n return new TableBuilderWithColumns({\n ...this.#schema,\n primaryKey: pkColumnNames,\n });\n }\n\n get schema() {\n return this.#schema;\n }\n\n build() {\n // We can probably get the type system to throw an error if primaryKey is not called\n // before passing the schema to createSchema\n // Till then --\n if (this.#schema.primaryKey.length === 0) {\n throw new Error(`Table \"${this.#schema.name}\" is missing a primary key`);\n }\n const names = new Set<string>();\n for (const [col, {serverName}] of Object.entries(this.#schema.columns)) {\n const name = serverName ?? col;\n if (names.has(name)) {\n throw new Error(\n `Table \"${\n this.#schema.name\n }\" has multiple columns referencing \"${name}\"`,\n );\n }\n names.add(name);\n }\n return this.#schema;\n }\n}\n\nclass ColumnBuilder<TShape extends SchemaValue<any>> {\n readonly #schema: TShape;\n constructor(schema: TShape) {\n this.#schema = schema;\n }\n\n from<ServerName extends string>(serverName: ServerName) {\n return new ColumnBuilder<TShape & {serverName: string}>({\n ...this.#schema,\n serverName,\n });\n }\n\n optional(): ColumnBuilder<Omit<TShape, 'optional'> & {optional: true}> {\n return new ColumnBuilder({\n ...this.#schema,\n optional: true,\n });\n }\n\n get schema() {\n return this.#schema;\n }\n}\n\nexport type {ColumnBuilder};\n"],"mappings":";AAKA,SAAgB,MAA4B,MAAa;CACvD,OAAO,IAAI,aAAa;EACtB;EACA,SAAS,CAAC;EACV,YAAY,CAAC;CACf,CAAC;AACH;AAEA,SAAgB,SAAoC;CAClD,OAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;CACd,CAAC;AACH;AAEA,SAAgB,SAAoC;CAClD,OAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;CACd,CAAC;AACH;AAEA,SAAgB,UAAuC;CACrD,OAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;CACd,CAAC;AACH;AAEA,SAAgB,OAAwD;CACtE,OAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;CACd,CAAC;AACH;AAEA,SAAgB,cAAgC;CAC9C,OAAO,IAAI,cAAc;EACvB,MAAM;EACN,UAAU;EACV,YAAY;CACd,CAAC;AACH;AAUA,IAAa,eAAb,MAAa,aAAyC;CACpD;CACA,YAAY,QAAgB;EAC1B,KAAKA,UAAU;CACjB;CAEA,KAAgC,YAAwB;EACtD,OAAO,IAAI,aAAqB;GAC9B,GAAG,KAAKA;GAIR,YAAY,WAAW,WAAW,SAAS,IACvC,WAAW,UAAU,CAAgB,IACrC;EACN,CAAC;CACH;CAEA,QACE,SAKC;EACD,MAAM,gBAAgB,OAAO,YAC3B,OAAO,QAAQ,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CACvD;EACA,OAAO,IAAI,wBAAwB;GACjC,GAAG,KAAKA;GACR,SAAS;EACX,CAAC;CACH;AACF;AAEA,IAAa,0BAAb,MAAa,wBAAoD;CAC/D;CAEA,YAAY,QAAgB;EAC1B,KAAKA,UAAU;CACjB;CAEA,WACE,GAAG,eACH;EACA,OAAO,IAAI,wBAAwB;GACjC,GAAG,KAAKA;GACR,YAAY;EACd,CAAC;CACH;CAEA,IAAI,SAAS;EACX,OAAO,KAAKA;CACd;CAEA,QAAQ;EAIN,IAAI,KAAKA,QAAQ,WAAW,WAAW,GACrC,MAAM,IAAI,MAAM,UAAU,KAAKA,QAAQ,KAAK,2BAA2B;EAEzE,MAAM,wBAAQ,IAAI,IAAY;EAC9B,KAAK,MAAM,CAAC,KAAK,EAAC,iBAAgB,OAAO,QAAQ,KAAKA,QAAQ,OAAO,GAAG;GACtE,MAAM,OAAO,cAAc;GAC3B,IAAI,MAAM,IAAI,IAAI,GAChB,MAAM,IAAI,MACR,UACE,KAAKA,QAAQ,KACd,sCAAsC,KAAK,EAC9C;GAEF,MAAM,IAAI,IAAI;EAChB;EACA,OAAO,KAAKA;CACd;AACF;AAEA,IAAM,gBAAN,MAAM,cAA+C;CACnD;CACA,YAAY,QAAgB;EAC1B,KAAKA,UAAU;CACjB;CAEA,KAAgC,YAAwB;EACtD,OAAO,IAAI,cAA6C;GACtD,GAAG,KAAKA;GACR;EACF,CAAC;CACH;CAEA,WAAuE;EACrE,OAAO,IAAI,cAAc;GACvB,GAAG,KAAKA;GACR,UAAU;EACZ,CAAC;CACH;CAEA,IAAI,SAAS;EACX,OAAO,KAAKA;CACd;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"compiled-permissions.js","names":[],"sources":["../../../../zero-schema/src/compiled-permissions.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\nimport {conditionSchema} from '../../zero-protocol/src/ast.ts';\n\nconst ruleSchema = v.tuple([v.literal('allow'), conditionSchema]);\nexport type Rule = v.Infer<typeof ruleSchema>;\nconst policySchema = v.array(ruleSchema);\nexport type Policy = v.Infer<typeof policySchema>;\n\nconst assetSchema = v.object({\n select: policySchema.optional(),\n insert: policySchema.optional(),\n update: v\n .object({\n preMutation: policySchema.optional(),\n postMutation: policySchema.optional(),\n })\n .optional(),\n delete: policySchema.optional(),\n});\n\nexport type AssetPermissions = v.Infer<typeof assetSchema>;\n\nconst tablePermissionsSchema = v.record(\n v.object({\n row: assetSchema.optional(),\n cell: v.record(assetSchema).optional(),\n }),\n);\n\nexport const permissionsConfigSchema = v.object({\n tables: tablePermissionsSchema.optional(),\n});\n\nexport type TablePermissions = v.Infer<typeof tablePermissionsSchema>;\nexport type PermissionsConfig = v.Infer<typeof permissionsConfigSchema>;\n"],"mappings":";;;AAGA,IAAM,aAAa,eAAE,MAAM,CAAC,eAAE,QAAQ,QAAQ,EAAE,gBAAgB,CAAC;AAEjE,IAAM,eAAe,eAAE,MAAM,WAAW;AAGxC,IAAM,cAAc,eAAE,OAAO;CAC3B,QAAQ,aAAa,UAAU;CAC/B,QAAQ,aAAa,UAAU;CAC/B,QAAQ,eACL,OAAO;EACN,aAAa,aAAa,UAAU;EACpC,cAAc,aAAa,UAAU;EACtC,CAAC,CACD,UAAU;CACb,QAAQ,aAAa,UAAU;CAChC,CAAC;AAIF,IAAM,yBAAyB,eAAE,OAC/B,eAAE,OAAO;CACP,KAAK,YAAY,UAAU;CAC3B,MAAM,eAAE,OAAO,YAAY,CAAC,UAAU;CACvC,CAAC,CACH;AAED,IAAa,0BAA0B,eAAE,OAAO,EAC9C,QAAQ,uBAAuB,UAAU,EAC1C,CAAC"}
1
+ {"version":3,"file":"compiled-permissions.js","names":[],"sources":["../../../../zero-schema/src/compiled-permissions.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\nimport {conditionSchema} from '../../zero-protocol/src/ast.ts';\n\nconst ruleSchema = v.tuple([v.literal('allow'), conditionSchema]);\nexport type Rule = v.Infer<typeof ruleSchema>;\nconst policySchema = v.array(ruleSchema);\nexport type Policy = v.Infer<typeof policySchema>;\n\nconst assetSchema = v.object({\n select: policySchema.optional(),\n insert: policySchema.optional(),\n update: v\n .object({\n preMutation: policySchema.optional(),\n postMutation: policySchema.optional(),\n })\n .optional(),\n delete: policySchema.optional(),\n});\n\nexport type AssetPermissions = v.Infer<typeof assetSchema>;\n\nconst tablePermissionsSchema = v.record(\n v.object({\n row: assetSchema.optional(),\n cell: v.record(assetSchema).optional(),\n }),\n);\n\nexport const permissionsConfigSchema = v.object({\n tables: tablePermissionsSchema.optional(),\n});\n\nexport type TablePermissions = v.Infer<typeof tablePermissionsSchema>;\nexport type PermissionsConfig = v.Infer<typeof permissionsConfigSchema>;\n"],"mappings":";;;AAGA,IAAM,aAAa,eAAE,MAAM,CAAC,eAAE,QAAQ,OAAO,GAAG,eAAe,CAAC;AAEhE,IAAM,eAAe,eAAE,MAAM,UAAU;AAGvC,IAAM,cAAc,eAAE,OAAO;CAC3B,QAAQ,aAAa,SAAS;CAC9B,QAAQ,aAAa,SAAS;CAC9B,QAAQ,eACL,OAAO;EACN,aAAa,aAAa,SAAS;EACnC,cAAc,aAAa,SAAS;CACtC,CAAC,EACA,SAAS;CACZ,QAAQ,aAAa,SAAS;AAChC,CAAC;AAID,IAAM,yBAAyB,eAAE,OAC/B,eAAE,OAAO;CACP,KAAK,YAAY,SAAS;CAC1B,MAAM,eAAE,OAAO,WAAW,EAAE,SAAS;AACvC,CAAC,CACH;AAEA,IAAa,0BAA0B,eAAE,OAAO,EAC9C,QAAQ,uBAAuB,SAAS,EAC1C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"name-mapper.js","names":[],"sources":["../../../../zero-schema/src/name-mapper.ts"],"sourcesContent":["import {NameMapper} from '../../zero-types/src/name-mapper.ts';\nimport type {TableSchema} from './table-schema.ts';\n\nexport {NameMapper};\n\nexport function clientToServer(\n tables: Record<string, TableSchema>,\n): NameMapper {\n return createMapperFrom('client', tables);\n}\n\nexport function serverToClient(\n tables: Record<string, TableSchema>,\n): NameMapper {\n return createMapperFrom('server', tables);\n}\n\nfunction createMapperFrom(\n src: 'client' | 'server',\n tables: Record<string, TableSchema>,\n): NameMapper {\n const mapping = new Map(\n Object.entries(tables).map(\n ([tableName, {serverName: serverTableName, columns}]) => {\n let allColumnsSame = true;\n const names: Record<string, string> = {};\n for (const [name, {serverName}] of Object.entries(columns)) {\n if (serverName && serverName !== name) {\n allColumnsSame = false;\n }\n if (src === 'client') {\n names[name] = serverName ?? name;\n } else {\n names[serverName ?? name] = name;\n }\n }\n return [\n src === 'client' ? tableName : (serverTableName ?? tableName),\n {\n tableName:\n src === 'client' ? (serverTableName ?? tableName) : tableName,\n columns: names,\n allColumnsSame,\n },\n ];\n },\n ),\n );\n return new NameMapper(mapping);\n}\n\n/**\n * Returns an \"identity\" NameMapper that simply serves the purpose\n * of validating that all table and column names conform to the\n * specified `tablesToColumns` map.\n */\nexport function validator(tablesToColumns: Map<string, string[]>): NameMapper {\n const identity = new Map(\n Array.from(tablesToColumns.entries(), ([tableName, columns]) => [\n tableName,\n {\n tableName,\n columns: Object.fromEntries(columns.map(c => [c, c])),\n allColumnsSame: true,\n },\n ]),\n );\n return new NameMapper(identity);\n}\n"],"mappings":";;AAKA,SAAgB,eACd,QACY;AACZ,QAAO,iBAAiB,UAAU,OAAO;;AAG3C,SAAgB,eACd,QACY;AACZ,QAAO,iBAAiB,UAAU,OAAO;;AAG3C,SAAS,iBACP,KACA,QACY;AA4BZ,QAAO,IAAI,WA3BK,IAAI,IAClB,OAAO,QAAQ,OAAO,CAAC,KACpB,CAAC,WAAW,EAAC,YAAY,iBAAiB,eAAc;EACvD,IAAI,iBAAiB;EACrB,MAAM,QAAgC,EAAE;AACxC,OAAK,MAAM,CAAC,MAAM,EAAC,iBAAgB,OAAO,QAAQ,QAAQ,EAAE;AAC1D,OAAI,cAAc,eAAe,KAC/B,kBAAiB;AAEnB,OAAI,QAAQ,SACV,OAAM,QAAQ,cAAc;OAE5B,OAAM,cAAc,QAAQ;;AAGhC,SAAO,CACL,QAAQ,WAAW,YAAa,mBAAmB,WACnD;GACE,WACE,QAAQ,WAAY,mBAAmB,YAAa;GACtD,SAAS;GACT;GACD,CACF;GAEJ,CACF,CAC6B;;;;;;;AAQhC,SAAgB,UAAU,iBAAoD;AAW5E,QAAO,IAAI,WAVM,IAAI,IACnB,MAAM,KAAK,gBAAgB,SAAS,GAAG,CAAC,WAAW,aAAa,CAC9D,WACA;EACE;EACA,SAAS,OAAO,YAAY,QAAQ,KAAI,MAAK,CAAC,GAAG,EAAE,CAAC,CAAC;EACrD,gBAAgB;EACjB,CACF,CAAC,CACH,CAC8B"}
1
+ {"version":3,"file":"name-mapper.js","names":[],"sources":["../../../../zero-schema/src/name-mapper.ts"],"sourcesContent":["import {NameMapper} from '../../zero-types/src/name-mapper.ts';\nimport type {TableSchema} from './table-schema.ts';\n\nexport {NameMapper};\n\nexport function clientToServer(\n tables: Record<string, TableSchema>,\n): NameMapper {\n return createMapperFrom('client', tables);\n}\n\nexport function serverToClient(\n tables: Record<string, TableSchema>,\n): NameMapper {\n return createMapperFrom('server', tables);\n}\n\nfunction createMapperFrom(\n src: 'client' | 'server',\n tables: Record<string, TableSchema>,\n): NameMapper {\n const mapping = new Map(\n Object.entries(tables).map(\n ([tableName, {serverName: serverTableName, columns}]) => {\n let allColumnsSame = true;\n const names: Record<string, string> = {};\n for (const [name, {serverName}] of Object.entries(columns)) {\n if (serverName && serverName !== name) {\n allColumnsSame = false;\n }\n if (src === 'client') {\n names[name] = serverName ?? name;\n } else {\n names[serverName ?? name] = name;\n }\n }\n return [\n src === 'client' ? tableName : (serverTableName ?? tableName),\n {\n tableName:\n src === 'client' ? (serverTableName ?? tableName) : tableName,\n columns: names,\n allColumnsSame,\n },\n ];\n },\n ),\n );\n return new NameMapper(mapping);\n}\n\n/**\n * Returns an \"identity\" NameMapper that simply serves the purpose\n * of validating that all table and column names conform to the\n * specified `tablesToColumns` map.\n */\nexport function validator(tablesToColumns: Map<string, string[]>): NameMapper {\n const identity = new Map(\n Array.from(tablesToColumns.entries(), ([tableName, columns]) => [\n tableName,\n {\n tableName,\n columns: Object.fromEntries(columns.map(c => [c, c])),\n allColumnsSame: true,\n },\n ]),\n );\n return new NameMapper(identity);\n}\n"],"mappings":";;AAKA,SAAgB,eACd,QACY;CACZ,OAAO,iBAAiB,UAAU,MAAM;AAC1C;AAEA,SAAgB,eACd,QACY;CACZ,OAAO,iBAAiB,UAAU,MAAM;AAC1C;AAEA,SAAS,iBACP,KACA,QACY;CA4BZ,OAAO,IAAI,WAAW,IA3BF,IAClB,OAAO,QAAQ,MAAM,EAAE,KACpB,CAAC,WAAW,EAAC,YAAY,iBAAiB,eAAc;EACvD,IAAI,iBAAiB;EACrB,MAAM,QAAgC,CAAC;EACvC,KAAK,MAAM,CAAC,MAAM,EAAC,iBAAgB,OAAO,QAAQ,OAAO,GAAG;GAC1D,IAAI,cAAc,eAAe,MAC/B,iBAAiB;GAEnB,IAAI,QAAQ,UACV,MAAM,QAAQ,cAAc;QAE5B,MAAM,cAAc,QAAQ;EAEhC;EACA,OAAO,CACL,QAAQ,WAAW,YAAa,mBAAmB,WACnD;GACE,WACE,QAAQ,WAAY,mBAAmB,YAAa;GACtD,SAAS;GACT;EACF,CACF;CACF,CACF,CAEoB,CAAO;AAC/B;;;;;;AAOA,SAAgB,UAAU,iBAAoD;CAW5E,OAAO,IAAI,WAAW,IAVD,IACnB,MAAM,KAAK,gBAAgB,QAAQ,IAAI,CAAC,WAAW,aAAa,CAC9D,WACA;EACE;EACA,SAAS,OAAO,YAAY,QAAQ,KAAI,MAAK,CAAC,GAAG,CAAC,CAAC,CAAC;EACpD,gBAAgB;CAClB,CACF,CAAC,CAEmB,CAAQ;AAChC"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema-config.js","names":[],"sources":["../../../../zero-schema/src/schema-config.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\nimport {compoundKeySchema} from '../../zero-protocol/src/ast.ts';\nimport {valueTypeSchema} from '../../zero-protocol/src/client-schema.ts';\nimport {primaryKeySchema} from '../../zero-protocol/src/primary-key.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport {type PermissionsConfig} from './compiled-permissions.ts';\nimport type {Relationship, TableSchema} from './table-schema.ts';\n\nexport type SchemaConfig = {\n schema: Schema;\n permissions: PermissionsConfig;\n};\n\nconst relationshipPart = v.readonlyObject({\n sourceField: compoundKeySchema,\n destField: compoundKeySchema,\n destSchema: v.string(),\n cardinality: v.literalUnion('one', 'many'),\n});\n\nexport const relationshipSchema: v.Type<Relationship> = v.union(\n v.readonly(v.tuple([relationshipPart])),\n v.readonly(v.tuple([relationshipPart, relationshipPart])),\n);\n\nexport const schemaValueSchema = v.readonlyObject({\n type: valueTypeSchema,\n serverName: v.string().optional(),\n optional: v.boolean().optional(),\n});\n\nexport const tableSchemaSchema: v.Type<TableSchema> = v.readonlyObject({\n name: v.string(),\n serverName: v.string().optional(),\n columns: v.record(schemaValueSchema),\n primaryKey: primaryKeySchema,\n});\n\nexport const schemaSchema = v.readonlyObject({\n tables: v.record(tableSchemaSchema),\n relationships: v.record(v.record(relationshipSchema)),\n enableLegacyQueries: v.boolean().optional(),\n enableLegacyMutators: v.boolean().optional(),\n});\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isSchemaConfig(value: any): value is SchemaConfig {\n // oxlint-disable-next-line eqeqeq\n return value != null && 'schema' in value;\n}\n"],"mappings":";;;;;;AAaA,IAAM,mBAAmB,eAAiB;CACxC,aAAa;CACb,WAAW;CACX,YAAY,eAAE,QAAQ;CACtB,aAAa,aAAe,OAAO,OAAO;CAC3C,CAAC;AAEF,IAAa,qBAA2C,eAAE,MACxD,SAAW,eAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,EACvC,SAAW,eAAE,MAAM,CAAC,kBAAkB,iBAAiB,CAAC,CAAC,CAC1D;AAED,IAAa,oBAAoB,eAAiB;CAChD,MAAM;CACN,YAAY,eAAE,QAAQ,CAAC,UAAU;CACjC,UAAU,eAAE,SAAS,CAAC,UAAU;CACjC,CAAC;AAEF,IAAa,oBAAyC,eAAiB;CACrE,MAAM,eAAE,QAAQ;CAChB,YAAY,eAAE,QAAQ,CAAC,UAAU;CACjC,SAAS,eAAE,OAAO,kBAAkB;CACpC,YAAY;CACb,CAAC;AAE0B,eAAiB;CAC3C,QAAQ,eAAE,OAAO,kBAAkB;CACnC,eAAe,eAAE,OAAO,eAAE,OAAO,mBAAmB,CAAC;CACrD,qBAAqB,eAAE,SAAS,CAAC,UAAU;CAC3C,sBAAsB,eAAE,SAAS,CAAC,UAAU;CAC7C,CAAC;AAGF,SAAgB,eAAe,OAAmC;AAEhE,QAAO,SAAS,QAAQ,YAAY"}
1
+ {"version":3,"file":"schema-config.js","names":[],"sources":["../../../../zero-schema/src/schema-config.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\nimport {compoundKeySchema} from '../../zero-protocol/src/ast.ts';\nimport {valueTypeSchema} from '../../zero-protocol/src/client-schema.ts';\nimport {primaryKeySchema} from '../../zero-protocol/src/primary-key.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport {type PermissionsConfig} from './compiled-permissions.ts';\nimport type {Relationship, TableSchema} from './table-schema.ts';\n\nexport type SchemaConfig = {\n schema: Schema;\n permissions: PermissionsConfig;\n};\n\nconst relationshipPart = v.readonlyObject({\n sourceField: compoundKeySchema,\n destField: compoundKeySchema,\n destSchema: v.string(),\n cardinality: v.literalUnion('one', 'many'),\n});\n\nexport const relationshipSchema: v.Type<Relationship> = v.union(\n v.readonly(v.tuple([relationshipPart])),\n v.readonly(v.tuple([relationshipPart, relationshipPart])),\n);\n\nexport const schemaValueSchema = v.readonlyObject({\n type: valueTypeSchema,\n serverName: v.string().optional(),\n optional: v.boolean().optional(),\n});\n\nexport const tableSchemaSchema: v.Type<TableSchema> = v.readonlyObject({\n name: v.string(),\n serverName: v.string().optional(),\n columns: v.record(schemaValueSchema),\n primaryKey: primaryKeySchema,\n});\n\nexport const schemaSchema = v.readonlyObject({\n tables: v.record(tableSchemaSchema),\n relationships: v.record(v.record(relationshipSchema)),\n enableLegacyQueries: v.boolean().optional(),\n enableLegacyMutators: v.boolean().optional(),\n});\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isSchemaConfig(value: any): value is SchemaConfig {\n // oxlint-disable-next-line eqeqeq\n return value != null && 'schema' in value;\n}\n"],"mappings":";;;;;;AAaA,IAAM,mBAAmB,eAAiB;CACxC,aAAa;CACb,WAAW;CACX,YAAY,eAAE,OAAO;CACrB,aAAa,aAAe,OAAO,MAAM;AAC3C,CAAC;AAED,IAAa,qBAA2C,eAAE,MACxD,SAAW,eAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,GACtC,SAAW,eAAE,MAAM,CAAC,kBAAkB,gBAAgB,CAAC,CAAC,CAC1D;AAEA,IAAa,oBAAoB,eAAiB;CAChD,MAAM;CACN,YAAY,eAAE,OAAO,EAAE,SAAS;CAChC,UAAU,eAAE,QAAQ,EAAE,SAAS;AACjC,CAAC;AAED,IAAa,oBAAyC,eAAiB;CACrE,MAAM,eAAE,OAAO;CACf,YAAY,eAAE,OAAO,EAAE,SAAS;CAChC,SAAS,eAAE,OAAO,iBAAiB;CACnC,YAAY;AACd,CAAC;AAE2B,eAAiB;CAC3C,QAAQ,eAAE,OAAO,iBAAiB;CAClC,eAAe,eAAE,OAAO,eAAE,OAAO,kBAAkB,CAAC;CACpD,qBAAqB,eAAE,QAAQ,EAAE,SAAS;CAC1C,sBAAsB,eAAE,QAAQ,EAAE,SAAS;AAC7C,CAAC;AAGD,SAAgB,eAAe,OAAmC;CAEhE,OAAO,SAAS,QAAQ,YAAY;AACtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle.js","names":["#drizzle"],"sources":["../../../../../zero-server/src/adapters/drizzle.ts"],"sourcesContent":["import type {\n PgDatabase,\n PgQueryResultHKT,\n PgTransaction,\n} from 'drizzle-orm/pg-core';\nimport type {ExtractTablesWithRelations} from 'drizzle-orm/relations';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\nexport type DrizzleDatabase<\n TQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> = PgDatabase<TQueryResult, TSchema>;\n\n/**\n * Helper type for the wrapped transaction used by drizzle-orm.\n *\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, DrizzleTransaction<typeof drizzleDb>>`.\n */\nexport type DrizzleTransaction<\n TDbOrSchema extends DrizzleDatabase | Record<string, unknown>,\n TSchema extends Record<string, unknown> = TDbOrSchema extends PgDatabase<\n PgQueryResultHKT,\n infer TInferredSchema\n >\n ? TInferredSchema\n : TDbOrSchema,\n> = PgTransaction<\n PgQueryResultHKT,\n TSchema,\n ExtractTablesWithRelations<TSchema>\n>;\n\nexport class DrizzleConnection<\n TDrizzle extends DrizzleDatabase,\n TTransaction extends DrizzleTransaction<TDrizzle> =\n DrizzleTransaction<TDrizzle>,\n> implements DBConnection<TTransaction> {\n readonly #drizzle: TDrizzle;\n\n constructor(drizzle: TDrizzle) {\n this.#drizzle = drizzle;\n }\n\n transaction<T>(\n fn: (tx: DBTransaction<TTransaction>) => Promise<T>,\n ): Promise<T> {\n return this.#drizzle.transaction(drizzleTx =>\n fn(\n new DrizzleInternalTransaction(\n drizzleTx,\n ) as DBTransaction<TTransaction>,\n ),\n );\n }\n}\n\nclass DrizzleInternalTransaction<\n TTransaction extends DrizzleTransaction<DrizzleDatabase>,\n> implements DBTransaction<TTransaction> {\n readonly wrappedTransaction: TTransaction;\n\n constructor(drizzleTx: TTransaction) {\n this.wrappedTransaction = drizzleTx;\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n\n async query(sql: string, params: unknown[]): Promise<Iterable<Row>> {\n const prepared = this.wrappedTransaction._.session.prepareQuery(\n {sql, params},\n undefined,\n undefined,\n false,\n );\n const result = await prepared.execute();\n return toIterableRows(result);\n }\n}\n\nfunction isIterable(value: unknown): value is Iterable<unknown> {\n return (\n // oxlint-disable-next-line eqeqeq\n value != null &&\n typeof (value as Iterable<unknown>)[Symbol.iterator] === 'function'\n );\n}\n\nexport function toIterableRows(result: unknown): Iterable<Row> {\n if (result === null || result === undefined) {\n return [] as Row[];\n }\n if (Array.isArray(result)) {\n return result as Row[];\n }\n if (isIterable(result)) {\n return result as Iterable<Row>;\n }\n if (typeof result === 'object') {\n const rows = (result as {rows?: unknown}).rows;\n if (rows === null || rows === undefined) {\n return [] as Row[];\n }\n if (Array.isArray(rows)) {\n return rows as Row[];\n }\n if (isIterable(rows)) {\n return rows as Iterable<Row>;\n }\n }\n throw new TypeError('Drizzle query result is not iterable');\n}\n\n/**\n * Wrap a `drizzle-orm` database for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying drizzle transaction.\n * Use {@link DrizzleTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param client - Drizzle database.\n *\n * @example\n * ```ts\n * import {Pool} from 'pg';\n * import {drizzle} from 'drizzle-orm/node-postgres';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroDrizzle} from '@rocicorp/zero/server/adapters/drizzle';\n * import {z} from 'zod/mini';\n *\n * const pool = new Pool({connectionString: process.env.ZERO_UPSTREAM_DB!});\n * const drizzleDb = drizzle(pool, {schema: drizzleSchema});\n * const zql = zeroDrizzle(schema, drizzleDb);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction\n * .insert(drizzleSchema.user)\n * .values({id: args.id, name: args.name, status: 'active'});\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroDrizzle<\n TSchema extends Schema,\n TDrizzle extends DrizzleDatabase,\n>(\n schema: TSchema,\n client: TDrizzle,\n): ZQLDatabase<TSchema, DrizzleTransaction<TDrizzle>> {\n return new ZQLDatabase(\n new DrizzleConnection<TDrizzle, DrizzleTransaction<TDrizzle>>(client),\n schema,\n );\n}\n"],"mappings":";;;AA6CA,IAAa,oBAAb,MAIwC;CACtC;CAEA,YAAY,SAAmB;AAC7B,QAAA,UAAgB;;CAGlB,YACE,IACY;AACZ,SAAO,MAAA,QAAc,aAAY,cAC/B,GACE,IAAI,2BACF,UACD,CACF,CACF;;;AAIL,IAAM,6BAAN,MAEyC;CACvC;CAEA,YAAY,WAAyB;AACnC,OAAK,qBAAqB;;CAG5B,SACE,KACA,QACA,QACA,cACiC;AACjC,SAAO,qBACL,MACA,KACA,QACA,QACA,aACD;;CAGH,MAAM,MAAM,KAAa,QAA2C;AAQlE,SAAO,eADQ,MANE,KAAK,mBAAmB,EAAE,QAAQ,aACjD;GAAC;GAAK;GAAO,EACb,KAAA,GACA,KAAA,GACA,MACD,CAC6B,SAAS,CACV;;;AAIjC,SAAS,WAAW,OAA4C;AAC9D,QAEE,SAAS,QACT,OAAQ,MAA4B,OAAO,cAAc;;AAI7D,SAAgB,eAAe,QAAgC;AAC7D,KAAI,WAAW,QAAQ,WAAW,KAAA,EAChC,QAAO,EAAE;AAEX,KAAI,MAAM,QAAQ,OAAO,CACvB,QAAO;AAET,KAAI,WAAW,OAAO,CACpB,QAAO;AAET,KAAI,OAAO,WAAW,UAAU;EAC9B,MAAM,OAAQ,OAA4B;AAC1C,MAAI,SAAS,QAAQ,SAAS,KAAA,EAC5B,QAAO,EAAE;AAEX,MAAI,MAAM,QAAQ,KAAK,CACrB,QAAO;AAET,MAAI,WAAW,KAAK,CAClB,QAAO;;AAGX,OAAM,IAAI,UAAU,uCAAuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyC7D,SAAgB,YAId,QACA,QACoD;AACpD,QAAO,IAAI,YACT,IAAI,kBAA0D,OAAO,EACrE,OACD"}
1
+ {"version":3,"file":"drizzle.js","names":["#drizzle"],"sources":["../../../../../zero-server/src/adapters/drizzle.ts"],"sourcesContent":["import type {\n PgDatabase,\n PgQueryResultHKT,\n PgTransaction,\n} from 'drizzle-orm/pg-core';\nimport type {ExtractTablesWithRelations} from 'drizzle-orm/relations';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\nexport type DrizzleDatabase<\n TQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n> = PgDatabase<TQueryResult, TSchema>;\n\n/**\n * Helper type for the wrapped transaction used by drizzle-orm.\n *\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, DrizzleTransaction<typeof drizzleDb>>`.\n */\nexport type DrizzleTransaction<\n TDbOrSchema extends DrizzleDatabase | Record<string, unknown>,\n TSchema extends Record<string, unknown> = TDbOrSchema extends PgDatabase<\n PgQueryResultHKT,\n infer TInferredSchema\n >\n ? TInferredSchema\n : TDbOrSchema,\n> = PgTransaction<\n PgQueryResultHKT,\n TSchema,\n ExtractTablesWithRelations<TSchema>\n>;\n\nexport class DrizzleConnection<\n TDrizzle extends DrizzleDatabase,\n TTransaction extends DrizzleTransaction<TDrizzle> =\n DrizzleTransaction<TDrizzle>,\n> implements DBConnection<TTransaction> {\n readonly #drizzle: TDrizzle;\n\n constructor(drizzle: TDrizzle) {\n this.#drizzle = drizzle;\n }\n\n transaction<T>(\n fn: (tx: DBTransaction<TTransaction>) => Promise<T>,\n ): Promise<T> {\n return this.#drizzle.transaction(drizzleTx =>\n fn(\n new DrizzleInternalTransaction(\n drizzleTx,\n ) as DBTransaction<TTransaction>,\n ),\n );\n }\n}\n\nclass DrizzleInternalTransaction<\n TTransaction extends DrizzleTransaction<DrizzleDatabase>,\n> implements DBTransaction<TTransaction> {\n readonly wrappedTransaction: TTransaction;\n\n constructor(drizzleTx: TTransaction) {\n this.wrappedTransaction = drizzleTx;\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n\n async query(sql: string, params: unknown[]): Promise<Iterable<Row>> {\n const prepared = this.wrappedTransaction._.session.prepareQuery(\n {sql, params},\n undefined,\n undefined,\n false,\n );\n const result = await prepared.execute();\n return toIterableRows(result);\n }\n}\n\nfunction isIterable(value: unknown): value is Iterable<unknown> {\n return (\n // oxlint-disable-next-line eqeqeq\n value != null &&\n typeof (value as Iterable<unknown>)[Symbol.iterator] === 'function'\n );\n}\n\nexport function toIterableRows(result: unknown): Iterable<Row> {\n if (result === null || result === undefined) {\n return [] as Row[];\n }\n if (Array.isArray(result)) {\n return result as Row[];\n }\n if (isIterable(result)) {\n return result as Iterable<Row>;\n }\n if (typeof result === 'object') {\n const rows = (result as {rows?: unknown}).rows;\n if (rows === null || rows === undefined) {\n return [] as Row[];\n }\n if (Array.isArray(rows)) {\n return rows as Row[];\n }\n if (isIterable(rows)) {\n return rows as Iterable<Row>;\n }\n }\n throw new TypeError('Drizzle query result is not iterable');\n}\n\n/**\n * Wrap a `drizzle-orm` database for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying drizzle transaction.\n * Use {@link DrizzleTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param client - Drizzle database.\n *\n * @example\n * ```ts\n * import {Pool} from 'pg';\n * import {drizzle} from 'drizzle-orm/node-postgres';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroDrizzle} from '@rocicorp/zero/server/adapters/drizzle';\n * import {z} from 'zod/mini';\n *\n * const pool = new Pool({connectionString: process.env.ZERO_UPSTREAM_DB!});\n * const drizzleDb = drizzle(pool, {schema: drizzleSchema});\n * const zql = zeroDrizzle(schema, drizzleDb);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction\n * .insert(drizzleSchema.user)\n * .values({id: args.id, name: args.name, status: 'active'});\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroDrizzle<\n TSchema extends Schema,\n TDrizzle extends DrizzleDatabase,\n>(\n schema: TSchema,\n client: TDrizzle,\n): ZQLDatabase<TSchema, DrizzleTransaction<TDrizzle>> {\n return new ZQLDatabase(\n new DrizzleConnection<TDrizzle, DrizzleTransaction<TDrizzle>>(client),\n schema,\n );\n}\n"],"mappings":";;;AA6CA,IAAa,oBAAb,MAIwC;CACtC;CAEA,YAAY,SAAmB;EAC7B,KAAKA,WAAW;CAClB;CAEA,YACE,IACY;EACZ,OAAO,KAAKA,SAAS,aAAY,cAC/B,GACE,IAAI,2BACF,SACF,CACF,CACF;CACF;AACF;AAEA,IAAM,6BAAN,MAEyC;CACvC;CAEA,YAAY,WAAyB;EACnC,KAAK,qBAAqB;CAC5B;CAEA,SACE,KACA,QACA,QACA,cACiC;EACjC,OAAO,qBACL,MACA,KACA,QACA,QACA,YACF;CACF;CAEA,MAAM,MAAM,KAAa,QAA2C;EAQlE,OAAO,eAAe,MAPL,KAAK,mBAAmB,EAAE,QAAQ,aACjD;GAAC;GAAK;EAAM,GACZ,KAAA,GACA,KAAA,GACA,KAEmB,EAAS,QAAQ,CACV;CAC9B;AACF;AAEA,SAAS,WAAW,OAA4C;CAC9D,OAEE,SAAS,QACT,OAAQ,MAA4B,OAAO,cAAc;AAE7D;AAEA,SAAgB,eAAe,QAAgC;CAC7D,IAAI,WAAW,QAAQ,WAAW,KAAA,GAChC,OAAO,CAAC;CAEV,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO;CAET,IAAI,WAAW,MAAM,GACnB,OAAO;CAET,IAAI,OAAO,WAAW,UAAU;EAC9B,MAAM,OAAQ,OAA4B;EAC1C,IAAI,SAAS,QAAQ,SAAS,KAAA,GAC5B,OAAO,CAAC;EAEV,IAAI,MAAM,QAAQ,IAAI,GACpB,OAAO;EAET,IAAI,WAAW,IAAI,GACjB,OAAO;CAEX;CACA,MAAM,IAAI,UAAU,sCAAsC;AAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,SAAgB,YAId,QACA,QACoD;CACpD,OAAO,IAAI,YACT,IAAI,kBAA0D,MAAM,GACpE,MACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"kysely.js","names":["#client"],"sources":["../../../../../zero-server/src/adapters/kysely.ts"],"sourcesContent":["import {CompiledQuery} from 'kysely';\nimport type {Kysely, Transaction as WrappedKyselyTransaction} from 'kysely';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\nexport type KyselyDatabase<TDatabase = unknown> = Kysely<TDatabase>;\n\n/**\n * Helper type for the wrapped transaction used by Kysely.\n *\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, KyselyTransaction<typeof db>>`.\n */\nexport type KyselyTransaction<TDbOrSchema = KyselyDatabase> =\n TDbOrSchema extends Kysely<infer TInferredDatabase>\n ? WrappedKyselyTransaction<TInferredDatabase>\n : WrappedKyselyTransaction<TDbOrSchema>;\n\nexport class KyselyConnection<TDatabase> implements DBConnection<\n WrappedKyselyTransaction<TDatabase>\n> {\n readonly #client: Kysely<TDatabase>;\n\n constructor(client: Kysely<TDatabase>) {\n this.#client = client;\n }\n\n transaction<T>(\n fn: (tx: DBTransaction<WrappedKyselyTransaction<TDatabase>>) => Promise<T>,\n ): Promise<T> {\n return this.#client\n .transaction()\n .execute(kyselyTx => fn(new KyselyInternalTransaction(kyselyTx)));\n }\n}\n\nclass KyselyInternalTransaction<TDatabase> implements DBTransaction<\n WrappedKyselyTransaction<TDatabase>\n> {\n readonly wrappedTransaction: WrappedKyselyTransaction<TDatabase>;\n\n constructor(kyselyTx: WrappedKyselyTransaction<TDatabase>) {\n this.wrappedTransaction = kyselyTx;\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n\n async query(sql: string, params: unknown[]): Promise<Row[]> {\n const result = await this.wrappedTransaction.executeQuery<Row>(\n CompiledQuery.raw(sql, params),\n );\n return result.rows;\n }\n}\n\n/**\n * Wrap a Postgres-backed Kysely client for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying Kysely transaction.\n * Use {@link KyselyTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param client - Kysely client.\n *\n * @example\n * ```ts\n * import {Pool} from 'pg';\n * import {Kysely, PostgresDialect} from 'kysely';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroKysely} from '@rocicorp/zero/server/adapters/kysely';\n * import {z} from 'zod/mini';\n *\n * interface Database {\n * user: {\n * id: string;\n * name: string | null;\n * status: 'active' | 'inactive';\n * };\n * }\n *\n * const db = new Kysely<Database>({\n * dialect: new PostgresDialect({\n * pool: new Pool({connectionString: process.env.ZERO_UPSTREAM_DB!}),\n * }),\n * });\n * const zql = zeroKysely(schema, db);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction\n * .insertInto('user')\n * .values({id: args.id, name: args.name, status: 'active'})\n * .execute();\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroKysely<TSchema extends Schema, TDatabase>(\n schema: TSchema,\n client: Kysely<TDatabase>,\n): ZQLDatabase<TSchema, WrappedKyselyTransaction<TDatabase>> {\n return new ZQLDatabase(new KyselyConnection(client), schema);\n}\n"],"mappings":";;;;AA6BA,IAAa,mBAAb,MAEE;CACA;CAEA,YAAY,QAA2B;AACrC,QAAA,SAAe;;CAGjB,YACE,IACY;AACZ,SAAO,MAAA,OACJ,aAAa,CACb,SAAQ,aAAY,GAAG,IAAI,0BAA0B,SAAS,CAAC,CAAC;;;AAIvE,IAAM,4BAAN,MAEE;CACA;CAEA,YAAY,UAA+C;AACzD,OAAK,qBAAqB;;CAG5B,SACE,KACA,QACA,QACA,cACiC;AACjC,SAAO,qBACL,MACA,KACA,QACA,QACA,aACD;;CAGH,MAAM,MAAM,KAAa,QAAmC;AAI1D,UAHe,MAAM,KAAK,mBAAmB,aAC3C,cAAc,IAAI,KAAK,OAAO,CAC/B,EACa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDlB,SAAgB,WACd,QACA,QAC2D;AAC3D,QAAO,IAAI,YAAY,IAAI,iBAAiB,OAAO,EAAE,OAAO"}
1
+ {"version":3,"file":"kysely.js","names":["#client"],"sources":["../../../../../zero-server/src/adapters/kysely.ts"],"sourcesContent":["import {CompiledQuery} from 'kysely';\nimport type {Kysely, Transaction as WrappedKyselyTransaction} from 'kysely';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\nexport type KyselyDatabase<TDatabase = unknown> = Kysely<TDatabase>;\n\n/**\n * Helper type for the wrapped transaction used by Kysely.\n *\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, KyselyTransaction<typeof db>>`.\n */\nexport type KyselyTransaction<TDbOrSchema = KyselyDatabase> =\n TDbOrSchema extends Kysely<infer TInferredDatabase>\n ? WrappedKyselyTransaction<TInferredDatabase>\n : WrappedKyselyTransaction<TDbOrSchema>;\n\nexport class KyselyConnection<TDatabase> implements DBConnection<\n WrappedKyselyTransaction<TDatabase>\n> {\n readonly #client: Kysely<TDatabase>;\n\n constructor(client: Kysely<TDatabase>) {\n this.#client = client;\n }\n\n transaction<T>(\n fn: (tx: DBTransaction<WrappedKyselyTransaction<TDatabase>>) => Promise<T>,\n ): Promise<T> {\n return this.#client\n .transaction()\n .execute(kyselyTx => fn(new KyselyInternalTransaction(kyselyTx)));\n }\n}\n\nclass KyselyInternalTransaction<TDatabase> implements DBTransaction<\n WrappedKyselyTransaction<TDatabase>\n> {\n readonly wrappedTransaction: WrappedKyselyTransaction<TDatabase>;\n\n constructor(kyselyTx: WrappedKyselyTransaction<TDatabase>) {\n this.wrappedTransaction = kyselyTx;\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n\n async query(sql: string, params: unknown[]): Promise<Row[]> {\n const result = await this.wrappedTransaction.executeQuery<Row>(\n CompiledQuery.raw(sql, params),\n );\n return result.rows;\n }\n}\n\n/**\n * Wrap a Postgres-backed Kysely client for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying Kysely transaction.\n * Use {@link KyselyTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param client - Kysely client.\n *\n * @example\n * ```ts\n * import {Pool} from 'pg';\n * import {Kysely, PostgresDialect} from 'kysely';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroKysely} from '@rocicorp/zero/server/adapters/kysely';\n * import {z} from 'zod/mini';\n *\n * interface Database {\n * user: {\n * id: string;\n * name: string | null;\n * status: 'active' | 'inactive';\n * };\n * }\n *\n * const db = new Kysely<Database>({\n * dialect: new PostgresDialect({\n * pool: new Pool({connectionString: process.env.ZERO_UPSTREAM_DB!}),\n * }),\n * });\n * const zql = zeroKysely(schema, db);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction\n * .insertInto('user')\n * .values({id: args.id, name: args.name, status: 'active'})\n * .execute();\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroKysely<TSchema extends Schema, TDatabase>(\n schema: TSchema,\n client: Kysely<TDatabase>,\n): ZQLDatabase<TSchema, WrappedKyselyTransaction<TDatabase>> {\n return new ZQLDatabase(new KyselyConnection(client), schema);\n}\n"],"mappings":";;;;AA6BA,IAAa,mBAAb,MAEE;CACA;CAEA,YAAY,QAA2B;EACrC,KAAKA,UAAU;CACjB;CAEA,YACE,IACY;EACZ,OAAO,KAAKA,QACT,YAAY,EACZ,SAAQ,aAAY,GAAG,IAAI,0BAA0B,QAAQ,CAAC,CAAC;CACpE;AACF;AAEA,IAAM,4BAAN,MAEE;CACA;CAEA,YAAY,UAA+C;EACzD,KAAK,qBAAqB;CAC5B;CAEA,SACE,KACA,QACA,QACA,cACiC;EACjC,OAAO,qBACL,MACA,KACA,QACA,QACA,YACF;CACF;CAEA,MAAM,MAAM,KAAa,QAAmC;EAI1D,QAAO,MAHc,KAAK,mBAAmB,aAC3C,cAAc,IAAI,KAAK,MAAM,CAC/B,GACc;CAChB;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,SAAgB,WACd,QACA,QAC2D;CAC3D,OAAO,IAAI,YAAY,IAAI,iBAAiB,MAAM,GAAG,MAAM;AAC7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"pg.js","names":["#pool"],"sources":["../../../../../zero-server/src/adapters/pg.ts"],"sourcesContent":["import type {Client} from 'pg';\nimport {Pool, type PoolClient} from 'pg';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\n/**\n * Helper type for the wrapped transaction used by node-postgres.\n *\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, NodePgTransaction>`.\n */\nexport type NodePgTransaction = Pool | PoolClient | Client;\n\nexport class NodePgConnection implements DBConnection<NodePgTransaction> {\n readonly #pool: NodePgTransaction;\n\n constructor(pool: NodePgTransaction) {\n this.#pool = pool;\n }\n\n async transaction<TRet>(\n fn: (tx: DBTransaction<NodePgTransaction>) => Promise<TRet>,\n ): Promise<TRet> {\n const client =\n this.#pool instanceof Pool ? await this.#pool.connect() : this.#pool;\n try {\n await client.query('BEGIN');\n const result = await fn(new NodePgTransactionInternal(client));\n await client.query('COMMIT');\n return result;\n } catch (error) {\n try {\n await client.query('ROLLBACK');\n } catch {\n // ignore rollback error; original error will be thrown\n }\n throw error;\n } finally {\n if (this.#pool instanceof Pool && 'release' in client) {\n client.release();\n }\n }\n }\n}\n\nexport class NodePgTransactionInternal implements DBTransaction<NodePgTransaction> {\n readonly wrappedTransaction: NodePgTransaction;\n\n constructor(client: NodePgTransaction) {\n this.wrappedTransaction = client;\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n\n async query(sql: string, params: unknown[]): Promise<Row[]> {\n const res = await this.wrappedTransaction.query(sql, params as unknown[]);\n return res.rows as Row[];\n }\n}\n\n/**\n * Wrap a `pg` Pool for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying node-postgres client.\n * Use {@link NodePgTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param pg - `pg` Pool or connection string.\n *\n * @example\n * ```ts\n * import {Pool} from 'pg';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroNodePg} from '@rocicorp/zero/server/adapters/pg';\n * import {z} from 'zod/mini';\n *\n * const pool = new Pool({connectionString: process.env.ZERO_UPSTREAM_DB!});\n * const zql = zeroNodePg(schema, pool);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction.query(\n * 'INSERT INTO \"user\" (id, name, status) VALUES ($1, $2, $3)',\n * [args.id, args.name, 'active'],\n * );\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroNodePg<S extends Schema>(\n schema: S,\n pg: NodePgTransaction | string,\n) {\n if (typeof pg === 'string') {\n pg = new Pool({connectionString: pg});\n }\n return new ZQLDatabase(new NodePgConnection(pg), schema);\n}\n"],"mappings":";;;;AAwBA,IAAa,mBAAb,MAAyE;CACvE;CAEA,YAAY,MAAyB;AACnC,QAAA,OAAa;;CAGf,MAAM,YACJ,IACe;EACf,MAAM,SACJ,MAAA,gBAAsB,OAAO,MAAM,MAAA,KAAW,SAAS,GAAG,MAAA;AAC5D,MAAI;AACF,SAAM,OAAO,MAAM,QAAQ;GAC3B,MAAM,SAAS,MAAM,GAAG,IAAI,0BAA0B,OAAO,CAAC;AAC9D,SAAM,OAAO,MAAM,SAAS;AAC5B,UAAO;WACA,OAAO;AACd,OAAI;AACF,UAAM,OAAO,MAAM,WAAW;WACxB;AAGR,SAAM;YACE;AACR,OAAI,MAAA,gBAAsB,QAAQ,aAAa,OAC7C,QAAO,SAAS;;;;AAMxB,IAAa,4BAAb,MAAmF;CACjF;CAEA,YAAY,QAA2B;AACrC,OAAK,qBAAqB;;CAG5B,SACE,KACA,QACA,QACA,cACiC;AACjC,SAAO,qBACL,MACA,KACA,QACA,QACA,aACD;;CAGH,MAAM,MAAM,KAAa,QAAmC;AAE1D,UADY,MAAM,KAAK,mBAAmB,MAAM,KAAK,OAAoB,EAC9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCf,SAAgB,WACd,QACA,IACA;AACA,KAAI,OAAO,OAAO,SAChB,MAAK,IAAI,KAAK,EAAC,kBAAkB,IAAG,CAAC;AAEvC,QAAO,IAAI,YAAY,IAAI,iBAAiB,GAAG,EAAE,OAAO"}
1
+ {"version":3,"file":"pg.js","names":["#pool"],"sources":["../../../../../zero-server/src/adapters/pg.ts"],"sourcesContent":["import type {Client} from 'pg';\nimport {Pool, type PoolClient} from 'pg';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\n/**\n * Helper type for the wrapped transaction used by node-postgres.\n *\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, NodePgTransaction>`.\n */\nexport type NodePgTransaction = Pool | PoolClient | Client;\n\nexport class NodePgConnection implements DBConnection<NodePgTransaction> {\n readonly #pool: NodePgTransaction;\n\n constructor(pool: NodePgTransaction) {\n this.#pool = pool;\n }\n\n async transaction<TRet>(\n fn: (tx: DBTransaction<NodePgTransaction>) => Promise<TRet>,\n ): Promise<TRet> {\n const client =\n this.#pool instanceof Pool ? await this.#pool.connect() : this.#pool;\n try {\n await client.query('BEGIN');\n const result = await fn(new NodePgTransactionInternal(client));\n await client.query('COMMIT');\n return result;\n } catch (error) {\n try {\n await client.query('ROLLBACK');\n } catch {\n // ignore rollback error; original error will be thrown\n }\n throw error;\n } finally {\n if (this.#pool instanceof Pool && 'release' in client) {\n client.release();\n }\n }\n }\n}\n\nexport class NodePgTransactionInternal implements DBTransaction<NodePgTransaction> {\n readonly wrappedTransaction: NodePgTransaction;\n\n constructor(client: NodePgTransaction) {\n this.wrappedTransaction = client;\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n\n async query(sql: string, params: unknown[]): Promise<Row[]> {\n const res = await this.wrappedTransaction.query(sql, params as unknown[]);\n return res.rows as Row[];\n }\n}\n\n/**\n * Wrap a `pg` Pool for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying node-postgres client.\n * Use {@link NodePgTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param pg - `pg` Pool or connection string.\n *\n * @example\n * ```ts\n * import {Pool} from 'pg';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroNodePg} from '@rocicorp/zero/server/adapters/pg';\n * import {z} from 'zod/mini';\n *\n * const pool = new Pool({connectionString: process.env.ZERO_UPSTREAM_DB!});\n * const zql = zeroNodePg(schema, pool);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction.query(\n * 'INSERT INTO \"user\" (id, name, status) VALUES ($1, $2, $3)',\n * [args.id, args.name, 'active'],\n * );\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroNodePg<S extends Schema>(\n schema: S,\n pg: NodePgTransaction | string,\n) {\n if (typeof pg === 'string') {\n pg = new Pool({connectionString: pg});\n }\n return new ZQLDatabase(new NodePgConnection(pg), schema);\n}\n"],"mappings":";;;;AAwBA,IAAa,mBAAb,MAAyE;CACvE;CAEA,YAAY,MAAyB;EACnC,KAAKA,QAAQ;CACf;CAEA,MAAM,YACJ,IACe;EACf,MAAM,SACJ,KAAKA,iBAAiB,OAAO,MAAM,KAAKA,MAAM,QAAQ,IAAI,KAAKA;EACjE,IAAI;GACF,MAAM,OAAO,MAAM,OAAO;GAC1B,MAAM,SAAS,MAAM,GAAG,IAAI,0BAA0B,MAAM,CAAC;GAC7D,MAAM,OAAO,MAAM,QAAQ;GAC3B,OAAO;EACT,SAAS,OAAO;GACd,IAAI;IACF,MAAM,OAAO,MAAM,UAAU;GAC/B,QAAQ,CAER;GACA,MAAM;EACR,UAAU;GACR,IAAI,KAAKA,iBAAiB,QAAQ,aAAa,QAC7C,OAAO,QAAQ;EAEnB;CACF;AACF;AAEA,IAAa,4BAAb,MAAmF;CACjF;CAEA,YAAY,QAA2B;EACrC,KAAK,qBAAqB;CAC5B;CAEA,SACE,KACA,QACA,QACA,cACiC;EACjC,OAAO,qBACL,MACA,KACA,QACA,QACA,YACF;CACF;CAEA,MAAM,MAAM,KAAa,QAAmC;EAE1D,QAAO,MADW,KAAK,mBAAmB,MAAM,KAAK,MAAmB,GAC7D;CACb;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAAgB,WACd,QACA,IACA;CACA,IAAI,OAAO,OAAO,UAChB,KAAK,IAAI,KAAK,EAAC,kBAAkB,GAAE,CAAC;CAEtC,OAAO,IAAI,YAAY,IAAI,iBAAiB,EAAE,GAAG,MAAM;AACzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"postgresjs.js","names":["#pg"],"sources":["../../../../../zero-server/src/adapters/postgresjs.ts"],"sourcesContent":["import postgres from 'postgres';\nimport type {JSONValue} from '../../../shared/src/json.ts';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\n/**\n * Helper type for the wrapped transaction used by postgres.js.\n *\n * @typeParam T - The row-shape context bound to the postgres.js client.\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, PostgresJsTransaction>`.\n */\nexport type PostgresJsTransaction<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = postgres.TransactionSql<T>;\n\nexport class PostgresJSConnection<\n T extends Record<string, unknown>,\n> implements DBConnection<PostgresJsTransaction<T>> {\n readonly #pg: postgres.Sql<T>;\n constructor(pg: postgres.Sql<T>) {\n this.#pg = pg;\n }\n\n transaction<TRet>(\n fn: (tx: DBTransaction<PostgresJsTransaction<T>>) => Promise<TRet>,\n ): Promise<TRet> {\n return this.#pg.begin(pgTx =>\n fn(new PostgresJsTransactionInternal(pgTx)),\n ) as Promise<TRet>;\n }\n}\n\nexport class PostgresJsTransactionInternal<\n T extends Record<string, unknown>,\n> implements DBTransaction<PostgresJsTransaction<T>> {\n readonly wrappedTransaction: PostgresJsTransaction<T>;\n constructor(pgTx: PostgresJsTransaction<T>) {\n this.wrappedTransaction = pgTx;\n }\n\n query(sql: string, params: unknown[]): Promise<Row[]> {\n return this.wrappedTransaction.unsafe(sql, params as JSONValue[]);\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n}\n\n/**\n * Wrap a `postgres` client for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying postgres.js transaction.\n * Use {@link PostgresJsTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param pg - `postgres` client or connection string.\n *\n * @example\n * ```ts\n * import postgres from 'postgres';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroPostgresJS} from '@rocicorp/zero/server/adapters/postgresjs';\n * import {z} from 'zod/mini';\n *\n * const sql = postgres(process.env.ZERO_UPSTREAM_DB!);\n * const zql = zeroPostgresJS(schema, sql);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction`\n * INSERT INTO \"user\" (id, name, status)\n * VALUES (${args.id}, ${args.name}, ${'active'})\n * `;\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroPostgresJS<\n S extends Schema,\n T extends Record<string, unknown> = Record<string, unknown>,\n>(schema: S, pg: postgres.Sql<T> | string) {\n if (typeof pg === 'string') {\n pg = postgres(pg, {\n connection: {['application_name']: 'zero-server'},\n }) as postgres.Sql<T>;\n }\n return new ZQLDatabase(new PostgresJSConnection(pg), schema);\n}\n"],"mappings":";;;;AA2BA,IAAa,uBAAb,MAEoD;CAClD;CACA,YAAY,IAAqB;AAC/B,QAAA,KAAW;;CAGb,YACE,IACe;AACf,SAAO,MAAA,GAAS,OAAM,SACpB,GAAG,IAAI,8BAA8B,KAAK,CAAC,CAC5C;;;AAIL,IAAa,gCAAb,MAEqD;CACnD;CACA,YAAY,MAAgC;AAC1C,OAAK,qBAAqB;;CAG5B,MAAM,KAAa,QAAmC;AACpD,SAAO,KAAK,mBAAmB,OAAO,KAAK,OAAsB;;CAGnE,SACE,KACA,QACA,QACA,cACiC;AACjC,SAAO,qBACL,MACA,KACA,QACA,QACA,aACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCL,SAAgB,eAGd,QAAW,IAA8B;AACzC,KAAI,OAAO,OAAO,SAChB,MAAK,SAAS,IAAI,EAChB,YAAY,GAAE,qBAAqB,eAAc,EAClD,CAAC;AAEJ,QAAO,IAAI,YAAY,IAAI,qBAAqB,GAAG,EAAE,OAAO"}
1
+ {"version":3,"file":"postgresjs.js","names":["#pg"],"sources":["../../../../../zero-server/src/adapters/postgresjs.ts"],"sourcesContent":["import postgres from 'postgres';\nimport type {JSONValue} from '../../../shared/src/json.ts';\nimport type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\n/**\n * Helper type for the wrapped transaction used by postgres.js.\n *\n * @typeParam T - The row-shape context bound to the postgres.js client.\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, PostgresJsTransaction>`.\n */\nexport type PostgresJsTransaction<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = postgres.TransactionSql<T>;\n\nexport class PostgresJSConnection<\n T extends Record<string, unknown>,\n> implements DBConnection<PostgresJsTransaction<T>> {\n readonly #pg: postgres.Sql<T>;\n constructor(pg: postgres.Sql<T>) {\n this.#pg = pg;\n }\n\n transaction<TRet>(\n fn: (tx: DBTransaction<PostgresJsTransaction<T>>) => Promise<TRet>,\n ): Promise<TRet> {\n return this.#pg.begin(pgTx =>\n fn(new PostgresJsTransactionInternal(pgTx)),\n ) as Promise<TRet>;\n }\n}\n\nexport class PostgresJsTransactionInternal<\n T extends Record<string, unknown>,\n> implements DBTransaction<PostgresJsTransaction<T>> {\n readonly wrappedTransaction: PostgresJsTransaction<T>;\n constructor(pgTx: PostgresJsTransaction<T>) {\n this.wrappedTransaction = pgTx;\n }\n\n query(sql: string, params: unknown[]): Promise<Row[]> {\n return this.wrappedTransaction.unsafe(sql, params as JSONValue[]);\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n}\n\n/**\n * Wrap a `postgres` client for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying postgres.js transaction.\n * Use {@link PostgresJsTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param pg - `postgres` client or connection string.\n *\n * @example\n * ```ts\n * import postgres from 'postgres';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroPostgresJS} from '@rocicorp/zero/server/adapters/postgresjs';\n * import {z} from 'zod/mini';\n *\n * const sql = postgres(process.env.ZERO_UPSTREAM_DB!);\n * const zql = zeroPostgresJS(schema, sql);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction`\n * INSERT INTO \"user\" (id, name, status)\n * VALUES (${args.id}, ${args.name}, ${'active'})\n * `;\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroPostgresJS<\n S extends Schema,\n T extends Record<string, unknown> = Record<string, unknown>,\n>(schema: S, pg: postgres.Sql<T> | string) {\n if (typeof pg === 'string') {\n pg = postgres(pg, {\n connection: {['application_name']: 'zero-server'},\n }) as postgres.Sql<T>;\n }\n return new ZQLDatabase(new PostgresJSConnection(pg), schema);\n}\n"],"mappings":";;;;AA2BA,IAAa,uBAAb,MAEoD;CAClD;CACA,YAAY,IAAqB;EAC/B,KAAKA,MAAM;CACb;CAEA,YACE,IACe;EACf,OAAO,KAAKA,IAAI,OAAM,SACpB,GAAG,IAAI,8BAA8B,IAAI,CAAC,CAC5C;CACF;AACF;AAEA,IAAa,gCAAb,MAEqD;CACnD;CACA,YAAY,MAAgC;EAC1C,KAAK,qBAAqB;CAC5B;CAEA,MAAM,KAAa,QAAmC;EACpD,OAAO,KAAK,mBAAmB,OAAO,KAAK,MAAqB;CAClE;CAEA,SACE,KACA,QACA,QACA,cACiC;EACjC,OAAO,qBACL,MACA,KACA,QACA,QACA,YACF;CACF;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAAgB,eAGd,QAAW,IAA8B;CACzC,IAAI,OAAO,OAAO,UAChB,KAAK,SAAS,IAAI,EAChB,YAAY,GAAE,qBAAqB,cAAa,EAClD,CAAC;CAEH,OAAO,IAAI,YAAY,IAAI,qBAAqB,EAAE,GAAG,MAAM;AAC7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"prisma.js","names":["#client"],"sources":["../../../../../zero-server/src/adapters/prisma.ts"],"sourcesContent":["import type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\nexport type PrismaTransactionLike = {\n $queryRawUnsafe: (query: string, ...params: unknown[]) => Promise<unknown>;\n};\n\nexport type PrismaClientLike<\n TTransaction extends PrismaTransactionLike = PrismaTransactionLike,\n> = {\n $transaction: <T>(fn: (tx: TTransaction) => Promise<T>) => Promise<T>;\n};\n\n/**\n * Helper type for the wrapped transaction used by Prisma.\n *\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, PrismaTransaction<typeof prisma>>`.\n */\nexport type PrismaTransaction<\n TClient extends PrismaClientLike = PrismaClientLike,\n> =\n TClient extends PrismaClientLike<infer TTransaction>\n ? TTransaction\n : PrismaTransactionLike;\n\nexport class PrismaConnection<\n TClient extends PrismaClientLike,\n> implements DBConnection<PrismaTransaction<TClient>> {\n readonly #client: TClient;\n\n constructor(client: TClient) {\n this.#client = client;\n }\n\n transaction<T>(\n fn: (tx: DBTransaction<PrismaTransaction<TClient>>) => Promise<T>,\n ): Promise<T> {\n return this.#client.$transaction(prismaTx =>\n fn(\n new PrismaInternalTransaction(prismaTx) as DBTransaction<\n PrismaTransaction<TClient>\n >,\n ),\n );\n }\n}\n\nclass PrismaInternalTransaction<\n TTransaction extends PrismaTransactionLike,\n> implements DBTransaction<TTransaction> {\n readonly wrappedTransaction: TTransaction;\n\n constructor(prismaTx: TTransaction) {\n this.wrappedTransaction = prismaTx;\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n\n async query(sql: string, params: unknown[]): Promise<Iterable<Row>> {\n const result = await this.wrappedTransaction.$queryRawUnsafe(\n sql,\n ...params,\n );\n return toIterableRows(result);\n }\n}\n\nfunction isIterable(value: unknown): value is Iterable<unknown> {\n return (\n // oxlint-disable-next-line eqeqeq\n value != null &&\n typeof (value as Iterable<unknown>)[Symbol.iterator] === 'function'\n );\n}\n\nfunction toIterableRows(result: unknown): Iterable<Row> {\n if (result === null || result === undefined) {\n return [] as Row[];\n }\n if (Array.isArray(result)) {\n return result as Row[];\n }\n if (isIterable(result)) {\n return result as Iterable<Row>;\n }\n return [] as Row[];\n}\n\n/**\n * Wrap a Prisma client for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying Prisma transaction.\n * Use {@link PrismaTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param client - Prisma client.\n *\n * @example\n * ```ts\n * import {PrismaPg} from '@prisma/adapter-pg';\n * import {PrismaClient} from '@prisma/client';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroPrisma} from '@rocicorp/zero/server/adapters/prisma';\n * import {z} from 'zod/mini';\n *\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({connectionString: process.env.ZERO_UPSTREAM_DB!}),\n * });\n * const zql = zeroPrisma(schema, prisma);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction.user.create({\n * data: {\n * id: args.id,\n * name: args.name,\n * status: 'active',\n * },\n * });\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroPrisma<\n TSchema extends Schema,\n TClient extends PrismaClientLike,\n>(\n schema: TSchema,\n client: TClient,\n): ZQLDatabase<TSchema, PrismaTransaction<TClient>> {\n return new ZQLDatabase(new PrismaConnection(client), schema);\n}\n"],"mappings":";;;AAqCA,IAAa,mBAAb,MAEsD;CACpD;CAEA,YAAY,QAAiB;AAC3B,QAAA,SAAe;;CAGjB,YACE,IACY;AACZ,SAAO,MAAA,OAAa,cAAa,aAC/B,GACE,IAAI,0BAA0B,SAAS,CAGxC,CACF;;;AAIL,IAAM,4BAAN,MAEyC;CACvC;CAEA,YAAY,UAAwB;AAClC,OAAK,qBAAqB;;CAG5B,SACE,KACA,QACA,QACA,cACiC;AACjC,SAAO,qBACL,MACA,KACA,QACA,QACA,aACD;;CAGH,MAAM,MAAM,KAAa,QAA2C;AAKlE,SAAO,eAJQ,MAAM,KAAK,mBAAmB,gBAC3C,KACA,GAAG,OACJ,CAC4B;;;AAIjC,SAAS,WAAW,OAA4C;AAC9D,QAEE,SAAS,QACT,OAAQ,MAA4B,OAAO,cAAc;;AAI7D,SAAS,eAAe,QAAgC;AACtD,KAAI,WAAW,QAAQ,WAAW,KAAA,EAChC,QAAO,EAAE;AAEX,KAAI,MAAM,QAAQ,OAAO,CACvB,QAAO;AAET,KAAI,WAAW,OAAO,CACpB,QAAO;AAET,QAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CX,SAAgB,WAId,QACA,QACkD;AAClD,QAAO,IAAI,YAAY,IAAI,iBAAiB,OAAO,EAAE,OAAO"}
1
+ {"version":3,"file":"prisma.js","names":["#client"],"sources":["../../../../../zero-server/src/adapters/prisma.ts"],"sourcesContent":["import type {AST} from '../../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../../zero-types/src/format.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../../zero-types/src/server-schema.ts';\nimport type {\n DBConnection,\n DBTransaction,\n Row,\n} from '../../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../../zql/src/query/query.ts';\nimport {executePostgresQuery} from '../pg-query-executor.ts';\nimport {ZQLDatabase} from '../zql-database.ts';\n\nexport type {ZQLDatabase};\n\nexport type PrismaTransactionLike = {\n $queryRawUnsafe: (query: string, ...params: unknown[]) => Promise<unknown>;\n};\n\nexport type PrismaClientLike<\n TTransaction extends PrismaTransactionLike = PrismaTransactionLike,\n> = {\n $transaction: <T>(fn: (tx: TTransaction) => Promise<T>) => Promise<T>;\n};\n\n/**\n * Helper type for the wrapped transaction used by Prisma.\n *\n * @remarks Use with `ServerTransaction` as `ServerTransaction<Schema, PrismaTransaction<typeof prisma>>`.\n */\nexport type PrismaTransaction<\n TClient extends PrismaClientLike = PrismaClientLike,\n> =\n TClient extends PrismaClientLike<infer TTransaction>\n ? TTransaction\n : PrismaTransactionLike;\n\nexport class PrismaConnection<\n TClient extends PrismaClientLike,\n> implements DBConnection<PrismaTransaction<TClient>> {\n readonly #client: TClient;\n\n constructor(client: TClient) {\n this.#client = client;\n }\n\n transaction<T>(\n fn: (tx: DBTransaction<PrismaTransaction<TClient>>) => Promise<T>,\n ): Promise<T> {\n return this.#client.$transaction(prismaTx =>\n fn(\n new PrismaInternalTransaction(prismaTx) as DBTransaction<\n PrismaTransaction<TClient>\n >,\n ),\n );\n }\n}\n\nclass PrismaInternalTransaction<\n TTransaction extends PrismaTransactionLike,\n> implements DBTransaction<TTransaction> {\n readonly wrappedTransaction: TTransaction;\n\n constructor(prismaTx: TTransaction) {\n this.wrappedTransaction = prismaTx;\n }\n\n runQuery<TReturn>(\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n ): Promise<HumanReadable<TReturn>> {\n return executePostgresQuery<TReturn>(\n this,\n ast,\n format,\n schema,\n serverSchema,\n );\n }\n\n async query(sql: string, params: unknown[]): Promise<Iterable<Row>> {\n const result = await this.wrappedTransaction.$queryRawUnsafe(\n sql,\n ...params,\n );\n return toIterableRows(result);\n }\n}\n\nfunction isIterable(value: unknown): value is Iterable<unknown> {\n return (\n // oxlint-disable-next-line eqeqeq\n value != null &&\n typeof (value as Iterable<unknown>)[Symbol.iterator] === 'function'\n );\n}\n\nfunction toIterableRows(result: unknown): Iterable<Row> {\n if (result === null || result === undefined) {\n return [] as Row[];\n }\n if (Array.isArray(result)) {\n return result as Row[];\n }\n if (isIterable(result)) {\n return result as Iterable<Row>;\n }\n return [] as Row[];\n}\n\n/**\n * Wrap a Prisma client for Zero ZQL.\n *\n * Provides ZQL querying plus access to the underlying Prisma transaction.\n * Use {@link PrismaTransaction} to type your server mutator transaction.\n *\n * @param schema - Zero schema.\n * @param client - Prisma client.\n *\n * @example\n * ```ts\n * import {PrismaPg} from '@prisma/adapter-pg';\n * import {PrismaClient} from '@prisma/client';\n * import {defineMutator, defineMutators} from '@rocicorp/zero';\n * import {zeroPrisma} from '@rocicorp/zero/server/adapters/prisma';\n * import {z} from 'zod/mini';\n *\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({connectionString: process.env.ZERO_UPSTREAM_DB!}),\n * });\n * const zql = zeroPrisma(schema, prisma);\n *\n * export const serverMutators = defineMutators({\n * user: {\n * create: defineMutator(\n * z.object({id: z.string(), name: z.string()}),\n * async ({tx, args}) => {\n * if (tx.location !== 'server') {\n * throw new Error('Server-only mutator');\n * }\n * await tx.dbTransaction.wrappedTransaction.user.create({\n * data: {\n * id: args.id,\n * name: args.name,\n * status: 'active',\n * },\n * });\n * },\n * ),\n * },\n * });\n * ```\n */\nexport function zeroPrisma<\n TSchema extends Schema,\n TClient extends PrismaClientLike,\n>(\n schema: TSchema,\n client: TClient,\n): ZQLDatabase<TSchema, PrismaTransaction<TClient>> {\n return new ZQLDatabase(new PrismaConnection(client), schema);\n}\n"],"mappings":";;;AAqCA,IAAa,mBAAb,MAEsD;CACpD;CAEA,YAAY,QAAiB;EAC3B,KAAKA,UAAU;CACjB;CAEA,YACE,IACY;EACZ,OAAO,KAAKA,QAAQ,cAAa,aAC/B,GACE,IAAI,0BAA0B,QAAQ,CAGxC,CACF;CACF;AACF;AAEA,IAAM,4BAAN,MAEyC;CACvC;CAEA,YAAY,UAAwB;EAClC,KAAK,qBAAqB;CAC5B;CAEA,SACE,KACA,QACA,QACA,cACiC;EACjC,OAAO,qBACL,MACA,KACA,QACA,QACA,YACF;CACF;CAEA,MAAM,MAAM,KAAa,QAA2C;EAKlE,OAAO,eAAe,MAJD,KAAK,mBAAmB,gBAC3C,KACA,GAAG,MACL,CAC4B;CAC9B;AACF;AAEA,SAAS,WAAW,OAA4C;CAC9D,OAEE,SAAS,QACT,OAAQ,MAA4B,OAAO,cAAc;AAE7D;AAEA,SAAS,eAAe,QAAgC;CACtD,IAAI,WAAW,QAAQ,WAAW,KAAA,GAChC,OAAO,CAAC;CAEV,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO;CAET,IAAI,WAAW,MAAM,GACnB,OAAO;CAET,OAAO,CAAC;AACV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAgB,WAId,QACA,QACkD;CAClD,OAAO,IAAI,YAAY,IAAI,iBAAiB,MAAM,GAAG,MAAM;AAC7D"}
@@ -59,7 +59,8 @@ var TransactionImpl = class {
59
59
  this.mutate = mutate;
60
60
  this.#schema = schema;
61
61
  this.#serverSchema = serverSchema;
62
- this.query = createRunnableBuilder(new ServerTransactionQueryDelegate(dbTransaction, schema, serverSchema), schema);
62
+ const delegate = new ServerTransactionQueryDelegate(dbTransaction, schema, serverSchema);
63
+ this.query = createRunnableBuilder(delegate, schema);
63
64
  }
64
65
  run(query, _options) {
65
66
  const queryInternals = asQueryInternals(query);
@@ -1 +1 @@
1
- {"version":3,"file":"custom.js","names":["#dbTransaction","#schema","#serverSchema","#tableCRUDs","#getOrFetchServerSchema"],"sources":["../../../../zero-server/src/custom.ts"],"sourcesContent":["import {assert} from '../../shared/src/asserts.ts';\nimport {mapValues} from '../../shared/src/objects.ts';\nimport {recordProxy} from '../../shared/src/record-proxy.ts';\nimport {\n formatPgInternalConvert,\n sql,\n sqlConvertColumnArg,\n} from '../../z2s/src/sql.ts';\nimport type {TableSchema} from '../../zero-schema/src/table-schema.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {\n ServerColumnSchema,\n ServerSchema,\n ServerTableSchema,\n} from '../../zero-types/src/server-schema.ts';\nimport {\n type CRUDExecutor,\n type CRUDKind,\n makeCRUDMutate,\n makeTransactionMutate,\n type SchemaCRUD,\n type TableCRUD,\n type TransactionMutate,\n} from '../../zql/src/mutate/crud.ts';\nimport type {\n DBTransaction,\n MutateCRUD,\n ServerTransaction,\n} from '../../zql/src/mutate/custom.ts';\nimport {createRunnableBuilder} from '../../zql/src/query/create-builder.ts';\nimport {QueryDelegateBase} from '../../zql/src/query/query-delegate-base.ts';\nimport {asQueryInternals} from '../../zql/src/query/query-internals.ts';\nimport type {\n HumanReadable,\n Query,\n RunOptions,\n} from '../../zql/src/query/query.ts';\nimport type {ConditionalSchemaQuery} from '../../zql/src/query/schema-query.ts';\nimport {getServerSchema} from './schema.ts';\n\nexport type CustomMutatorDefs<TDBTransaction> = {\n [namespaceOrKey: string]:\n | CustomMutatorImpl<TDBTransaction>\n | CustomMutatorDefs<TDBTransaction>;\n};\n\nexport type CustomMutatorImpl<\n TDBTransaction,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n TArgs = any,\n Context = unknown,\n> = (tx: TDBTransaction, args: TArgs, ctx: Context) => Promise<void>;\n\n/**\n * QueryDelegate implementation for server-side transactions.\n * Extends QueryDelegateBase to satisfy the QueryDelegate interface,\n * but overrides run() to execute against Postgres and throws on\n * preload()/materialize() which don't make sense server-side.\n */\nclass ServerTransactionQueryDelegate extends QueryDelegateBase {\n readonly #dbTransaction: DBTransaction<unknown>;\n readonly #schema: Schema;\n readonly #serverSchema: ServerSchema;\n\n readonly defaultQueryComplete = true;\n\n constructor(\n dbTransaction: DBTransaction<unknown>,\n schema: Schema,\n serverSchema: ServerSchema,\n ) {\n super();\n this.#dbTransaction = dbTransaction;\n this.#schema = schema;\n this.#serverSchema = serverSchema;\n }\n\n getSource(): never {\n throw new Error('not implemented');\n }\n\n override run<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n _options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n const queryInternals = asQueryInternals(query);\n return this.#dbTransaction.runQuery<TReturn>(\n queryInternals.ast,\n queryInternals.format,\n this.#schema,\n this.#serverSchema,\n );\n }\n\n override preload(): never {\n throw new Error('preload() is not supported in server transactions');\n }\n\n override materialize(): never {\n throw new Error('materialize() is not supported in server transactions');\n }\n}\n\nexport class TransactionImpl<\n TSchema extends Schema,\n TWrappedTransaction,\n> implements ServerTransaction<TSchema, TWrappedTransaction> {\n readonly location = 'server';\n readonly reason = 'authoritative';\n readonly dbTransaction: DBTransaction<TWrappedTransaction>;\n readonly clientID: string;\n readonly mutationID: number;\n readonly mutate: TransactionMutate<TSchema>;\n /**\n * @deprecated Use {@linkcode createBuilder} with `tx.run(zql.table.where(...))` instead.\n */\n readonly query: ConditionalSchemaQuery<TSchema>;\n\n readonly #schema: TSchema;\n readonly #serverSchema: ServerSchema;\n\n constructor(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n mutate: TransactionMutate<TSchema>,\n schema: TSchema,\n serverSchema: ServerSchema,\n ) {\n this.dbTransaction = dbTransaction;\n this.clientID = clientID;\n this.mutationID = mutationID;\n this.mutate = mutate;\n this.#schema = schema;\n this.#serverSchema = serverSchema;\n\n const delegate = new ServerTransactionQueryDelegate(\n dbTransaction,\n schema,\n serverSchema,\n );\n this.query = createRunnableBuilder(delegate, schema);\n }\n\n run<TTable extends keyof TSchema['tables'] & string, TReturn>(\n query: Query<TTable, TSchema, TReturn>,\n _options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n const queryInternals = asQueryInternals(query);\n\n // Execute the query using the database-specific executor\n return this.dbTransaction.runQuery<TReturn>(\n queryInternals.ast,\n queryInternals.format,\n this.#schema,\n this.#serverSchema,\n );\n }\n}\n\nconst dbTxSymbol = Symbol();\n\nconst serverSchemaSymbol = Symbol();\n\ntype WithHiddenTxAndSchema = {\n [dbTxSymbol]: DBTransaction<unknown>;\n [serverSchemaSymbol]: ServerSchema;\n};\n\n/**\n * Factory for creating MutateCRUD instances efficiently.\n *\n * Pre-creates the SQL-generating TableCRUD methods once from the schema,\n * caches the serverSchema after first fetch, and only binds the transaction\n * at transaction time.\n *\n * Use this when you need to create many transactions and want to avoid\n * the overhead of re-creating CRUD methods for each one.\n */\nexport class CRUDMutatorFactory<S extends Schema> {\n readonly #schema: S;\n readonly #tableCRUDs: Record<string, TableCRUD<TableSchema>>;\n #serverSchema: ServerSchema | undefined;\n\n constructor(schema: S) {\n this.#schema = schema;\n // Pre-create TableCRUD methods for each table once\n this.#tableCRUDs = {};\n for (const tableSchema of Object.values(schema.tables)) {\n this.#tableCRUDs[tableSchema.name] = makeServerTableCRUD(tableSchema);\n }\n }\n\n /**\n * Gets the cached serverSchema, or fetches and caches it on first call.\n */\n async #getOrFetchServerSchema(\n dbTransaction: DBTransaction<unknown>,\n ): Promise<ServerSchema> {\n if (!this.#serverSchema) {\n this.#serverSchema = await getServerSchema(dbTransaction, this.#schema);\n }\n return this.#serverSchema;\n }\n\n /**\n * Creates a CRUDExecutor bound to the given transaction and serverSchema.\n * Uses the pre-created TableCRUD methods from construction time.\n */\n createExecutor(\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n ): CRUDExecutor {\n const txHolder: WithHiddenTxAndSchema = {\n [dbTxSymbol]: dbTransaction,\n [serverSchemaSymbol]: serverSchema,\n };\n const boundCRUDs = recordProxy(this.#tableCRUDs, tableCRUD =>\n mapValues(tableCRUD, method => method.bind(txHolder)),\n ) as unknown as SchemaCRUD<S>;\n\n return (table: string, kind: CRUDKind, args: unknown) => {\n const tableCRUD = boundCRUDs[table as keyof S['tables']];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (tableCRUD as any)[kind](args);\n };\n }\n\n /**\n * Creates a full ServerTransaction.\n * Fetches/caches serverSchema automatically.\n */\n async createTransaction<TWrappedTransaction>(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n ): Promise<TransactionImpl<S, TWrappedTransaction>> {\n const serverSchema = await this.#getOrFetchServerSchema(dbTransaction);\n const executor = this.createExecutor(dbTransaction, serverSchema);\n const mutate = makeTransactionMutate(this.#schema, executor);\n return new TransactionImpl(\n dbTransaction,\n clientID,\n mutationID,\n mutate,\n this.#schema,\n serverSchema,\n );\n }\n}\n\nexport async function makeServerTransaction<\n TSchema extends Schema,\n TWrappedTransaction,\n>(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n schema: TSchema,\n) {\n const serverSchema = await getServerSchema(dbTransaction, schema);\n // Use the internal executor and shared function directly,\n // bypassing the validation in makeMutateCRUD/makeSchemaCRUD\n const executor = makeServerCRUDExecutor(schema, dbTransaction, serverSchema);\n const mutate = makeTransactionMutate(schema, executor);\n return new TransactionImpl(\n dbTransaction,\n clientID,\n mutationID,\n mutate,\n schema,\n serverSchema,\n );\n}\n\n/**\n * @deprecated Use transactions instead.\n *\n * Returns a curried function for backwards compatibility.\n */\nexport function makeSchemaCRUD<S extends Schema>(\n schema: S,\n): (\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n) => MutateCRUD<S, true> {\n return (dbTransaction: DBTransaction<unknown>, serverSchema: ServerSchema) =>\n makeCRUDMutate(\n schema,\n true,\n makeServerCRUDExecutor(schema, dbTransaction, serverSchema),\n );\n}\n\nfunction removeUndefined<T extends Record<string, unknown>>(value: T): T {\n const valueWithoutUndefined: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n if (val !== undefined) {\n valueWithoutUndefined[key] = val;\n }\n }\n return valueWithoutUndefined as T;\n}\n\n/**\n * Creates a CRUDExecutor for server-side SQL execution.\n *\n * For users with very large schemas it is expensive to re-create\n * all the CRUD mutators for each transaction. Instead, we create\n * the SQL-generating methods once up-front and then bind them to\n * the transaction as requested.\n */\nfunction makeServerCRUDExecutor<S extends Schema>(\n schema: S,\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n): CRUDExecutor {\n // Pre-create TableCRUD methods for each table (optimization for large schemas)\n const tableCRUDs: Record<string, TableCRUD<TableSchema>> = {};\n for (const tableSchema of Object.values(schema.tables)) {\n tableCRUDs[tableSchema.name] = makeServerTableCRUD(tableSchema);\n }\n\n // Bind transaction context to the methods\n const txHolder: WithHiddenTxAndSchema = {\n [dbTxSymbol]: dbTransaction,\n [serverSchemaSymbol]: serverSchema,\n };\n const boundCRUDs = recordProxy(tableCRUDs, tableCRUD =>\n mapValues(tableCRUD, method => method.bind(txHolder)),\n ) as unknown as SchemaCRUD<S>;\n\n // Return executor that dispatches to bound methods\n return (table: string, kind: CRUDKind, args: unknown) => {\n const tableCRUD = boundCRUDs[table as keyof S['tables']];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (tableCRUD as any)[kind](args);\n };\n}\n\n/**\n * Creates SQL-generating TableCRUD methods for a table.\n * Methods use `this` context to access transaction and server schema.\n */\nfunction makeServerTableCRUD(schema: TableSchema): TableCRUD<TableSchema> {\n return {\n async insert(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPgInternalConvert(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.entries(value).map(([col, v]) =>\n sqlInsertValue(v, serverTableSchema[serverNameFor(col, schema)]),\n ),\n ', ',\n )})`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async upsert(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const primaryKeyColumns = origAndServerNamesFor(\n schema.primaryKey,\n schema,\n );\n const stmt = formatPgInternalConvert(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.entries(value).map(([col, val]) =>\n sqlInsertValue(val, serverTableSchema[serverNameFor(col, schema)]),\n ),\n ', ',\n )}) ON CONFLICT (${sql.join(\n primaryKeyColumns.map(([, serverName]) => sql.ident(serverName)),\n ', ',\n )}) DO UPDATE SET ${sql.join(\n Object.entries(value).map(\n ([col, val]) =>\n sql`${sql.ident(\n schema.columns[col].serverName ?? col,\n )} = ${sqlInsertValue(val, serverTableSchema[serverNameFor(col, schema)])}`,\n ),\n ', ',\n )}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async update(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPgInternalConvert(\n sql`UPDATE ${sql.ident(serverName(schema))} SET ${sql.join(\n targetedColumns.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)} = ${sqlInsertValue(value[origName], serverTableSchema[serverName])}`,\n ),\n ', ',\n )} WHERE ${primaryKeyClause(schema, serverTableSchema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async delete(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const stmt = formatPgInternalConvert(\n sql`DELETE FROM ${sql.ident(\n serverName(schema),\n )} WHERE ${primaryKeyClause(schema, serverTableSchema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n };\n}\n\nfunction serverName(x: {name: string; serverName?: string | undefined}) {\n return x.serverName ?? x.name;\n}\n\nfunction primaryKeyClause(\n schema: TableSchema,\n serverTableSchema: ServerTableSchema,\n row: Record<string, unknown>,\n) {\n const primaryKey = origAndServerNamesFor(schema.primaryKey, schema);\n return sql`${sql.join(\n primaryKey.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)} = ${sqlValue(row[origName], serverTableSchema[serverName])}`,\n ),\n ' AND ',\n )}`;\n}\n\nfunction origAndServerNamesFor(\n originalNames: readonly string[],\n schema: TableSchema,\n): [origName: string, serverName: string][] {\n return originalNames.map(\n name => [name, serverNameFor(name, schema)] as const,\n );\n}\n\nfunction serverNameFor(originalName: string, schema: TableSchema): string {\n const col = schema.columns[originalName];\n assert(\n col,\n `Column ${originalName} was not found in the Zero schema for the table ${schema.name}`,\n );\n return col.serverName ?? originalName;\n}\n\nfunction sqlValue(value: unknown, serverColumnSchema: ServerColumnSchema) {\n return sqlConvertColumnArg(serverColumnSchema, value, false, true);\n}\n\nfunction sqlInsertValue(\n value: unknown,\n serverColumnSchema: ServerColumnSchema,\n) {\n return sqlConvertColumnArg(serverColumnSchema, value, false, false);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"custom.js","names":["#dbTransaction","#schema","#serverSchema","#tableCRUDs","#getOrFetchServerSchema"],"sources":["../../../../zero-server/src/custom.ts"],"sourcesContent":["import {assert} from '../../shared/src/asserts.ts';\nimport {mapValues} from '../../shared/src/objects.ts';\nimport {recordProxy} from '../../shared/src/record-proxy.ts';\nimport {\n formatPgInternalConvert,\n sql,\n sqlConvertColumnArg,\n} from '../../z2s/src/sql.ts';\nimport type {TableSchema} from '../../zero-schema/src/table-schema.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {\n ServerColumnSchema,\n ServerSchema,\n ServerTableSchema,\n} from '../../zero-types/src/server-schema.ts';\nimport {\n type CRUDExecutor,\n type CRUDKind,\n makeCRUDMutate,\n makeTransactionMutate,\n type SchemaCRUD,\n type TableCRUD,\n type TransactionMutate,\n} from '../../zql/src/mutate/crud.ts';\nimport type {\n DBTransaction,\n MutateCRUD,\n ServerTransaction,\n} from '../../zql/src/mutate/custom.ts';\nimport {createRunnableBuilder} from '../../zql/src/query/create-builder.ts';\nimport {QueryDelegateBase} from '../../zql/src/query/query-delegate-base.ts';\nimport {asQueryInternals} from '../../zql/src/query/query-internals.ts';\nimport type {\n HumanReadable,\n Query,\n RunOptions,\n} from '../../zql/src/query/query.ts';\nimport type {ConditionalSchemaQuery} from '../../zql/src/query/schema-query.ts';\nimport {getServerSchema} from './schema.ts';\n\nexport type CustomMutatorDefs<TDBTransaction> = {\n [namespaceOrKey: string]:\n | CustomMutatorImpl<TDBTransaction>\n | CustomMutatorDefs<TDBTransaction>;\n};\n\nexport type CustomMutatorImpl<\n TDBTransaction,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n TArgs = any,\n Context = unknown,\n> = (tx: TDBTransaction, args: TArgs, ctx: Context) => Promise<void>;\n\n/**\n * QueryDelegate implementation for server-side transactions.\n * Extends QueryDelegateBase to satisfy the QueryDelegate interface,\n * but overrides run() to execute against Postgres and throws on\n * preload()/materialize() which don't make sense server-side.\n */\nclass ServerTransactionQueryDelegate extends QueryDelegateBase {\n readonly #dbTransaction: DBTransaction<unknown>;\n readonly #schema: Schema;\n readonly #serverSchema: ServerSchema;\n\n readonly defaultQueryComplete = true;\n\n constructor(\n dbTransaction: DBTransaction<unknown>,\n schema: Schema,\n serverSchema: ServerSchema,\n ) {\n super();\n this.#dbTransaction = dbTransaction;\n this.#schema = schema;\n this.#serverSchema = serverSchema;\n }\n\n getSource(): never {\n throw new Error('not implemented');\n }\n\n override run<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n _options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n const queryInternals = asQueryInternals(query);\n return this.#dbTransaction.runQuery<TReturn>(\n queryInternals.ast,\n queryInternals.format,\n this.#schema,\n this.#serverSchema,\n );\n }\n\n override preload(): never {\n throw new Error('preload() is not supported in server transactions');\n }\n\n override materialize(): never {\n throw new Error('materialize() is not supported in server transactions');\n }\n}\n\nexport class TransactionImpl<\n TSchema extends Schema,\n TWrappedTransaction,\n> implements ServerTransaction<TSchema, TWrappedTransaction> {\n readonly location = 'server';\n readonly reason = 'authoritative';\n readonly dbTransaction: DBTransaction<TWrappedTransaction>;\n readonly clientID: string;\n readonly mutationID: number;\n readonly mutate: TransactionMutate<TSchema>;\n /**\n * @deprecated Use {@linkcode createBuilder} with `tx.run(zql.table.where(...))` instead.\n */\n readonly query: ConditionalSchemaQuery<TSchema>;\n\n readonly #schema: TSchema;\n readonly #serverSchema: ServerSchema;\n\n constructor(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n mutate: TransactionMutate<TSchema>,\n schema: TSchema,\n serverSchema: ServerSchema,\n ) {\n this.dbTransaction = dbTransaction;\n this.clientID = clientID;\n this.mutationID = mutationID;\n this.mutate = mutate;\n this.#schema = schema;\n this.#serverSchema = serverSchema;\n\n const delegate = new ServerTransactionQueryDelegate(\n dbTransaction,\n schema,\n serverSchema,\n );\n this.query = createRunnableBuilder(delegate, schema);\n }\n\n run<TTable extends keyof TSchema['tables'] & string, TReturn>(\n query: Query<TTable, TSchema, TReturn>,\n _options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n const queryInternals = asQueryInternals(query);\n\n // Execute the query using the database-specific executor\n return this.dbTransaction.runQuery<TReturn>(\n queryInternals.ast,\n queryInternals.format,\n this.#schema,\n this.#serverSchema,\n );\n }\n}\n\nconst dbTxSymbol = Symbol();\n\nconst serverSchemaSymbol = Symbol();\n\ntype WithHiddenTxAndSchema = {\n [dbTxSymbol]: DBTransaction<unknown>;\n [serverSchemaSymbol]: ServerSchema;\n};\n\n/**\n * Factory for creating MutateCRUD instances efficiently.\n *\n * Pre-creates the SQL-generating TableCRUD methods once from the schema,\n * caches the serverSchema after first fetch, and only binds the transaction\n * at transaction time.\n *\n * Use this when you need to create many transactions and want to avoid\n * the overhead of re-creating CRUD methods for each one.\n */\nexport class CRUDMutatorFactory<S extends Schema> {\n readonly #schema: S;\n readonly #tableCRUDs: Record<string, TableCRUD<TableSchema>>;\n #serverSchema: ServerSchema | undefined;\n\n constructor(schema: S) {\n this.#schema = schema;\n // Pre-create TableCRUD methods for each table once\n this.#tableCRUDs = {};\n for (const tableSchema of Object.values(schema.tables)) {\n this.#tableCRUDs[tableSchema.name] = makeServerTableCRUD(tableSchema);\n }\n }\n\n /**\n * Gets the cached serverSchema, or fetches and caches it on first call.\n */\n async #getOrFetchServerSchema(\n dbTransaction: DBTransaction<unknown>,\n ): Promise<ServerSchema> {\n if (!this.#serverSchema) {\n this.#serverSchema = await getServerSchema(dbTransaction, this.#schema);\n }\n return this.#serverSchema;\n }\n\n /**\n * Creates a CRUDExecutor bound to the given transaction and serverSchema.\n * Uses the pre-created TableCRUD methods from construction time.\n */\n createExecutor(\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n ): CRUDExecutor {\n const txHolder: WithHiddenTxAndSchema = {\n [dbTxSymbol]: dbTransaction,\n [serverSchemaSymbol]: serverSchema,\n };\n const boundCRUDs = recordProxy(this.#tableCRUDs, tableCRUD =>\n mapValues(tableCRUD, method => method.bind(txHolder)),\n ) as unknown as SchemaCRUD<S>;\n\n return (table: string, kind: CRUDKind, args: unknown) => {\n const tableCRUD = boundCRUDs[table as keyof S['tables']];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (tableCRUD as any)[kind](args);\n };\n }\n\n /**\n * Creates a full ServerTransaction.\n * Fetches/caches serverSchema automatically.\n */\n async createTransaction<TWrappedTransaction>(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n ): Promise<TransactionImpl<S, TWrappedTransaction>> {\n const serverSchema = await this.#getOrFetchServerSchema(dbTransaction);\n const executor = this.createExecutor(dbTransaction, serverSchema);\n const mutate = makeTransactionMutate(this.#schema, executor);\n return new TransactionImpl(\n dbTransaction,\n clientID,\n mutationID,\n mutate,\n this.#schema,\n serverSchema,\n );\n }\n}\n\nexport async function makeServerTransaction<\n TSchema extends Schema,\n TWrappedTransaction,\n>(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n schema: TSchema,\n) {\n const serverSchema = await getServerSchema(dbTransaction, schema);\n // Use the internal executor and shared function directly,\n // bypassing the validation in makeMutateCRUD/makeSchemaCRUD\n const executor = makeServerCRUDExecutor(schema, dbTransaction, serverSchema);\n const mutate = makeTransactionMutate(schema, executor);\n return new TransactionImpl(\n dbTransaction,\n clientID,\n mutationID,\n mutate,\n schema,\n serverSchema,\n );\n}\n\n/**\n * @deprecated Use transactions instead.\n *\n * Returns a curried function for backwards compatibility.\n */\nexport function makeSchemaCRUD<S extends Schema>(\n schema: S,\n): (\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n) => MutateCRUD<S, true> {\n return (dbTransaction: DBTransaction<unknown>, serverSchema: ServerSchema) =>\n makeCRUDMutate(\n schema,\n true,\n makeServerCRUDExecutor(schema, dbTransaction, serverSchema),\n );\n}\n\nfunction removeUndefined<T extends Record<string, unknown>>(value: T): T {\n const valueWithoutUndefined: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n if (val !== undefined) {\n valueWithoutUndefined[key] = val;\n }\n }\n return valueWithoutUndefined as T;\n}\n\n/**\n * Creates a CRUDExecutor for server-side SQL execution.\n *\n * For users with very large schemas it is expensive to re-create\n * all the CRUD mutators for each transaction. Instead, we create\n * the SQL-generating methods once up-front and then bind them to\n * the transaction as requested.\n */\nfunction makeServerCRUDExecutor<S extends Schema>(\n schema: S,\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n): CRUDExecutor {\n // Pre-create TableCRUD methods for each table (optimization for large schemas)\n const tableCRUDs: Record<string, TableCRUD<TableSchema>> = {};\n for (const tableSchema of Object.values(schema.tables)) {\n tableCRUDs[tableSchema.name] = makeServerTableCRUD(tableSchema);\n }\n\n // Bind transaction context to the methods\n const txHolder: WithHiddenTxAndSchema = {\n [dbTxSymbol]: dbTransaction,\n [serverSchemaSymbol]: serverSchema,\n };\n const boundCRUDs = recordProxy(tableCRUDs, tableCRUD =>\n mapValues(tableCRUD, method => method.bind(txHolder)),\n ) as unknown as SchemaCRUD<S>;\n\n // Return executor that dispatches to bound methods\n return (table: string, kind: CRUDKind, args: unknown) => {\n const tableCRUD = boundCRUDs[table as keyof S['tables']];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (tableCRUD as any)[kind](args);\n };\n}\n\n/**\n * Creates SQL-generating TableCRUD methods for a table.\n * Methods use `this` context to access transaction and server schema.\n */\nfunction makeServerTableCRUD(schema: TableSchema): TableCRUD<TableSchema> {\n return {\n async insert(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPgInternalConvert(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.entries(value).map(([col, v]) =>\n sqlInsertValue(v, serverTableSchema[serverNameFor(col, schema)]),\n ),\n ', ',\n )})`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async upsert(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const primaryKeyColumns = origAndServerNamesFor(\n schema.primaryKey,\n schema,\n );\n const stmt = formatPgInternalConvert(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.entries(value).map(([col, val]) =>\n sqlInsertValue(val, serverTableSchema[serverNameFor(col, schema)]),\n ),\n ', ',\n )}) ON CONFLICT (${sql.join(\n primaryKeyColumns.map(([, serverName]) => sql.ident(serverName)),\n ', ',\n )}) DO UPDATE SET ${sql.join(\n Object.entries(value).map(\n ([col, val]) =>\n sql`${sql.ident(\n schema.columns[col].serverName ?? col,\n )} = ${sqlInsertValue(val, serverTableSchema[serverNameFor(col, schema)])}`,\n ),\n ', ',\n )}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async update(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPgInternalConvert(\n sql`UPDATE ${sql.ident(serverName(schema))} SET ${sql.join(\n targetedColumns.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)} = ${sqlInsertValue(value[origName], serverTableSchema[serverName])}`,\n ),\n ', ',\n )} WHERE ${primaryKeyClause(schema, serverTableSchema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async delete(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const stmt = formatPgInternalConvert(\n sql`DELETE FROM ${sql.ident(\n serverName(schema),\n )} WHERE ${primaryKeyClause(schema, serverTableSchema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n };\n}\n\nfunction serverName(x: {name: string; serverName?: string | undefined}) {\n return x.serverName ?? x.name;\n}\n\nfunction primaryKeyClause(\n schema: TableSchema,\n serverTableSchema: ServerTableSchema,\n row: Record<string, unknown>,\n) {\n const primaryKey = origAndServerNamesFor(schema.primaryKey, schema);\n return sql`${sql.join(\n primaryKey.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)} = ${sqlValue(row[origName], serverTableSchema[serverName])}`,\n ),\n ' AND ',\n )}`;\n}\n\nfunction origAndServerNamesFor(\n originalNames: readonly string[],\n schema: TableSchema,\n): [origName: string, serverName: string][] {\n return originalNames.map(\n name => [name, serverNameFor(name, schema)] as const,\n );\n}\n\nfunction serverNameFor(originalName: string, schema: TableSchema): string {\n const col = schema.columns[originalName];\n assert(\n col,\n `Column ${originalName} was not found in the Zero schema for the table ${schema.name}`,\n );\n return col.serverName ?? originalName;\n}\n\nfunction sqlValue(value: unknown, serverColumnSchema: ServerColumnSchema) {\n return sqlConvertColumnArg(serverColumnSchema, value, false, true);\n}\n\nfunction sqlInsertValue(\n value: unknown,\n serverColumnSchema: ServerColumnSchema,\n) {\n return sqlConvertColumnArg(serverColumnSchema, value, false, false);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","names":[],"sources":["../../../../zero-server/src/logging.ts"],"sourcesContent":["import {LogContext, consoleLogSink, type LogLevel} from '@rocicorp/logger';\n\nexport function createLogContext(level: LogLevel): LogContext {\n return new LogContext(level, {}, consoleLogSink);\n}\n"],"mappings":";;AAEA,SAAgB,iBAAiB,OAA6B;AAC5D,QAAO,IAAI,WAAW,OAAO,EAAE,EAAE,eAAe"}
1
+ {"version":3,"file":"logging.js","names":[],"sources":["../../../../zero-server/src/logging.ts"],"sourcesContent":["import {LogContext, consoleLogSink, type LogLevel} from '@rocicorp/logger';\n\nexport function createLogContext(level: LogLevel): LogContext {\n return new LogContext(level, {}, consoleLogSink);\n}\n"],"mappings":";;AAEA,SAAgB,iBAAiB,OAA6B;CAC5D,OAAO,IAAI,WAAW,OAAO,CAAC,GAAG,cAAc;AACjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"pg-query-executor.js","names":[],"sources":["../../../../zero-server/src/pg-query-executor.ts"],"sourcesContent":["import {compile, extractZqlResult} from '../../z2s/src/compiler.ts';\nimport {formatPgInternalConvert} from '../../z2s/src/sql.ts';\nimport type {AST} from '../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../zero-types/src/format.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../zero-types/src/server-schema.ts';\nimport type {DBTransaction} from '../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../zql/src/query/query.ts';\n\n/**\n * Executes a query AST against a PostgreSQL database.\n */\nexport async function executePostgresQuery<TReturn>(\n dbTransaction: DBTransaction<unknown>,\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n): Promise<HumanReadable<TReturn>> {\n const sqlQuery = formatPgInternalConvert(\n compile(serverSchema, schema, ast, format),\n );\n\n const pgIterableResult = await dbTransaction.query(\n sqlQuery.text,\n sqlQuery.values,\n );\n\n const pgArrayResult = Array.isArray(pgIterableResult)\n ? pgIterableResult\n : [...pgIterableResult];\n\n if (pgArrayResult.length === 0 && format.singular) {\n return undefined as unknown as HumanReadable<TReturn>;\n }\n\n return extractZqlResult(pgArrayResult) as HumanReadable<TReturn>;\n}\n"],"mappings":";;;;;;AAYA,eAAsB,qBACpB,eACA,KACA,QACA,QACA,cACiC;CACjC,MAAM,WAAW,wBACf,QAAQ,cAAc,QAAQ,KAAK,OAAO,CAC3C;CAED,MAAM,mBAAmB,MAAM,cAAc,MAC3C,SAAS,MACT,SAAS,OACV;CAED,MAAM,gBAAgB,MAAM,QAAQ,iBAAiB,GACjD,mBACA,CAAC,GAAG,iBAAiB;AAEzB,KAAI,cAAc,WAAW,KAAK,OAAO,SACvC;AAGF,QAAO,iBAAiB,cAAc"}
1
+ {"version":3,"file":"pg-query-executor.js","names":[],"sources":["../../../../zero-server/src/pg-query-executor.ts"],"sourcesContent":["import {compile, extractZqlResult} from '../../z2s/src/compiler.ts';\nimport {formatPgInternalConvert} from '../../z2s/src/sql.ts';\nimport type {AST} from '../../zero-protocol/src/ast.ts';\nimport type {Format} from '../../zero-types/src/format.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../zero-types/src/server-schema.ts';\nimport type {DBTransaction} from '../../zql/src/mutate/custom.ts';\nimport type {HumanReadable} from '../../zql/src/query/query.ts';\n\n/**\n * Executes a query AST against a PostgreSQL database.\n */\nexport async function executePostgresQuery<TReturn>(\n dbTransaction: DBTransaction<unknown>,\n ast: AST,\n format: Format,\n schema: Schema,\n serverSchema: ServerSchema,\n): Promise<HumanReadable<TReturn>> {\n const sqlQuery = formatPgInternalConvert(\n compile(serverSchema, schema, ast, format),\n );\n\n const pgIterableResult = await dbTransaction.query(\n sqlQuery.text,\n sqlQuery.values,\n );\n\n const pgArrayResult = Array.isArray(pgIterableResult)\n ? pgIterableResult\n : [...pgIterableResult];\n\n if (pgArrayResult.length === 0 && format.singular) {\n return undefined as unknown as HumanReadable<TReturn>;\n }\n\n return extractZqlResult(pgArrayResult) as HumanReadable<TReturn>;\n}\n"],"mappings":";;;;;;AAYA,eAAsB,qBACpB,eACA,KACA,QACA,QACA,cACiC;CACjC,MAAM,WAAW,wBACf,QAAQ,cAAc,QAAQ,KAAK,MAAM,CAC3C;CAEA,MAAM,mBAAmB,MAAM,cAAc,MAC3C,SAAS,MACT,SAAS,MACX;CAEA,MAAM,gBAAgB,MAAM,QAAQ,gBAAgB,IAChD,mBACA,CAAC,GAAG,gBAAgB;CAExB,IAAI,cAAc,WAAW,KAAK,OAAO,UACvC;CAGF,OAAO,iBAAiB,aAAa;AACvC"}