@rocicorp/zero 0.2.2024101101 → 0.3.2024102300

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 (600) hide show
  1. package/out/react.js +92 -39
  2. package/out/react.js.map +2 -2
  3. package/out/replicache/src/async-iterable-to-array.js +8 -0
  4. package/out/replicache/src/async-iterable-to-array.js.map +1 -0
  5. package/out/replicache/src/bg-interval.js +38 -0
  6. package/out/replicache/src/bg-interval.js.map +1 -0
  7. package/out/replicache/src/binary-search.js +31 -0
  8. package/out/replicache/src/binary-search.js.map +1 -0
  9. package/out/replicache/src/broadcast-channel.js +29 -0
  10. package/out/replicache/src/broadcast-channel.js.map +1 -0
  11. package/out/replicache/src/btree/diff.js +6 -0
  12. package/out/replicache/src/btree/diff.js.map +1 -0
  13. package/out/replicache/src/btree/node.js +392 -0
  14. package/out/replicache/src/btree/node.js.map +1 -0
  15. package/out/replicache/src/btree/read.js +227 -0
  16. package/out/replicache/src/btree/read.js.map +1 -0
  17. package/out/replicache/src/btree/splice.js +79 -0
  18. package/out/replicache/src/btree/splice.js.map +1 -0
  19. package/out/replicache/src/btree/write.js +154 -0
  20. package/out/replicache/src/btree/write.js.map +1 -0
  21. package/out/replicache/src/call-default-fetch.js +37 -0
  22. package/out/replicache/src/call-default-fetch.js.map +1 -0
  23. package/out/replicache/src/config.js +13 -0
  24. package/out/replicache/src/config.js.map +1 -0
  25. package/out/replicache/src/connection-loop-delegates.js +30 -0
  26. package/out/replicache/src/connection-loop-delegates.js.map +1 -0
  27. package/out/replicache/src/connection-loop.js +268 -0
  28. package/out/replicache/src/connection-loop.js.map +1 -0
  29. package/out/replicache/src/cookies.js +41 -0
  30. package/out/replicache/src/cookies.js.map +1 -0
  31. package/out/replicache/src/dag/chunk.js +60 -0
  32. package/out/replicache/src/dag/chunk.js.map +1 -0
  33. package/out/replicache/src/dag/gc.js +126 -0
  34. package/out/replicache/src/dag/gc.js.map +1 -0
  35. package/out/replicache/src/dag/key-type-enum.js +6 -0
  36. package/out/replicache/src/dag/key-type-enum.js.map +1 -0
  37. package/out/replicache/src/dag/key.js +54 -0
  38. package/out/replicache/src/dag/key.js.map +1 -0
  39. package/out/replicache/src/dag/lazy-store.js +532 -0
  40. package/out/replicache/src/dag/lazy-store.js.map +1 -0
  41. package/out/replicache/src/dag/store-impl.js +175 -0
  42. package/out/replicache/src/dag/store-impl.js.map +1 -0
  43. package/out/replicache/src/dag/store.js +22 -0
  44. package/out/replicache/src/dag/store.js.map +1 -0
  45. package/out/replicache/src/dag/visitor.js +22 -0
  46. package/out/replicache/src/dag/visitor.js.map +1 -0
  47. package/out/replicache/src/db/commit.js +443 -0
  48. package/out/replicache/src/db/commit.js.map +1 -0
  49. package/out/replicache/src/db/index-operation-enum.js +4 -0
  50. package/out/replicache/src/db/index-operation-enum.js.map +1 -0
  51. package/out/replicache/src/db/index.js +170 -0
  52. package/out/replicache/src/db/index.js.map +1 -0
  53. package/out/replicache/src/db/meta-type-enum.js +7 -0
  54. package/out/replicache/src/db/meta-type-enum.js.map +1 -0
  55. package/out/replicache/src/db/read.js +59 -0
  56. package/out/replicache/src/db/read.js.map +1 -0
  57. package/out/replicache/src/db/rebase.js +56 -0
  58. package/out/replicache/src/db/rebase.js.map +1 -0
  59. package/out/replicache/src/db/scan.js +2 -0
  60. package/out/replicache/src/db/scan.js.map +1 -0
  61. package/out/replicache/src/db/write.js +260 -0
  62. package/out/replicache/src/db/write.js.map +1 -0
  63. package/out/replicache/src/error-responses.js +30 -0
  64. package/out/replicache/src/error-responses.js.map +1 -0
  65. package/out/replicache/src/filter-async-iterable.js +15 -0
  66. package/out/replicache/src/filter-async-iterable.js.map +1 -0
  67. package/out/replicache/src/format-version-enum.js +9 -0
  68. package/out/replicache/src/format-version-enum.js.map +1 -0
  69. package/out/replicache/src/format-version.js +8 -0
  70. package/out/replicache/src/format-version.js.map +1 -0
  71. package/out/replicache/src/frozen-json.js +151 -0
  72. package/out/replicache/src/frozen-json.js.map +1 -0
  73. package/out/replicache/src/get-default-puller.js +74 -0
  74. package/out/replicache/src/get-default-puller.js.map +1 -0
  75. package/out/replicache/src/get-default-pusher.js +36 -0
  76. package/out/replicache/src/get-default-pusher.js.map +1 -0
  77. package/out/replicache/src/hash.js +73 -0
  78. package/out/replicache/src/hash.js.map +1 -0
  79. package/out/replicache/src/http-request-info.js +7 -0
  80. package/out/replicache/src/http-request-info.js.map +1 -0
  81. package/out/replicache/src/impl.js +2 -0
  82. package/out/replicache/src/impl.js.map +1 -0
  83. package/out/replicache/src/index-defs.js +28 -0
  84. package/out/replicache/src/index-defs.js.map +1 -0
  85. package/out/replicache/src/invoke-kind-enum.js +4 -0
  86. package/out/replicache/src/invoke-kind-enum.js.map +1 -0
  87. package/out/replicache/src/iterable-union.js +5 -0
  88. package/out/replicache/src/iterable-union.js.map +1 -0
  89. package/out/replicache/src/kv/idb-store-with-mem-fallback.js +93 -0
  90. package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -0
  91. package/out/replicache/src/kv/idb-store.js +179 -0
  92. package/out/replicache/src/kv/idb-store.js.map +1 -0
  93. package/out/replicache/src/kv/mem-store.js +61 -0
  94. package/out/replicache/src/kv/mem-store.js.map +1 -0
  95. package/out/replicache/src/kv/read-impl.js +23 -0
  96. package/out/replicache/src/kv/read-impl.js.map +1 -0
  97. package/out/replicache/src/kv/store.js +2 -0
  98. package/out/replicache/src/kv/store.js.map +1 -0
  99. package/out/replicache/src/kv/write-impl-base.js +48 -0
  100. package/out/replicache/src/kv/write-impl-base.js.map +1 -0
  101. package/out/replicache/src/kv/write-impl.js +25 -0
  102. package/out/replicache/src/kv/write-impl.js.map +1 -0
  103. package/out/replicache/src/lazy.js +10 -0
  104. package/out/replicache/src/lazy.js.map +1 -0
  105. package/out/replicache/src/log-options.js +13 -0
  106. package/out/replicache/src/log-options.js.map +1 -0
  107. package/out/replicache/src/merge-async-iterables.js +61 -0
  108. package/out/replicache/src/merge-async-iterables.js.map +1 -0
  109. package/out/replicache/src/mod.js +14 -0
  110. package/out/replicache/src/mod.js.map +1 -0
  111. package/out/replicache/src/mutation-recovery.js +439 -0
  112. package/out/replicache/src/mutation-recovery.js.map +1 -0
  113. package/out/replicache/src/new-client-channel.js +77 -0
  114. package/out/replicache/src/new-client-channel.js.map +1 -0
  115. package/out/replicache/src/on-persist-channel.js +33 -0
  116. package/out/replicache/src/on-persist-channel.js.map +1 -0
  117. package/out/replicache/src/patch-operation.js +37 -0
  118. package/out/replicache/src/patch-operation.js.map +1 -0
  119. package/out/replicache/src/pending-mutations.js +18 -0
  120. package/out/replicache/src/pending-mutations.js.map +1 -0
  121. package/out/replicache/src/persist/client-gc.js +38 -0
  122. package/out/replicache/src/persist/client-gc.js.map +1 -0
  123. package/out/replicache/src/persist/client-group-gc.js +38 -0
  124. package/out/replicache/src/persist/client-group-gc.js.map +1 -0
  125. package/out/replicache/src/persist/client-groups.js +180 -0
  126. package/out/replicache/src/persist/client-groups.js.map +1 -0
  127. package/out/replicache/src/persist/clients.js +390 -0
  128. package/out/replicache/src/persist/clients.js.map +1 -0
  129. package/out/replicache/src/persist/collect-idb-databases.js +174 -0
  130. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -0
  131. package/out/replicache/src/persist/gather-mem-only-visitor.js +25 -0
  132. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -0
  133. package/out/replicache/src/persist/gather-not-cached-visitor.js +35 -0
  134. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -0
  135. package/out/replicache/src/persist/heartbeat.js +37 -0
  136. package/out/replicache/src/persist/heartbeat.js.map +1 -0
  137. package/out/replicache/src/persist/idb-databases-store-db-name.js +18 -0
  138. package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -0
  139. package/out/replicache/src/persist/idb-databases-store.js +90 -0
  140. package/out/replicache/src/persist/idb-databases-store.js.map +1 -0
  141. package/out/replicache/src/persist/make-client-id.js +13 -0
  142. package/out/replicache/src/persist/make-client-id.js.map +1 -0
  143. package/out/replicache/src/persist/persist.js +132 -0
  144. package/out/replicache/src/persist/persist.js.map +1 -0
  145. package/out/replicache/src/persist/refresh.js +147 -0
  146. package/out/replicache/src/persist/refresh.js.map +1 -0
  147. package/out/replicache/src/process-scheduler.js +93 -0
  148. package/out/replicache/src/process-scheduler.js.map +1 -0
  149. package/out/replicache/src/puller.js +2 -0
  150. package/out/replicache/src/puller.js.map +1 -0
  151. package/out/replicache/src/pusher.js +32 -0
  152. package/out/replicache/src/pusher.js.map +1 -0
  153. package/out/replicache/src/replicache-impl.js +1007 -0
  154. package/out/replicache/src/replicache-impl.js.map +1 -0
  155. package/out/replicache/src/replicache-options.js +2 -0
  156. package/out/replicache/src/replicache-options.js.map +1 -0
  157. package/out/replicache/src/replicache.js +387 -0
  158. package/out/replicache/src/replicache.js.map +1 -0
  159. package/out/replicache/src/request-idle.js +15 -0
  160. package/out/replicache/src/request-idle.js.map +1 -0
  161. package/out/replicache/src/scan-iterator.js +202 -0
  162. package/out/replicache/src/scan-iterator.js.map +1 -0
  163. package/out/replicache/src/scan-options.js +45 -0
  164. package/out/replicache/src/scan-options.js.map +1 -0
  165. package/out/replicache/src/set-interval-with-signal.js +7 -0
  166. package/out/replicache/src/set-interval-with-signal.js.map +1 -0
  167. package/out/replicache/src/size-of-value.js +77 -0
  168. package/out/replicache/src/size-of-value.js.map +1 -0
  169. package/out/replicache/src/subscriptions.js +357 -0
  170. package/out/replicache/src/subscriptions.js.map +1 -0
  171. package/out/replicache/src/sync/diff.js +75 -0
  172. package/out/replicache/src/sync/diff.js.map +1 -0
  173. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js +5 -0
  174. package/out/replicache/src/sync/handle-pull-response-result-type-enum.js.map +1 -0
  175. package/out/replicache/src/sync/ids.js +4 -0
  176. package/out/replicache/src/sync/ids.js.map +1 -0
  177. package/out/replicache/src/sync/patch.js +41 -0
  178. package/out/replicache/src/sync/patch.js.map +1 -0
  179. package/out/replicache/src/sync/pull-error.js +16 -0
  180. package/out/replicache/src/sync/pull-error.js.map +1 -0
  181. package/out/replicache/src/sync/pull.js +375 -0
  182. package/out/replicache/src/sync/pull.js.map +1 -0
  183. package/out/replicache/src/sync/push.js +141 -0
  184. package/out/replicache/src/sync/push.js.map +1 -0
  185. package/out/replicache/src/sync/request-id.js +31 -0
  186. package/out/replicache/src/sync/request-id.js.map +1 -0
  187. package/out/replicache/src/sync/sync-head-name.js +2 -0
  188. package/out/replicache/src/sync/sync-head-name.js.map +1 -0
  189. package/out/replicache/src/test-license-key.js +3 -0
  190. package/out/replicache/src/test-license-key.js.map +1 -0
  191. package/out/replicache/src/to-error.js +7 -0
  192. package/out/replicache/src/to-error.js.map +1 -0
  193. package/out/replicache/src/transaction-closed-error.js +17 -0
  194. package/out/replicache/src/transaction-closed-error.js.map +1 -0
  195. package/out/replicache/src/transactions.js +144 -0
  196. package/out/replicache/src/transactions.js.map +1 -0
  197. package/out/replicache/src/types.js +2 -0
  198. package/out/replicache/src/types.js.map +1 -0
  199. package/out/replicache/src/version.js +5 -0
  200. package/out/replicache/src/version.js.map +1 -0
  201. package/out/replicache/src/with-transactions.js +28 -0
  202. package/out/replicache/src/with-transactions.js.map +1 -0
  203. package/out/shared/src/browser-env.js +14 -0
  204. package/out/shared/src/browser-env.js.map +1 -0
  205. package/out/shared/src/document-visible.js +76 -0
  206. package/out/shared/src/document-visible.js.map +1 -0
  207. package/out/shared/src/immutable.js +2 -0
  208. package/out/shared/src/immutable.js.map +1 -0
  209. package/out/shared/src/iterables.d.ts +2 -2
  210. package/out/shared/src/iterables.d.ts.map +1 -1
  211. package/out/shared/src/iterables.js +40 -0
  212. package/out/shared/src/iterables.js.map +1 -0
  213. package/out/shared/src/navigator.js +3 -0
  214. package/out/shared/src/navigator.js.map +1 -0
  215. package/out/shared/src/random-uint64.js +8 -0
  216. package/out/shared/src/random-uint64.js.map +1 -0
  217. package/out/shared/src/random-values.d.ts +1 -0
  218. package/out/shared/src/random-values.d.ts.map +1 -1
  219. package/out/shared/src/random-values.js +22 -0
  220. package/out/shared/src/random-values.js.map +1 -0
  221. package/out/shared/src/set-utils.d.ts +1 -1
  222. package/out/shared/src/set-utils.d.ts.map +1 -1
  223. package/out/shared/src/set-utils.js +6 -4
  224. package/out/shared/src/set-utils.js.map +1 -1
  225. package/out/shared/src/sorted-entries.d.ts +2 -0
  226. package/out/shared/src/sorted-entries.d.ts.map +1 -0
  227. package/out/shared/src/sorted-entries.js +6 -0
  228. package/out/shared/src/sorted-entries.js.map +1 -0
  229. package/out/shared/src/types.js +2 -0
  230. package/out/shared/src/types.js.map +1 -0
  231. package/out/shared/src/valita.d.ts +1 -1
  232. package/out/shared/src/valita.d.ts.map +1 -1
  233. package/out/shared/src/valita.js.map +1 -1
  234. package/out/shared/src/writable.d.ts +4 -0
  235. package/out/shared/src/writable.d.ts.map +1 -0
  236. package/out/shared/src/writable.js +2 -0
  237. package/out/shared/src/writable.js.map +1 -0
  238. package/out/zero/src/config.d.ts +2 -0
  239. package/out/zero/src/config.d.ts.map +1 -0
  240. package/out/zero/src/config.js +2 -0
  241. package/out/zero/src/config.js.map +1 -0
  242. package/out/zero-cache/src/config/config-query.d.ts +18 -0
  243. package/out/zero-cache/src/config/config-query.d.ts.map +1 -0
  244. package/out/zero-cache/src/config/config-query.js +19 -0
  245. package/out/zero-cache/src/config/config-query.js.map +1 -0
  246. package/out/zero-cache/src/config/define-config.d.ts +43 -0
  247. package/out/zero-cache/src/config/define-config.d.ts.map +1 -0
  248. package/out/zero-cache/src/config/define-config.js +120 -0
  249. package/out/zero-cache/src/config/define-config.js.map +1 -0
  250. package/out/zero-cache/src/config/refs.d.ts +3 -0
  251. package/out/zero-cache/src/config/refs.d.ts.map +1 -0
  252. package/out/zero-cache/src/config/refs.js +14 -0
  253. package/out/zero-cache/src/config/refs.js.map +1 -0
  254. package/out/zero-cache/src/config/zero-config.d.ts +126 -686
  255. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  256. package/out/zero-cache/src/config/zero-config.js +43 -161
  257. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  258. package/out/zero-cache/src/db/create.d.ts +8 -0
  259. package/out/zero-cache/src/db/create.d.ts.map +1 -0
  260. package/out/zero-cache/src/db/create.js +39 -0
  261. package/out/zero-cache/src/db/create.js.map +1 -0
  262. package/out/zero-cache/src/db/lite-tables.d.ts +3 -3
  263. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  264. package/out/zero-cache/src/db/lite-tables.js +29 -20
  265. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  266. package/out/zero-cache/src/db/{migration-lite.d.ts → old-migration-lite.d.ts} +1 -1
  267. package/out/zero-cache/src/db/old-migration-lite.d.ts.map +1 -0
  268. package/out/zero-cache/src/db/{migration-lite.js → old-migration-lite.js} +1 -1
  269. package/out/zero-cache/src/db/old-migration-lite.js.map +1 -0
  270. package/out/zero-cache/src/db/{migration.d.ts → old-migration.d.ts} +1 -1
  271. package/out/zero-cache/src/db/old-migration.d.ts.map +1 -0
  272. package/out/zero-cache/src/db/{migration.js → old-migration.js} +1 -1
  273. package/out/zero-cache/src/db/old-migration.js.map +1 -0
  274. package/out/zero-cache/src/db/pg-to-lite.d.ts +11 -0
  275. package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -0
  276. package/out/zero-cache/src/{services/change-streamer/pg/schema/lite.js → db/pg-to-lite.js} +27 -15
  277. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -0
  278. package/out/zero-cache/src/db/specs.d.ts +73 -0
  279. package/out/zero-cache/src/db/specs.d.ts.map +1 -0
  280. package/out/zero-cache/src/db/specs.js +30 -0
  281. package/out/zero-cache/src/db/specs.js.map +1 -0
  282. package/out/zero-cache/src/db/statements.d.ts +1 -1
  283. package/out/zero-cache/src/db/statements.d.ts.map +1 -1
  284. package/out/zero-cache/src/server/life-cycle.d.ts.map +1 -1
  285. package/out/zero-cache/src/server/life-cycle.js +9 -5
  286. package/out/zero-cache/src/server/life-cycle.js.map +1 -1
  287. package/out/zero-cache/src/server/main.js +2 -2
  288. package/out/zero-cache/src/server/main.js.map +1 -1
  289. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  290. package/out/zero-cache/src/server/syncer.js +2 -1
  291. package/out/zero-cache/src/server/syncer.js.map +1 -1
  292. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +1 -1
  293. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  294. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +1 -4
  295. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  296. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +455 -13
  297. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  298. package/out/zero-cache/src/services/change-streamer/change-streamer.js +16 -0
  299. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  300. package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts.map +1 -1
  301. package/out/zero-cache/src/services/change-streamer/pg/change-source.js +311 -86
  302. package/out/zero-cache/src/services/change-streamer/pg/change-source.js.map +1 -1
  303. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.d.ts.map +1 -1
  304. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js +7 -51
  305. package/out/zero-cache/src/services/change-streamer/pg/initial-sync.js.map +1 -1
  306. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts +239 -59
  307. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.d.ts.map +1 -1
  308. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js +263 -183
  309. package/out/zero-cache/src/services/change-streamer/pg/schema/ddl.js.map +1 -1
  310. package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts +4 -4
  311. package/out/zero-cache/src/services/change-streamer/pg/schema/published.d.ts.map +1 -1
  312. package/out/zero-cache/src/services/change-streamer/pg/schema/published.js +14 -19
  313. package/out/zero-cache/src/services/change-streamer/pg/schema/published.js.map +1 -1
  314. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.d.ts +2 -1
  315. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.d.ts.map +1 -1
  316. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.js +51 -6
  317. package/out/zero-cache/src/services/change-streamer/pg/schema/zero.js.map +1 -1
  318. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.js +1 -1
  319. package/out/zero-cache/src/services/change-streamer/pg/sync-schema.js.map +1 -1
  320. package/out/zero-cache/src/services/change-streamer/schema/change.d.ts +325 -26
  321. package/out/zero-cache/src/services/change-streamer/schema/change.d.ts.map +1 -1
  322. package/out/zero-cache/src/services/change-streamer/schema/change.js +84 -1
  323. package/out/zero-cache/src/services/change-streamer/schema/change.js.map +1 -1
  324. package/out/zero-cache/src/services/change-streamer/schema/init.js +1 -1
  325. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  326. package/out/zero-cache/src/services/dispatcher/connect-params.d.ts +1 -0
  327. package/out/zero-cache/src/services/dispatcher/connect-params.d.ts.map +1 -1
  328. package/out/zero-cache/src/services/dispatcher/connect-params.js +5 -2
  329. package/out/zero-cache/src/services/dispatcher/connect-params.js.map +1 -1
  330. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  331. package/out/zero-cache/src/services/mutagen/mutagen.js +17 -19
  332. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  333. package/out/zero-cache/src/services/mutagen/write-authorizer.d.ts.map +1 -1
  334. package/out/zero-cache/src/services/mutagen/write-authorizer.js +18 -9
  335. package/out/zero-cache/src/services/mutagen/write-authorizer.js.map +1 -1
  336. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  337. package/out/zero-cache/src/services/replicator/incremental-sync.js +120 -16
  338. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  339. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +20 -3
  340. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
  341. package/out/zero-cache/src/services/replicator/schema/change-log.js +44 -12
  342. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  343. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +3 -2
  344. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  345. package/out/zero-cache/src/services/view-syncer/client-handler.js +21 -18
  346. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  347. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +5 -1
  348. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  349. package/out/zero-cache/src/services/view-syncer/cvr-store.js +49 -8
  350. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  351. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +1 -1
  352. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  353. package/out/zero-cache/src/services/view-syncer/cvr.js +1 -1
  354. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  355. package/out/zero-cache/src/services/view-syncer/database-storage.js +1 -1
  356. package/out/zero-cache/src/services/view-syncer/database-storage.js.map +1 -1
  357. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts +31 -0
  358. package/out/zero-cache/src/services/view-syncer/drain-coordinator.d.ts.map +1 -0
  359. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js +53 -0
  360. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -0
  361. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +11 -5
  362. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  363. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +17 -0
  364. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  365. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
  366. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +2 -2
  367. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  368. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.js +1 -1
  369. package/out/zero-cache/src/services/view-syncer/schema/pg-migrations.js.map +1 -1
  370. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +11 -11
  371. package/out/zero-cache/src/services/view-syncer/schema/types.js +2 -2
  372. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  373. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +12 -4
  374. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  375. package/out/zero-cache/src/services/view-syncer/snapshotter.js +59 -49
  376. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  377. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +2 -3
  378. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  379. package/out/zero-cache/src/services/view-syncer/view-syncer.js +50 -10
  380. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  381. package/out/zero-cache/src/types/pg.d.ts +7 -1
  382. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  383. package/out/zero-cache/src/types/pg.js +14 -1
  384. package/out/zero-cache/src/types/pg.js.map +1 -1
  385. package/out/zero-cache/src/workers/connection.d.ts +3 -1
  386. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  387. package/out/zero-cache/src/workers/connection.js +19 -1
  388. package/out/zero-cache/src/workers/connection.js.map +1 -1
  389. package/out/zero-cache/src/workers/syncer.d.ts +2 -1
  390. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  391. package/out/zero-cache/src/workers/syncer.js +20 -9
  392. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  393. package/out/zero-client/src/client/context.d.ts +1 -1
  394. package/out/zero-client/src/client/context.d.ts.map +1 -1
  395. package/out/zero-client/src/client/context.js +99 -0
  396. package/out/zero-client/src/client/context.js.map +1 -0
  397. package/out/zero-client/src/client/crud.d.ts +8 -10
  398. package/out/zero-client/src/client/crud.d.ts.map +1 -1
  399. package/out/zero-client/src/client/crud.js +181 -0
  400. package/out/zero-client/src/client/crud.js.map +1 -0
  401. package/out/zero-client/src/client/enable-analytics.js +21 -0
  402. package/out/zero-client/src/client/enable-analytics.js.map +1 -0
  403. package/out/zero-client/src/client/http-string.js +14 -0
  404. package/out/zero-client/src/client/http-string.js.map +1 -0
  405. package/out/zero-client/src/client/keys.d.ts +3 -2
  406. package/out/zero-client/src/client/keys.d.ts.map +1 -1
  407. package/out/zero-client/src/client/keys.js +32 -0
  408. package/out/zero-client/src/client/keys.js.map +1 -0
  409. package/out/zero-client/src/client/log-options.js +57 -0
  410. package/out/zero-client/src/client/log-options.js.map +1 -0
  411. package/out/zero-client/src/client/metrics.js +268 -0
  412. package/out/zero-client/src/client/metrics.js.map +1 -0
  413. package/out/zero-client/src/client/normalized-schema.d.ts +17 -0
  414. package/out/zero-client/src/client/normalized-schema.d.ts.map +1 -0
  415. package/out/zero-client/src/client/normalized-schema.js +31 -0
  416. package/out/zero-client/src/client/normalized-schema.js.map +1 -0
  417. package/out/zero-client/src/client/options.js +2 -0
  418. package/out/zero-client/src/client/options.js.map +1 -0
  419. package/out/zero-client/src/client/query-manager.d.ts +18 -3
  420. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  421. package/out/zero-client/src/client/query-manager.js +149 -0
  422. package/out/zero-client/src/client/query-manager.js.map +1 -0
  423. package/out/zero-client/src/client/reload-error-handler.js +23 -0
  424. package/out/zero-client/src/client/reload-error-handler.js.map +1 -0
  425. package/out/zero-client/src/client/replicache-types.js +2 -0
  426. package/out/zero-client/src/client/replicache-types.js.map +1 -0
  427. package/out/zero-client/src/client/server-error.js +22 -0
  428. package/out/zero-client/src/client/server-error.js.map +1 -0
  429. package/out/zero-client/src/client/server-option.js +37 -0
  430. package/out/zero-client/src/client/server-option.js.map +1 -0
  431. package/out/zero-client/src/client/version.js +5 -0
  432. package/out/zero-client/src/client/version.js.map +1 -0
  433. package/out/zero-client/src/client/zero-poke-handler.d.ts +3 -3
  434. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  435. package/out/zero-client/src/client/zero-poke-handler.js +240 -0
  436. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -0
  437. package/out/zero-client/src/client/zero.d.ts +3 -2
  438. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  439. package/out/zero-client/src/client/zero.js +1212 -0
  440. package/out/zero-client/src/client/zero.js.map +1 -0
  441. package/out/zero-client/src/mod.js +4 -0
  442. package/out/zero-client/src/mod.js.map +1 -0
  443. package/out/zero-client/src/util/nanoid.js +34 -0
  444. package/out/zero-client/src/util/nanoid.js.map +1 -0
  445. package/out/zero-client/src/util/socket.js +4 -0
  446. package/out/zero-client/src/util/socket.js.map +1 -0
  447. package/out/zero-protocol/src/ast.d.ts +87 -1
  448. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  449. package/out/zero-protocol/src/ast.js +53 -0
  450. package/out/zero-protocol/src/ast.js.map +1 -1
  451. package/out/zero-protocol/src/change-desired-queries.d.ts +6 -6
  452. package/out/zero-protocol/src/change-desired-queries.d.ts.map +1 -1
  453. package/out/zero-protocol/src/clients-patch.d.ts +1 -1
  454. package/out/zero-protocol/src/connect.d.ts +15 -8
  455. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  456. package/out/zero-protocol/src/connect.js +21 -0
  457. package/out/zero-protocol/src/connect.js.map +1 -1
  458. package/out/zero-protocol/src/data.d.ts +36 -0
  459. package/out/zero-protocol/src/data.d.ts.map +1 -0
  460. package/out/zero-protocol/src/data.js +4 -0
  461. package/out/zero-protocol/src/data.js.map +1 -0
  462. package/out/zero-protocol/src/delete-clients.d.ts +4 -4
  463. package/out/zero-protocol/src/delete-clients.d.ts.map +1 -1
  464. package/out/zero-protocol/src/down.d.ts +18 -16
  465. package/out/zero-protocol/src/down.d.ts.map +1 -1
  466. package/out/zero-protocol/src/down.js +2 -1
  467. package/out/zero-protocol/src/down.js.map +1 -1
  468. package/out/zero-protocol/src/mod.d.ts +1 -2
  469. package/out/zero-protocol/src/mod.d.ts.map +1 -1
  470. package/out/zero-protocol/src/mod.js +2 -2
  471. package/out/zero-protocol/src/mod.js.map +1 -1
  472. package/out/zero-protocol/src/ping.d.ts +1 -1
  473. package/out/zero-protocol/src/ping.d.ts.map +1 -1
  474. package/out/zero-protocol/src/poke.d.ts +26 -26
  475. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  476. package/out/zero-protocol/src/poke.js +8 -5
  477. package/out/zero-protocol/src/poke.js.map +1 -1
  478. package/out/zero-protocol/src/pong.d.ts +1 -1
  479. package/out/zero-protocol/src/pong.d.ts.map +1 -1
  480. package/out/zero-protocol/src/primary-key.d.ts +2 -3
  481. package/out/zero-protocol/src/primary-key.d.ts.map +1 -1
  482. package/out/zero-protocol/src/primary-key.js +1 -3
  483. package/out/zero-protocol/src/primary-key.js.map +1 -1
  484. package/out/zero-protocol/src/pull.d.ts +4 -4
  485. package/out/zero-protocol/src/pull.d.ts.map +1 -1
  486. package/out/zero-protocol/src/push.d.ts +105 -98
  487. package/out/zero-protocol/src/push.d.ts.map +1 -1
  488. package/out/zero-protocol/src/push.js +17 -13
  489. package/out/zero-protocol/src/push.js.map +1 -1
  490. package/out/zero-protocol/src/queries-patch.d.ts +4 -4
  491. package/out/zero-protocol/src/row-patch.d.ts +38 -0
  492. package/out/zero-protocol/src/row-patch.d.ts.map +1 -0
  493. package/out/zero-protocol/src/{entities-patch.js → row-patch.js} +10 -11
  494. package/out/zero-protocol/src/row-patch.js.map +1 -0
  495. package/out/zero-protocol/src/up.d.ts +28 -27
  496. package/out/zero-protocol/src/up.d.ts.map +1 -1
  497. package/out/zero-protocol/src/warm.d.ts +10 -0
  498. package/out/zero-protocol/src/warm.d.ts.map +1 -0
  499. package/out/zero-protocol/src/warm.js +6 -0
  500. package/out/zero-protocol/src/warm.js.map +1 -0
  501. package/out/zero-react/src/use-query.d.ts.map +1 -1
  502. package/out/zero.js +499 -208
  503. package/out/zero.js.map +4 -4
  504. package/out/zql/src/zql/builder/builder.d.ts +3 -3
  505. package/out/zql/src/zql/builder/builder.d.ts.map +1 -1
  506. package/out/zql/src/zql/builder/builder.js +1 -1
  507. package/out/zql/src/zql/builder/builder.js.map +1 -1
  508. package/out/zql/src/zql/builder/filter.d.ts +2 -2
  509. package/out/zql/src/zql/builder/filter.d.ts.map +1 -1
  510. package/out/zql/src/zql/builder/filter.js.map +1 -1
  511. package/out/zql/src/zql/ivm/array-view.d.ts +1 -1
  512. package/out/zql/src/zql/ivm/array-view.d.ts.map +1 -1
  513. package/out/zql/src/zql/ivm/array-view.js +232 -0
  514. package/out/zql/src/zql/ivm/array-view.js.map +1 -0
  515. package/out/zql/src/zql/ivm/change.d.ts +2 -1
  516. package/out/zql/src/zql/ivm/change.d.ts.map +1 -1
  517. package/out/zql/src/zql/ivm/data.d.ts +2 -33
  518. package/out/zql/src/zql/ivm/data.d.ts.map +1 -1
  519. package/out/zql/src/zql/ivm/data.js.map +1 -1
  520. package/out/zql/src/zql/ivm/filter.d.ts +2 -1
  521. package/out/zql/src/zql/ivm/filter.d.ts.map +1 -1
  522. package/out/zql/src/zql/ivm/filter.js.map +1 -1
  523. package/out/zql/src/zql/ivm/join.d.ts +1 -1
  524. package/out/zql/src/zql/ivm/join.d.ts.map +1 -1
  525. package/out/zql/src/zql/ivm/join.js +68 -24
  526. package/out/zql/src/zql/ivm/join.js.map +1 -1
  527. package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  528. package/out/zql/src/zql/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  529. package/out/zql/src/zql/ivm/memory-source.d.ts +8 -6
  530. package/out/zql/src/zql/ivm/memory-source.d.ts.map +1 -1
  531. package/out/zql/src/zql/ivm/memory-source.js +2 -0
  532. package/out/zql/src/zql/ivm/memory-source.js.map +1 -1
  533. package/out/zql/src/zql/ivm/memory-storage.js +33 -0
  534. package/out/zql/src/zql/ivm/memory-storage.js.map +1 -0
  535. package/out/zql/src/zql/ivm/operator.d.ts +2 -1
  536. package/out/zql/src/zql/ivm/operator.d.ts.map +1 -1
  537. package/out/zql/src/zql/ivm/schema.d.ts +3 -3
  538. package/out/zql/src/zql/ivm/schema.d.ts.map +1 -1
  539. package/out/zql/src/zql/ivm/schema.js.map +1 -1
  540. package/out/zql/src/zql/ivm/skip.d.ts +2 -1
  541. package/out/zql/src/zql/ivm/skip.d.ts.map +1 -1
  542. package/out/zql/src/zql/ivm/skip.js.map +1 -1
  543. package/out/zql/src/zql/ivm/source.d.ts +2 -2
  544. package/out/zql/src/zql/ivm/source.d.ts.map +1 -1
  545. package/out/zql/src/zql/ivm/take.d.ts.map +1 -1
  546. package/out/zql/src/zql/ivm/take.js.map +1 -1
  547. package/out/zql/src/zql/query/normalize-table-schema.d.ts +48 -0
  548. package/out/zql/src/zql/query/normalize-table-schema.d.ts.map +1 -0
  549. package/out/zql/src/zql/query/normalize-table-schema.js +116 -0
  550. package/out/zql/src/zql/query/normalize-table-schema.js.map +1 -0
  551. package/out/zql/src/zql/query/query-impl.d.ts +6 -5
  552. package/out/zql/src/zql/query/query-impl.d.ts.map +1 -1
  553. package/out/zql/src/zql/query/query-impl.js +263 -0
  554. package/out/zql/src/zql/query/query-impl.js.map +1 -0
  555. package/out/zql/src/zql/query/query.d.ts +1 -1
  556. package/out/zql/src/zql/query/query.d.ts.map +1 -1
  557. package/out/zql/src/zql/query/query.js +3 -0
  558. package/out/zql/src/zql/query/query.js.map +1 -0
  559. package/out/zql/src/zql/query/schema.d.ts +13 -4
  560. package/out/zql/src/zql/query/schema.d.ts.map +1 -1
  561. package/out/zql/src/zql/query/schema.js +7 -0
  562. package/out/zql/src/zql/query/schema.js.map +1 -0
  563. package/out/zql/src/zql/query/typed-view.js +2 -0
  564. package/out/zql/src/zql/query/typed-view.js.map +1 -0
  565. package/out/zqlite/src/db.d.ts +1 -1
  566. package/out/zqlite/src/db.d.ts.map +1 -1
  567. package/out/zqlite/src/db.js +1 -1
  568. package/out/zqlite/src/db.js.map +1 -1
  569. package/out/zqlite/src/table-source.d.ts +2 -2
  570. package/out/zqlite/src/table-source.d.ts.map +1 -1
  571. package/out/zqlite/src/table-source.js.map +1 -1
  572. package/package.json +10 -8
  573. package/deps/sqlite3/sqlite3.c +0 -260574
  574. package/deps/sqlite3/sqlite3.h +0 -13572
  575. package/deps/sqlite3/sqlite3ext.h +0 -719
  576. package/out/zero-cache/src/db/migration-lite.d.ts.map +0 -1
  577. package/out/zero-cache/src/db/migration-lite.js.map +0 -1
  578. package/out/zero-cache/src/db/migration.d.ts.map +0 -1
  579. package/out/zero-cache/src/db/migration.js.map +0 -1
  580. package/out/zero-cache/src/services/change-streamer/pg/schema/create.d.ts +0 -6
  581. package/out/zero-cache/src/services/change-streamer/pg/schema/create.d.ts.map +0 -1
  582. package/out/zero-cache/src/services/change-streamer/pg/schema/create.js +0 -29
  583. package/out/zero-cache/src/services/change-streamer/pg/schema/create.js.map +0 -1
  584. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.d.ts +0 -6
  585. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.d.ts.map +0 -1
  586. package/out/zero-cache/src/services/change-streamer/pg/schema/lite.js.map +0 -1
  587. package/out/zero-cache/src/types/specs.d.ts +0 -29
  588. package/out/zero-cache/src/types/specs.d.ts.map +0 -1
  589. package/out/zero-cache/src/types/specs.js +0 -2
  590. package/out/zero-cache/src/types/specs.js.map +0 -1
  591. package/out/zero-client/src/client/make-id-from-primary-key.d.ts +0 -5
  592. package/out/zero-client/src/client/make-id-from-primary-key.d.ts.map +0 -1
  593. package/out/zero-protocol/src/entities-patch.d.ts +0 -66
  594. package/out/zero-protocol/src/entities-patch.d.ts.map +0 -1
  595. package/out/zero-protocol/src/entities-patch.js.map +0 -1
  596. package/out/zql/src/zql/ast/ast.d.ts +0 -84
  597. package/out/zql/src/zql/ast/ast.d.ts.map +0 -1
  598. package/out/zql/src/zql/ast/ast.js +0 -54
  599. package/out/zql/src/zql/ast/ast.js.map +0 -1
  600. package/tool/install-sqlite3.js +0 -37
