@rocicorp/zero 0.26.0-canary.0 → 0.26.0-canary.3

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 (391) hide show
  1. package/README.md +1 -1
  2. package/out/replicache/src/persist/collect-idb-databases.d.ts +4 -4
  3. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  4. package/out/replicache/src/persist/collect-idb-databases.js +22 -19
  5. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  6. package/out/replicache/src/persist/refresh.d.ts.map +1 -1
  7. package/out/replicache/src/persist/refresh.js +0 -8
  8. package/out/replicache/src/persist/refresh.js.map +1 -1
  9. package/out/replicache/src/process-scheduler.d.ts +23 -0
  10. package/out/replicache/src/process-scheduler.d.ts.map +1 -1
  11. package/out/replicache/src/process-scheduler.js +50 -1
  12. package/out/replicache/src/process-scheduler.js.map +1 -1
  13. package/out/replicache/src/replicache-impl.d.ts +8 -0
  14. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  15. package/out/replicache/src/replicache-impl.js +11 -2
  16. package/out/replicache/src/replicache-impl.js.map +1 -1
  17. package/out/shared/src/custom-key-map.d.ts +4 -4
  18. package/out/shared/src/custom-key-map.d.ts.map +1 -1
  19. package/out/shared/src/custom-key-map.js.map +1 -1
  20. package/out/shared/src/falsy.d.ts +3 -0
  21. package/out/shared/src/falsy.d.ts.map +1 -0
  22. package/out/shared/src/iterables.d.ts +6 -8
  23. package/out/shared/src/iterables.d.ts.map +1 -1
  24. package/out/shared/src/iterables.js +13 -7
  25. package/out/shared/src/iterables.js.map +1 -1
  26. package/out/shared/src/options.d.ts +1 -0
  27. package/out/shared/src/options.d.ts.map +1 -1
  28. package/out/shared/src/options.js +5 -1
  29. package/out/shared/src/options.js.map +1 -1
  30. package/out/zero/package.json.js +1 -1
  31. package/out/zero/src/adapters/drizzle.js +1 -2
  32. package/out/zero/src/adapters/prisma.d.ts +2 -0
  33. package/out/zero/src/adapters/prisma.d.ts.map +1 -0
  34. package/out/zero/src/adapters/prisma.js +6 -0
  35. package/out/zero/src/adapters/prisma.js.map +1 -0
  36. package/out/zero/src/pg.js +4 -7
  37. package/out/zero/src/react.js +3 -1
  38. package/out/zero/src/react.js.map +1 -1
  39. package/out/zero/src/server.js +5 -8
  40. package/out/zero/src/zero-cache-dev.js +7 -3
  41. package/out/zero/src/zero-cache-dev.js.map +1 -1
  42. package/out/zero-cache/src/auth/load-permissions.d.ts +3 -2
  43. package/out/zero-cache/src/auth/load-permissions.d.ts.map +1 -1
  44. package/out/zero-cache/src/auth/load-permissions.js +14 -8
  45. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  46. package/out/zero-cache/src/auth/write-authorizer.d.ts +6 -0
  47. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  48. package/out/zero-cache/src/auth/write-authorizer.js +16 -3
  49. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  50. package/out/zero-cache/src/config/zero-config.d.ts +54 -9
  51. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  52. package/out/zero-cache/src/config/zero-config.js +80 -20
  53. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  54. package/out/zero-cache/src/custom/fetch.d.ts +3 -0
  55. package/out/zero-cache/src/custom/fetch.d.ts.map +1 -1
  56. package/out/zero-cache/src/custom/fetch.js +26 -0
  57. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  58. package/out/zero-cache/src/db/lite-tables.js +1 -1
  59. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  60. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  61. package/out/zero-cache/src/db/migration-lite.js +9 -3
  62. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  63. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  64. package/out/zero-cache/src/db/migration.js +9 -3
  65. package/out/zero-cache/src/db/migration.js.map +1 -1
  66. package/out/zero-cache/src/db/specs.d.ts +4 -3
  67. package/out/zero-cache/src/db/specs.d.ts.map +1 -1
  68. package/out/zero-cache/src/db/specs.js +4 -1
  69. package/out/zero-cache/src/db/specs.js.map +1 -1
  70. package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
  71. package/out/zero-cache/src/db/transaction-pool.js +9 -3
  72. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  73. package/out/zero-cache/src/observability/events.d.ts.map +1 -1
  74. package/out/zero-cache/src/observability/events.js +15 -5
  75. package/out/zero-cache/src/observability/events.js.map +1 -1
  76. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  77. package/out/zero-cache/src/server/change-streamer.js +10 -2
  78. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  79. package/out/zero-cache/src/server/inspector-delegate.d.ts +1 -1
  80. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  81. package/out/zero-cache/src/server/inspector-delegate.js +11 -30
  82. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  83. package/out/zero-cache/src/server/main.js +1 -1
  84. package/out/zero-cache/src/server/main.js.map +1 -1
  85. package/out/zero-cache/src/server/priority-op.d.ts +8 -0
  86. package/out/zero-cache/src/server/priority-op.d.ts.map +1 -0
  87. package/out/zero-cache/src/server/priority-op.js +29 -0
  88. package/out/zero-cache/src/server/priority-op.js.map +1 -0
  89. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  90. package/out/zero-cache/src/server/syncer.js +10 -10
  91. package/out/zero-cache/src/server/syncer.js.map +1 -1
  92. package/out/zero-cache/src/services/analyze.js +1 -1
  93. package/out/zero-cache/src/services/analyze.js.map +1 -1
  94. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  95. package/out/zero-cache/src/services/change-source/custom/change-source.js +4 -7
  96. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  97. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  98. package/out/zero-cache/src/services/change-source/pg/change-source.js +68 -13
  99. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  100. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  101. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +7 -2
  102. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  103. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  104. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +7 -4
  105. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  106. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +125 -180
  107. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  108. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +1 -10
  109. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  110. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  111. package/out/zero-cache/src/services/change-source/pg/schema/init.js +26 -12
  112. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  113. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +36 -90
  114. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
  115. package/out/zero-cache/src/services/change-source/pg/schema/published.js +51 -14
  116. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  117. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +31 -36
  118. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  119. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +25 -17
  120. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  121. package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts +2 -2
  122. package/out/zero-cache/src/services/change-source/pg/schema/validation.d.ts.map +1 -1
  123. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +2 -4
  124. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  125. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +158 -53
  126. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  127. package/out/zero-cache/src/services/change-source/protocol/current/data.js +55 -10
  128. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  129. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +210 -72
  130. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  131. package/out/zero-cache/src/services/change-source/protocol/current.js +4 -2
  132. package/out/zero-cache/src/services/change-source/replica-schema.d.ts.map +1 -1
  133. package/out/zero-cache/src/services/change-source/replica-schema.js +20 -4
  134. package/out/zero-cache/src/services/change-source/replica-schema.js.map +1 -1
  135. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +1 -1
  136. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  137. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +6 -4
  138. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  139. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +71 -25
  140. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  141. package/out/zero-cache/src/services/change-streamer/change-streamer.js +1 -1
  142. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  143. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +1 -0
  144. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  145. package/out/zero-cache/src/services/change-streamer/schema/tables.js +6 -5
  146. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  147. package/out/zero-cache/src/services/change-streamer/storer.d.ts +1 -1
  148. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  149. package/out/zero-cache/src/services/change-streamer/storer.js +17 -6
  150. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  151. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts +2 -0
  152. package/out/zero-cache/src/services/change-streamer/subscriber.d.ts.map +1 -1
  153. package/out/zero-cache/src/services/change-streamer/subscriber.js +14 -1
  154. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  155. package/out/zero-cache/src/services/heapz.d.ts.map +1 -1
  156. package/out/zero-cache/src/services/heapz.js +1 -0
  157. package/out/zero-cache/src/services/heapz.js.map +1 -1
  158. package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
  159. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  160. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  161. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  162. package/out/zero-cache/src/services/litestream/commands.js +3 -1
  163. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  164. package/out/zero-cache/src/services/litestream/config.yml +1 -0
  165. package/out/zero-cache/src/services/mutagen/error.d.ts.map +1 -1
  166. package/out/zero-cache/src/services/mutagen/error.js +4 -1
  167. package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
  168. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +4 -4
  169. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  170. package/out/zero-cache/src/services/mutagen/mutagen.js +10 -24
  171. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  172. package/out/zero-cache/src/services/mutagen/pusher.d.ts +8 -6
  173. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  174. package/out/zero-cache/src/services/mutagen/pusher.js +130 -19
  175. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  176. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  177. package/out/zero-cache/src/services/replicator/change-processor.js +24 -31
  178. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  179. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +4 -4
  180. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
  181. package/out/zero-cache/src/services/replicator/schema/change-log.js +38 -36
  182. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  183. package/out/zero-cache/src/services/{change-source → replicator/schema}/column-metadata.d.ts +3 -3
  184. package/out/zero-cache/src/services/replicator/schema/column-metadata.d.ts.map +1 -0
  185. package/out/zero-cache/src/services/{change-source → replicator/schema}/column-metadata.js +3 -3
  186. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -0
  187. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  188. package/out/zero-cache/src/services/replicator/schema/replication-state.js +3 -1
  189. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  190. package/out/zero-cache/src/services/run-ast.js +1 -1
  191. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  192. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  193. package/out/zero-cache/src/services/statz.js +1 -0
  194. package/out/zero-cache/src/services/statz.js.map +1 -1
  195. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +5 -6
  196. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  197. package/out/zero-cache/src/services/view-syncer/client-handler.js +5 -23
  198. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  199. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +1 -1
  200. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  201. package/out/zero-cache/src/services/view-syncer/cvr-store.js +65 -44
  202. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  203. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +0 -1
  204. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  205. package/out/zero-cache/src/services/view-syncer/cvr.js +23 -6
  206. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  207. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +14 -22
  208. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  209. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +46 -67
  210. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  211. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts +1 -1
  212. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
  213. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +22 -11
  214. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  215. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +0 -2
  216. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  217. package/out/zero-cache/src/services/view-syncer/snapshotter.js +3 -11
  218. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  219. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +6 -4
  220. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  221. package/out/zero-cache/src/services/view-syncer/view-syncer.js +216 -243
  222. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  223. package/out/zero-cache/src/types/lexi-version.d.ts.map +1 -1
  224. package/out/zero-cache/src/types/lexi-version.js +4 -1
  225. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  226. package/out/zero-cache/src/types/lite.d.ts.map +1 -1
  227. package/out/zero-cache/src/types/lite.js +8 -2
  228. package/out/zero-cache/src/types/lite.js.map +1 -1
  229. package/out/zero-cache/src/types/shards.js +1 -1
  230. package/out/zero-cache/src/types/shards.js.map +1 -1
  231. package/out/zero-cache/src/types/sql.d.ts +5 -0
  232. package/out/zero-cache/src/types/sql.d.ts.map +1 -1
  233. package/out/zero-cache/src/types/sql.js +5 -1
  234. package/out/zero-cache/src/types/sql.js.map +1 -1
  235. package/out/zero-cache/src/types/subscription.js +1 -1
  236. package/out/zero-cache/src/types/subscription.js.map +1 -1
  237. package/out/zero-cache/src/workers/connect-params.d.ts +1 -1
  238. package/out/zero-cache/src/workers/connect-params.d.ts.map +1 -1
  239. package/out/zero-cache/src/workers/connect-params.js +2 -3
  240. package/out/zero-cache/src/workers/connect-params.js.map +1 -1
  241. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  242. package/out/zero-cache/src/workers/replicator.js +2 -5
  243. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  244. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  245. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +15 -10
  246. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  247. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  248. package/out/zero-cache/src/workers/syncer.js +17 -10
  249. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  250. package/out/zero-client/src/client/connection-manager.d.ts +8 -0
  251. package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
  252. package/out/zero-client/src/client/connection-manager.js +33 -0
  253. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  254. package/out/zero-client/src/client/connection.d.ts.map +1 -1
  255. package/out/zero-client/src/client/connection.js +6 -3
  256. package/out/zero-client/src/client/connection.js.map +1 -1
  257. package/out/zero-client/src/client/context.js +1 -0
  258. package/out/zero-client/src/client/context.js.map +1 -1
  259. package/out/zero-client/src/client/error.js +1 -1
  260. package/out/zero-client/src/client/error.js.map +1 -1
  261. package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
  262. package/out/zero-client/src/client/mutator-proxy.js +15 -1
  263. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  264. package/out/zero-client/src/client/options.d.ts +11 -1
  265. package/out/zero-client/src/client/options.d.ts.map +1 -1
  266. package/out/zero-client/src/client/options.js.map +1 -1
  267. package/out/zero-client/src/client/query-manager.d.ts +4 -0
  268. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  269. package/out/zero-client/src/client/query-manager.js +7 -0
  270. package/out/zero-client/src/client/query-manager.js.map +1 -1
  271. package/out/zero-client/src/client/version.js +1 -1
  272. package/out/zero-client/src/client/zero.d.ts +5 -5
  273. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  274. package/out/zero-client/src/client/zero.js +53 -8
  275. package/out/zero-client/src/client/zero.js.map +1 -1
  276. package/out/zero-client/src/mod.d.ts +1 -0
  277. package/out/zero-client/src/mod.d.ts.map +1 -1
  278. package/out/zero-protocol/src/connect.d.ts +4 -0
  279. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  280. package/out/zero-protocol/src/connect.js +3 -1
  281. package/out/zero-protocol/src/connect.js.map +1 -1
  282. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  283. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  284. package/out/zero-protocol/src/protocol-version.js +1 -1
  285. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  286. package/out/zero-protocol/src/push.d.ts +16 -0
  287. package/out/zero-protocol/src/push.d.ts.map +1 -1
  288. package/out/zero-protocol/src/push.js +25 -1
  289. package/out/zero-protocol/src/push.js.map +1 -1
  290. package/out/zero-protocol/src/up.d.ts +2 -0
  291. package/out/zero-protocol/src/up.d.ts.map +1 -1
  292. package/out/zero-react/src/mod.d.ts +3 -1
  293. package/out/zero-react/src/mod.d.ts.map +1 -1
  294. package/out/zero-react/src/paging-reducer.d.ts +61 -0
  295. package/out/zero-react/src/paging-reducer.d.ts.map +1 -0
  296. package/out/zero-react/src/paging-reducer.js +77 -0
  297. package/out/zero-react/src/paging-reducer.js.map +1 -0
  298. package/out/zero-react/src/use-query.d.ts +11 -1
  299. package/out/zero-react/src/use-query.d.ts.map +1 -1
  300. package/out/zero-react/src/use-query.js +13 -11
  301. package/out/zero-react/src/use-query.js.map +1 -1
  302. package/out/zero-react/src/use-rows.d.ts +39 -0
  303. package/out/zero-react/src/use-rows.d.ts.map +1 -0
  304. package/out/zero-react/src/use-rows.js +130 -0
  305. package/out/zero-react/src/use-rows.js.map +1 -0
  306. package/out/zero-react/src/use-zero-virtualizer.d.ts +122 -0
  307. package/out/zero-react/src/use-zero-virtualizer.d.ts.map +1 -0
  308. package/out/zero-react/src/use-zero-virtualizer.js +342 -0
  309. package/out/zero-react/src/use-zero-virtualizer.js.map +1 -0
  310. package/out/zero-react/src/zero-provider.js +1 -1
  311. package/out/zero-react/src/zero-provider.js.map +1 -1
  312. package/out/zero-server/src/adapters/drizzle.d.ts +18 -18
  313. package/out/zero-server/src/adapters/drizzle.d.ts.map +1 -1
  314. package/out/zero-server/src/adapters/drizzle.js +8 -22
  315. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  316. package/out/zero-server/src/adapters/pg.d.ts +19 -13
  317. package/out/zero-server/src/adapters/pg.d.ts.map +1 -1
  318. package/out/zero-server/src/adapters/pg.js.map +1 -1
  319. package/out/zero-server/src/adapters/postgresjs.d.ts +19 -13
  320. package/out/zero-server/src/adapters/postgresjs.d.ts.map +1 -1
  321. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  322. package/out/zero-server/src/adapters/prisma.d.ts +66 -0
  323. package/out/zero-server/src/adapters/prisma.d.ts.map +1 -0
  324. package/out/zero-server/src/adapters/prisma.js +63 -0
  325. package/out/zero-server/src/adapters/prisma.js.map +1 -0
  326. package/out/zero-server/src/custom.js +1 -15
  327. package/out/zero-server/src/custom.js.map +1 -1
  328. package/out/zero-server/src/mod.d.ts +9 -8
  329. package/out/zero-server/src/mod.d.ts.map +1 -1
  330. package/out/zero-server/src/process-mutations.d.ts +2 -1
  331. package/out/zero-server/src/process-mutations.d.ts.map +1 -1
  332. package/out/zero-server/src/process-mutations.js +39 -4
  333. package/out/zero-server/src/process-mutations.js.map +1 -1
  334. package/out/zero-server/src/push-processor.js +1 -1
  335. package/out/zero-server/src/push-processor.js.map +1 -1
  336. package/out/zero-server/src/schema.d.ts.map +1 -1
  337. package/out/zero-server/src/schema.js +4 -1
  338. package/out/zero-server/src/schema.js.map +1 -1
  339. package/out/zero-server/src/zql-database.d.ts.map +1 -1
  340. package/out/zero-server/src/zql-database.js +18 -0
  341. package/out/zero-server/src/zql-database.js.map +1 -1
  342. package/out/zero-solid/src/mod.d.ts +1 -1
  343. package/out/zero-solid/src/mod.d.ts.map +1 -1
  344. package/out/zero-solid/src/solid-view.js +1 -0
  345. package/out/zero-solid/src/solid-view.js.map +1 -1
  346. package/out/zero-solid/src/use-query.d.ts +10 -1
  347. package/out/zero-solid/src/use-query.d.ts.map +1 -1
  348. package/out/zero-solid/src/use-query.js +22 -5
  349. package/out/zero-solid/src/use-query.js.map +1 -1
  350. package/out/zero-solid/src/use-zero.js +1 -1
  351. package/out/zero-solid/src/use-zero.js.map +1 -1
  352. package/out/zql/src/ivm/constraint.d.ts.map +1 -1
  353. package/out/zql/src/ivm/constraint.js +4 -1
  354. package/out/zql/src/ivm/constraint.js.map +1 -1
  355. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  356. package/out/zql/src/ivm/exists.js +4 -1
  357. package/out/zql/src/ivm/exists.js.map +1 -1
  358. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  359. package/out/zql/src/ivm/join-utils.js +8 -2
  360. package/out/zql/src/ivm/join-utils.js.map +1 -1
  361. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  362. package/out/zql/src/ivm/memory-source.js +12 -3
  363. package/out/zql/src/ivm/memory-source.js.map +1 -1
  364. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  365. package/out/zql/src/ivm/push-accumulated.js +25 -2
  366. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  367. package/out/zql/src/ivm/stream.d.ts.map +1 -1
  368. package/out/zql/src/ivm/stream.js +1 -1
  369. package/out/zql/src/ivm/stream.js.map +1 -1
  370. package/out/zql/src/ivm/take.d.ts.map +1 -1
  371. package/out/zql/src/ivm/take.js +24 -6
  372. package/out/zql/src/ivm/take.js.map +1 -1
  373. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  374. package/out/zql/src/ivm/union-fan-in.js +12 -3
  375. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  376. package/out/zql/src/mutate/mutator.js +4 -4
  377. package/out/zql/src/mutate/mutator.js.map +1 -1
  378. package/out/zql/src/query/create-builder.js +3 -5
  379. package/out/zql/src/query/create-builder.js.map +1 -1
  380. package/out/zql/src/query/query-registry.js +4 -4
  381. package/out/zql/src/query/query-registry.js.map +1 -1
  382. package/out/zqlite/src/table-source.d.ts.map +1 -1
  383. package/out/zqlite/src/table-source.js +1 -2
  384. package/out/zqlite/src/table-source.js.map +1 -1
  385. package/package.json +8 -4
  386. package/out/zero-cache/src/services/change-source/column-metadata.d.ts.map +0 -1
  387. package/out/zero-cache/src/services/change-source/column-metadata.js.map +0 -1
  388. package/out/zero-cache/src/types/schema-versions.d.ts +0 -12
  389. package/out/zero-cache/src/types/schema-versions.d.ts.map +0 -1
  390. package/out/zero-cache/src/types/schema-versions.js +0 -28
  391. package/out/zero-cache/src/types/schema-versions.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"table-source.js","sources":["../../../../zqlite/src/table-source.ts"],"sourcesContent":["import type {SQLQuery} from '@databases/sql';\nimport type {LogContext} from '@rocicorp/logger';\nimport SQLite3Database from '@rocicorp/zero-sqlite3';\nimport type {LogConfig} from '../../otel/src/log-options.ts';\nimport {timeSampled} from '../../otel/src/maybe-time.ts';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {must} from '../../shared/src/must.ts';\nimport type {Writable} from '../../shared/src/writable.ts';\nimport type {Condition, Ordering} from '../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../zero-protocol/src/data.ts';\nimport type {PrimaryKey} from '../../zero-protocol/src/primary-key.ts';\nimport type {\n SchemaValue,\n ValueType,\n} from '../../zero-schema/src/table-schema.ts';\nimport type {DebugDelegate} from '../../zql/src/builder/debug-delegate.ts';\nimport {\n createPredicate,\n transformFilters,\n} from '../../zql/src/builder/filter.ts';\nimport {makeComparator, type Node} from '../../zql/src/ivm/data.ts';\nimport {\n generateWithOverlay,\n generateWithStart,\n genPushAndWriteWithSplitEdit,\n type Connection,\n type Overlay,\n} from '../../zql/src/ivm/memory-source.ts';\nimport {type FetchRequest} from '../../zql/src/ivm/operator.ts';\nimport type {SourceSchema} from '../../zql/src/ivm/schema.ts';\nimport {\n type Source,\n type SourceChange,\n type SourceInput,\n} from '../../zql/src/ivm/source.ts';\nimport type {Stream} from '../../zql/src/ivm/stream.ts';\nimport type {Database, Statement} from './db.ts';\nimport {compile, format, sql} from './internal/sql.ts';\nimport {StatementCache} from './internal/statement-cache.ts';\nimport {\n buildSelectQuery,\n toSQLiteType,\n type NoSubqueryCondition,\n} from './query-builder.ts';\nimport {assertOrderingIncludesPK} from '../../zql/src/query/complete-ordering.ts';\n\ntype Statements = {\n readonly cache: StatementCache;\n readonly insert: Statement;\n readonly delete: Statement;\n readonly update: Statement | undefined;\n readonly checkExists: Statement;\n readonly getExisting: Statement;\n};\n\nlet eventCount = 0;\n\n/**\n * A source that is backed by a SQLite table.\n *\n * Values are written to the backing table _after_ being vended by the source.\n *\n * This ordering of events is to ensure self joins function properly. That is,\n * we can't reveal a value to an output before it has been pushed to that output.\n *\n * The code is fairly straightforward except for:\n * 1. Dealing with a `fetch` that has a basis of `before`.\n * 2. Dealing with compound orders that have differing directions (a ASC, b DESC, c ASC)\n *\n * See comments in relevant functions for more details.\n */\nexport class TableSource implements Source {\n readonly #dbCache = new WeakMap<Database, Statements>();\n readonly #connections: Connection[] = [];\n readonly #table: string;\n readonly #columns: Record<string, SchemaValue>;\n // Maps sorted columns JSON string (e.g. '[\"a\",\"b\"]) to Set of columns.\n readonly #uniqueIndexes: Map<string, Set<string>>;\n readonly #primaryKey: PrimaryKey;\n readonly #logConfig: LogConfig;\n readonly #lc: LogContext;\n readonly #shouldYield: () => boolean;\n #stmts: Statements;\n #overlay?: Overlay | undefined;\n #pushEpoch = 0;\n\n /**\n * @param shouldYield a function called after each row is read from the database,\n * which should return true if the source should yield the special 'yield' value\n * to yield control back to the caller at the end of the pipeline. Can\n * also throw an error to abort the pipeline processing.\n */\n constructor(\n logContext: LogContext,\n logConfig: LogConfig,\n db: Database,\n tableName: string,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n shouldYield = () => false,\n ) {\n this.#lc = logContext;\n this.#logConfig = logConfig;\n this.#table = tableName;\n this.#columns = columns;\n this.#uniqueIndexes = getUniqueIndexes(db, tableName);\n this.#primaryKey = primaryKey;\n this.#stmts = this.#getStatementsFor(db);\n this.#shouldYield = shouldYield;\n\n assert(\n this.#uniqueIndexes.has(JSON.stringify([...primaryKey].sort())),\n `primary key ${primaryKey} does not have a UNIQUE index`,\n );\n }\n\n get tableSchema() {\n return {\n name: this.#table,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n };\n }\n\n /**\n * Sets the db (snapshot) to use, to facilitate the Snapshotter leapfrog\n * algorithm for concurrent traversal of historic timelines.\n */\n setDB(db: Database) {\n this.#stmts = this.#getStatementsFor(db);\n }\n\n #getStatementsFor(db: Database) {\n const cached = this.#dbCache.get(db);\n if (cached) {\n return cached;\n }\n\n const stmts = {\n cache: new StatementCache(db),\n insert: db.prepare(\n compile(\n sql`INSERT INTO ${sql.ident(this.#table)} (${sql.join(\n Object.keys(this.#columns).map(c => sql.ident(c)),\n ', ',\n )}) VALUES (${sql.__dangerous__rawValue(\n Array.from({length: Object.keys(this.#columns).length})\n .fill('?')\n .join(','),\n )})`,\n ),\n ),\n delete: db.prepare(\n compile(\n sql`DELETE FROM ${sql.ident(this.#table)} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n ),\n // If all the columns are part of the primary key, we cannot use UPDATE.\n update:\n Object.keys(this.#columns).length > this.#primaryKey.length\n ? db.prepare(\n compile(\n sql`UPDATE ${sql.ident(this.#table)} SET ${sql.join(\n nonPrimaryKeys(this.#columns, this.#primaryKey).map(\n c => sql`${sql.ident(c)}=?`,\n ),\n ',',\n )} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n )\n : undefined,\n checkExists: db.prepare(\n compile(\n sql`SELECT 1 AS \"exists\" FROM ${sql.ident(\n this.#table,\n )} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )} LIMIT 1`,\n ),\n ),\n getExisting: db.prepare(\n compile(\n sql`SELECT * FROM ${sql.ident(this.#table)} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n ),\n };\n this.#dbCache.set(db, stmts);\n return stmts;\n }\n\n get #allColumns() {\n return sql.join(\n Object.keys(this.#columns).map(c => sql.ident(c)),\n sql`,`,\n );\n }\n\n #getSchema(connection: Connection): SourceSchema {\n return {\n tableName: this.#table,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n sort: connection.sort,\n relationships: {},\n isHidden: false,\n system: 'client',\n compareRows: connection.compareRows,\n };\n }\n\n connect(\n sort: Ordering,\n filters?: Condition,\n splitEditKeys?: Set<string>,\n debug?: DebugDelegate,\n ) {\n const transformedFilters = transformFilters(filters);\n const input: SourceInput = {\n getSchema: () => schema,\n fetch: req => this.#fetch(req, connection),\n setOutput: output => {\n connection.output = output;\n },\n destroy: () => {\n const idx = this.#connections.indexOf(connection);\n assert(idx !== -1, 'Connection not found');\n this.#connections.splice(idx, 1);\n },\n fullyAppliedFilters: !transformedFilters.conditionsRemoved,\n };\n\n const connection: Connection = {\n input,\n debug,\n output: undefined,\n sort,\n splitEditKeys,\n filters: transformedFilters.filters\n ? {\n condition: transformedFilters.filters,\n predicate: createPredicate(transformedFilters.filters),\n }\n : undefined,\n compareRows: makeComparator(sort),\n lastPushedEpoch: 0,\n };\n const schema = this.#getSchema(connection);\n assertOrderingIncludesPK(sort, this.#primaryKey);\n\n this.#connections.push(connection);\n return input;\n }\n\n toSQLiteRow(row: Row): Row {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => [\n key,\n toSQLiteType(value, this.#columns[key].type),\n ]),\n ) as Row;\n }\n\n *#fetch(req: FetchRequest, connection: Connection): Stream<Node | 'yield'> {\n const {sort, debug} = connection;\n\n const query = this.#requestToSQL(req, connection.filters?.condition, sort);\n const sqlAndBindings = format(query);\n\n const cachedStatement = this.#stmts.cache.get(sqlAndBindings.text);\n try {\n cachedStatement.statement.safeIntegers(true);\n const rowIterator = cachedStatement.statement.iterate<Row>(\n ...sqlAndBindings.values,\n );\n\n const comparator = makeComparator(sort, req.reverse);\n\n debug?.initQuery(this.#table, sqlAndBindings.text);\n\n yield* generateWithStart(\n generateWithYields(\n generateWithOverlay(\n req.start?.row,\n this.#mapFromSQLiteTypes(\n this.#columns,\n rowIterator,\n sqlAndBindings.text,\n debug,\n ),\n req.constraint,\n this.#overlay,\n connection.lastPushedEpoch,\n comparator,\n connection.filters?.predicate,\n ),\n this.#shouldYield,\n ),\n req.start,\n comparator,\n );\n } finally {\n if (debug) {\n let totalNvisit = 0;\n let i = 0;\n while (true) {\n const nvisit = cachedStatement.statement.scanStatus(\n i++,\n SQLite3Database.SQLITE_SCANSTAT_NVISIT,\n 1,\n );\n if (nvisit === undefined) {\n break;\n }\n totalNvisit += Number(nvisit);\n }\n if (totalNvisit !== 0) {\n debug.recordNVisit(this.#table, sqlAndBindings.text, totalNvisit);\n }\n cachedStatement.statement.scanStatusReset();\n }\n this.#stmts.cache.return(cachedStatement);\n }\n }\n\n *#mapFromSQLiteTypes(\n valueTypes: Record<string, SchemaValue>,\n rowIterator: IterableIterator<Row>,\n query: string,\n debug: DebugDelegate | undefined,\n ): IterableIterator<Row> {\n let result;\n try {\n do {\n result = timeSampled(\n this.#lc,\n ++eventCount,\n this.#logConfig.ivmSampling,\n () => rowIterator.next(),\n this.#logConfig.slowRowThreshold,\n () =>\n `table-source.next took too long for ${query}. Are you missing an index?`,\n );\n if (result.done) {\n break;\n }\n const row = fromSQLiteTypes(valueTypes, result.value, this.#table);\n debug?.rowVended(this.#table, query, row);\n yield row;\n } while (!result.done);\n } finally {\n rowIterator.return?.();\n }\n }\n\n *push(change: SourceChange): Stream<'yield'> {\n for (const result of this.genPush(change)) {\n if (result === 'yield') {\n yield result;\n }\n }\n }\n\n *genPush(change: SourceChange) {\n const exists = (row: Row) =>\n this.#stmts.checkExists.get<{exists: number} | undefined>(\n ...toSQLiteTypes(this.#primaryKey, row, this.#columns),\n )?.exists === 1;\n const setOverlay = (o: Overlay | undefined) => (this.#overlay = o);\n const writeChange = (c: SourceChange) => this.#writeChange(c);\n\n yield* genPushAndWriteWithSplitEdit(\n this.#connections,\n change,\n exists,\n setOverlay,\n writeChange,\n () => ++this.#pushEpoch,\n );\n }\n\n #writeChange(change: SourceChange) {\n switch (change.type) {\n case 'add':\n this.#stmts.insert.run(\n ...toSQLiteTypes(\n Object.keys(this.#columns),\n change.row,\n this.#columns,\n ),\n );\n break;\n case 'remove':\n this.#stmts.delete.run(\n ...toSQLiteTypes(this.#primaryKey, change.row, this.#columns),\n );\n break;\n case 'edit': {\n // If the PK is the same, use UPDATE.\n if (\n canUseUpdate(\n change.oldRow,\n change.row,\n this.#columns,\n this.#primaryKey,\n )\n ) {\n const mergedRow = {\n ...change.oldRow,\n ...change.row,\n };\n const params = [\n ...nonPrimaryValues(this.#columns, this.#primaryKey, mergedRow),\n ...toSQLiteTypes(this.#primaryKey, mergedRow, this.#columns),\n ];\n must(this.#stmts.update).run(params);\n } else {\n this.#stmts.delete.run(\n ...toSQLiteTypes(this.#primaryKey, change.oldRow, this.#columns),\n );\n this.#stmts.insert.run(\n ...toSQLiteTypes(\n Object.keys(this.#columns),\n change.row,\n this.#columns,\n ),\n );\n }\n\n break;\n }\n default:\n unreachable(change);\n }\n }\n\n #getRowStmtCache = new Map<string, string>();\n\n #getRowStmt(keyCols: string[]): string {\n const keyString = JSON.stringify(keyCols);\n let stmt = this.#getRowStmtCache.get(keyString);\n if (!stmt) {\n stmt = compile(\n sql`SELECT ${this.#allColumns} FROM ${sql.ident(\n this.#table,\n )} WHERE ${sql.join(\n keyCols.map(k => sql`${sql.ident(k)}=?`),\n sql` AND`,\n )}`,\n );\n this.#getRowStmtCache.set(keyString, stmt);\n }\n return stmt;\n }\n\n /**\n * Retrieves a row from the backing DB by a unique key, or `undefined` if such a\n * row does not exist. This is not used in the IVM pipeline but is useful\n * for retrieving data that is consistent with the state (and type\n * semantics) of the pipeline. Note that this key may not necessarily correspond\n * to the `primaryKey` with which this TableSource.\n */\n getRow(rowKey: Row): Row | undefined {\n const keyCols = Object.keys(rowKey);\n const keyVals = Object.values(rowKey);\n\n const stmt = this.#getRowStmt(keyCols);\n const row = this.#stmts.cache.use(stmt, cached =>\n cached.statement.safeIntegers(true).get<Row>(keyVals),\n );\n if (row) {\n return fromSQLiteTypes(this.#columns, row, this.#table);\n }\n return row;\n }\n\n #requestToSQL(\n request: FetchRequest,\n filters: NoSubqueryCondition | undefined,\n order: Ordering,\n ): SQLQuery {\n return buildSelectQuery(\n this.#table,\n this.#columns,\n request.constraint,\n filters,\n order,\n request.reverse,\n request.start,\n );\n }\n}\n\nfunction getUniqueIndexes(\n db: Database,\n tableName: string,\n): Map<string, Set<string>> {\n const sqlAndBindings = format(\n sql`\n SELECT idx.name, json_group_array(col.name) as columnsJSON\n FROM sqlite_master as idx\n JOIN pragma_index_list(idx.tbl_name) AS info ON info.name = idx.name\n JOIN pragma_index_info(idx.name) as col\n WHERE idx.tbl_name = ${tableName} AND\n idx.type = 'index' AND \n info.\"unique\" != 0\n GROUP BY idx.name\n ORDER BY idx.name`,\n );\n const stmt = db.prepare(sqlAndBindings.text);\n const indexes = stmt.all<{columnsJSON: string}>(...sqlAndBindings.values);\n return new Map(\n indexes.map(({columnsJSON}) => {\n const columns = JSON.parse(columnsJSON);\n const set = new Set<string>(columns);\n return [JSON.stringify(columns.sort()), set];\n }),\n );\n}\n\nexport function toSQLiteTypes(\n columns: readonly string[],\n row: Row,\n columnTypes: Record<string, SchemaValue>,\n): readonly unknown[] {\n return columns.map(col => toSQLiteType(row[col], columnTypes[col].type));\n}\n\nexport function toSQLiteTypeName(type: ValueType) {\n switch (type) {\n case 'boolean':\n return 'INTEGER';\n case 'number':\n return 'REAL';\n case 'string':\n return 'TEXT';\n case 'null':\n return 'NULL';\n case 'json':\n return 'TEXT';\n }\n}\n\nexport function fromSQLiteTypes(\n valueTypes: Record<string, SchemaValue>,\n row: Row,\n tableName: string,\n): Row {\n const newRow: Writable<Row> = {};\n for (const key of Object.keys(row)) {\n const valueType = valueTypes[key];\n if (valueType === undefined) {\n const columnList = Object.keys(valueTypes).sort().join(', ');\n throw new Error(\n `Invalid column \"${key}\" for table \"${tableName}\". Synced columns include ${columnList}`,\n );\n }\n newRow[key] = fromSQLiteType(valueType.type, row[key], key, tableName);\n }\n return newRow;\n}\n\nfunction fromSQLiteType(\n valueType: ValueType,\n v: Value,\n column: string,\n tableName: string,\n): Value {\n if (v === null) {\n return null;\n }\n switch (valueType) {\n case 'boolean':\n return !!v;\n case 'number':\n case 'string':\n case 'null':\n if (typeof v === 'bigint') {\n if (v > Number.MAX_SAFE_INTEGER || v < Number.MIN_SAFE_INTEGER) {\n throw new UnsupportedValueError(\n `value ${v} (in ${tableName}.${column}) is outside of supported bounds`,\n );\n }\n return Number(v);\n }\n return v;\n case 'json':\n try {\n return JSON.parse(v as string);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new UnsupportedValueError(\n `Failed to parse JSON for ${tableName}.${column}: ${errorMessage}`,\n {cause: error},\n );\n }\n }\n}\n\nexport class UnsupportedValueError extends Error {}\n\nfunction canUseUpdate(\n oldRow: Row,\n row: Row,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n): boolean {\n for (const pk of primaryKey) {\n if (oldRow[pk] !== row[pk]) {\n return false;\n }\n }\n return Object.keys(columns).length > primaryKey.length;\n}\n\nfunction nonPrimaryValues(\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n row: Row,\n): Iterable<unknown> {\n return nonPrimaryKeys(columns, primaryKey).map(c =>\n toSQLiteType(row[c], columns[c].type),\n );\n}\n\nfunction nonPrimaryKeys(\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n) {\n return Object.keys(columns).filter(c => !primaryKey.includes(c));\n}\n\nfunction* generateWithYields(stream: Stream<Node>, shouldYield: () => boolean) {\n for (const n of stream) {\n if (shouldYield()) {\n yield 'yield';\n }\n yield n;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table-source.js","sources":["../../../../zqlite/src/table-source.ts"],"sourcesContent":["import type {SQLQuery} from '@databases/sql';\nimport type {LogContext} from '@rocicorp/logger';\nimport SQLite3Database from '@rocicorp/zero-sqlite3';\nimport type {LogConfig} from '../../otel/src/log-options.ts';\nimport {timeSampled} from '../../otel/src/maybe-time.ts';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {must} from '../../shared/src/must.ts';\nimport type {Writable} from '../../shared/src/writable.ts';\nimport type {Condition, Ordering} from '../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../zero-protocol/src/data.ts';\nimport type {PrimaryKey} from '../../zero-protocol/src/primary-key.ts';\nimport type {\n SchemaValue,\n ValueType,\n} from '../../zero-schema/src/table-schema.ts';\nimport type {DebugDelegate} from '../../zql/src/builder/debug-delegate.ts';\nimport {\n createPredicate,\n transformFilters,\n} from '../../zql/src/builder/filter.ts';\nimport {makeComparator, type Node} from '../../zql/src/ivm/data.ts';\nimport {\n generateWithOverlay,\n generateWithStart,\n genPushAndWriteWithSplitEdit,\n type Connection,\n type Overlay,\n} from '../../zql/src/ivm/memory-source.ts';\nimport {type FetchRequest} from '../../zql/src/ivm/operator.ts';\nimport type {SourceSchema} from '../../zql/src/ivm/schema.ts';\nimport {\n type Source,\n type SourceChange,\n type SourceInput,\n} from '../../zql/src/ivm/source.ts';\nimport type {Stream} from '../../zql/src/ivm/stream.ts';\nimport type {Database, Statement} from './db.ts';\nimport {compile, format, sql} from './internal/sql.ts';\nimport {StatementCache} from './internal/statement-cache.ts';\nimport {\n buildSelectQuery,\n toSQLiteType,\n type NoSubqueryCondition,\n} from './query-builder.ts';\nimport {assertOrderingIncludesPK} from '../../zql/src/query/complete-ordering.ts';\n\ntype Statements = {\n readonly cache: StatementCache;\n readonly insert: Statement;\n readonly delete: Statement;\n readonly update: Statement | undefined;\n readonly checkExists: Statement;\n readonly getExisting: Statement;\n};\n\nlet eventCount = 0;\n\n/**\n * A source that is backed by a SQLite table.\n *\n * Values are written to the backing table _after_ being vended by the source.\n *\n * This ordering of events is to ensure self joins function properly. That is,\n * we can't reveal a value to an output before it has been pushed to that output.\n *\n * The code is fairly straightforward except for:\n * 1. Dealing with a `fetch` that has a basis of `before`.\n * 2. Dealing with compound orders that have differing directions (a ASC, b DESC, c ASC)\n *\n * See comments in relevant functions for more details.\n */\nexport class TableSource implements Source {\n readonly #dbCache = new WeakMap<Database, Statements>();\n readonly #connections: Connection[] = [];\n readonly #table: string;\n readonly #columns: Record<string, SchemaValue>;\n // Maps sorted columns JSON string (e.g. '[\"a\",\"b\"]) to Set of columns.\n readonly #uniqueIndexes: Map<string, Set<string>>;\n readonly #primaryKey: PrimaryKey;\n readonly #logConfig: LogConfig;\n readonly #lc: LogContext;\n readonly #shouldYield: () => boolean;\n #stmts: Statements;\n #overlay?: Overlay | undefined;\n #pushEpoch = 0;\n\n /**\n * @param shouldYield a function called after each row is read from the database,\n * which should return true if the source should yield the special 'yield' value\n * to yield control back to the caller at the end of the pipeline. Can\n * also throw an error to abort the pipeline processing.\n */\n constructor(\n logContext: LogContext,\n logConfig: LogConfig,\n db: Database,\n tableName: string,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n shouldYield = () => false,\n ) {\n this.#lc = logContext;\n this.#logConfig = logConfig;\n this.#table = tableName;\n this.#columns = columns;\n this.#uniqueIndexes = getUniqueIndexes(db, tableName);\n this.#primaryKey = primaryKey;\n this.#stmts = this.#getStatementsFor(db);\n this.#shouldYield = shouldYield;\n\n assert(\n this.#uniqueIndexes.has(JSON.stringify([...primaryKey].sort())),\n `primary key ${primaryKey} does not have a UNIQUE index`,\n );\n }\n\n get tableSchema() {\n return {\n name: this.#table,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n };\n }\n\n /**\n * Sets the db (snapshot) to use, to facilitate the Snapshotter leapfrog\n * algorithm for concurrent traversal of historic timelines.\n */\n setDB(db: Database) {\n this.#stmts = this.#getStatementsFor(db);\n }\n\n #getStatementsFor(db: Database) {\n const cached = this.#dbCache.get(db);\n if (cached) {\n return cached;\n }\n\n const stmts = {\n cache: new StatementCache(db),\n insert: db.prepare(\n compile(\n sql`INSERT INTO ${sql.ident(this.#table)} (${sql.join(\n Object.keys(this.#columns).map(c => sql.ident(c)),\n ', ',\n )}) VALUES (${sql.__dangerous__rawValue(\n Array.from({length: Object.keys(this.#columns).length})\n .fill('?')\n .join(','),\n )})`,\n ),\n ),\n delete: db.prepare(\n compile(\n sql`DELETE FROM ${sql.ident(this.#table)} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n ),\n // If all the columns are part of the primary key, we cannot use UPDATE.\n update:\n Object.keys(this.#columns).length > this.#primaryKey.length\n ? db.prepare(\n compile(\n sql`UPDATE ${sql.ident(this.#table)} SET ${sql.join(\n nonPrimaryKeys(this.#columns, this.#primaryKey).map(\n c => sql`${sql.ident(c)}=?`,\n ),\n ',',\n )} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n )\n : undefined,\n checkExists: db.prepare(\n compile(\n sql`SELECT 1 AS \"exists\" FROM ${sql.ident(\n this.#table,\n )} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )} LIMIT 1`,\n ),\n ),\n getExisting: db.prepare(\n compile(\n sql`SELECT * FROM ${sql.ident(this.#table)} WHERE ${sql.join(\n this.#primaryKey.map(k => sql`${sql.ident(k)}=?`),\n ' AND ',\n )}`,\n ),\n ),\n };\n this.#dbCache.set(db, stmts);\n return stmts;\n }\n\n get #allColumns() {\n return sql.join(\n Object.keys(this.#columns).map(c => sql.ident(c)),\n sql`,`,\n );\n }\n\n #getSchema(connection: Connection): SourceSchema {\n return {\n tableName: this.#table,\n columns: this.#columns,\n primaryKey: this.#primaryKey,\n sort: connection.sort,\n relationships: {},\n isHidden: false,\n system: 'client',\n compareRows: connection.compareRows,\n };\n }\n\n connect(\n sort: Ordering,\n filters?: Condition,\n splitEditKeys?: Set<string>,\n debug?: DebugDelegate,\n ) {\n const transformedFilters = transformFilters(filters);\n const input: SourceInput = {\n getSchema: () => schema,\n fetch: req => this.#fetch(req, connection),\n setOutput: output => {\n connection.output = output;\n },\n destroy: () => {\n const idx = this.#connections.indexOf(connection);\n assert(idx !== -1, 'Connection not found');\n this.#connections.splice(idx, 1);\n },\n fullyAppliedFilters: !transformedFilters.conditionsRemoved,\n };\n\n const connection: Connection = {\n input,\n debug,\n output: undefined,\n sort,\n splitEditKeys,\n filters: transformedFilters.filters\n ? {\n condition: transformedFilters.filters,\n predicate: createPredicate(transformedFilters.filters),\n }\n : undefined,\n compareRows: makeComparator(sort),\n lastPushedEpoch: 0,\n };\n const schema = this.#getSchema(connection);\n assertOrderingIncludesPK(sort, this.#primaryKey);\n\n this.#connections.push(connection);\n return input;\n }\n\n toSQLiteRow(row: Row): Row {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => [\n key,\n toSQLiteType(value, this.#columns[key].type),\n ]),\n ) as Row;\n }\n\n *#fetch(req: FetchRequest, connection: Connection): Stream<Node | 'yield'> {\n const {sort, debug} = connection;\n\n const query = this.#requestToSQL(req, connection.filters?.condition, sort);\n const sqlAndBindings = format(query);\n\n const cachedStatement = this.#stmts.cache.get(sqlAndBindings.text);\n try {\n cachedStatement.statement.safeIntegers(true);\n const rowIterator = cachedStatement.statement.iterate<Row>(\n ...sqlAndBindings.values,\n );\n\n const comparator = makeComparator(sort, req.reverse);\n\n debug?.initQuery(this.#table, sqlAndBindings.text);\n\n yield* generateWithStart(\n generateWithYields(\n generateWithOverlay(\n req.start?.row,\n this.#mapFromSQLiteTypes(\n this.#columns,\n rowIterator,\n sqlAndBindings.text,\n debug,\n ),\n req.constraint,\n this.#overlay,\n connection.lastPushedEpoch,\n comparator,\n connection.filters?.predicate,\n ),\n this.#shouldYield,\n ),\n req.start,\n comparator,\n );\n } finally {\n if (debug) {\n let totalNvisit = 0;\n let i = 0;\n while (true) {\n const nvisit = cachedStatement.statement.scanStatus(\n i++,\n SQLite3Database.SQLITE_SCANSTAT_NVISIT,\n 1,\n );\n if (nvisit === undefined) {\n break;\n }\n totalNvisit += Number(nvisit);\n }\n if (totalNvisit !== 0) {\n debug.recordNVisit(this.#table, sqlAndBindings.text, totalNvisit);\n }\n cachedStatement.statement.scanStatusReset();\n }\n this.#stmts.cache.return(cachedStatement);\n }\n }\n\n *#mapFromSQLiteTypes(\n valueTypes: Record<string, SchemaValue>,\n rowIterator: IterableIterator<Row>,\n query: string,\n debug: DebugDelegate | undefined,\n ): IterableIterator<Row> {\n let result;\n try {\n do {\n result = timeSampled(\n this.#lc,\n ++eventCount,\n this.#logConfig.ivmSampling,\n () => rowIterator.next(),\n this.#logConfig.slowRowThreshold,\n () =>\n `table-source.next took too long for ${query}. Are you missing an index?`,\n );\n if (result.done) {\n break;\n }\n const row = fromSQLiteTypes(valueTypes, result.value, this.#table);\n debug?.rowVended(this.#table, query, row);\n yield row;\n } while (!result.done);\n } finally {\n rowIterator.return?.();\n }\n }\n\n *push(change: SourceChange): Stream<'yield'> {\n for (const result of this.genPush(change)) {\n if (result === 'yield') {\n yield result;\n }\n }\n }\n\n *genPush(change: SourceChange) {\n const exists = (row: Row) =>\n this.#stmts.checkExists.get<{exists: number} | undefined>(\n ...toSQLiteTypes(this.#primaryKey, row, this.#columns),\n )?.exists === 1;\n const setOverlay = (o: Overlay | undefined) => (this.#overlay = o);\n const writeChange = (c: SourceChange) => this.#writeChange(c);\n\n yield* genPushAndWriteWithSplitEdit(\n this.#connections,\n change,\n exists,\n setOverlay,\n writeChange,\n () => ++this.#pushEpoch,\n );\n }\n\n #writeChange(change: SourceChange) {\n switch (change.type) {\n case 'add':\n this.#stmts.insert.run(\n ...toSQLiteTypes(\n Object.keys(this.#columns),\n change.row,\n this.#columns,\n ),\n );\n break;\n case 'remove':\n this.#stmts.delete.run(\n ...toSQLiteTypes(this.#primaryKey, change.row, this.#columns),\n );\n break;\n case 'edit': {\n // If the PK is the same, use UPDATE.\n if (\n canUseUpdate(\n change.oldRow,\n change.row,\n this.#columns,\n this.#primaryKey,\n )\n ) {\n const mergedRow = {\n ...change.oldRow,\n ...change.row,\n };\n const params = [\n ...nonPrimaryValues(this.#columns, this.#primaryKey, mergedRow),\n ...toSQLiteTypes(this.#primaryKey, mergedRow, this.#columns),\n ];\n must(this.#stmts.update).run(params);\n } else {\n this.#stmts.delete.run(\n ...toSQLiteTypes(this.#primaryKey, change.oldRow, this.#columns),\n );\n this.#stmts.insert.run(\n ...toSQLiteTypes(\n Object.keys(this.#columns),\n change.row,\n this.#columns,\n ),\n );\n }\n\n break;\n }\n default:\n unreachable(change);\n }\n }\n\n #getRowStmtCache = new Map<string, string>();\n\n #getRowStmt(keyCols: string[]): string {\n const keyString = JSON.stringify(keyCols);\n let stmt = this.#getRowStmtCache.get(keyString);\n if (!stmt) {\n stmt = compile(\n sql`SELECT ${this.#allColumns} FROM ${sql.ident(\n this.#table,\n )} WHERE ${sql.join(\n keyCols.map(k => sql`${sql.ident(k)}=?`),\n sql` AND`,\n )}`,\n );\n this.#getRowStmtCache.set(keyString, stmt);\n }\n return stmt;\n }\n\n /**\n * Retrieves a row from the backing DB by a unique key, or `undefined` if such a\n * row does not exist. This is not used in the IVM pipeline but is useful\n * for retrieving data that is consistent with the state (and type\n * semantics) of the pipeline. Note that this key may not necessarily correspond\n * to the `primaryKey` with which this TableSource.\n */\n getRow(rowKey: Row): Row | undefined {\n const keyCols = Object.keys(rowKey);\n\n const stmt = this.#getRowStmt(keyCols);\n const row = this.#stmts.cache.use(stmt, cached =>\n cached.statement\n .safeIntegers(true)\n .get<Row>(...toSQLiteTypes(keyCols, rowKey, this.#columns)),\n );\n if (row) {\n return fromSQLiteTypes(this.#columns, row, this.#table);\n }\n return row;\n }\n\n #requestToSQL(\n request: FetchRequest,\n filters: NoSubqueryCondition | undefined,\n order: Ordering,\n ): SQLQuery {\n return buildSelectQuery(\n this.#table,\n this.#columns,\n request.constraint,\n filters,\n order,\n request.reverse,\n request.start,\n );\n }\n}\n\nfunction getUniqueIndexes(\n db: Database,\n tableName: string,\n): Map<string, Set<string>> {\n const sqlAndBindings = format(\n sql`\n SELECT idx.name, json_group_array(col.name) as columnsJSON\n FROM sqlite_master as idx\n JOIN pragma_index_list(idx.tbl_name) AS info ON info.name = idx.name\n JOIN pragma_index_info(idx.name) as col\n WHERE idx.tbl_name = ${tableName} AND\n idx.type = 'index' AND \n info.\"unique\" != 0\n GROUP BY idx.name\n ORDER BY idx.name`,\n );\n const stmt = db.prepare(sqlAndBindings.text);\n const indexes = stmt.all<{columnsJSON: string}>(...sqlAndBindings.values);\n return new Map(\n indexes.map(({columnsJSON}) => {\n const columns = JSON.parse(columnsJSON);\n const set = new Set<string>(columns);\n return [JSON.stringify(columns.sort()), set];\n }),\n );\n}\n\nexport function toSQLiteTypes(\n columns: readonly string[],\n row: Row,\n columnTypes: Record<string, SchemaValue>,\n): readonly unknown[] {\n return columns.map(col => toSQLiteType(row[col], columnTypes[col].type));\n}\n\nexport function toSQLiteTypeName(type: ValueType) {\n switch (type) {\n case 'boolean':\n return 'INTEGER';\n case 'number':\n return 'REAL';\n case 'string':\n return 'TEXT';\n case 'null':\n return 'NULL';\n case 'json':\n return 'TEXT';\n }\n}\n\nexport function fromSQLiteTypes(\n valueTypes: Record<string, SchemaValue>,\n row: Row,\n tableName: string,\n): Row {\n const newRow: Writable<Row> = {};\n for (const key of Object.keys(row)) {\n const valueType = valueTypes[key];\n if (valueType === undefined) {\n const columnList = Object.keys(valueTypes).sort().join(', ');\n throw new Error(\n `Invalid column \"${key}\" for table \"${tableName}\". Synced columns include ${columnList}`,\n );\n }\n newRow[key] = fromSQLiteType(valueType.type, row[key], key, tableName);\n }\n return newRow;\n}\n\nfunction fromSQLiteType(\n valueType: ValueType,\n v: Value,\n column: string,\n tableName: string,\n): Value {\n if (v === null) {\n return null;\n }\n switch (valueType) {\n case 'boolean':\n return !!v;\n case 'number':\n case 'string':\n case 'null':\n if (typeof v === 'bigint') {\n if (v > Number.MAX_SAFE_INTEGER || v < Number.MIN_SAFE_INTEGER) {\n throw new UnsupportedValueError(\n `value ${v} (in ${tableName}.${column}) is outside of supported bounds`,\n );\n }\n return Number(v);\n }\n return v;\n case 'json':\n try {\n return JSON.parse(v as string);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new UnsupportedValueError(\n `Failed to parse JSON for ${tableName}.${column}: ${errorMessage}`,\n {cause: error},\n );\n }\n }\n}\n\nexport class UnsupportedValueError extends Error {}\n\nfunction canUseUpdate(\n oldRow: Row,\n row: Row,\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n): boolean {\n for (const pk of primaryKey) {\n if (oldRow[pk] !== row[pk]) {\n return false;\n }\n }\n return Object.keys(columns).length > primaryKey.length;\n}\n\nfunction nonPrimaryValues(\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n row: Row,\n): Iterable<unknown> {\n return nonPrimaryKeys(columns, primaryKey).map(c =>\n toSQLiteType(row[c], columns[c].type),\n );\n}\n\nfunction nonPrimaryKeys(\n columns: Record<string, SchemaValue>,\n primaryKey: PrimaryKey,\n) {\n return Object.keys(columns).filter(c => !primaryKey.includes(c));\n}\n\nfunction* generateWithYields(stream: Stream<Node>, shouldYield: () => boolean) {\n for (const n of stream) {\n if (shouldYield()) {\n yield 'yield';\n }\n yield n;\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rocicorp/zero",
3
- "version": "0.26.0-canary.0",
3
+ "version": "0.26.0-canary.3",
4
4
  "description": "Zero is a web framework for serverless web development.",
5
5
  "author": "Rocicorp, Inc.",
6
6
  "repository": {
@@ -46,7 +46,7 @@
46
46
  "@rocicorp/lock": "^1.0.4",
47
47
  "@rocicorp/logger": "^5.4.0",
48
48
  "@rocicorp/resolver": "^1.0.2",
49
- "@rocicorp/zero-sqlite3": "^1.0.12",
49
+ "@rocicorp/zero-sqlite3": "^1.0.15",
50
50
  "@standard-schema/spec": "^1.0.0",
51
51
  "@types/basic-auth": "^1.1.8",
52
52
  "basic-auth": "^2.0.1",
@@ -85,8 +85,8 @@
85
85
  "expo-sqlite": ">=15",
86
86
  "replicache": "15.2.1",
87
87
  "shared": "0.0.0",
88
- "typedoc": "^0.28.2",
89
- "typedoc-plugin-markdown": "^4.6.1",
88
+ "typedoc": "^0.28.15",
89
+ "typedoc-plugin-markdown": "^4.9.0",
90
90
  "typescript": "~5.9.3",
91
91
  "vite": "7.2.7",
92
92
  "vitest": "4.0.15",
@@ -155,6 +155,10 @@
155
155
  "types": "./out/zero/src/adapters/drizzle.d.ts",
156
156
  "default": "./out/zero/src/adapters/drizzle.js"
157
157
  },
158
+ "./server/adapters/prisma": {
159
+ "types": "./out/zero/src/adapters/prisma.d.ts",
160
+ "default": "./out/zero/src/adapters/prisma.js"
161
+ },
158
162
  "./server/adapters/pg": {
159
163
  "types": "./out/zero/src/adapters/pg.d.ts",
160
164
  "default": "./out/zero/src/adapters/pg.js"
@@ -1 +0,0 @@
1
- {"version":3,"file":"column-metadata.d.ts","sourceRoot":"","sources":["../../../../../../zero-cache/src/services/change-source/column-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAC,QAAQ,EAAY,MAAM,8BAA8B,CAAC;AAEtE,OAAO,KAAK,EAAC,UAAU,EAAE,aAAa,EAAC,MAAM,mBAAmB,CAAC;AASjE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAUD,eAAO,MAAM,4BAA4B,0UAWxC,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,mBAAmB;;IAY9B,OAAO;IAqDP;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,mBAAmB,GAAG,SAAS;IAoBjE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAqBrE,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,UAAU,GACf,IAAI;IAcP,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAIzD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIpC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAI7D,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAkB5E,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAmBxD,QAAQ,IAAI,OAAO;IAKnB;;;OAGG;IACH,0BAA0B,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;CAW1D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GACjC,cAAc,CAiBhB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAOzE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAQvE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"column-metadata.js","sources":["../../../../../../zero-cache/src/services/change-source/column-metadata.ts"],"sourcesContent":["/**\n * Column metadata table for storing upstream PostgreSQL schema information.\n *\n * Previously, upstream type metadata was embedded in SQLite column type strings\n * using pipe-delimited notation (e.g., \"int8|NOT_NULL|TEXT_ENUM\"). This caused\n * issues with SQLite type affinity and made schema inspection difficult.\n *\n * This table stores that metadata separately, allowing SQLite columns to use\n * plain type names while preserving all necessary upstream type information.\n */\n\nimport type {Database, Statement} from '../../../../zqlite/src/db.ts';\nimport {isArrayColumn, isEnumColumn} from '../../db/pg-to-lite.ts';\nimport type {ColumnSpec, LiteTableSpec} from '../../db/specs.ts';\nimport {\n upstreamDataType,\n nullableUpstream,\n isEnum as checkIsEnum,\n isArray as checkIsArray,\n liteTypeString,\n} from '../../types/lite.ts';\n\n/**\n * Structured column metadata, replacing the old pipe-delimited string format.\n */\nexport interface ColumnMetadata {\n /** PostgreSQL type name, e.g., 'int8', 'varchar', 'text[]', 'user_role' */\n upstreamType: string;\n isNotNull: boolean;\n isEnum: boolean;\n isArray: boolean;\n /** Maximum character length for varchar/char types */\n characterMaxLength?: number | null;\n}\n\ntype ColumnMetadataRow = {\n upstream_type: string;\n is_not_null: number;\n is_enum: number;\n is_array: number;\n character_max_length: number | null;\n};\n\nexport const CREATE_COLUMN_METADATA_TABLE = `\n CREATE TABLE \"_zero.column_metadata\" (\n table_name TEXT NOT NULL,\n column_name TEXT NOT NULL,\n upstream_type TEXT NOT NULL,\n is_not_null INTEGER NOT NULL,\n is_enum INTEGER NOT NULL,\n is_array INTEGER NOT NULL,\n character_max_length INTEGER,\n PRIMARY KEY (table_name, column_name)\n );\n`;\n\n/**\n * Efficient column metadata store that prepares all statements upfront.\n * Use this class to avoid re-preparing statements on every operation.\n *\n * Access via `ColumnMetadataStore.getInstance(db)`, which returns `undefined`\n * if the metadata table doesn't exist yet.\n */\nexport class ColumnMetadataStore {\n static #instances = new WeakMap<Database, ColumnMetadataStore>();\n\n readonly #insertStmt: Statement;\n readonly #updateStmt: Statement;\n readonly #deleteColumnStmt: Statement;\n readonly #deleteTableStmt: Statement;\n readonly #renameTableStmt: Statement;\n readonly #getColumnStmt: Statement;\n readonly #getTableStmt: Statement;\n readonly #hasTableStmt: Statement;\n\n private constructor(db: Database) {\n this.#insertStmt = db.prepare(`\n INSERT INTO \"_zero.column_metadata\"\n (table_name, column_name, upstream_type, is_not_null, is_enum, is_array, character_max_length)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n this.#updateStmt = db.prepare(`\n UPDATE \"_zero.column_metadata\"\n SET column_name = ?,\n upstream_type = ?,\n is_not_null = ?,\n is_enum = ?,\n is_array = ?,\n character_max_length = ?\n WHERE table_name = ? AND column_name = ?\n `);\n\n this.#deleteColumnStmt = db.prepare(`\n DELETE FROM \"_zero.column_metadata\"\n WHERE table_name = ? AND column_name = ?\n `);\n\n this.#deleteTableStmt = db.prepare(`\n DELETE FROM \"_zero.column_metadata\"\n WHERE table_name = ?\n `);\n\n this.#renameTableStmt = db.prepare(`\n UPDATE \"_zero.column_metadata\"\n SET table_name = ?\n WHERE table_name = ?\n `);\n\n this.#getColumnStmt = db.prepare(`\n SELECT upstream_type, is_not_null, is_enum, is_array, character_max_length\n FROM \"_zero.column_metadata\"\n WHERE table_name = ? AND column_name = ?\n `);\n\n this.#getTableStmt = db.prepare(`\n SELECT column_name, upstream_type, is_not_null, is_enum, is_array, character_max_length\n FROM \"_zero.column_metadata\"\n WHERE table_name = ?\n ORDER BY column_name\n `);\n\n this.#hasTableStmt = db.prepare(`\n SELECT 1 FROM sqlite_master\n WHERE type = 'table' AND name = '_zero.column_metadata'\n `);\n }\n\n /**\n * Gets the singleton instance of ColumnMetadataStore for the given database.\n * Returns `undefined` if the metadata table doesn't exist yet.\n */\n static getInstance(db: Database): ColumnMetadataStore | undefined {\n // Check if table exists\n const tableExists = db\n .prepare(\n `SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = '_zero.column_metadata'`,\n )\n .get();\n\n if (!tableExists) {\n return undefined;\n }\n\n let instance = ColumnMetadataStore.#instances.get(db);\n if (!instance) {\n instance = new ColumnMetadataStore(db);\n ColumnMetadataStore.#instances.set(db, instance);\n }\n return instance;\n }\n\n insert(tableName: string, columnName: string, spec: ColumnSpec): void {\n const metadata = pgColumnSpecToMetadata(spec);\n this.#insertMetadata(tableName, columnName, metadata);\n }\n\n #insertMetadata(\n tableName: string,\n columnName: string,\n metadata: ColumnMetadata,\n ): void {\n this.#insertStmt.run(\n tableName,\n columnName,\n metadata.upstreamType,\n metadata.isNotNull ? 1 : 0,\n metadata.isEnum ? 1 : 0,\n metadata.isArray ? 1 : 0,\n metadata.characterMaxLength ?? null,\n );\n }\n\n update(\n tableName: string,\n oldColumnName: string,\n newColumnName: string,\n spec: ColumnSpec,\n ): void {\n const metadata = pgColumnSpecToMetadata(spec);\n this.#updateStmt.run(\n newColumnName,\n metadata.upstreamType,\n metadata.isNotNull ? 1 : 0,\n metadata.isEnum ? 1 : 0,\n metadata.isArray ? 1 : 0,\n metadata.characterMaxLength ?? null,\n tableName,\n oldColumnName,\n );\n }\n\n deleteColumn(tableName: string, columnName: string): void {\n this.#deleteColumnStmt.run(tableName, columnName);\n }\n\n deleteTable(tableName: string): void {\n this.#deleteTableStmt.run(tableName);\n }\n\n renameTable(oldTableName: string, newTableName: string): void {\n this.#renameTableStmt.run(newTableName, oldTableName);\n }\n\n getColumn(tableName: string, columnName: string): ColumnMetadata | undefined {\n const row = this.#getColumnStmt.get(tableName, columnName) as\n | ColumnMetadataRow\n | undefined;\n\n if (!row) {\n return undefined;\n }\n\n return {\n upstreamType: row.upstream_type,\n isNotNull: row.is_not_null !== 0,\n isEnum: row.is_enum !== 0,\n isArray: row.is_array !== 0,\n characterMaxLength: row.character_max_length,\n };\n }\n\n getTable(tableName: string): Map<string, ColumnMetadata> {\n const rows = this.#getTableStmt.all(tableName) as Array<\n ColumnMetadataRow & {column_name: string}\n >;\n\n const metadata = new Map<string, ColumnMetadata>();\n for (const row of rows) {\n metadata.set(row.column_name, {\n upstreamType: row.upstream_type,\n isNotNull: row.is_not_null !== 0,\n isEnum: row.is_enum !== 0,\n isArray: row.is_array !== 0,\n characterMaxLength: row.character_max_length,\n });\n }\n\n return metadata;\n }\n\n hasTable(): boolean {\n const result = this.#hasTableStmt.get();\n return result !== undefined;\n }\n\n /**\n * Populates metadata table from existing tables that use pipe notation.\n * This is used during migration v6 to backfill the metadata table.\n */\n populateFromExistingTables(tables: LiteTableSpec[]): void {\n for (const table of tables) {\n for (const [columnName, columnSpec] of Object.entries(table.columns)) {\n const metadata = liteTypeStringToMetadata(\n columnSpec.dataType,\n columnSpec.characterMaximumLength,\n );\n this.#insertMetadata(table.name, columnName, metadata);\n }\n }\n }\n}\n\n/**\n * Converts pipe-delimited LiteTypeString to structured ColumnMetadata.\n * This is a compatibility helper for the migration period.\n */\nexport function liteTypeStringToMetadata(\n liteTypeString: string,\n characterMaxLength?: number | null,\n): ColumnMetadata {\n const baseType = upstreamDataType(liteTypeString);\n const isArrayType = checkIsArray(liteTypeString);\n\n // Reconstruct the full upstream type including array notation\n // For new-style arrays like 'text[]', upstreamDataType returns 'text[]'\n // For old-style arrays like 'int4|NOT_NULL[]', upstreamDataType returns 'int4', so we append '[]'\n const fullUpstreamType =\n isArrayType && !baseType.includes('[]') ? `${baseType}[]` : baseType;\n\n return {\n upstreamType: fullUpstreamType,\n isNotNull: !nullableUpstream(liteTypeString),\n isEnum: checkIsEnum(liteTypeString),\n isArray: isArrayType,\n characterMaxLength: characterMaxLength ?? null,\n };\n}\n\n/**\n * Converts structured ColumnMetadata back to pipe-delimited LiteTypeString.\n * This is a compatibility helper for the migration period.\n */\nexport function metadataToLiteTypeString(metadata: ColumnMetadata): string {\n return liteTypeString(\n metadata.upstreamType,\n metadata.isNotNull,\n metadata.isEnum,\n metadata.isArray,\n );\n}\n\n/**\n * Converts PostgreSQL ColumnSpec to structured ColumnMetadata.\n * Used during replication to populate the metadata table from upstream schema.\n *\n * Uses the same logic as liteTypeString() and mapPostgresToLiteColumn() via shared helpers.\n */\nexport function pgColumnSpecToMetadata(spec: ColumnSpec): ColumnMetadata {\n return {\n upstreamType: spec.dataType,\n isNotNull: spec.notNull ?? false,\n isEnum: isEnumColumn(spec),\n isArray: isArrayColumn(spec),\n characterMaxLength: spec.characterMaximumLength ?? null,\n };\n}\n"],"names":["liteTypeString","checkIsArray","checkIsEnum"],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import { ProtocolError } from '../../../zero-protocol/src/error.ts';
2
- export type SchemaVersions = {
3
- readonly minSupportedVersion: number;
4
- readonly maxSupportedVersion: number;
5
- };
6
- export declare function throwProtocolErrorIfSchemaVersionNotSupported(schemaVersion: number, schemaVersions: SchemaVersions): void;
7
- export declare function getProtocolErrorIfSchemaVersionNotSupported(schemaVersion: number, schemaVersions: SchemaVersions): ProtocolError<{
8
- readonly kind: "SchemaVersionNotSupported";
9
- readonly message: `Schema version ${number} is not in range of supported schema versions [${number}, ${number}].`;
10
- readonly origin: "zeroCache";
11
- }> | undefined;
12
- //# sourceMappingURL=schema-versions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-versions.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/types/schema-versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,qCAAqC,CAAC;AAIlE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,wBAAgB,6CAA6C,CAC3D,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,cAAc,QAS/B;AAED,wBAAgB,2CAA2C,CACzD,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,cAAc;;;;eAc/B"}
@@ -1,28 +0,0 @@
1
- import { ProtocolError } from "../../../zero-protocol/src/error.js";
2
- import { SchemaVersionNotSupported } from "../../../zero-protocol/src/error-kind-enum.js";
3
- import { ZeroCache } from "../../../zero-protocol/src/error-origin-enum.js";
4
- function throwProtocolErrorIfSchemaVersionNotSupported(schemaVersion, schemaVersions) {
5
- const error = getProtocolErrorIfSchemaVersionNotSupported(
6
- schemaVersion,
7
- schemaVersions
8
- );
9
- if (error) {
10
- throw error;
11
- }
12
- }
13
- function getProtocolErrorIfSchemaVersionNotSupported(schemaVersion, schemaVersions) {
14
- const { minSupportedVersion, maxSupportedVersion } = schemaVersions;
15
- if (schemaVersion < minSupportedVersion || schemaVersion > maxSupportedVersion) {
16
- return new ProtocolError({
17
- kind: SchemaVersionNotSupported,
18
- message: `Schema version ${schemaVersion} is not in range of supported schema versions [${minSupportedVersion}, ${maxSupportedVersion}].`,
19
- origin: ZeroCache
20
- });
21
- }
22
- return void 0;
23
- }
24
- export {
25
- getProtocolErrorIfSchemaVersionNotSupported,
26
- throwProtocolErrorIfSchemaVersionNotSupported
27
- };
28
- //# sourceMappingURL=schema-versions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-versions.js","sources":["../../../../../zero-cache/src/types/schema-versions.ts"],"sourcesContent":["import {ProtocolError} from '../../../zero-protocol/src/error.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts';\n\nexport type SchemaVersions = {\n readonly minSupportedVersion: number;\n readonly maxSupportedVersion: number;\n};\n\nexport function throwProtocolErrorIfSchemaVersionNotSupported(\n schemaVersion: number,\n schemaVersions: SchemaVersions,\n) {\n const error = getProtocolErrorIfSchemaVersionNotSupported(\n schemaVersion,\n schemaVersions,\n );\n if (error) {\n throw error;\n }\n}\n\nexport function getProtocolErrorIfSchemaVersionNotSupported(\n schemaVersion: number,\n schemaVersions: SchemaVersions,\n) {\n const {minSupportedVersion, maxSupportedVersion} = schemaVersions;\n if (\n schemaVersion < minSupportedVersion ||\n schemaVersion > maxSupportedVersion\n ) {\n return new ProtocolError({\n kind: ErrorKind.SchemaVersionNotSupported,\n message: `Schema version ${schemaVersion} is not in range of supported schema versions [${minSupportedVersion}, ${maxSupportedVersion}].`,\n origin: ErrorOrigin.ZeroCache,\n });\n }\n return undefined;\n}\n"],"names":["ErrorKind.SchemaVersionNotSupported","ErrorOrigin.ZeroCache"],"mappings":";;;AASO,SAAS,8CACd,eACA,gBACA;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,EAAA;AAEF,MAAI,OAAO;AACT,UAAM;AAAA,EACR;AACF;AAEO,SAAS,4CACd,eACA,gBACA;AACA,QAAM,EAAC,qBAAqB,oBAAA,IAAuB;AACnD,MACE,gBAAgB,uBAChB,gBAAgB,qBAChB;AACA,WAAO,IAAI,cAAc;AAAA,MACvB,MAAMA;AAAAA,MACN,SAAS,kBAAkB,aAAa,kDAAkD,mBAAmB,KAAK,mBAAmB;AAAA,MACrI,QAAQC;AAAAA,IAAY,CACrB;AAAA,EACH;AACA,SAAO;AACT;"}