package/out/zero.js CHANGED
@@ -9483,20 +9483,72 @@ var Join = class {
9483
9483
  case "child":
9484
9484
  this.#output.push(change);
9485
9485
  break;
9486
- case "edit":
9487
- if (normalizeUndefined(change.row[this.#parentKey]) === normalizeUndefined(change.oldRow[this.#parentKey])) {
9488
- this.#output.push(change);
9489
- } else {
9490
- this.#output.push({
9491
- type: "remove",
9492
- node: this.#processParentNode(change.oldRow, {}, "cleanup")
9486
+ case "edit": {
9487
+ this.#output.push({
9488
+ type: "edit",
9489
+ row: change.row,
9490
+ oldRow: change.oldRow
9491
+ });
9492
+ const oldKeyValue = normalizeUndefined(change.oldRow[this.#parentKey]);
9493
+ const newKeyValue = normalizeUndefined(change.row[this.#parentKey]);
9494
+ if (newKeyValue !== oldKeyValue) {
9495
+ const childrenToRemoveStream = this.#child.cleanup({
9496
+ constraint: {
9497
+ key: this.#childKey,
9498
+ value: oldKeyValue
9499
+ }
9493
9500
  });
9494
- this.#output.push({
9495
- type: "add",
9496
- node: this.#processParentNode(change.row, {}, "fetch")
9501
+ for (const childNode of childrenToRemoveStream) {
9502
+ this.#output.push({
9503
+ type: "child",
9504
+ // This is the new row since we already changed it in the edit above.
9505
+ row: change.row,
9506
+ child: {
9507
+ relationshipName: this.#relationshipName,
9508
+ change: {
9509
+ type: "remove",
9510
+ node: childNode
9511
+ }
9512
+ }
9513
+ });
9514
+ }
9515
+ const childrenToAddStream = this.#child.fetch({
9516
+ constraint: {
9517
+ key: this.#childKey,
9518
+ value: newKeyValue
9519
+ }
9497
9520
  });
9521
+ for (const childNode of childrenToAddStream) {
9522
+ this.#output.push({
9523
+ type: "child",
9524
+ row: change.row,
9525
+ child: {
9526
+ relationshipName: this.#relationshipName,
9527
+ change: {
9528
+ type: "add",
9529
+ node: childNode
9530
+ }
9531
+ }
9532
+ });
9533
+ }
9534
+ }
9535
+ const { primaryKey } = this.#parent.getSchema();
9536
+ const oldStorageKey = makeStorageKey(
9537
+ oldKeyValue,
9538
+ primaryKey,
9539
+ change.oldRow
9540
+ );
9541
+ const newStorageKey = makeStorageKey(
9542
+ newKeyValue,
9543
+ primaryKey,
9544
+ change.row
9545
+ );
9546
+ if (oldStorageKey !== newStorageKey) {
9547
+ this.#storage.del(oldStorageKey);
9548
+ this.#storage.set(newStorageKey, true);
9498
9549
  }
9499
9550
  break;
9551
+ }
9500
9552
  default:
9501
9553
  unreachable(change);
9502
9554
  }
@@ -9569,14 +9621,11 @@ var Join = class {
9569
9621
  }
9570
9622
  #processParentNode(parentNodeRow, parentNodeRelations, mode) {
9571
9623
  const parentKeyValue = normalizeUndefined(parentNodeRow[this.#parentKey]);
9572
- const parentPrimaryKey = [];
9573
- for (const key of this.#parent.getSchema().primaryKey) {
9574
- parentPrimaryKey.push(normalizeUndefined(parentNodeRow[key]));
9575
- }
9576
- const storageKey = createPrimaryKeySetStorageKey([
9624
+ const storageKey = makeStorageKey(
9577
9625
  parentKeyValue,
9578
- ...parentPrimaryKey
9579
- ]);
9626
+ this.#parent.getSchema().primaryKey,
9627
+ parentNodeRow
9628
+ );
9580
9629
  let method = mode;
9581
9630
  if (mode === "cleanup") {
9582
9631
  const [, second] = take(
@@ -9615,6 +9664,13 @@ function createPrimaryKeySetStorageKey(values) {
9615
9664
  function createPrimaryKeySetStorageKeyPrefix(value) {
9616
9665
  return createPrimaryKeySetStorageKey([value]);
9617
9666
  }
9667
+ function makeStorageKey(keyValue, primaryKey, row) {
9668
+ const parentPrimaryKey = [keyValue];
9669
+ for (const key of primaryKey) {
9670
+ parentPrimaryKey.push(normalizeUndefined(row[key]));
9671
+ }
9672
+ return createPrimaryKeySetStorageKey(parentPrimaryKey);
9673
+ }
9618
9674
 
9619
9675
  // ../zql/src/zql/ivm/skip.ts
9620
9676
  var Skip = class {
@@ -10155,6 +10211,10 @@ function getTakeStateKey(partitionValue) {
10155
10211
  return JSON.stringify(["take", normalizeUndefined(partitionValue)]);
10156
10212
  }
10157
10213
 
10214
+ // ../zql/src/zql/builder/error.ts
10215
+ var MissingParameterError = class extends Error {
10216
+ };
10217
+
10158
10218
  // ../zql/src/zql/builder/like.ts
10159
10219
  function getLikePredicate(pattern, flags) {
10160
10220
  const op = getLikeOp(String(pattern), flags);
@@ -10258,10 +10318,6 @@ function not(f) {
10258
10318
  return (lhs) => !f(lhs);
10259
10319
  }
10260
10320
 
10261
- // ../zql/src/zql/builder/error.ts
10262
- var MissingParameterError = class extends Error {
10263
- };
10264
-
10265
10321
  // ../zql/src/zql/builder/builder.ts
10266
10322
  function buildPipeline(ast, delegate, staticQueryParameters) {
10267
10323
  return buildPipelineInternal(
@@ -10637,6 +10693,11 @@ function makeEntryPreserveRelationships(row, entry, relationships) {
10637
10693
  return result;
10638
10694
  }
10639
10695
 
10696
+ // ../shared/src/sorted-entries.ts
10697
+ function sortedEntries(object16) {
10698
+ return Object.entries(object16).sort((a, b) => stringCompare(a[0], b[0]));
10699
+ }
10700
+
10640
10701
  // ../zql/src/zql/query/schema.ts
10641
10702
  function isFieldRelationship(relationship) {
10642
10703
  return relationship.junction === void 0;
@@ -10645,9 +10706,151 @@ function isJunctionRelationship(relationship) {
10645
10706
  return !isFieldRelationship(relationship);
10646
10707
  }
10647
10708
 
10709
+ // ../zql/src/zql/query/normalize-table-schema.ts
10710
+ var NormalizedTableSchema = class {
10711
+ tableName;
10712
+ primaryKey;
10713
+ columns;
10714
+ relationships;
10715
+ constructor(tableSchema, tableSchemaCache) {
10716
+ this.tableName = tableSchema.tableName;
10717
+ const primaryKey = normalizePrimaryKey(tableSchema.primaryKey);
10718
+ this.primaryKey = primaryKey;
10719
+ this.columns = normalizeColumns(tableSchema.columns, primaryKey);
10720
+ tableSchemaCache.set(tableSchema, this);
10721
+ this.relationships = normalizeRelationships(
10722
+ tableSchema.relationships,
10723
+ tableSchemaCache
10724
+ );
10725
+ }
10726
+ };
10727
+ function normalizeTableSchema(tableSchema) {
10728
+ return normalizeTableSchemaWithCache(
10729
+ tableSchema,
10730
+ tableSchema.tableName,
10731
+ /* @__PURE__ */ new Map()
10732
+ );
10733
+ }
10734
+ function normalizeTableSchemaWithCache(tableSchema, expectedName, tableSchemaCache) {
10735
+ if (tableSchema instanceof NormalizedTableSchema) {
10736
+ return tableSchema;
10737
+ }
10738
+ assert(
10739
+ tableSchema.tableName === expectedName,
10740
+ `Table name mismatch: "${tableSchema.tableName}" !== "${expectedName}"`
10741
+ );
10742
+ let normalizedTableSchema = tableSchemaCache.get(tableSchema);
10743
+ if (normalizedTableSchema) {
10744
+ return normalizedTableSchema;
10745
+ }
10746
+ normalizedTableSchema = new NormalizedTableSchema(
10747
+ tableSchema,
10748
+ tableSchemaCache
10749
+ );
10750
+ return normalizedTableSchema;
10751
+ }
10752
+ function isSorted(arr) {
10753
+ for (let i = 1; i < arr.length; i++) {
10754
+ if (arr[i - 1] >= arr[i]) {
10755
+ return false;
10756
+ }
10757
+ }
10758
+ return true;
10759
+ }
10760
+ function assertNoDuplicates(arr) {
10761
+ for (let i = 1; i < arr.length; i++) {
10762
+ assert(arr[i - 1] !== arr[i], "Primary key must not contain duplicates");
10763
+ }
10764
+ }
10765
+ function normalizePrimaryKey(arr) {
10766
+ if (isSorted(arr)) {
10767
+ return arr;
10768
+ }
10769
+ arr = [...arr].sort();
10770
+ assertNoDuplicates(arr);
10771
+ return arr;
10772
+ }
10773
+ function normalizeColumns(columns, primaryKey) {
10774
+ const rv = {};
10775
+ for (const pk of primaryKey) {
10776
+ const schemaValue = columns[pk];
10777
+ assert(schemaValue, `Primary key column "${pk}" not found`);
10778
+ const { type, optional } = schemaValue;
10779
+ assert(!optional, `Primary key column "${pk}" cannot be optional`);
10780
+ assert(
10781
+ type === "string" || type === "number" || type === "boolean",
10782
+ `Primary key column "${pk}" must be a string, number, or boolean. Got ${type}`
10783
+ );
10784
+ }
10785
+ for (const [name, column] of sortedEntries(columns)) {
10786
+ rv[name] = normalizeSchemaValue(column);
10787
+ }
10788
+ return rv;
10789
+ }
10790
+ function normalizeSchemaValue(value) {
10791
+ return {
10792
+ type: value.type,
10793
+ optional: value.optional ?? false
10794
+ };
10795
+ }
10796
+ function normalizeRelationships(relationships, tableSchemaCache) {
10797
+ const rv = {};
10798
+ for (const [name, relationship] of sortedEntries(relationships)) {
10799
+ rv[name] = normalizeRelationship(relationship, tableSchemaCache);
10800
+ }
10801
+ return rv;
10802
+ }
10803
+ function normalizeRelationship(relationship, tableSchemaCache) {
10804
+ if (isFieldRelationship(relationship)) {
10805
+ return normalizeFieldRelationship(relationship, tableSchemaCache);
10806
+ }
10807
+ return normalizeJunctionRelationship(relationship, tableSchemaCache);
10808
+ }
10809
+ function normalizeFieldRelationship(relationship, tableSchemaCache) {
10810
+ return {
10811
+ source: relationship.source,
10812
+ dest: {
10813
+ field: relationship.dest.field,
10814
+ schema: normalizeLazyTableSchema(
10815
+ relationship.dest.schema,
10816
+ tableSchemaCache
10817
+ )
10818
+ }
10819
+ };
10820
+ }
10821
+ function normalizeJunctionRelationship(relationship, tableSchemaCache) {
10822
+ return {
10823
+ source: relationship.source,
10824
+ junction: {
10825
+ sourceField: relationship.junction.sourceField,
10826
+ destField: relationship.junction.destField,
10827
+ schema: normalizeLazyTableSchema(
10828
+ relationship.junction.schema,
10829
+ tableSchemaCache
10830
+ )
10831
+ },
10832
+ dest: {
10833
+ field: relationship.dest.field,
10834
+ schema: normalizeLazyTableSchema(
10835
+ relationship.dest.schema,
10836
+ tableSchemaCache
10837
+ )
10838
+ }
10839
+ };
10840
+ }
10841
+ function normalizeLazyTableSchema(tableSchema, buildCache) {
10842
+ const tableSchemaInstance = typeof tableSchema === "function" ? tableSchema() : tableSchema;
10843
+ return normalizeTableSchemaWithCache(
10844
+ tableSchemaInstance,
10845
+ tableSchemaInstance.tableName,
10846
+ // Don't care about name here.
10847
+ buildCache
10848
+ );
10849
+ }
10850
+
10648
10851
  // ../zql/src/zql/query/query-impl.ts
10649
10852
  function newQuery(delegate, tableSchema) {
10650
- return new QueryImpl(delegate, tableSchema);
10853
+ return new QueryImpl(delegate, normalizeTableSchema(tableSchema));
10651
10854
  }
10652
10855
  function newQueryWithDetails(delegate, schema, ast, format) {
10653
10856
  return new QueryImpl(delegate, schema, ast, format);
@@ -10688,7 +10891,7 @@ var AbstractQuery = class {
10688
10891
  const related1 = related;
10689
10892
  const related2 = related;
10690
10893
  if (isFieldRelationship(related1)) {
10691
- const destSchema = resolveSchema(related1.dest.schema);
10894
+ const destSchema = related1.dest.schema;
10692
10895
  const sq = cb(
10693
10896
  this._newQuery(
10694
10897
  destSchema,
@@ -10725,8 +10928,8 @@ var AbstractQuery = class {
10725
10928
  );
10726
10929
  }
10727
10930
  if (isJunctionRelationship(related2)) {
10728
- const destSchema = resolveSchema(related2.dest.schema);
10729
- const junctionSchema = resolveSchema(related2.junction.schema);
10931
+ const destSchema = related2.dest.schema;
10932
+ const junctionSchema = related2.junction.schema;
10730
10933
  const sq = cb(
10731
10934
  this._newQuery(
10732
10935
  destSchema,
@@ -10913,12 +11116,6 @@ var QueryImpl = class extends AbstractQuery {
10913
11116
  };
10914
11117
  }
10915
11118
  };
10916
- function resolveSchema(maybeSchema) {
10917
- if (typeof maybeSchema === "function") {
10918
- return maybeSchema();
10919
- }
10920
- return maybeSchema;
10921
- }
10922
11119
  function addPrimaryKeys(schema, orderBy) {
10923
11120
  orderBy = orderBy ?? [];
10924
11121
  const { primaryKey } = schema;
@@ -10946,6 +11143,7 @@ import { LogContext as LogContext3 } from "@rocicorp/logger";
10946
11143
  import { resolver as resolver8 } from "@rocicorp/resolver";
10947
11144
 
10948
11145
  // ../zero-protocol/src/ast.ts
11146
+ import { compareUTF8 as compareUTF84 } from "compare-utf8";
10949
11147
  var selectorSchema = valita_exports.string();
10950
11148
  var orderingElementSchema = readonly(
10951
11149
  valita_exports.tuple([selectorSchema, valita_exports.union(valita_exports.literal("asc"), valita_exports.literal("desc"))])
@@ -11020,6 +11218,57 @@ var astSchema = valita_exports.object({
11020
11218
  exclusive: valita_exports.boolean()
11021
11219
  }).optional()
11022
11220
  });
11221
+ function normalizeAST(ast) {
11222
+ return {
11223
+ schema: ast.schema,
11224
+ table: ast.table,
11225
+ alias: ast.alias,
11226
+ where: ast.where ? sortedWhere(ast.where) : void 0,
11227
+ related: ast.related ? sortedRelated(
11228
+ ast.related.map(
11229
+ (r) => ({
11230
+ correlation: {
11231
+ parentField: r.correlation.parentField,
11232
+ childField: r.correlation.childField,
11233
+ op: r.correlation.op
11234
+ },
11235
+ hidden: r.hidden,
11236
+ subquery: normalizeAST(r.subquery)
11237
+ })
11238
+ )
11239
+ ) : void 0,
11240
+ start: ast.start,
11241
+ limit: ast.limit,
11242
+ orderBy: ast.orderBy
11243
+ };
11244
+ }
11245
+ function sortedWhere(where) {
11246
+ return [...where].sort(cmpCondition);
11247
+ }
11248
+ function sortedRelated(related) {
11249
+ return related.sort(cmpRelated);
11250
+ }
11251
+ function cmpCondition(a, b) {
11252
+ return compareUTF8MaybeNull(a.field, b.field) || compareUTF8MaybeNull(a.op, b.op) || // Comparing the same field with the same op more than once doesn't make logical
11253
+ // sense, but is technically possible. Assume the values are of the same type and
11254
+ // sort by their String forms.
11255
+ compareUTF8MaybeNull(String(a.value), String(b.value));
11256
+ }
11257
+ function cmpRelated(a, b) {
11258
+ return compareUTF84(must(a.subquery.alias), must(b.subquery.alias));
11259
+ }
11260
+ function compareUTF8MaybeNull(a, b) {
11261
+ if (a !== null && b !== null) {
11262
+ return compareUTF84(a, b);
11263
+ }
11264
+ if (b !== null) {
11265
+ return -1;
11266
+ }
11267
+ if (a !== null) {
11268
+ return 1;
11269
+ }
11270
+ return 0;
11271
+ }
11023
11272
 
11024
11273
  // ../zero-protocol/src/queries-patch.ts
11025
11274
  var putOpSchema = valita_exports.object({
@@ -11077,6 +11326,13 @@ var initConnectionMessageSchema = valita_exports.tuple([
11077
11326
  valita_exports.literal("initConnection"),
11078
11327
  initConnectionBodySchema
11079
11328
  ]);
11329
+ function encodeSecProtocols(initConnectionMessage, authToken) {
11330
+ const protocols = [btoa(JSON.stringify(initConnectionMessage))];
11331
+ if (authToken !== void 0) {
11332
+ protocols.push(authToken);
11333
+ }
11334
+ return encodeURIComponent(protocols.join(","));
11335
+ }
11080
11336
 
11081
11337
  // ../zero-protocol/src/error.ts
11082
11338
  var errorKindSchema = valita_exports.union(
@@ -11101,12 +11357,20 @@ var errorMessageSchema = valita_exports.tuple([
11101
11357
  valita_exports.string()
11102
11358
  ]);
11103
11359
 
11104
- // ../zero-protocol/src/version.ts
11105
- var versionSchema = valita_exports.string();
11106
- var nullableVersionSchema = valita_exports.union(versionSchema, valita_exports.null());
11360
+ // ../zero-protocol/src/data.ts
11361
+ var valueSchema = valita_exports.union(
11362
+ valita_exports.null(),
11363
+ valita_exports.boolean(),
11364
+ valita_exports.number(),
11365
+ valita_exports.string(),
11366
+ valita_exports.undefined()
11367
+ );
11368
+ var rowSchema = valita_exports.record(valueSchema);
11107
11369
 
11108
11370
  // ../zero-protocol/src/primary-key.ts
11109
- var primaryKeySchema = valita_exports.array(valita_exports.string()).assert((arr) => arr.length > 0);
11371
+ var primaryKeySchema = readonly(
11372
+ valita_exports.tuple([valita_exports.string()]).concat(valita_exports.array(valita_exports.string()))
11373
+ );
11110
11374
  var primaryKeyValueSchema = valita_exports.union(
11111
11375
  valita_exports.string(),
11112
11376
  valita_exports.number(),
@@ -11116,35 +11380,38 @@ var primaryKeyValueRecordSchema = readonlyRecord(
11116
11380
  primaryKeyValueSchema
11117
11381
  );
11118
11382
 
11119
- // ../zero-protocol/src/entities-patch.ts
11383
+ // ../zero-protocol/src/row-patch.ts
11120
11384
  var putOpSchema3 = valita_exports.object({
11121
11385
  op: valita_exports.literal("put"),
11122
- entityType: valita_exports.string(),
11123
- entityID: primaryKeyValueRecordSchema,
11124
- value: jsonObjectSchema
11386
+ tableName: valita_exports.string(),
11387
+ value: rowSchema
11125
11388
  });
11126
11389
  var updateOpSchema = valita_exports.object({
11127
11390
  op: valita_exports.literal("update"),
11128
- entityType: valita_exports.string(),
11129
- entityID: primaryKeyValueRecordSchema,
11391
+ tableName: valita_exports.string(),
11392
+ id: primaryKeyValueRecordSchema,
11130
11393
  merge: jsonObjectSchema.optional(),
11131
11394
  constrain: valita_exports.array(valita_exports.string()).optional()
11132
11395
  });
11133
11396
  var delOpSchema3 = valita_exports.object({
11134
11397
  op: valita_exports.literal("del"),
11135
- entityType: valita_exports.string(),
11136
- entityID: primaryKeyValueRecordSchema
11398
+ tableName: valita_exports.string(),
11399
+ id: primaryKeyValueRecordSchema
11137
11400
  });
11138
11401
  var clearOpSchema3 = valita_exports.object({
11139
11402
  op: valita_exports.literal("clear")
11140
11403
  });
11141
- var entityPatchOpSchema = valita_exports.union(
11404
+ var rowPatchOpSchema = valita_exports.union(
11142
11405
  putOpSchema3,
11143
11406
  updateOpSchema,
11144
11407
  delOpSchema3,
11145
11408
  clearOpSchema3
11146
11409
  );
11147
- var entitiesPatchSchema = valita_exports.array(entityPatchOpSchema);
11410
+ var rowsPatchSchema = valita_exports.array(rowPatchOpSchema);
11411
+
11412
+ // ../zero-protocol/src/version.ts
11413
+ var versionSchema = valita_exports.string();
11414
+ var nullableVersionSchema = valita_exports.union(versionSchema, valita_exports.null());
11148
11415
 
11149
11416
  // ../zero-protocol/src/poke.ts
11150
11417
  var pokeStartBodySchema = valita_exports.object({
@@ -11170,13 +11437,16 @@ var pokePartBodySchema = valita_exports.object({
11170
11437
  // Patches to the desired query sets by client id.
11171
11438
  desiredQueriesPatches: valita_exports.record(queriesPatchSchema).optional(),
11172
11439
  // Patches to the set of queries for which entities are sync'd in
11173
- // entitiesPatch.
11440
+ // rowsPatch.
11174
11441
  gotQueriesPatch: queriesPatchSchema.optional(),
11175
- // Patches to the entities set.
11176
- entitiesPatch: entitiesPatchSchema.optional()
11442
+ // Patches to the rows set.
11443
+ rowsPatch: rowsPatchSchema.optional()
11177
11444
  });
11178
11445
  var pokeEndBodySchema = valita_exports.object({
11179
- pokeID: valita_exports.string()
11446
+ pokeID: valita_exports.string(),
11447
+ // If `true`, the poke with id `pokeID` should be discarded without
11448
+ // applying it.
11449
+ cancel: valita_exports.boolean().optional()
11180
11450
  });
11181
11451
  var pokeStartMessageSchema = valita_exports.tuple([
11182
11452
  valita_exports.literal("pokeStart"),
@@ -11218,9 +11488,16 @@ var pullResponseMessageSchema = valita_exports.tuple([
11218
11488
  pullResponseBodySchema
11219
11489
  ]);
11220
11490
 
11491
+ // ../zero-protocol/src/warm.ts
11492
+ var warmBodySchema = valita_exports.object({
11493
+ payload: valita_exports.string()
11494
+ });
11495
+ var warmMessageSchema = valita_exports.tuple([valita_exports.literal("warm"), warmBodySchema]);
11496
+
11221
11497
  // ../zero-protocol/src/down.ts
11222
11498
  var downstreamSchema = valita_exports.union(
11223
11499
  connectedMessageSchema,
11500
+ warmMessageSchema,
11224
11501
  errorMessageSchema,
11225
11502
  pongMessageSchema,
11226
11503
  pokeStartMessageSchema,
@@ -11237,26 +11514,29 @@ var pingMessageSchema = valita_exports.tuple([valita_exports.literal("ping"), pi
11237
11514
  var CRUD_MUTATION_NAME = "_zero_crud";
11238
11515
  var createOpSchema = valita_exports.object({
11239
11516
  op: valita_exports.literal("create"),
11240
- entityType: valita_exports.string(),
11241
- id: primaryKeyValueRecordSchema,
11242
- value: jsonObjectSchema
11517
+ tableName: valita_exports.string(),
11518
+ primaryKey: primaryKeySchema,
11519
+ value: rowSchema
11243
11520
  });
11244
11521
  var setOpSchema = valita_exports.object({
11245
11522
  op: valita_exports.literal("set"),
11246
- entityType: valita_exports.string(),
11247
- id: primaryKeyValueRecordSchema,
11248
- value: jsonObjectSchema
11523
+ tableName: valita_exports.string(),
11524
+ primaryKey: primaryKeySchema,
11525
+ value: rowSchema
11249
11526
  });
11250
11527
  var updateOpSchema2 = valita_exports.object({
11251
11528
  op: valita_exports.literal("update"),
11252
- entityType: valita_exports.string(),
11253
- id: primaryKeyValueRecordSchema,
11254
- partialValue: jsonObjectSchema
11529
+ tableName: valita_exports.string(),
11530
+ primaryKey: primaryKeySchema,
11531
+ // Partial value with at least the primary key fields
11532
+ value: rowSchema
11255
11533
  });
11256
11534
  var deleteOpSchema = valita_exports.object({
11257
11535
  op: valita_exports.literal("delete"),
11258
- entityType: valita_exports.string(),
11259
- id: primaryKeyValueRecordSchema
11536
+ tableName: valita_exports.string(),
11537
+ primaryKey: primaryKeySchema,
11538
+ // Partial value representing the primary key
11539
+ value: primaryKeyValueRecordSchema
11260
11540
  });
11261
11541
  var crudOpSchema = valita_exports.union(
11262
11542
  createOpSchema,
@@ -13478,21 +13758,12 @@ function desiredQueriesPrefixForClient(clientID) {
13478
13758
  function toGotQueriesKey(hash2) {
13479
13759
  return GOT_QUERIES_KEY_PREFIX + hash2;
13480
13760
  }
13481
- function maybeSort(arr) {
13482
- for (let i = 1; i < arr.length; i++) {
13483
- if (arr[i] < arr[i - 1]) {
13484
- return [...arr].sort();
13485
- }
13486
- }
13487
- return arr;
13488
- }
13489
- function toPrimaryKeyString(tableName, primaryKey, id) {
13761
+ function toPrimaryKeyString(tableName, primaryKey, value) {
13490
13762
  if (primaryKey.length === 1) {
13491
- return ENTITIES_KEY_PREFIX + tableName + "/" + id[primaryKey[0]];
13763
+ return ENTITIES_KEY_PREFIX + tableName + "/" + parse(value[primaryKey[0]], primaryKeyValueSchema);
13492
13764
  }
13493
- const sorted = maybeSort(primaryKey);
13494
- const arr = sorted.map((k) => id[k]);
13495
- const str = JSON.stringify(arr);
13765
+ const values = primaryKey.map((k) => parse(value[k], primaryKeyValueSchema));
13766
+ const str = JSON.stringify(values);
13496
13767
  const idSegment = h64WithReverse(str);
13497
13768
  return ENTITIES_KEY_PREFIX + tableName + "/" + idSegment;
13498
13769
  }
@@ -13583,15 +13854,6 @@ var ZeroContext = class {
13583
13854
  }
13584
13855
  };
13585
13856
 
13586
- // ../zero-client/src/client/make-id-from-primary-key.ts
13587
- function makeIDFromPrimaryKey(primaryKey, value) {
13588
- const id = {};
13589
- for (const key of primaryKey) {
13590
- id[key] = parse(value[key], primaryKeyValueSchema);
13591
- }
13592
- return id;
13593
- }
13594
-
13595
13857
  // ../zero-client/src/client/crud.ts
13596
13858
  function makeCRUDMutate(schema, repMutate) {
13597
13859
  const { [CRUD_MUTATION_NAME]: zeroCRUD } = repMutate;
@@ -13614,9 +13876,9 @@ function makeCRUDMutate(schema, repMutate) {
13614
13876
  inBatch = false;
13615
13877
  }
13616
13878
  };
13617
- const assertNotInBatch = (entityType, op) => {
13879
+ const assertNotInBatch = (tableName, op) => {
13618
13880
  if (inBatch) {
13619
- throw new Error(`Cannot call mutate.${entityType}.${op} inside a batch`);
13881
+ throw new Error(`Cannot call mutate.${tableName}.${op} inside a batch`);
13620
13882
  }
13621
13883
  };
13622
13884
  for (const [name, tableSchema] of Object.entries(schema.tables)) {
@@ -13629,44 +13891,45 @@ function makeCRUDMutate(schema, repMutate) {
13629
13891
  }
13630
13892
  return mutate;
13631
13893
  }
13632
- function makeEntityCRUDMutate(entityType, primaryKey, zeroCRUD, assertNotInBatch) {
13894
+ function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD, assertNotInBatch) {
13633
13895
  return {
13634
13896
  create: (value) => {
13635
- assertNotInBatch(entityType, "create");
13897
+ assertNotInBatch(tableName, "create");
13636
13898
  const op = {
13637
13899
  op: "create",
13638
- entityType,
13639
- id: makeIDFromPrimaryKey(primaryKey, value),
13900
+ tableName,
13901
+ primaryKey,
13640
13902
  value
13641
13903
  };
13642
13904
  return zeroCRUD({ ops: [op] });
13643
13905
  },
13644
13906
  set: (value) => {
13645
- assertNotInBatch(entityType, "set");
13907
+ assertNotInBatch(tableName, "set");
13646
13908
  const op = {
13647
13909
  op: "set",
13648
- entityType,
13649
- id: makeIDFromPrimaryKey(primaryKey, value),
13910
+ tableName,
13911
+ primaryKey,
13650
13912
  value
13651
13913
  };
13652
13914
  return zeroCRUD({ ops: [op] });
13653
13915
  },
13654
13916
  update: (value) => {
13655
- assertNotInBatch(entityType, "update");
13917
+ assertNotInBatch(tableName, "update");
13656
13918
  const op = {
13657
13919
  op: "update",
13658
- entityType,
13659
- id: makeIDFromPrimaryKey(primaryKey, value),
13660
- partialValue: value
13920
+ tableName,
13921
+ primaryKey,
13922
+ value
13661
13923
  };
13662
13924
  return zeroCRUD({ ops: [op] });
13663
13925
  },
13664
13926
  delete: (id) => {
13665
- assertNotInBatch(entityType, "delete");
13927
+ assertNotInBatch(tableName, "delete");
13666
13928
  const op = {
13667
13929
  op: "delete",
13668
- entityType,
13669
- id: makeIDFromPrimaryKey(primaryKey, id)
13930
+ tableName,
13931
+ primaryKey,
13932
+ value: id
13670
13933
  };
13671
13934
  return zeroCRUD({ ops: [op] });
13672
13935
  }
@@ -13678,8 +13941,8 @@ function makeBatchCRUDMutate(tableName, schema, ops) {
13678
13941
  create: (value) => {
13679
13942
  const op = {
13680
13943
  op: "create",
13681
- entityType: tableName,
13682
- id: makeIDFromPrimaryKey(primaryKey, value),
13944
+ tableName,
13945
+ primaryKey,
13683
13946
  value
13684
13947
  };
13685
13948
  ops.push(op);
@@ -13688,8 +13951,8 @@ function makeBatchCRUDMutate(tableName, schema, ops) {
13688
13951
  set: (value) => {
13689
13952
  const op = {
13690
13953
  op: "set",
13691
- entityType: tableName,
13692
- id: makeIDFromPrimaryKey(primaryKey, value),
13954
+ tableName,
13955
+ primaryKey,
13693
13956
  value
13694
13957
  };
13695
13958
  ops.push(op);
@@ -13698,9 +13961,9 @@ function makeBatchCRUDMutate(tableName, schema, ops) {
13698
13961
  update: (value) => {
13699
13962
  const op = {
13700
13963
  op: "update",
13701
- entityType: tableName,
13702
- id: makeIDFromPrimaryKey(primaryKey, value),
13703
- partialValue: value
13964
+ tableName,
13965
+ primaryKey,
13966
+ value
13704
13967
  };
13705
13968
  ops.push(op);
13706
13969
  return promiseVoid;
@@ -13708,8 +13971,9 @@ function makeBatchCRUDMutate(tableName, schema, ops) {
13708
13971
  delete: (id) => {
13709
13972
  const op = {
13710
13973
  op: "delete",
13711
- entityType: tableName,
13712
- id: makeIDFromPrimaryKey(primaryKey, id)
13974
+ tableName,
13975
+ primaryKey,
13976
+ value: id
13713
13977
  };
13714
13978
  ops.push(op);
13715
13979
  return promiseVoid;
@@ -13738,9 +14002,9 @@ function makeCRUDMutator(schema) {
13738
14002
  }
13739
14003
  async function createImpl(tx, arg, schema) {
13740
14004
  const key = toPrimaryKeyString(
13741
- arg.entityType,
13742
- schema.tables[arg.entityType].primaryKey,
13743
- arg.id
14005
+ arg.tableName,
14006
+ schema.tables[arg.tableName].primaryKey,
14007
+ arg.value
13744
14008
  );
13745
14009
  if (!await tx.has(key)) {
13746
14010
  await tx.set(key, arg.value);
@@ -13748,31 +14012,31 @@ async function createImpl(tx, arg, schema) {
13748
14012
  }
13749
14013
  async function setImpl(tx, arg, schema) {
13750
14014
  const key = toPrimaryKeyString(
13751
- arg.entityType,
13752
- schema.tables[arg.entityType].primaryKey,
13753
- arg.id
14015
+ arg.tableName,
14016
+ schema.tables[arg.tableName].primaryKey,
14017
+ arg.value
13754
14018
  );
13755
14019
  await tx.set(key, arg.value);
13756
14020
  }
13757
14021
  async function updateImpl(tx, arg, schema) {
13758
14022
  const key = toPrimaryKeyString(
13759
- arg.entityType,
13760
- schema.tables[arg.entityType].primaryKey,
13761
- arg.id
14023
+ arg.tableName,
14024
+ schema.tables[arg.tableName].primaryKey,
14025
+ arg.value
13762
14026
  );
13763
14027
  const prev = await tx.get(key);
13764
14028
  if (prev === void 0) {
13765
14029
  return;
13766
14030
  }
13767
- const update = arg.partialValue;
14031
+ const update = arg.value;
13768
14032
  const next = { ...prev, ...update };
13769
14033
  await tx.set(key, next);
13770
14034
  }
13771
14035
  async function deleteImpl(tx, arg, schema) {
13772
14036
  const key = toPrimaryKeyString(
13773
- arg.entityType,
13774
- schema.tables[arg.entityType].primaryKey,
13775
- arg.id
14037
+ arg.tableName,
14038
+ schema.tables[arg.tableName].primaryKey,
14039
+ arg.value
13776
14040
  );
13777
14041
  await tx.del(key);
13778
14042
  }
@@ -14308,58 +14572,28 @@ var State = class {
14308
14572
  }
14309
14573
  };
14310
14574
 
14311
- // ../zql/src/zql/ast/ast.ts
14312
- import { compareUTF8 as compareUTF84 } from "compare-utf8";
14313
- function normalizeAST(ast) {
14314
- return {
14315
- schema: ast.schema,
14316
- table: ast.table,
14317
- alias: ast.alias,
14318
- where: ast.where ? sortedWhere(ast.where) : void 0,
14319
- related: ast.related ? sortedRelated(
14320
- ast.related.map(
14321
- (r) => ({
14322
- correlation: {
14323
- parentField: r.correlation.parentField,
14324
- childField: r.correlation.childField,
14325
- op: r.correlation.op
14326
- },
14327
- hidden: r.hidden,
14328
- subquery: normalizeAST(r.subquery)
14329
- })
14330
- )
14331
- ) : void 0,
14332
- start: ast.start,
14333
- limit: ast.limit,
14334
- orderBy: ast.orderBy
14335
- };
14336
- }
14337
- function sortedWhere(where) {
14338
- return [...where].sort(cmpCondition);
14339
- }
14340
- function sortedRelated(related) {
14341
- return related.sort(cmpRelated);
14342
- }
14343
- function cmpCondition(a, b) {
14344
- return compareUTF8MaybeNull(a.field, b.field) || compareUTF8MaybeNull(a.op, b.op) || // Comparing the same field with the same op more than once doesn't make logical
14345
- // sense, but is technically possible. Assume the values are of the same type and
14346
- // sort by their String forms.
14347
- compareUTF8MaybeNull(String(a.value), String(b.value));
14348
- }
14349
- function cmpRelated(a, b) {
14350
- return compareUTF84(must(a.subquery.alias), must(b.subquery.alias));
14351
- }
14352
- function compareUTF8MaybeNull(a, b) {
14353
- if (a !== null && b !== null) {
14354
- return compareUTF84(a, b);
14575
+ // ../zero-client/src/client/normalized-schema.ts
14576
+ function normalizeSchema(schema) {
14577
+ if (schema instanceof NormalizedSchema) {
14578
+ return schema;
14355
14579
  }
14356
- if (b !== null) {
14357
- return -1;
14580
+ return new NormalizedSchema(schema);
14581
+ }
14582
+ var NormalizedSchema = class {
14583
+ version;
14584
+ tables;
14585
+ constructor(schema) {
14586
+ this.version = schema.version;
14587
+ this.tables = normalizeTables(schema.tables);
14358
14588
  }
14359
- if (a !== null) {
14360
- return 1;
14589
+ };
14590
+ function normalizeTables(tables) {
14591
+ const rv = {};
14592
+ const tableSchemaCache = /* @__PURE__ */ new Map();
14593
+ for (const [name, table] of sortedEntries(tables)) {
14594
+ rv[name] = normalizeTableSchemaWithCache(table, name, tableSchemaCache);
14361
14595
  }
14362
- return 0;
14596
+ return rv;
14363
14597
  }
14364
14598
 
14365
14599
  // ../zero-client/src/client/query-manager.ts
@@ -14399,21 +14633,49 @@ var QueryManager = class {
14399
14633
  gotCallback(got);
14400
14634
  }
14401
14635
  }
14402
- async getQueriesPatch(tx) {
14636
+ /**
14637
+ * Get the queries that need to be registered with the server.
14638
+ *
14639
+ * An optional `lastPatch` can be provided. This is the last patch that was
14640
+ * sent to the server and may not yet have been acked. If `lastPatch` is provided,
14641
+ * this method will return a patch that does not include any events sent in `lastPatch`.
14642
+ *
14643
+ * This diffing of last patch and current patch is needed since we send
14644
+ * a set of queries to the server when we first connect inside of the `sec-protocol` as
14645
+ * the `initConnectionMessage`.
14646
+ *
14647
+ * While we're waiting for the `connected` response to come back from the server,
14648
+ * the client may have registered more queries. We need to diff the `initConnectionMessage`
14649
+ * queries with the current set of queries to understand what those were.
14650
+ */
14651
+ async getQueriesPatch(tx, lastPatch) {
14403
14652
  const existingQueryHashes = /* @__PURE__ */ new Set();
14404
14653
  const prefix = desiredQueriesPrefixForClient(this.#clientID);
14405
14654
  for await (const key of tx.scan({ prefix }).keys()) {
14406
14655
  existingQueryHashes.add(key.substring(prefix.length, key.length));
14407
14656
  }
14408
- const patch = [];
14657
+ const patch = /* @__PURE__ */ new Map();
14409
14658
  for (const hash2 of existingQueryHashes) {
14410
14659
  if (!this.#queries.has(hash2)) {
14411
- patch.push({ op: "del", hash: hash2 });
14660
+ patch.set(hash2, { op: "del", hash: hash2 });
14412
14661
  }
14413
14662
  }
14414
14663
  for (const [hash2, { normalized }] of this.#queries) {
14415
14664
  if (!existingQueryHashes.has(hash2)) {
14416
- patch.push({ op: "put", hash: hash2, ast: normalized });
14665
+ patch.set(hash2, { op: "put", hash: hash2, ast: normalized });
14666
+ }
14667
+ }
14668
+ if (lastPatch) {
14669
+ for (const [hash2, { op }] of lastPatch) {
14670
+ if (op === "put" && !patch.has(hash2)) {
14671
+ patch.set(hash2, { op: "del", hash: hash2 });
14672
+ }
14673
+ }
14674
+ for (const [hash2, { op }] of patch) {
14675
+ const lastPatchOp = lastPatch.get(hash2);
14676
+ if (lastPatchOp && lastPatchOp.op === op) {
14677
+ patch.delete(hash2);
14678
+ }
14417
14679
  }
14418
14680
  }
14419
14681
  return patch;
@@ -14614,6 +14876,10 @@ var PokeHandler = class {
14614
14876
  );
14615
14877
  return;
14616
14878
  }
14879
+ if (pokeEnd.cancel) {
14880
+ this.#receivingPoke = void 0;
14881
+ return;
14882
+ }
14617
14883
  this.#pokeBuffer.push(this.#receivingPoke);
14618
14884
  this.#receivingPoke = void 0;
14619
14885
  if (!this.#pokePlaybackLoopRunning) {
@@ -14733,10 +14999,10 @@ function mergePokes(pokeBuffer, schema) {
14733
14999
  )
14734
15000
  );
14735
15001
  }
14736
- if (pokePart.entitiesPatch) {
15002
+ if (pokePart.rowsPatch) {
14737
15003
  mergedPatch.push(
14738
- ...pokePart.entitiesPatch.map(
14739
- (p) => entitiesPatchOpToReplicachePatchOp(p, schema)
15004
+ ...pokePart.rowsPatch.map(
15005
+ (p) => rowsPatchOpToReplicachePatchOp(p, schema)
14740
15006
  )
14741
15007
  );
14742
15008
  }
@@ -14787,7 +15053,7 @@ function queryPatchOpToReplicachePatchOp(op, toKey) {
14787
15053
  };
14788
15054
  }
14789
15055
  }
14790
- function entitiesPatchOpToReplicachePatchOp(op, schema) {
15056
+ function rowsPatchOpToReplicachePatchOp(op, schema) {
14791
15057
  switch (op.op) {
14792
15058
  case "clear":
14793
15059
  return op;
@@ -14795,18 +15061,18 @@ function entitiesPatchOpToReplicachePatchOp(op, schema) {
14795
15061
  return {
14796
15062
  op: "del",
14797
15063
  key: toPrimaryKeyString(
14798
- op.entityType,
14799
- schema.tables[op.entityType].primaryKey,
14800
- op.entityID
15064
+ op.tableName,
15065
+ schema.tables[op.tableName].primaryKey,
15066
+ op.id
14801
15067
  )
14802
15068
  };
14803
15069
  case "put":
14804
15070
  return {
14805
15071
  op: "put",
14806
15072
  key: toPrimaryKeyString(
14807
- op.entityType,
14808
- schema.tables[op.entityType].primaryKey,
14809
- op.entityID
15073
+ op.tableName,
15074
+ schema.tables[op.tableName].primaryKey,
15075
+ op.value
14810
15076
  ),
14811
15077
  value: op.value
14812
15078
  };
@@ -14814,9 +15080,9 @@ function entitiesPatchOpToReplicachePatchOp(op, schema) {
14814
15080
  return {
14815
15081
  op: "update",
14816
15082
  key: toPrimaryKeyString(
14817
- op.entityType,
14818
- schema.tables[op.entityType].primaryKey,
14819
- op.entityID
15083
+ op.tableName,
15084
+ schema.tables[op.tableName].primaryKey,
15085
+ op.id
14820
15086
  ),
14821
15087
  merge: op.merge,
14822
15088
  constrain: op.constrain
@@ -14880,6 +15146,13 @@ var Zero = class {
14880
15146
  #enableAnalytics;
14881
15147
  #pokeHandler;
14882
15148
  #queryManager;
15149
+ /**
15150
+ * The queries we sent when establishing a connection.
15151
+ * More queries could be registered while we're waiting for the 'connected' message
15152
+ * to come back from the server. To understand what queries we need to send
15153
+ * to the server, we diff the `initConnectionQueries` with the current set of desired queries.
15154
+ */
15155
+ #initConnectionQueries = /* @__PURE__ */ new Map();
14883
15156
  #lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
14884
15157
  #onPong = () => void 0;
14885
15158
  #online = false;
@@ -15030,11 +15303,12 @@ var Zero = class {
15030
15303
  enableAnalytics: this.#enableAnalytics
15031
15304
  });
15032
15305
  const logOptions = this.#logOptions;
15306
+ const normalizedSchema = normalizeSchema(schema);
15033
15307
  const replicacheMutators = {
15034
- ["_zero_crud"]: makeCRUDMutator(schema)
15308
+ ["_zero_crud"]: makeCRUDMutator(normalizedSchema)
15035
15309
  };
15036
15310
  const replicacheOptions = {
15037
- schemaVersion: schema.version.toString(),
15311
+ schemaVersion: normalizedSchema.version.toString(),
15038
15312
  logLevel: logOptions.logLevel,
15039
15313
  logSinks: [logOptions.logSink],
15040
15314
  mutators: replicacheMutators,
@@ -15080,14 +15354,14 @@ var Zero = class {
15080
15354
  reason ?? ON_CLIENT_STATE_NOT_FOUND_REASON_CLIENT
15081
15355
  );
15082
15356
  };
15083
- this.mutate = makeCRUDMutate(schema, rep.mutate);
15357
+ this.mutate = makeCRUDMutate(normalizedSchema, rep.mutate);
15084
15358
  this.#queryManager = new QueryManager(
15085
15359
  rep.clientID,
15086
15360
  (msg) => this.#sendChangeDesiredQueries(msg),
15087
15361
  rep.experimentalWatch.bind(rep)
15088
15362
  );
15089
15363
  this.#zeroContext = new ZeroContext(
15090
- schema.tables,
15364
+ normalizedSchema.tables,
15091
15365
  (ast, gotCallback) => this.#queryManager.add(ast, gotCallback)
15092
15366
  );
15093
15367
  rep.experimentalWatch(
@@ -15097,7 +15371,7 @@ var Zero = class {
15097
15371
  initialValuesInFirstDiff: true
15098
15372
  }
15099
15373
  );
15100
- this.query = this.#registerQueries(schema);
15374
+ this.query = this.#registerQueries(normalizedSchema);
15101
15375
  reportReloadReason(this.#lc);
15102
15376
  this.#metrics = new MetricManager({
15103
15377
  reportIntervalMs: REPORT_INTERVAL_MS,
@@ -15111,7 +15385,7 @@ var Zero = class {
15111
15385
  (poke) => this.#rep.poke(poke),
15112
15386
  () => this.#onPokeError(),
15113
15387
  rep.clientID,
15114
- schema,
15388
+ normalizedSchema,
15115
15389
  this.#lc
15116
15390
  );
15117
15391
  this.#visibilityWatcher = getDocumentVisibilityWatcher(
@@ -15244,7 +15518,8 @@ var Zero = class {
15244
15518
  return;
15245
15519
  }
15246
15520
  this.#messageCount++;
15247
- switch (downMessage[0]) {
15521
+ const msgType = downMessage[0];
15522
+ switch (msgType) {
15248
15523
  case "connected":
15249
15524
  return this.#handleConnectedMessage(lc, downMessage);
15250
15525
  case "error":
@@ -15259,7 +15534,10 @@ var Zero = class {
15259
15534
  return this.#handlePokeEnd(lc, downMessage);
15260
15535
  case "pull":
15261
15536
  return this.#handlePullResponse(lc, downMessage);
15537
+ case "warm":
15538
+ break;
15262
15539
  default:
15540
+ msgType;
15263
15541
  rejectInvalidMessage();
15264
15542
  }
15265
15543
  };
@@ -15365,16 +15643,19 @@ var Zero = class {
15365
15643
  });
15366
15644
  this.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
15367
15645
  lc.debug?.("Resolving connect resolver");
15646
+ assert(this.#socket);
15368
15647
  const queriesPatch = await this.#rep.query(
15369
- (tx) => this.#queryManager.getQueriesPatch(tx)
15648
+ (tx) => this.#queryManager.getQueriesPatch(tx, this.#initConnectionQueries)
15370
15649
  );
15371
- assert(this.#socket);
15372
- send(this.#socket, [
15373
- "initConnection",
15374
- {
15375
- desiredQueriesPatch: queriesPatch
15376
- }
15377
- ]);
15650
+ if (queriesPatch.size > 0) {
15651
+ send(this.#socket, [
15652
+ "changeDesiredQueries",
15653
+ {
15654
+ desiredQueriesPatch: [...queriesPatch.values()]
15655
+ }
15656
+ ]);
15657
+ }
15658
+ this.#initConnectionQueries = /* @__PURE__ */ new Map();
15378
15659
  this.#setConnectionState(2 /* Connected */);
15379
15660
  this.#connectResolver.resolve();
15380
15661
  }
@@ -15428,7 +15709,9 @@ var Zero = class {
15428
15709
  clearTimeout(timeoutID);
15429
15710
  };
15430
15711
  this.#closeAbortController.signal.addEventListener("abort", abortHandler);
15431
- const ws = createSocket(
15712
+ const [ws, initConnectionQueries] = await createSocket(
15713
+ this.#rep,
15714
+ this.#queryManager,
15432
15715
  toWSString(this.#server),
15433
15716
  this.#connectCookie,
15434
15717
  this.clientID,
@@ -15445,6 +15728,7 @@ var Zero = class {
15445
15728
  if (this.closed) {
15446
15729
  return;
15447
15730
  }
15731
+ this.#initConnectionQueries = initConnectionQueries;
15448
15732
  ws.addEventListener("message", this.#onMessage);
15449
15733
  ws.addEventListener("open", this.#onOpen);
15450
15734
  ws.addEventListener("close", this.#onClose);
@@ -15908,7 +16192,7 @@ var Zero = class {
15908
16192
  return rv;
15909
16193
  }
15910
16194
  };
15911
- function createSocket(socketOrigin, baseCookie, clientID, clientGroupID, schemaVersion, userID, auth, jurisdiction, lmid, wsid, debugPerf, lc) {
16195
+ async function createSocket(rep, queryManager, socketOrigin, baseCookie, clientID, clientGroupID, schemaVersion, userID, auth, jurisdiction, lmid, wsid, debugPerf, lc) {
15912
16196
  const url = new URL(socketOrigin);
15913
16197
  url.pathname = `/api/sync/v${REFLECT_VERSION}/connect`;
15914
16198
  const { searchParams } = url;
@@ -15928,11 +16212,18 @@ function createSocket(socketOrigin, baseCookie, clientID, clientGroupID, schemaV
15928
16212
  }
15929
16213
  lc.info?.("Connecting to", url.toString());
15930
16214
  const WS = mustGetBrowserGlobal("WebSocket");
15931
- return new WS(
15932
- // toString() required for RN URL polyfill.
15933
- url.toString(),
15934
- auth === "" || auth === void 0 ? void 0 : encodeURIComponent(auth)
15935
- );
16215
+ const queriesPatch = await rep.query((tx) => queryManager.getQueriesPatch(tx));
16216
+ return [
16217
+ new WS(
16218
+ // toString() required for RN URL polyfill.
16219
+ url.toString(),
16220
+ encodeSecProtocols(
16221
+ ["initConnection", { desiredQueriesPatch: [...queriesPatch.values()] }],
16222
+ auth
16223
+ )
16224
+ ),
16225
+ queriesPatch
16226
+ ];
15936
16227
  }
15937
16228
  function addWebSocketIDFromSocketToLogContext({ url }, lc) {
15938
16229
  const wsid = new URL(url).searchParams.get("wsid") ?? nanoid();