@rocicorp/zero 1.12.0-canary.2 → 1.12.0-canary.4

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 (803) hide show
  1. package/out/_virtual/{_@oxc-project_runtime@0.130.0/helpers → _@oxc-project_runtime@0.154.0/helpers/esm}/usingCtx.js +2 -2
  2. package/out/analyze-query/src/analyze-cli.js +2 -1
  3. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  4. package/out/analyze-query/src/bin-analyze.js +5 -3
  5. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  6. package/out/analyze-query/src/bin-transform.js +3 -2
  7. package/out/analyze-query/src/bin-transform.js.map +1 -1
  8. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  9. package/out/ast-to-zql/src/bin.js +3 -2
  10. package/out/ast-to-zql/src/bin.js.map +1 -1
  11. package/out/ast-to-zql/src/format.js.map +1 -1
  12. package/out/datadog/src/datadog-log-sink.js +5 -4
  13. package/out/datadog/src/datadog-log-sink.js.map +1 -1
  14. package/out/otel/src/log-options.js.map +1 -1
  15. package/out/replicache/src/btree/node.js +13 -11
  16. package/out/replicache/src/btree/node.js.map +1 -1
  17. package/out/replicache/src/btree/read.js +4 -2
  18. package/out/replicache/src/btree/read.js.map +1 -1
  19. package/out/replicache/src/btree/splice.js.map +1 -1
  20. package/out/replicache/src/btree/write.js +9 -5
  21. package/out/replicache/src/btree/write.js.map +1 -1
  22. package/out/replicache/src/config.js +1 -2
  23. package/out/replicache/src/connection-loop.js.map +1 -1
  24. package/out/replicache/src/dag/chunk.js +1 -1
  25. package/out/replicache/src/dag/gc.js.map +1 -1
  26. package/out/replicache/src/dag/lazy-store.js +8 -7
  27. package/out/replicache/src/dag/lazy-store.js.map +1 -1
  28. package/out/replicache/src/dag/store-impl.js +1 -1
  29. package/out/replicache/src/dag/store-impl.js.map +1 -1
  30. package/out/replicache/src/dag/visitor.js.map +1 -1
  31. package/out/replicache/src/db/commit.js +5 -3
  32. package/out/replicache/src/db/commit.js.map +1 -1
  33. package/out/replicache/src/db/read.js +1 -1
  34. package/out/replicache/src/db/read.js.map +1 -1
  35. package/out/replicache/src/db/rebase.js.map +1 -1
  36. package/out/replicache/src/db/write.js +5 -2
  37. package/out/replicache/src/db/write.js.map +1 -1
  38. package/out/replicache/src/deleted-clients.js +3 -2
  39. package/out/replicache/src/deleted-clients.js.map +1 -1
  40. package/out/replicache/src/expo-sqlite.js +1 -2
  41. package/out/replicache/src/frozen-json.js +1 -1
  42. package/out/replicache/src/frozen-json.js.map +1 -1
  43. package/out/replicache/src/get-default-puller.js +1 -1
  44. package/out/replicache/src/hash.js +1 -1
  45. package/out/replicache/src/hash.js.map +1 -1
  46. package/out/replicache/src/impl.js +1 -2
  47. package/out/replicache/src/index-defs.js +5 -3
  48. package/out/replicache/src/index-defs.js.map +1 -1
  49. package/out/replicache/src/kv/expo-sqlite/store.js +1 -1
  50. package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
  51. package/out/replicache/src/kv/idb-store.js +1 -1
  52. package/out/replicache/src/kv/idb-store.js.map +1 -1
  53. package/out/replicache/src/kv/mem-fallback-store.js +1 -1
  54. package/out/replicache/src/kv/mem-fallback-store.js.map +1 -1
  55. package/out/replicache/src/kv/mem-store.js.map +1 -1
  56. package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
  57. package/out/replicache/src/kv/op-sqlite/types.js.map +1 -1
  58. package/out/replicache/src/kv/read-impl.js.map +1 -1
  59. package/out/replicache/src/kv/sqlite-store.js +1 -1
  60. package/out/replicache/src/kv/sqlite-store.js.map +1 -1
  61. package/out/replicache/src/kv/write-impl-base.js +4 -1
  62. package/out/replicache/src/kv/write-impl-base.js.map +1 -1
  63. package/out/replicache/src/kv/write-impl.js.map +1 -1
  64. package/out/replicache/src/log-options.js +2 -1
  65. package/out/replicache/src/log-options.js.map +1 -1
  66. package/out/replicache/src/make-idb-name.js +1 -1
  67. package/out/replicache/src/new-client-channel.js +9 -7
  68. package/out/replicache/src/new-client-channel.js.map +1 -1
  69. package/out/replicache/src/on-persist-channel.js +1 -1
  70. package/out/replicache/src/on-persist-channel.js.map +1 -1
  71. package/out/replicache/src/op-sqlite.js +1 -2
  72. package/out/replicache/src/pending-mutations.js +2 -1
  73. package/out/replicache/src/pending-mutations.js.map +1 -1
  74. package/out/replicache/src/persist/client-gc.js +2 -2
  75. package/out/replicache/src/persist/client-gc.js.map +1 -1
  76. package/out/replicache/src/persist/client-group-gc.js +2 -2
  77. package/out/replicache/src/persist/client-group-gc.js.map +1 -1
  78. package/out/replicache/src/persist/client-groups.js +1 -1
  79. package/out/replicache/src/persist/client-groups.js.map +1 -1
  80. package/out/replicache/src/persist/clients.js +1 -1
  81. package/out/replicache/src/persist/clients.js.map +1 -1
  82. package/out/replicache/src/persist/collect-idb-databases.js +5 -4
  83. package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
  84. package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
  85. package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
  86. package/out/replicache/src/persist/heartbeat.js +2 -2
  87. package/out/replicache/src/persist/heartbeat.js.map +1 -1
  88. package/out/replicache/src/persist/idb-databases-store.js +1 -1
  89. package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
  90. package/out/replicache/src/persist/make-client-id.js +1 -1
  91. package/out/replicache/src/persist/make-client-id.js.map +1 -1
  92. package/out/replicache/src/persist/persist.js +3 -2
  93. package/out/replicache/src/persist/persist.js.map +1 -1
  94. package/out/replicache/src/persist/refresh.js +8 -5
  95. package/out/replicache/src/persist/refresh.js.map +1 -1
  96. package/out/replicache/src/process-scheduler.js.map +1 -1
  97. package/out/replicache/src/replicache-impl.js +3 -3
  98. package/out/replicache/src/replicache-impl.js.map +1 -1
  99. package/out/replicache/src/scan-iterator.js.map +1 -1
  100. package/out/replicache/src/scan-options.js +7 -6
  101. package/out/replicache/src/scan-options.js.map +1 -1
  102. package/out/replicache/src/sqlite.js +1 -2
  103. package/out/replicache/src/subscriptions.js +1 -1
  104. package/out/replicache/src/subscriptions.js.map +1 -1
  105. package/out/replicache/src/sync/diff.js +3 -1
  106. package/out/replicache/src/sync/diff.js.map +1 -1
  107. package/out/replicache/src/sync/ids.js.map +1 -1
  108. package/out/replicache/src/sync/patch.js +2 -4
  109. package/out/replicache/src/sync/patch.js.map +1 -1
  110. package/out/replicache/src/sync/pull.js +3 -1
  111. package/out/replicache/src/sync/pull.js.map +1 -1
  112. package/out/replicache/src/sync/push.js.map +1 -1
  113. package/out/replicache/src/sync/request-id.js +1 -1
  114. package/out/replicache/src/sync/request-id.js.map +1 -1
  115. package/out/replicache/src/transactions.js +1 -1
  116. package/out/replicache/src/transactions.js.map +1 -1
  117. package/out/shared/src/arrays.js +4 -1
  118. package/out/shared/src/arrays.js.map +1 -1
  119. package/out/shared/src/asserts.js +1 -1
  120. package/out/shared/src/bigint-json.d.ts +9 -0
  121. package/out/shared/src/bigint-json.d.ts.map +1 -1
  122. package/out/shared/src/bigint-json.js +27 -2
  123. package/out/shared/src/bigint-json.js.map +1 -1
  124. package/out/shared/src/broadcast-channel.js +1 -1
  125. package/out/shared/src/btree-set.js +11 -8
  126. package/out/shared/src/btree-set.js.map +1 -1
  127. package/out/shared/src/cache.js.map +1 -1
  128. package/out/shared/src/config.js +1 -1
  129. package/out/shared/src/custom-key-map.js.map +1 -1
  130. package/out/shared/src/custom-key-set.js.map +1 -1
  131. package/out/shared/src/deep-clone.js +1 -1
  132. package/out/shared/src/document-visible.js.map +1 -1
  133. package/out/shared/src/dotenv.js.map +1 -1
  134. package/out/shared/src/error.js +1 -1
  135. package/out/shared/src/error.js.map +1 -1
  136. package/out/shared/src/hash.js +2 -2
  137. package/out/shared/src/hash.js.map +1 -1
  138. package/out/shared/src/iterables.js.map +1 -1
  139. package/out/shared/src/json-schema.js.map +1 -1
  140. package/out/shared/src/json.js.map +1 -1
  141. package/out/shared/src/logging-test-utils.js +1 -1
  142. package/out/shared/src/logging.js +1 -1
  143. package/out/shared/src/logging.js.map +1 -1
  144. package/out/shared/src/navigator.js +1 -1
  145. package/out/shared/src/options.js +9 -12
  146. package/out/shared/src/options.js.map +1 -1
  147. package/out/shared/src/promise-race.js.map +1 -1
  148. package/out/shared/src/queue.js.map +1 -1
  149. package/out/shared/src/record-proxy.js.map +1 -1
  150. package/out/shared/src/ring-buffer.js.map +1 -1
  151. package/out/shared/src/size-of-value.js +7 -10
  152. package/out/shared/src/size-of-value.js.map +1 -1
  153. package/out/shared/src/sorted-entries.js.map +1 -1
  154. package/out/shared/src/tdigest-schema.js.map +1 -1
  155. package/out/shared/src/tdigest.js.map +1 -1
  156. package/out/shared/src/valita.js +1 -1
  157. package/out/shared/src/valita.js.map +1 -1
  158. package/out/z2s/src/compiler.js +2 -4
  159. package/out/z2s/src/compiler.js.map +1 -1
  160. package/out/z2s/src/sql.js +1 -1
  161. package/out/z2s/src/sql.js.map +1 -1
  162. package/out/zero/package.js +212 -189
  163. package/out/zero/package.js.map +1 -1
  164. package/out/zero/src/adapters/drizzle.js +1 -2
  165. package/out/zero/src/adapters/kysely.js +1 -2
  166. package/out/zero/src/adapters/pg.js +1 -2
  167. package/out/zero/src/adapters/postgresjs.js +1 -2
  168. package/out/zero/src/adapters/prisma.js +1 -2
  169. package/out/zero/src/analyze.js +1 -2
  170. package/out/zero/src/change-protocol/v0.js +1 -2
  171. package/out/zero/src/expo-sqlite.js +1 -2
  172. package/out/zero/src/op-sqlite.js +1 -2
  173. package/out/zero/src/react-native.js.map +1 -1
  174. package/out/zero/src/sqlite.js +1 -2
  175. package/out/zero/src/zero-cache-dev.js +10 -9
  176. package/out/zero/src/zero-cache-dev.js.map +1 -1
  177. package/out/zero/src/zero-out.js +2 -1
  178. package/out/zero/src/zero-out.js.map +1 -1
  179. package/out/zero-cache/src/auth/auth.js +1 -1
  180. package/out/zero-cache/src/auth/auth.js.map +1 -1
  181. package/out/zero-cache/src/auth/jwt.js +4 -1
  182. package/out/zero-cache/src/auth/jwt.js.map +1 -1
  183. package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
  184. package/out/zero-cache/src/auth/read-authorizer.js +3 -2
  185. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  186. package/out/zero-cache/src/auth/write-authorizer.js +5 -16
  187. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  188. package/out/zero-cache/src/config/network.js +1 -1
  189. package/out/zero-cache/src/config/network.js.map +1 -1
  190. package/out/zero-cache/src/config/server-context.js.map +1 -1
  191. package/out/zero-cache/src/config/zero-config.d.ts +9 -0
  192. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  193. package/out/zero-cache/src/config/zero-config.js +17 -2
  194. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  195. package/out/zero-cache/src/custom/fetch.js +1 -1
  196. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  197. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  198. package/out/zero-cache/src/db/create.js.map +1 -1
  199. package/out/zero-cache/src/db/index-predicate.js.map +1 -1
  200. package/out/zero-cache/src/db/lite-tables.d.ts +2 -2
  201. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  202. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  203. package/out/zero-cache/src/db/migration-lite.js +1 -1
  204. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  205. package/out/zero-cache/src/db/migration.js +5 -3
  206. package/out/zero-cache/src/db/migration.js.map +1 -1
  207. package/out/zero-cache/src/db/pg-copy-binary.js +4 -3
  208. package/out/zero-cache/src/db/pg-copy-binary.js.map +1 -1
  209. package/out/zero-cache/src/db/pg-copy.js +0 -1
  210. package/out/zero-cache/src/db/pg-copy.js.map +1 -1
  211. package/out/zero-cache/src/db/pg-to-lite.js +1 -1
  212. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  213. package/out/zero-cache/src/db/run-transaction.js.map +1 -1
  214. package/out/zero-cache/src/db/specs.js +7 -5
  215. package/out/zero-cache/src/db/specs.js.map +1 -1
  216. package/out/zero-cache/src/db/sqlite-corruption.js.map +1 -1
  217. package/out/zero-cache/src/db/statements.d.ts.map +1 -1
  218. package/out/zero-cache/src/db/statements.js +9 -2
  219. package/out/zero-cache/src/db/statements.js.map +1 -1
  220. package/out/zero-cache/src/db/transaction-pool.js +5 -3
  221. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  222. package/out/zero-cache/src/db/warmup.js.map +1 -1
  223. package/out/zero-cache/src/observability/events.js.map +1 -1
  224. package/out/zero-cache/src/observability/log-throttle.js.map +1 -1
  225. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  226. package/out/zero-cache/src/scripts/deploy-permissions.js +4 -2
  227. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  228. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  229. package/out/zero-cache/src/server/anonymous-otel-start.js +2 -1
  230. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  231. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  232. package/out/zero-cache/src/server/change-streamer.js +2 -1
  233. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  234. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  235. package/out/zero-cache/src/server/logging.js +1 -1
  236. package/out/zero-cache/src/server/logging.js.map +1 -1
  237. package/out/zero-cache/src/server/main.js.map +1 -1
  238. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  239. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  240. package/out/zero-cache/src/server/reaper.js +2 -2
  241. package/out/zero-cache/src/server/reaper.js.map +1 -1
  242. package/out/zero-cache/src/server/replicator.js.map +1 -1
  243. package/out/zero-cache/src/server/runner/run-worker.js +2 -1
  244. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  245. package/out/zero-cache/src/server/runner/runtime.js +2 -1
  246. package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
  247. package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
  248. package/out/zero-cache/src/server/shadow-syncer.js +1 -1
  249. package/out/zero-cache/src/server/shadow-syncer.js.map +1 -1
  250. package/out/zero-cache/src/server/slot-keeper.js.map +1 -1
  251. package/out/zero-cache/src/server/syncer-assigner.js.map +1 -1
  252. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  253. package/out/zero-cache/src/server/syncer.js +6 -1
  254. package/out/zero-cache/src/server/syncer.js.map +1 -1
  255. package/out/zero-cache/src/server/worker-dispatcher.js +1 -1
  256. package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
  257. package/out/zero-cache/src/server/worker-urls.js.map +1 -1
  258. package/out/zero-cache/src/services/analyze.js +1 -1
  259. package/out/zero-cache/src/services/analyze.js.map +1 -1
  260. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +1 -1
  261. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  262. package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
  263. package/out/zero-cache/src/services/change-source/common/init-cleanup.js.map +1 -1
  264. package/out/zero-cache/src/services/change-source/common/replica-restore.js.map +1 -1
  265. package/out/zero-cache/src/services/change-source/common/replica-schema.js +3 -3
  266. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  267. package/out/zero-cache/src/services/change-source/custom/change-source.js +1 -1
  268. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  269. package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
  270. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +3 -3
  271. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  272. package/out/zero-cache/src/services/change-source/pg/change-source-init.d.ts.map +1 -1
  273. package/out/zero-cache/src/services/change-source/pg/change-source-init.js +2 -2
  274. package/out/zero-cache/src/services/change-source/pg/change-source-init.js.map +1 -1
  275. package/out/zero-cache/src/services/change-source/pg/change-source.js +4 -6
  276. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  277. package/out/zero-cache/src/services/change-source/pg/decommission.js +2 -1
  278. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  279. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +1 -0
  280. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  281. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +10 -8
  282. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  283. package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
  284. package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
  285. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +3 -2
  286. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  287. package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
  288. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js +2 -2
  289. package/out/zero-cache/src/services/change-source/pg/replication-slot-cleanup-monitor.js.map +1 -1
  290. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.js +1 -1
  291. package/out/zero-cache/src/services/change-source/pg/replication-slot-health.js.map +1 -1
  292. package/out/zero-cache/src/services/change-source/pg/replication-slots.js +3 -3
  293. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  294. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +1 -1
  295. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  296. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +3 -3
  297. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  298. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js +13 -12
  299. package/out/zero-cache/src/services/change-source/pg/schema/index-predicate.js.map +1 -1
  300. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +1 -1
  301. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  302. package/out/zero-cache/src/services/change-source/pg/schema/init.js +8 -8
  303. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  304. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +1 -1
  305. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
  306. package/out/zero-cache/src/services/change-source/pg/schema/published.js +3 -2
  307. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  308. package/out/zero-cache/src/services/change-source/pg/schema/replica-stage-enum.js.map +1 -1
  309. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +2 -2
  310. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  311. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +13 -10
  312. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  313. package/out/zero-cache/src/services/change-source/pg/schema/validation.js +1 -1
  314. package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
  315. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js +1 -1
  316. package/out/zero-cache/src/services/change-source/protocol/backfill-progress.js.map +1 -1
  317. package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
  318. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  319. package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
  320. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  321. package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
  322. package/out/zero-cache/src/services/change-source/protocol/current.js +1 -1
  323. package/out/zero-cache/src/services/change-source/protocol/mod.js +1 -2
  324. package/out/zero-cache/src/services/change-streamer/backfill-state-tracker.js.map +1 -1
  325. package/out/zero-cache/src/services/change-streamer/backfill-state.js +1 -1
  326. package/out/zero-cache/src/services/change-streamer/backfill-state.js.map +1 -1
  327. package/out/zero-cache/src/services/change-streamer/backup-cleanup-monitor-factory.js.map +1 -1
  328. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  329. package/out/zero-cache/src/services/change-streamer/broadcast.js +1 -1
  330. package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
  331. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts +1 -1
  332. package/out/zero-cache/src/services/change-streamer/change-log-codec.d.ts.map +1 -1
  333. package/out/zero-cache/src/services/change-streamer/change-log-codec.js +2 -3
  334. package/out/zero-cache/src/services/change-streamer/change-log-codec.js.map +1 -1
  335. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js +2 -2
  336. package/out/zero-cache/src/services/change-streamer/change-log-initializer.js.map +1 -1
  337. package/out/zero-cache/src/services/change-streamer/change-log-transaction-hash.js.map +1 -1
  338. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +4 -2
  339. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  340. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +21 -21
  341. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  342. package/out/zero-cache/src/services/change-streamer/change-streamer.js +1 -1
  343. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  344. package/out/zero-cache/src/services/change-streamer/drain-tracker.js.map +1 -1
  345. package/out/zero-cache/src/services/change-streamer/forwarder.js +11 -10
  346. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  347. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js +1 -1
  348. package/out/zero-cache/src/services/change-streamer/litestream-sync-requester.js.map +1 -1
  349. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js +3 -3
  350. package/out/zero-cache/src/services/change-streamer/litestream3-prometheus-poller.js.map +1 -1
  351. package/out/zero-cache/src/services/change-streamer/replica-poller.js +1 -1
  352. package/out/zero-cache/src/services/change-streamer/replica-poller.js.map +1 -1
  353. package/out/zero-cache/src/services/change-streamer/restore-admission.js +12 -1
  354. package/out/zero-cache/src/services/change-streamer/restore-admission.js.map +1 -1
  355. package/out/zero-cache/src/services/change-streamer/schema/init.js +1 -1
  356. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  357. package/out/zero-cache/src/services/change-streamer/schema/tables.js +1 -1
  358. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  359. package/out/zero-cache/src/services/change-streamer/snapshot-message.js +1 -1
  360. package/out/zero-cache/src/services/change-streamer/snapshot-message.js.map +1 -1
  361. package/out/zero-cache/src/services/change-streamer/snapshot-reservations.js.map +1 -1
  362. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js +1 -1
  363. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-catchup.js.map +1 -1
  364. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js +2 -2
  365. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-comparator.js.map +1 -1
  366. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-purge-scheduler.js.map +1 -1
  367. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-read-router.js.map +1 -1
  368. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.d.ts.map +1 -1
  369. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js +4 -6
  370. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-reader.js.map +1 -1
  371. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js +1 -3
  372. package/out/zero-cache/src/services/change-streamer/sqlite-change-log-writer.js.map +1 -1
  373. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  374. package/out/zero-cache/src/services/change-streamer/storer.js +2 -2
  375. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  376. package/out/zero-cache/src/services/change-streamer/subscribe.js +1 -1
  377. package/out/zero-cache/src/services/change-streamer/subscribe.js.map +1 -1
  378. package/out/zero-cache/src/services/change-streamer/subscriber.js +2 -2
  379. package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
  380. package/out/zero-cache/src/services/change-streamer/upstream-acker.js +0 -1
  381. package/out/zero-cache/src/services/change-streamer/upstream-acker.js.map +1 -1
  382. package/out/zero-cache/src/services/heapz.js +2 -1
  383. package/out/zero-cache/src/services/heapz.js.map +1 -1
  384. package/out/zero-cache/src/services/http-service.js.map +1 -1
  385. package/out/zero-cache/src/services/life-cycle.js +1 -1
  386. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  387. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js +4 -2
  388. package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
  389. package/out/zero-cache/src/services/litestream/commands.js +1 -1
  390. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  391. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js +2 -2
  392. package/out/zero-cache/src/services/litestream/litestream-checkpointer.js.map +1 -1
  393. package/out/zero-cache/src/services/litestream/litestream-controller.js.map +1 -1
  394. package/out/zero-cache/src/services/litestream/metrics.js.map +1 -1
  395. package/out/zero-cache/src/services/litestream/restore-progress.js.map +1 -1
  396. package/out/zero-cache/src/services/mutagen/mutagen.js +1 -1
  397. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  398. package/out/zero-cache/src/services/mutagen/pusher.js +3 -2
  399. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  400. package/out/zero-cache/src/services/plannerz.js +4 -3
  401. package/out/zero-cache/src/services/plannerz.js.map +1 -1
  402. package/out/zero-cache/src/services/profz.js +5 -3
  403. package/out/zero-cache/src/services/profz.js.map +1 -1
  404. package/out/zero-cache/src/services/replicator/change-log-cookies.js.map +1 -1
  405. package/out/zero-cache/src/services/replicator/change-log-db.js +3 -2
  406. package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -1
  407. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js +1 -1
  408. package/out/zero-cache/src/services/replicator/change-log-stream-writer.js.map +1 -1
  409. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  410. package/out/zero-cache/src/services/replicator/drain-handler.js.map +1 -1
  411. package/out/zero-cache/src/services/replicator/incremental-sync.js +1 -1
  412. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  413. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  414. package/out/zero-cache/src/services/replicator/replication-status.js +4 -3
  415. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
  416. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  417. package/out/zero-cache/src/services/replicator/reporter/recorder.js +1 -1
  418. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  419. package/out/zero-cache/src/services/replicator/reporter/report-schema.js +1 -1
  420. package/out/zero-cache/src/services/replicator/reporter/report-schema.js.map +1 -1
  421. package/out/zero-cache/src/services/replicator/schema/backfilling.js +1 -1
  422. package/out/zero-cache/src/services/replicator/schema/backfilling.js.map +1 -1
  423. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts +19 -7
  424. package/out/zero-cache/src/services/replicator/schema/change-log.d.ts.map +1 -1
  425. package/out/zero-cache/src/services/replicator/schema/change-log.js +31 -15
  426. package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
  427. package/out/zero-cache/src/services/replicator/schema/column-metadata.js +1 -1
  428. package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
  429. package/out/zero-cache/src/services/replicator/schema/replication-state.js +10 -7
  430. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  431. package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
  432. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js +1 -1
  433. package/out/zero-cache/src/services/replicator/sqlite-change-log-observability.js.map +1 -1
  434. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js +1 -1
  435. package/out/zero-cache/src/services/replicator/sqlite-change-log-purger.js.map +1 -1
  436. package/out/zero-cache/src/services/replicator/write-worker-client.js +1 -1
  437. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  438. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  439. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  440. package/out/zero-cache/src/services/runner.js.map +1 -1
  441. package/out/zero-cache/src/services/running-state.js.map +1 -1
  442. package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -1
  443. package/out/zero-cache/src/services/statz.js +2 -1
  444. package/out/zero-cache/src/services/statz.js.map +1 -1
  445. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +2 -2
  446. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
  447. package/out/zero-cache/src/services/view-syncer/advancement-metrics.js.map +1 -1
  448. package/out/zero-cache/src/services/view-syncer/batch-pacer.js.map +1 -1
  449. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +18 -0
  450. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  451. package/out/zero-cache/src/services/view-syncer/client-handler.js +70 -23
  452. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  453. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts +15 -2
  454. package/out/zero-cache/src/services/view-syncer/client-schema.d.ts.map +1 -1
  455. package/out/zero-cache/src/services/view-syncer/client-schema.js +46 -6
  456. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  457. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  458. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +2 -2
  459. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  460. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  461. package/out/zero-cache/src/services/view-syncer/cvr-store.js +10 -5
  462. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  463. package/out/zero-cache/src/services/view-syncer/cvr.js +12 -4
  464. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  465. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js +1 -1
  466. package/out/zero-cache/src/services/view-syncer/deferred-writes-budget.js.map +1 -1
  467. package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
  468. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -1
  469. package/out/zero-cache/src/services/view-syncer/hydration-budget.js.map +1 -1
  470. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js +2 -2
  471. package/out/zero-cache/src/services/view-syncer/hydration-circuit-breaker.js.map +1 -1
  472. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +5 -3
  473. package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
  474. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  475. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +8 -5
  476. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  477. package/out/zero-cache/src/services/view-syncer/plan-warnings.js.map +1 -1
  478. package/out/zero-cache/src/services/view-syncer/push-cost.js.map +1 -1
  479. package/out/zero-cache/src/services/view-syncer/push-cutoff.js.map +1 -1
  480. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
  481. package/out/zero-cache/src/services/view-syncer/query-shape.js.map +1 -1
  482. package/out/zero-cache/src/services/view-syncer/query-stats.js +1 -1
  483. package/out/zero-cache/src/services/view-syncer/query-stats.js.map +1 -1
  484. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  485. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +1 -1
  486. package/out/zero-cache/src/services/view-syncer/schema/types.js +1 -1
  487. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  488. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js +7 -1
  489. package/out/zero-cache/src/services/view-syncer/snapshot-row-cache.js.map +1 -1
  490. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +12 -4
  491. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  492. package/out/zero-cache/src/services/view-syncer/snapshotter.js +11 -7
  493. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  494. package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
  495. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  496. package/out/zero-cache/src/services/view-syncer/view-syncer.js +13 -9
  497. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  498. package/out/zero-cache/src/types/error-with-level.js.map +1 -1
  499. package/out/zero-cache/src/types/lexi-version.js.map +1 -1
  500. package/out/zero-cache/src/types/lite.js +1 -1
  501. package/out/zero-cache/src/types/lite.js.map +1 -1
  502. package/out/zero-cache/src/types/pg-data-type.js +1 -1
  503. package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
  504. package/out/zero-cache/src/types/pg.js +6 -4
  505. package/out/zero-cache/src/types/pg.js.map +1 -1
  506. package/out/zero-cache/src/types/poke-chunk.js +2 -2
  507. package/out/zero-cache/src/types/poke-chunk.js.map +1 -1
  508. package/out/zero-cache/src/types/processes.js +1 -1
  509. package/out/zero-cache/src/types/processes.js.map +1 -1
  510. package/out/zero-cache/src/types/profiler.js.map +1 -1
  511. package/out/zero-cache/src/types/row-key.js.map +1 -1
  512. package/out/zero-cache/src/types/sql.js.map +1 -1
  513. package/out/zero-cache/src/types/streams.js +10 -9
  514. package/out/zero-cache/src/types/streams.js.map +1 -1
  515. package/out/zero-cache/src/types/strings.js.map +1 -1
  516. package/out/zero-cache/src/types/subscription.js.map +1 -1
  517. package/out/zero-cache/src/types/timeout.js +1 -1
  518. package/out/zero-cache/src/types/websocket-handoff.js +1 -1
  519. package/out/zero-cache/src/types/ws.js +1 -1
  520. package/out/zero-cache/src/workers/connection.js +2 -3
  521. package/out/zero-cache/src/workers/connection.js.map +1 -1
  522. package/out/zero-cache/src/workers/mutator.js.map +1 -1
  523. package/out/zero-cache/src/workers/replicator.js +5 -4
  524. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  525. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  526. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +9 -1
  527. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  528. package/out/zero-cache/src/workers/syncer.js +2 -2
  529. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  530. package/out/zero-client/src/client/active-clients-manager.js +1 -1
  531. package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
  532. package/out/zero-client/src/client/bindings.js +11 -11
  533. package/out/zero-client/src/client/connection-manager.js.map +1 -1
  534. package/out/zero-client/src/client/connection.js +1 -1
  535. package/out/zero-client/src/client/connection.js.map +1 -1
  536. package/out/zero-client/src/client/context.js.map +1 -1
  537. package/out/zero-client/src/client/crud-impl.js +1 -1
  538. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  539. package/out/zero-client/src/client/crud.js +1 -1
  540. package/out/zero-client/src/client/crud.js.map +1 -1
  541. package/out/zero-client/src/client/custom.js +1 -1
  542. package/out/zero-client/src/client/custom.js.map +1 -1
  543. package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
  544. package/out/zero-client/src/client/enable-analytics.js +1 -1
  545. package/out/zero-client/src/client/enable-analytics.js.map +1 -1
  546. package/out/zero-client/src/client/error.js.map +1 -1
  547. package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
  548. package/out/zero-client/src/client/inspector/client.js.map +1 -1
  549. package/out/zero-client/src/client/inspector/html-dialog-prompt.js +1 -1
  550. package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
  551. package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
  552. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  553. package/out/zero-client/src/client/inspector/query.js.map +1 -1
  554. package/out/zero-client/src/client/ivm-branch.js +1 -3
  555. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  556. package/out/zero-client/src/client/keys.js +2 -1
  557. package/out/zero-client/src/client/keys.js.map +1 -1
  558. package/out/zero-client/src/client/log-options.js.map +1 -1
  559. package/out/zero-client/src/client/make-replicache-mutators.js +5 -3
  560. package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
  561. package/out/zero-client/src/client/metrics.js +3 -5
  562. package/out/zero-client/src/client/metrics.js.map +1 -1
  563. package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
  564. package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
  565. package/out/zero-client/src/client/options.js.map +1 -1
  566. package/out/zero-client/src/client/query-manager.js +2 -2
  567. package/out/zero-client/src/client/query-manager.js.map +1 -1
  568. package/out/zero-client/src/client/reload-error-handler.js +4 -3
  569. package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
  570. package/out/zero-client/src/client/version.js +1 -1
  571. package/out/zero-client/src/client/zero-poke-handler.js +1 -1
  572. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
  573. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  574. package/out/zero-client/src/client/zero.js +19 -11
  575. package/out/zero-client/src/client/zero.js.map +1 -1
  576. package/out/zero-client/src/mod.js +23 -23
  577. package/out/zero-client/src/util/nanoid.js.map +1 -1
  578. package/out/zero-permissions/src/permissions.js +3 -2
  579. package/out/zero-permissions/src/permissions.js.map +1 -1
  580. package/out/zero-pg/src/mod.js +9 -9
  581. package/out/zero-protocol/src/analyze-query-result.js +1 -1
  582. package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
  583. package/out/zero-protocol/src/application-error.js.map +1 -1
  584. package/out/zero-protocol/src/ast.js +19 -9
  585. package/out/zero-protocol/src/ast.js.map +1 -1
  586. package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
  587. package/out/zero-protocol/src/client-schema.js +1 -1
  588. package/out/zero-protocol/src/client-schema.js.map +1 -1
  589. package/out/zero-protocol/src/close-connection.js +1 -1
  590. package/out/zero-protocol/src/close-connection.js.map +1 -1
  591. package/out/zero-protocol/src/connect.js +1 -1
  592. package/out/zero-protocol/src/connect.js.map +1 -1
  593. package/out/zero-protocol/src/custom-queries.js +1 -1
  594. package/out/zero-protocol/src/custom-queries.js.map +1 -1
  595. package/out/zero-protocol/src/data.js +4 -2
  596. package/out/zero-protocol/src/data.js.map +1 -1
  597. package/out/zero-protocol/src/delete-clients.js.map +1 -1
  598. package/out/zero-protocol/src/down.d.ts +27 -27
  599. package/out/zero-protocol/src/down.js.map +1 -1
  600. package/out/zero-protocol/src/error.js.map +1 -1
  601. package/out/zero-protocol/src/inspect-down.js +1 -1
  602. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  603. package/out/zero-protocol/src/inspect-up.js +1 -1
  604. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  605. package/out/zero-protocol/src/mutate-server.js +1 -1
  606. package/out/zero-protocol/src/mutate-server.js.map +1 -1
  607. package/out/zero-protocol/src/mutation-id.js.map +1 -1
  608. package/out/zero-protocol/src/mutation.js +1 -1
  609. package/out/zero-protocol/src/mutation.js.map +1 -1
  610. package/out/zero-protocol/src/mutations-patch.js +1 -1
  611. package/out/zero-protocol/src/mutations-patch.js.map +1 -1
  612. package/out/zero-protocol/src/ping.js +1 -1
  613. package/out/zero-protocol/src/ping.js.map +1 -1
  614. package/out/zero-protocol/src/poke.js +1 -1
  615. package/out/zero-protocol/src/poke.js.map +1 -1
  616. package/out/zero-protocol/src/pong.js +1 -1
  617. package/out/zero-protocol/src/pong.js.map +1 -1
  618. package/out/zero-protocol/src/primary-key.js.map +1 -1
  619. package/out/zero-protocol/src/protocol-version.js +1 -0
  620. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  621. package/out/zero-protocol/src/pull.js +1 -1
  622. package/out/zero-protocol/src/pull.js.map +1 -1
  623. package/out/zero-protocol/src/push.js +1 -1
  624. package/out/zero-protocol/src/push.js.map +1 -1
  625. package/out/zero-protocol/src/queries-patch.js +1 -1
  626. package/out/zero-protocol/src/queries-patch.js.map +1 -1
  627. package/out/zero-protocol/src/query-hash-visitor.js.map +1 -1
  628. package/out/zero-protocol/src/query-hash.js +2 -2
  629. package/out/zero-protocol/src/query-server.js +1 -1
  630. package/out/zero-protocol/src/query-server.js.map +1 -1
  631. package/out/zero-protocol/src/row-patch.js.map +1 -1
  632. package/out/zero-protocol/src/up.js.map +1 -1
  633. package/out/zero-protocol/src/update-auth.js.map +1 -1
  634. package/out/zero-protocol/src/version.js.map +1 -1
  635. package/out/zero-react/src/bindings.js +11 -11
  636. package/out/zero-react/src/mod.js +5 -5
  637. package/out/zero-react/src/use-query.js +1 -1
  638. package/out/zero-react/src/use-query.js.map +1 -1
  639. package/out/zero-react/src/zero-provider.d.ts +1 -1
  640. package/out/zero-react/src/zero-provider.d.ts.map +1 -1
  641. package/out/zero-react/src/zero-provider.js +2 -1
  642. package/out/zero-react/src/zero-provider.js.map +1 -1
  643. package/out/zero-react/src/zero.js +23 -23
  644. package/out/zero-schema/src/builder/schema-builder.js +3 -2
  645. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  646. package/out/zero-schema/src/builder/table-builder.js +1 -1
  647. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  648. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  649. package/out/zero-schema/src/name-mapper.js +7 -5
  650. package/out/zero-schema/src/name-mapper.js.map +1 -1
  651. package/out/zero-schema/src/schema-config.js +1 -1
  652. package/out/zero-schema/src/schema-config.js.map +1 -1
  653. package/out/zero-server/src/adapters/drizzle.js.map +1 -1
  654. package/out/zero-server/src/adapters/kysely.js.map +1 -1
  655. package/out/zero-server/src/adapters/pg.js.map +1 -1
  656. package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
  657. package/out/zero-server/src/adapters/prisma.js.map +1 -1
  658. package/out/zero-server/src/closable-db-transaction.js.map +1 -1
  659. package/out/zero-server/src/custom.js +1 -1
  660. package/out/zero-server/src/custom.js.map +1 -1
  661. package/out/zero-server/src/mod.js +8 -8
  662. package/out/zero-server/src/process-mutations.js.map +1 -1
  663. package/out/zero-server/src/push-processor.js.map +1 -1
  664. package/out/zero-server/src/queries/process-queries.js +2 -1
  665. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  666. package/out/zero-server/src/schema.js +7 -7
  667. package/out/zero-server/src/schema.js.map +1 -1
  668. package/out/zero-server/src/zql-database.js.map +1 -1
  669. package/out/zero-solid/src/bindings.js +11 -11
  670. package/out/zero-solid/src/mod.js +5 -5
  671. package/out/zero-solid/src/solid-view.js +1 -1
  672. package/out/zero-solid/src/solid-view.js.map +1 -1
  673. package/out/zero-solid/src/use-connection-state.js +2 -1
  674. package/out/zero-solid/src/use-connection-state.js.map +1 -1
  675. package/out/zero-solid/src/use-query.js.map +1 -1
  676. package/out/zero-solid/src/use-zero-online.js +2 -1
  677. package/out/zero-solid/src/use-zero-online.js.map +1 -1
  678. package/out/zero-solid/src/use-zero.js +3 -2
  679. package/out/zero-solid/src/use-zero.js.map +1 -1
  680. package/out/zero-solid/src/zero.js +23 -23
  681. package/out/zero-types/src/name-mapper.js.map +1 -1
  682. package/out/zql/src/builder/builder.js +15 -13
  683. package/out/zql/src/builder/builder.js.map +1 -1
  684. package/out/zql/src/builder/correlated-predicate-pushdown.js.map +1 -1
  685. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  686. package/out/zql/src/builder/like.js +0 -1
  687. package/out/zql/src/builder/like.js.map +1 -1
  688. package/out/zql/src/ivm/array-view.js.map +1 -1
  689. package/out/zql/src/ivm/cap.js +2 -4
  690. package/out/zql/src/ivm/cap.js.map +1 -1
  691. package/out/zql/src/ivm/constraint.js +1 -1
  692. package/out/zql/src/ivm/constraint.js.map +1 -1
  693. package/out/zql/src/ivm/data.js.map +1 -1
  694. package/out/zql/src/ivm/deferred-input.js.map +1 -1
  695. package/out/zql/src/ivm/exists.js +20 -18
  696. package/out/zql/src/ivm/exists.js.map +1 -1
  697. package/out/zql/src/ivm/fan-in.js.map +1 -1
  698. package/out/zql/src/ivm/fan-out.js.map +1 -1
  699. package/out/zql/src/ivm/filter-operators.js +1 -1
  700. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  701. package/out/zql/src/ivm/filter-push.js.map +1 -1
  702. package/out/zql/src/ivm/filter.js.map +1 -1
  703. package/out/zql/src/ivm/flipped-join.js +1 -3
  704. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  705. package/out/zql/src/ivm/join-index-tap.js.map +1 -1
  706. package/out/zql/src/ivm/join-index.js.map +1 -1
  707. package/out/zql/src/ivm/join-utils.js +11 -13
  708. package/out/zql/src/ivm/join-utils.js.map +1 -1
  709. package/out/zql/src/ivm/join.js.map +1 -1
  710. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  711. package/out/zql/src/ivm/memory-source.js +26 -22
  712. package/out/zql/src/ivm/memory-source.js.map +1 -1
  713. package/out/zql/src/ivm/memory-storage.js.map +1 -1
  714. package/out/zql/src/ivm/operator.js +2 -2
  715. package/out/zql/src/ivm/push-accumulated.js +0 -1
  716. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  717. package/out/zql/src/ivm/skip-yields.js.map +1 -1
  718. package/out/zql/src/ivm/skip.js.map +1 -1
  719. package/out/zql/src/ivm/take-gate.js.map +1 -1
  720. package/out/zql/src/ivm/take.js +3 -5
  721. package/out/zql/src/ivm/take.js.map +1 -1
  722. package/out/zql/src/ivm/union-fan-in.js +1 -1
  723. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  724. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  725. package/out/zql/src/ivm/view-apply-change.js +1 -1
  726. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  727. package/out/zql/src/mutate/crud.js +3 -2
  728. package/out/zql/src/mutate/crud.js.map +1 -1
  729. package/out/zql/src/planner/planner-builder.js +1 -1
  730. package/out/zql/src/planner/planner-builder.js.map +1 -1
  731. package/out/zql/src/planner/planner-connection.js.map +1 -1
  732. package/out/zql/src/planner/planner-debug.js.map +1 -1
  733. package/out/zql/src/planner/planner-fan-in.js.map +1 -1
  734. package/out/zql/src/planner/planner-fan-out.js.map +1 -1
  735. package/out/zql/src/planner/planner-filter.js.map +1 -1
  736. package/out/zql/src/planner/planner-graph.js +1 -5
  737. package/out/zql/src/planner/planner-graph.js.map +1 -1
  738. package/out/zql/src/planner/planner-join.js +1 -1
  739. package/out/zql/src/planner/planner-join.js.map +1 -1
  740. package/out/zql/src/planner/planner-source.js.map +1 -1
  741. package/out/zql/src/planner/planner-terminus.js.map +1 -1
  742. package/out/zql/src/query/create-builder.js +2 -1
  743. package/out/zql/src/query/create-builder.js.map +1 -1
  744. package/out/zql/src/query/expression.js +1 -1
  745. package/out/zql/src/query/expression.js.map +1 -1
  746. package/out/zql/src/query/measure-push-operator.js.map +1 -1
  747. package/out/zql/src/query/named.js +2 -1
  748. package/out/zql/src/query/named.js.map +1 -1
  749. package/out/zql/src/query/query-delegate-base.js +1 -1
  750. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  751. package/out/zql/src/query/query-impl.js +3 -2
  752. package/out/zql/src/query/query-impl.js.map +1 -1
  753. package/out/zql/src/query/query-registry.js +1 -1
  754. package/out/zql/src/query/query-registry.js.map +1 -1
  755. package/out/zql/src/query/query-transitions.js +1 -1
  756. package/out/zql/src/query/query-transitions.js.map +1 -1
  757. package/out/zql/src/query/runnable-query-impl.js +3 -2
  758. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  759. package/out/zql/src/query/static-query.js.map +1 -1
  760. package/out/zql/src/query/ttl.js +8 -8
  761. package/out/zql/src/query/ttl.js.map +1 -1
  762. package/out/zql/src/query/validate-input.js.map +1 -1
  763. package/out/zqlite/src/database-storage.d.ts +27 -8
  764. package/out/zqlite/src/database-storage.d.ts.map +1 -1
  765. package/out/zqlite/src/database-storage.js +195 -26
  766. package/out/zqlite/src/database-storage.js.map +1 -1
  767. package/out/zqlite/src/db.d.ts +47 -1
  768. package/out/zqlite/src/db.d.ts.map +1 -1
  769. package/out/zqlite/src/db.js +121 -21
  770. package/out/zqlite/src/db.js.map +1 -1
  771. package/out/zqlite/src/explain-queries.js.map +1 -1
  772. package/out/zqlite/src/fetch-sql.d.ts +27 -0
  773. package/out/zqlite/src/fetch-sql.d.ts.map +1 -0
  774. package/out/zqlite/src/fetch-sql.js +112 -0
  775. package/out/zqlite/src/fetch-sql.js.map +1 -0
  776. package/out/zqlite/src/index-usage.js.map +1 -1
  777. package/out/zqlite/src/internal/sql-inline.js.map +1 -1
  778. package/out/zqlite/src/internal/sql.js.map +1 -1
  779. package/out/zqlite/src/internal/statement-cache.d.ts +7 -0
  780. package/out/zqlite/src/internal/statement-cache.d.ts.map +1 -1
  781. package/out/zqlite/src/internal/statement-cache.js +11 -4
  782. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  783. package/out/zqlite/src/mod.js +5 -5
  784. package/out/zqlite/src/pending-delta.js.map +1 -1
  785. package/out/zqlite/src/query-builder.d.ts +11 -1
  786. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  787. package/out/zqlite/src/query-builder.js +22 -7
  788. package/out/zqlite/src/query-builder.js.map +1 -1
  789. package/out/zqlite/src/query-delegate.js.map +1 -1
  790. package/out/zqlite/src/resolve-scalar-subqueries.js +2 -5
  791. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  792. package/out/zqlite/src/sqlite-cost-model.js +3 -2
  793. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  794. package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
  795. package/out/zqlite/src/table-source.d.ts +20 -2
  796. package/out/zqlite/src/table-source.d.ts.map +1 -1
  797. package/out/zqlite/src/table-source.js +73 -39
  798. package/out/zqlite/src/table-source.js.map +1 -1
  799. package/package.json +17 -15
  800. package/out/otel/src/maybe-time.d.ts +0 -3
  801. package/out/otel/src/maybe-time.d.ts.map +0 -1
  802. package/out/otel/src/maybe-time.js +0 -15
  803. package/out/otel/src/maybe-time.js.map +0 -1
@@ -1,23 +1,23 @@
1
- import "../../replicache/src/get-default-puller.js";
2
- import "../../replicache/src/storage-failure.js";
3
- import "../../replicache/src/kv/idb-store.js";
4
- import "../../replicache/src/make-idb-name.js";
5
- import "../../replicache/src/persist/collect-idb-databases.js";
6
- import "../../replicache/src/transaction-closed-error.js";
7
- import "../../zero-permissions/src/permissions.js";
8
- import "../../zero-protocol/src/application-error.js";
9
- import "../../zero-protocol/src/custom-queries.js";
10
- import "../../zero-schema/src/builder/relationship-builder.js";
11
- import "../../zero-schema/src/builder/table-builder.js";
12
- import "../../zero-schema/src/builder/schema-builder.js";
13
- import "../../zql/src/query/validate-input.js";
14
- import "../../zql/src/mutate/mutator.js";
15
- import "../../zql/src/mutate/mutator-registry.js";
16
- import "../../zql/src/query/create-builder.js";
17
- import "../../zql/src/query/escape-like.js";
18
- import "../../zql/src/query/named.js";
19
- import "../../zql/src/query/query-registry.js";
20
- import "./client/connection-status-enum.js";
21
- import "./client/update-needed-reason-type-enum.js";
22
- import "./client/zero.js";
23
- export {};
1
+ import { getDefaultPuller } from "../../replicache/src/get-default-puller.js";
2
+ import { StorageFailureError } from "../../replicache/src/storage-failure.js";
3
+ import { IDBNotFoundError } from "../../replicache/src/kv/idb-store.js";
4
+ import { makeIDBName } from "../../replicache/src/make-idb-name.js";
5
+ import { dropAllDatabases, dropDatabase } from "../../replicache/src/persist/collect-idb-databases.js";
6
+ import { TransactionClosedError } from "../../replicache/src/transaction-closed-error.js";
7
+ import { ANYONE_CAN, ANYONE_CAN_DO_ANYTHING, NOBODY_CAN, definePermissions } from "../../zero-permissions/src/permissions.js";
8
+ import { ApplicationError } from "../../zero-protocol/src/application-error.js";
9
+ import { transformRequestMessageSchema, transformResponseMessageSchema } from "../../zero-protocol/src/custom-queries.js";
10
+ import { relationships } from "../../zero-schema/src/builder/relationship-builder.js";
11
+ import { boolean, enumeration, json, number, string, table } from "../../zero-schema/src/builder/table-builder.js";
12
+ import { createSchema } from "../../zero-schema/src/builder/schema-builder.js";
13
+ import { InputValidationError } from "../../zql/src/query/validate-input.js";
14
+ import { defineMutator, defineMutatorWithType, isMutator, isMutatorDefinition } from "../../zql/src/mutate/mutator.js";
15
+ import { defineMutators, defineMutatorsWithType, getMutator, isMutatorRegistry, mustGetMutator } from "../../zql/src/mutate/mutator-registry.js";
16
+ import { createBuilder } from "../../zql/src/query/create-builder.js";
17
+ import { escapeLike } from "../../zql/src/query/escape-like.js";
18
+ import { syncedQuery, syncedQueryWithContext, withValidation } from "../../zql/src/query/named.js";
19
+ import { defineQueries, defineQueriesWithType, defineQuery, defineQueryWithType, getQuery, isQuery, isQueryDefinition, isQueryRegistry, mustGetQuery } from "../../zql/src/query/query-registry.js";
20
+ import { connection_status_enum_exports } from "./client/connection-status-enum.js";
21
+ import { update_needed_reason_type_enum_exports } from "./client/update-needed-reason-type-enum.js";
22
+ import { Zero } from "./client/zero.js";
23
+ export { ANYONE_CAN, ANYONE_CAN_DO_ANYTHING, ApplicationError, connection_status_enum_exports as ConnectionStatus, IDBNotFoundError, InputValidationError, NOBODY_CAN, StorageFailureError, TransactionClosedError, update_needed_reason_type_enum_exports as UpdateNeededReasonType, Zero, boolean, createBuilder, createSchema, defineMutator, defineMutatorWithType, defineMutators, defineMutatorsWithType, definePermissions, defineQueries, defineQueriesWithType, defineQuery, defineQueryWithType, dropAllDatabases, dropDatabase, enumeration, escapeLike, getDefaultPuller, getMutator, getQuery, isMutator, isMutatorDefinition, isMutatorRegistry, isQuery, isQueryDefinition, isQueryRegistry, json, makeIDBName, mustGetMutator, mustGetQuery, number, relationships, string, syncedQuery, syncedQueryWithContext, table, transformRequestMessageSchema, transformResponseMessageSchema, withValidation };
@@ -1 +1 @@
1
- {"version":3,"file":"nanoid.js","names":[],"sources":["../../../../../zero-client/src/util/nanoid.ts"],"sourcesContent":["// This is taken from https://github.com/ai/nanoid/blob/main/index.browser.js We\n// copy this because we want to use `--platform=neutral` which doesn't work with\n// the npm package.\n// Also we changed the random number generator to use Math.random() for compat\n// with React Native.\n\nimport {getNonCryptoRandomValues} from '../../../shared/src/random-values.ts';\n\nexport function nanoid(size = 21): string {\n // Use our custom getRandomValues function to fill a Uint8Array with random values.\n const randomBytes = getNonCryptoRandomValues(new Uint8Array(size));\n\n return randomBytes.reduce((id, byte) => {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n byte &= 63;\n if (byte < 36) {\n // `0-9a-z`\n id += byte.toString(36);\n } else if (byte < 62) {\n // `A-Z`\n id += (byte - 26).toString(36).toUpperCase();\n } else if (byte > 62) {\n id += '-';\n } else {\n id += '_';\n }\n return id;\n }, '');\n}\n"],"mappings":";;AAQA,SAAgB,OAAO,OAAO,IAAY;CAIxC,OAFoB,yBAAyB,IAAI,WAAW,IAAI,CAEzD,EAAY,QAAQ,IAAI,SAAS;EAMtC,QAAQ;EACR,IAAI,OAAO,IAET,MAAM,KAAK,SAAS,EAAE;OACjB,IAAI,OAAO,IAEhB,OAAO,OAAO,IAAI,SAAS,EAAE,EAAE,YAAY;OACtC,IAAI,OAAO,IAChB,MAAM;OAEN,MAAM;EAER,OAAO;CACT,GAAG,EAAE;AACP"}
1
+ {"version":3,"file":"nanoid.js","names":[],"sources":["../../../../../zero-client/src/util/nanoid.ts"],"sourcesContent":["// This is taken from https://github.com/ai/nanoid/blob/main/index.browser.js We\n// copy this because we want to use `--platform=neutral` which doesn't work with\n// the npm package.\n// Also we changed the random number generator to use Math.random() for compat\n// with React Native.\n\nimport {getNonCryptoRandomValues} from '../../../shared/src/random-values.ts';\n\nexport function nanoid(size = 21): string {\n // Use our custom getRandomValues function to fill a Uint8Array with random values.\n const randomBytes = getNonCryptoRandomValues(new Uint8Array(size));\n\n return randomBytes.reduce((id, byte) => {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n byte &= 63;\n if (byte < 36) {\n // `0-9a-z`\n id += byte.toString(36);\n } else if (byte < 62) {\n // `A-Z`\n id += (byte - 26).toString(36).toUpperCase();\n } else if (byte > 62) {\n id += '-';\n } else {\n id += '_';\n }\n return id;\n }, '');\n}\n"],"mappings":";;AAQA,SAAgB,OAAO,OAAO,IAAY;CAIxC,OAFoB,yBAAyB,IAAI,WAAW,IAAI,CAEzD,CAAA,CAAY,QAAQ,IAAI,SAAS;EAMtC,QAAQ;EACR,IAAI,OAAO,IAET,MAAM,KAAK,SAAS,EAAE;OACjB,IAAI,OAAO,IAEhB,OAAO,OAAO,GAAA,CAAI,SAAS,EAAE,CAAC,CAAC,YAAY;OACtC,IAAI,OAAO,IAChB,MAAM;OAEN,MAAM;EAER,OAAO;CACT,GAAG,EAAE;AACP"}
@@ -58,7 +58,8 @@ function compileRowConfig(clientToServer, tableName, rowRules, expressionBuilder
58
58
  function compileRules(clientToServer, tableName, rules, expressionBuilder) {
59
59
  if (!rules) return;
60
60
  return rules.map((rule) => {
61
- return ["allow", mapCondition(rule(authDataRef, expressionBuilder), tableName, clientToServer)];
61
+ const cond = rule(authDataRef, expressionBuilder);
62
+ return ["allow", mapCondition(cond, tableName, clientToServer)];
62
63
  });
63
64
  }
64
65
  function compileCellConfig(clientToServer, tableName, cellRules, expressionBuilder) {
@@ -104,6 +105,6 @@ function staticParam(anchorClass, field) {
104
105
  };
105
106
  }
106
107
  //#endregion
107
- export { ANYONE_CAN, ANYONE_CAN_DO_ANYTHING, NOBODY_CAN, definePermissions };
108
+ export { ANYONE_CAN, ANYONE_CAN_DO_ANYTHING, NOBODY_CAN, authDataRef, definePermissions, staticParam };
108
109
 
109
110
  //# sourceMappingURL=permissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","names":["#anchor","#path"],"sources":["../../../../zero-permissions/src/permissions.ts"],"sourcesContent":["import {assert} from '../../shared/src/asserts.ts';\nimport {\n mapCondition,\n toStaticParam,\n type Condition,\n type Parameter,\n} from '../../zero-protocol/src/ast.ts';\nimport type {\n AssetPermissions as CompiledAssetPermissions,\n PermissionsConfig as CompiledPermissionsConfig,\n TablePermissions,\n} from '../../zero-schema/src/compiled-permissions.ts';\nimport type {NameMapper} from '../../zero-schema/src/name-mapper.ts';\nimport {clientToServer} from '../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {ExpressionBuilder} from '../../zql/src/query/expression.ts';\nimport type {Query} from '../../zql/src/query/query.ts';\nimport {newExpressionBuilder} from '../../zql/src/query/static-query.ts';\n\nexport const ANYONE_CAN = [\n (_: unknown, eb: ExpressionBuilder<never, Schema>) => eb.and(),\n];\n\n/**\n * @deprecated Use {@link ANYONE_CAN} instead.\n */\nexport const ANYONE_CAN_DO_ANYTHING = {\n row: {\n select: ANYONE_CAN,\n insert: ANYONE_CAN,\n update: {\n preMutation: ANYONE_CAN,\n postMutation: ANYONE_CAN,\n },\n delete: ANYONE_CAN,\n },\n};\n\nexport const NOBODY_CAN = [];\n\nexport type Anchor = 'authData' | 'preMutationRow';\n\nexport type Queries<TSchema extends Schema> = {\n [K in keyof TSchema['tables']]: Query<K & string, TSchema>;\n};\n\nexport type PermissionRule<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n> = (\n authData: TAuthDataShape,\n eb: ExpressionBuilder<TTable, TSchema>,\n) => Condition;\n\nexport type AssetPermissions<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n> = {\n // Why an array of rules?: https://github.com/rocicorp/mono/pull/3184/files#r1869680716\n select?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n insert?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n update?:\n | {\n preMutation?: PermissionRule<TAuthDataShape, TSchema, TTable>[];\n postMutation?: PermissionRule<TAuthDataShape, TSchema, TTable>[];\n }\n | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n delete?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n};\n\nexport type PermissionsConfig<TAuthDataShape, TSchema extends Schema> = {\n [K in keyof TSchema['tables']]?: {\n row?: AssetPermissions<TAuthDataShape, TSchema, K & string> | undefined;\n cell?:\n | {\n [C in keyof TSchema['tables'][K]['columns']]?: Omit<\n AssetPermissions<TAuthDataShape, TSchema, K & string>,\n 'cell'\n >;\n }\n | undefined;\n };\n};\n\n/**\n * @deprecated Use {@link defineMutators} and {@link defineQueries} instead.\n */\nexport async function definePermissions<TAuthDataShape, TSchema extends Schema>(\n schema: TSchema,\n definer: () =>\n | Promise<PermissionsConfig<TAuthDataShape, TSchema>>\n | PermissionsConfig<TAuthDataShape, TSchema>,\n): Promise<CompiledPermissionsConfig | undefined> {\n const expressionBuilders = {} as Record<\n string,\n ExpressionBuilder<string, TSchema>\n >;\n for (const name of Object.keys(schema.tables)) {\n expressionBuilders[name] = newExpressionBuilder(schema, name);\n }\n\n const config = await definer();\n return compilePermissions(schema, config, expressionBuilders);\n}\n\nfunction compilePermissions<TAuthDataShape, TSchema extends Schema>(\n schema: TSchema,\n authz: PermissionsConfig<TAuthDataShape, TSchema> | undefined,\n expressionBuilders: Record<string, ExpressionBuilder<string, TSchema>>,\n): CompiledPermissionsConfig | undefined {\n if (!authz) {\n return undefined;\n }\n const nameMapper = clientToServer(schema.tables);\n const ret = {tables: {} as TablePermissions};\n for (const [tableName, tableConfig] of Object.entries(authz)) {\n const serverName = schema.tables[tableName].serverName ?? tableName;\n ret.tables[serverName] = {\n row: compileRowConfig(\n nameMapper,\n tableName,\n tableConfig.row,\n expressionBuilders[tableName],\n ),\n cell: compileCellConfig(\n nameMapper,\n tableName,\n tableConfig.cell,\n expressionBuilders[tableName],\n ),\n };\n }\n\n return ret;\n}\n\nfunction compileRowConfig<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n rowRules: AssetPermissions<TAuthDataShape, TSchema, TTable> | undefined,\n expressionBuilder: ExpressionBuilder<TTable, TSchema>,\n): CompiledAssetPermissions | undefined {\n if (!rowRules) {\n return undefined;\n }\n return {\n select: compileRules(\n clientToServer,\n tableName,\n rowRules.select,\n expressionBuilder,\n ),\n insert: compileRules(\n clientToServer,\n tableName,\n rowRules.insert,\n expressionBuilder,\n ),\n update: {\n preMutation: compileRules(\n clientToServer,\n tableName,\n rowRules.update?.preMutation,\n expressionBuilder,\n ),\n postMutation: compileRules(\n clientToServer,\n tableName,\n rowRules.update?.postMutation,\n expressionBuilder,\n ),\n },\n delete: compileRules(\n clientToServer,\n tableName,\n rowRules.delete,\n expressionBuilder,\n ),\n };\n}\n\n/**\n * What is this \"allow\" and why are permissions policies an array of rules?\n *\n * Please read: https://github.com/rocicorp/mono/pull/3184/files#r1869680716\n */\nfunction compileRules<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n rules: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined,\n expressionBuilder: ExpressionBuilder<TTable, TSchema>,\n): ['allow', Condition][] | undefined {\n if (!rules) {\n return undefined;\n }\n\n return rules.map(rule => {\n const cond = rule(authDataRef as TAuthDataShape, expressionBuilder);\n return ['allow', mapCondition(cond, tableName, clientToServer)] as const;\n });\n}\n\nfunction compileCellConfig<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n cellRules:\n | Record<string, AssetPermissions<TAuthDataShape, TSchema, TTable>>\n | undefined,\n expressionBuilder: ExpressionBuilder<TTable, TSchema>,\n): Record<string, CompiledAssetPermissions> | undefined {\n if (!cellRules) {\n return undefined;\n }\n const ret: Record<string, CompiledAssetPermissions> = {};\n for (const [columnName, rules] of Object.entries(cellRules)) {\n ret[columnName] = {\n select: compileRules(\n clientToServer,\n tableName,\n rules.select,\n expressionBuilder,\n ),\n insert: compileRules(\n clientToServer,\n tableName,\n rules.insert,\n expressionBuilder,\n ),\n update: {\n preMutation: compileRules(\n clientToServer,\n tableName,\n rules.update?.preMutation,\n expressionBuilder,\n ),\n postMutation: compileRules(\n clientToServer,\n tableName,\n rules.update?.postMutation,\n expressionBuilder,\n ),\n },\n delete: compileRules(\n clientToServer,\n tableName,\n rules.delete,\n expressionBuilder,\n ),\n };\n }\n return ret;\n}\n\nclass CallTracker {\n readonly #anchor: Anchor;\n readonly #path: string[];\n constructor(anchor: Anchor, path: string[]) {\n this.#anchor = anchor;\n this.#path = path;\n }\n\n get(target: {[toStaticParam]: () => Parameter}, prop: string | symbol) {\n if (prop === toStaticParam) {\n return target[toStaticParam];\n }\n assert(\n typeof prop === 'string',\n () => `Expected prop to be a string, got ${typeof prop}`,\n );\n const path = [...this.#path, prop];\n return new Proxy(\n {\n [toStaticParam]: () => staticParam(this.#anchor, path),\n },\n new CallTracker(this.#anchor, path),\n );\n }\n}\n\nfunction baseTracker(anchor: Anchor) {\n return new Proxy(\n {\n [toStaticParam]: () => {\n throw new Error('no JWT field specified');\n },\n },\n new CallTracker(anchor, []),\n );\n}\n\nexport const authDataRef = baseTracker('authData');\nexport const preMutationRowRef = baseTracker('preMutationRow');\nexport function staticParam(\n anchorClass: 'authData' | 'preMutationRow',\n field: string | string[],\n): Parameter {\n return {\n type: 'static',\n anchor: anchorClass,\n // for backwards compatibility\n field: field.length === 1 ? field[0] : field,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","names":[],"sources":["../../../../zero-permissions/src/permissions.ts"],"sourcesContent":["import {assert} from '../../shared/src/asserts.ts';\nimport {\n mapCondition,\n toStaticParam,\n type Condition,\n type Parameter,\n} from '../../zero-protocol/src/ast.ts';\nimport type {\n AssetPermissions as CompiledAssetPermissions,\n PermissionsConfig as CompiledPermissionsConfig,\n TablePermissions,\n} from '../../zero-schema/src/compiled-permissions.ts';\nimport type {NameMapper} from '../../zero-schema/src/name-mapper.ts';\nimport {clientToServer} from '../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {ExpressionBuilder} from '../../zql/src/query/expression.ts';\nimport type {Query} from '../../zql/src/query/query.ts';\nimport {newExpressionBuilder} from '../../zql/src/query/static-query.ts';\n\nexport const ANYONE_CAN = [\n (_: unknown, eb: ExpressionBuilder<never, Schema>) => eb.and(),\n];\n\n/**\n * @deprecated Use {@link ANYONE_CAN} instead.\n */\nexport const ANYONE_CAN_DO_ANYTHING = {\n row: {\n select: ANYONE_CAN,\n insert: ANYONE_CAN,\n update: {\n preMutation: ANYONE_CAN,\n postMutation: ANYONE_CAN,\n },\n delete: ANYONE_CAN,\n },\n};\n\nexport const NOBODY_CAN = [];\n\nexport type Anchor = 'authData' | 'preMutationRow';\n\nexport type Queries<TSchema extends Schema> = {\n [K in keyof TSchema['tables']]: Query<K & string, TSchema>;\n};\n\nexport type PermissionRule<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n> = (\n authData: TAuthDataShape,\n eb: ExpressionBuilder<TTable, TSchema>,\n) => Condition;\n\nexport type AssetPermissions<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n> = {\n // Why an array of rules?: https://github.com/rocicorp/mono/pull/3184/files#r1869680716\n select?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n insert?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n update?:\n | {\n preMutation?: PermissionRule<TAuthDataShape, TSchema, TTable>[];\n postMutation?: PermissionRule<TAuthDataShape, TSchema, TTable>[];\n }\n | undefined;\n /**\n * @deprecated Use Mutators instead.\n * @see {@link https://zero.rocicorp.dev/docs/writing-data}\n */\n delete?: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined;\n};\n\nexport type PermissionsConfig<TAuthDataShape, TSchema extends Schema> = {\n [K in keyof TSchema['tables']]?: {\n row?: AssetPermissions<TAuthDataShape, TSchema, K & string> | undefined;\n cell?:\n | {\n [C in keyof TSchema['tables'][K]['columns']]?: Omit<\n AssetPermissions<TAuthDataShape, TSchema, K & string>,\n 'cell'\n >;\n }\n | undefined;\n };\n};\n\n/**\n * @deprecated Use {@link defineMutators} and {@link defineQueries} instead.\n */\nexport async function definePermissions<TAuthDataShape, TSchema extends Schema>(\n schema: TSchema,\n definer: () =>\n | Promise<PermissionsConfig<TAuthDataShape, TSchema>>\n | PermissionsConfig<TAuthDataShape, TSchema>,\n): Promise<CompiledPermissionsConfig | undefined> {\n const expressionBuilders = {} as Record<\n string,\n ExpressionBuilder<string, TSchema>\n >;\n for (const name of Object.keys(schema.tables)) {\n expressionBuilders[name] = newExpressionBuilder(schema, name);\n }\n\n const config = await definer();\n return compilePermissions(schema, config, expressionBuilders);\n}\n\nfunction compilePermissions<TAuthDataShape, TSchema extends Schema>(\n schema: TSchema,\n authz: PermissionsConfig<TAuthDataShape, TSchema> | undefined,\n expressionBuilders: Record<string, ExpressionBuilder<string, TSchema>>,\n): CompiledPermissionsConfig | undefined {\n if (!authz) {\n return undefined;\n }\n const nameMapper = clientToServer(schema.tables);\n const ret = {tables: {} as TablePermissions};\n for (const [tableName, tableConfig] of Object.entries(authz)) {\n const serverName = schema.tables[tableName].serverName ?? tableName;\n ret.tables[serverName] = {\n row: compileRowConfig(\n nameMapper,\n tableName,\n tableConfig.row,\n expressionBuilders[tableName],\n ),\n cell: compileCellConfig(\n nameMapper,\n tableName,\n tableConfig.cell,\n expressionBuilders[tableName],\n ),\n };\n }\n\n return ret;\n}\n\nfunction compileRowConfig<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n rowRules: AssetPermissions<TAuthDataShape, TSchema, TTable> | undefined,\n expressionBuilder: ExpressionBuilder<TTable, TSchema>,\n): CompiledAssetPermissions | undefined {\n if (!rowRules) {\n return undefined;\n }\n return {\n select: compileRules(\n clientToServer,\n tableName,\n rowRules.select,\n expressionBuilder,\n ),\n insert: compileRules(\n clientToServer,\n tableName,\n rowRules.insert,\n expressionBuilder,\n ),\n update: {\n preMutation: compileRules(\n clientToServer,\n tableName,\n rowRules.update?.preMutation,\n expressionBuilder,\n ),\n postMutation: compileRules(\n clientToServer,\n tableName,\n rowRules.update?.postMutation,\n expressionBuilder,\n ),\n },\n delete: compileRules(\n clientToServer,\n tableName,\n rowRules.delete,\n expressionBuilder,\n ),\n };\n}\n\n/**\n * What is this \"allow\" and why are permissions policies an array of rules?\n *\n * Please read: https://github.com/rocicorp/mono/pull/3184/files#r1869680716\n */\nfunction compileRules<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n rules: PermissionRule<TAuthDataShape, TSchema, TTable>[] | undefined,\n expressionBuilder: ExpressionBuilder<TTable, TSchema>,\n): ['allow', Condition][] | undefined {\n if (!rules) {\n return undefined;\n }\n\n return rules.map(rule => {\n const cond = rule(authDataRef as TAuthDataShape, expressionBuilder);\n return ['allow', mapCondition(cond, tableName, clientToServer)] as const;\n });\n}\n\nfunction compileCellConfig<\n TAuthDataShape,\n TSchema extends Schema,\n TTable extends keyof TSchema['tables'] & string,\n>(\n clientToServer: NameMapper,\n tableName: TTable,\n cellRules:\n | Record<string, AssetPermissions<TAuthDataShape, TSchema, TTable>>\n | undefined,\n expressionBuilder: ExpressionBuilder<TTable, TSchema>,\n): Record<string, CompiledAssetPermissions> | undefined {\n if (!cellRules) {\n return undefined;\n }\n const ret: Record<string, CompiledAssetPermissions> = {};\n for (const [columnName, rules] of Object.entries(cellRules)) {\n ret[columnName] = {\n select: compileRules(\n clientToServer,\n tableName,\n rules.select,\n expressionBuilder,\n ),\n insert: compileRules(\n clientToServer,\n tableName,\n rules.insert,\n expressionBuilder,\n ),\n update: {\n preMutation: compileRules(\n clientToServer,\n tableName,\n rules.update?.preMutation,\n expressionBuilder,\n ),\n postMutation: compileRules(\n clientToServer,\n tableName,\n rules.update?.postMutation,\n expressionBuilder,\n ),\n },\n delete: compileRules(\n clientToServer,\n tableName,\n rules.delete,\n expressionBuilder,\n ),\n };\n }\n return ret;\n}\n\nclass CallTracker {\n readonly #anchor: Anchor;\n readonly #path: string[];\n constructor(anchor: Anchor, path: string[]) {\n this.#anchor = anchor;\n this.#path = path;\n }\n\n get(target: {[toStaticParam]: () => Parameter}, prop: string | symbol) {\n if (prop === toStaticParam) {\n return target[toStaticParam];\n }\n assert(\n typeof prop === 'string',\n () => `Expected prop to be a string, got ${typeof prop}`,\n );\n const path = [...this.#path, prop];\n return new Proxy(\n {\n [toStaticParam]: () => staticParam(this.#anchor, path),\n },\n new CallTracker(this.#anchor, path),\n );\n }\n}\n\nfunction baseTracker(anchor: Anchor) {\n return new Proxy(\n {\n [toStaticParam]: () => {\n throw new Error('no JWT field specified');\n },\n },\n new CallTracker(anchor, []),\n );\n}\n\nexport const authDataRef = baseTracker('authData');\nexport const preMutationRowRef = baseTracker('preMutationRow');\nexport function staticParam(\n anchorClass: 'authData' | 'preMutationRow',\n field: string | string[],\n): Parameter {\n return {\n type: 'static',\n anchor: anchorClass,\n // for backwards compatibility\n field: field.length === 1 ? field[0] : field,\n };\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import "../../zero-protocol/src/application-error.js";
2
- import "../../zero-server/src/custom.js";
3
- import "../../zero-server/src/pg-query-executor.js";
4
- import "../../zero-server/src/push-processor.js";
5
- import "../../zero-server/src/process-mutations.js";
6
- import "../../zero-server/src/queries/process-queries.js";
7
- import "../../zero-server/src/zql-database.js";
1
+ import { ApplicationError, isApplicationError } from "../../zero-protocol/src/application-error.js";
2
+ import { CRUDMutatorFactory, makeSchemaCRUD } from "../../zero-server/src/custom.js";
3
+ import { executePostgresQuery } from "../../zero-server/src/pg-query-executor.js";
4
+ import { PushProcessor } from "../../zero-server/src/push-processor.js";
5
+ import { OutOfOrderMutation, getMutation, handleMutateRequest, handleMutationRequest } from "../../zero-server/src/process-mutations.js";
6
+ import { handleGetQueriesRequest, handleQueryRequest, handleTransformRequest } from "../../zero-server/src/queries/process-queries.js";
7
+ import { ZQLDatabase } from "../../zero-server/src/zql-database.js";
8
8
  import "../../zero-server/src/mod.js";
9
- import "../../zero-server/src/adapters/postgresjs.js";
10
- export {};
9
+ import { PostgresJSConnection, PostgresJsTransactionInternal, zeroPostgresJS } from "../../zero-server/src/adapters/postgresjs.js";
10
+ export { ApplicationError, CRUDMutatorFactory, OutOfOrderMutation, PostgresJSConnection, PostgresJsTransactionInternal, PushProcessor, ZQLDatabase, executePostgresQuery, getMutation, handleGetQueriesRequest, handleMutateRequest, handleMutationRequest, handleQueryRequest, handleTransformRequest, isApplicationError, makeSchemaCRUD, zeroPostgresJS };
@@ -118,6 +118,6 @@ var analyzeQueryResultSchema = valita_exports.object({
118
118
  joinPlans: valita_exports.array(planDebugEventJSONSchema).optional()
119
119
  });
120
120
  //#endregion
121
- export { analyzeQueryResultSchema };
121
+ export { analyzeQueryResultSchema, attemptStartEventJSONSchema, bestPlanSelectedEventJSONSchema, connectionSelectedEventJSONSchema, nodeConstraintEventJSONSchema, planFailedEventJSONSchema, rowCountsByQuerySchema, rowCountsBySourceSchema, rowsByQuerySchema, rowsBySourceSchema };
122
122
 
123
123
  //# sourceMappingURL=analyze-query-result.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-query-result.js","names":[],"sources":["../../../../zero-protocol/src/analyze-query-result.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\n\nimport {conditionSchema, orderingSchema} from './ast.ts';\nimport {rowSchema} from './data.ts';\n\nexport const rowCountsByQuerySchema = v.record(v.number());\nexport type RowCountsByQuery = v.Infer<typeof rowCountsByQuerySchema>;\n\nexport const rowCountsBySourceSchema = v.record(rowCountsByQuerySchema);\nexport type RowCountsBySource = v.Infer<typeof rowCountsBySourceSchema>;\n\nexport const rowsByQuerySchema = v.record(v.array(rowSchema));\nexport type RowsByQuery = v.Infer<typeof rowsByQuerySchema>;\n\nexport const rowsBySourceSchema = v.record(rowsByQuerySchema);\nexport type RowsBySource = v.Infer<typeof rowsBySourceSchema>;\n\n// Planner debug event schemas\n\nconst costEstimateJSONSchema = v.object({\n startupCost: v.number(),\n scanEst: v.number(),\n cost: v.number(),\n returnedRows: v.number(),\n selectivity: v.number(),\n limit: v.number().optional(),\n});\n\nconst plannerConstraintSchema = v.record(v.union(v.unknown(), v.null()));\n\nconst attemptStartEventJSONSchema = v.object({\n type: v.literal('attempt-start'),\n attemptNumber: v.number(),\n totalAttempts: v.number(),\n});\n\nconst connectionCostsEventJSONSchema = v.object({\n type: v.literal('connection-costs'),\n attemptNumber: v.number(),\n costs: v.array(\n v.object({\n connection: v.string(),\n cost: v.number(),\n costEstimate: costEstimateJSONSchema,\n pinned: v.boolean(),\n constraints: v.record(v.union(plannerConstraintSchema, v.null())),\n constraintCosts: v.record(costEstimateJSONSchema),\n }),\n ),\n});\n\nconst connectionSelectedEventJSONSchema = v.object({\n type: v.literal('connection-selected'),\n attemptNumber: v.number(),\n connection: v.string(),\n cost: v.number(),\n isRoot: v.boolean(),\n});\n\nconst constraintsPropagatedEventJSONSchema = v.object({\n type: v.literal('constraints-propagated'),\n attemptNumber: v.number(),\n connectionConstraints: v.array(\n v.object({\n connection: v.string(),\n constraints: v.record(v.union(plannerConstraintSchema, v.null())),\n constraintCosts: v.record(costEstimateJSONSchema),\n }),\n ),\n});\n\n// `joinType` and `nodeType` are only displayed, so they are open: a client\n// accepts values that a newer server adds instead of failing the whole message.\nconst joinTypeSchema = v.openLiteralUnion('semi', 'flipped', 'unflippable');\n\nconst planCompleteEventJSONSchema = v.object({\n type: v.literal('plan-complete'),\n attemptNumber: v.number(),\n totalCost: v.number(),\n flipPattern: v.number(),\n joinStates: v.array(\n v.object({\n join: v.string(),\n type: joinTypeSchema,\n }),\n ),\n});\n\nconst planFailedEventJSONSchema = v.object({\n type: v.literal('plan-failed'),\n attemptNumber: v.number(),\n reason: v.string(),\n});\n\nconst bestPlanSelectedEventJSONSchema = v.object({\n type: v.literal('best-plan-selected'),\n bestAttemptNumber: v.number(),\n totalCost: v.number(),\n flipPattern: v.number(),\n joinStates: v.array(\n v.object({\n join: v.string(),\n type: joinTypeSchema,\n }),\n ),\n});\n\nconst nodeTypeSchema = v.openLiteralUnion(\n 'connection',\n 'join',\n 'fan-out',\n 'fan-in',\n 'filter',\n 'terminus',\n);\n\nconst nodeCostEventJSONSchema = v.object({\n type: v.literal('node-cost'),\n attemptNumber: v.number().optional(),\n nodeType: nodeTypeSchema,\n node: v.string(),\n branchPattern: v.array(v.number()),\n downstreamChildSelectivity: v.number(),\n costEstimate: costEstimateJSONSchema,\n filters: conditionSchema.optional(),\n ordering: orderingSchema.optional(),\n joinType: joinTypeSchema.optional(),\n});\n\nconst nodeConstraintEventJSONSchema = v.object({\n type: v.literal('node-constraint'),\n attemptNumber: v.number().optional(),\n nodeType: nodeTypeSchema,\n node: v.string(),\n branchPattern: v.array(v.number()),\n constraint: v.union(plannerConstraintSchema, v.null()).optional(),\n from: v.string(),\n});\n\nconst planDebugEventJSONSchema = v.union(\n attemptStartEventJSONSchema,\n connectionCostsEventJSONSchema,\n connectionSelectedEventJSONSchema,\n constraintsPropagatedEventJSONSchema,\n planCompleteEventJSONSchema,\n planFailedEventJSONSchema,\n bestPlanSelectedEventJSONSchema,\n nodeCostEventJSONSchema,\n nodeConstraintEventJSONSchema,\n);\n\nexport type PlanDebugEventJSON = v.Infer<typeof planDebugEventJSONSchema>;\n\nexport {\n attemptStartEventJSONSchema,\n connectionSelectedEventJSONSchema,\n planFailedEventJSONSchema,\n bestPlanSelectedEventJSONSchema,\n nodeConstraintEventJSONSchema,\n};\n\nexport const analyzeQueryResultSchema = v.object({\n warnings: v.array(v.string()),\n syncedRows: v.record(v.array(rowSchema)).optional(),\n syncedRowCount: v.number(),\n start: v.number(),\n /** @deprecated Use start + elapsed instead */\n end: v.number(),\n elapsed: v.number().optional(),\n afterPermissions: v.string().optional(),\n /** @deprecated Use readRowCountsByQuery */\n vendedRowCounts: rowCountsBySourceSchema.optional(),\n /** @deprecated Use readRows */\n vendedRows: rowsBySourceSchema.optional(),\n sqlitePlans: v.record(v.array(v.string())).optional(),\n readRows: rowsBySourceSchema.optional(),\n readRowCountsByQuery: rowCountsBySourceSchema.optional(),\n readRowCount: v.number().optional(),\n dbScansByQuery: rowCountsBySourceSchema.optional(),\n joinPlans: v.array(planDebugEventJSONSchema).optional(),\n});\n\nexport type AnalyzeQueryResult = v.Infer<typeof analyzeQueryResultSchema>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"analyze-query-result.js","names":["v","v.openLiteralUnion"],"sources":["../../../../zero-protocol/src/analyze-query-result.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\n\nimport {conditionSchema, orderingSchema} from './ast.ts';\nimport {rowSchema} from './data.ts';\n\nexport const rowCountsByQuerySchema = v.record(v.number());\nexport type RowCountsByQuery = v.Infer<typeof rowCountsByQuerySchema>;\n\nexport const rowCountsBySourceSchema = v.record(rowCountsByQuerySchema);\nexport type RowCountsBySource = v.Infer<typeof rowCountsBySourceSchema>;\n\nexport const rowsByQuerySchema = v.record(v.array(rowSchema));\nexport type RowsByQuery = v.Infer<typeof rowsByQuerySchema>;\n\nexport const rowsBySourceSchema = v.record(rowsByQuerySchema);\nexport type RowsBySource = v.Infer<typeof rowsBySourceSchema>;\n\n// Planner debug event schemas\n\nconst costEstimateJSONSchema = v.object({\n startupCost: v.number(),\n scanEst: v.number(),\n cost: v.number(),\n returnedRows: v.number(),\n selectivity: v.number(),\n limit: v.number().optional(),\n});\n\nconst plannerConstraintSchema = v.record(v.union(v.unknown(), v.null()));\n\nconst attemptStartEventJSONSchema = v.object({\n type: v.literal('attempt-start'),\n attemptNumber: v.number(),\n totalAttempts: v.number(),\n});\n\nconst connectionCostsEventJSONSchema = v.object({\n type: v.literal('connection-costs'),\n attemptNumber: v.number(),\n costs: v.array(\n v.object({\n connection: v.string(),\n cost: v.number(),\n costEstimate: costEstimateJSONSchema,\n pinned: v.boolean(),\n constraints: v.record(v.union(plannerConstraintSchema, v.null())),\n constraintCosts: v.record(costEstimateJSONSchema),\n }),\n ),\n});\n\nconst connectionSelectedEventJSONSchema = v.object({\n type: v.literal('connection-selected'),\n attemptNumber: v.number(),\n connection: v.string(),\n cost: v.number(),\n isRoot: v.boolean(),\n});\n\nconst constraintsPropagatedEventJSONSchema = v.object({\n type: v.literal('constraints-propagated'),\n attemptNumber: v.number(),\n connectionConstraints: v.array(\n v.object({\n connection: v.string(),\n constraints: v.record(v.union(plannerConstraintSchema, v.null())),\n constraintCosts: v.record(costEstimateJSONSchema),\n }),\n ),\n});\n\n// `joinType` and `nodeType` are only displayed, so they are open: a client\n// accepts values that a newer server adds instead of failing the whole message.\nconst joinTypeSchema = v.openLiteralUnion('semi', 'flipped', 'unflippable');\n\nconst planCompleteEventJSONSchema = v.object({\n type: v.literal('plan-complete'),\n attemptNumber: v.number(),\n totalCost: v.number(),\n flipPattern: v.number(),\n joinStates: v.array(\n v.object({\n join: v.string(),\n type: joinTypeSchema,\n }),\n ),\n});\n\nconst planFailedEventJSONSchema = v.object({\n type: v.literal('plan-failed'),\n attemptNumber: v.number(),\n reason: v.string(),\n});\n\nconst bestPlanSelectedEventJSONSchema = v.object({\n type: v.literal('best-plan-selected'),\n bestAttemptNumber: v.number(),\n totalCost: v.number(),\n flipPattern: v.number(),\n joinStates: v.array(\n v.object({\n join: v.string(),\n type: joinTypeSchema,\n }),\n ),\n});\n\nconst nodeTypeSchema = v.openLiteralUnion(\n 'connection',\n 'join',\n 'fan-out',\n 'fan-in',\n 'filter',\n 'terminus',\n);\n\nconst nodeCostEventJSONSchema = v.object({\n type: v.literal('node-cost'),\n attemptNumber: v.number().optional(),\n nodeType: nodeTypeSchema,\n node: v.string(),\n branchPattern: v.array(v.number()),\n downstreamChildSelectivity: v.number(),\n costEstimate: costEstimateJSONSchema,\n filters: conditionSchema.optional(),\n ordering: orderingSchema.optional(),\n joinType: joinTypeSchema.optional(),\n});\n\nconst nodeConstraintEventJSONSchema = v.object({\n type: v.literal('node-constraint'),\n attemptNumber: v.number().optional(),\n nodeType: nodeTypeSchema,\n node: v.string(),\n branchPattern: v.array(v.number()),\n constraint: v.union(plannerConstraintSchema, v.null()).optional(),\n from: v.string(),\n});\n\nconst planDebugEventJSONSchema = v.union(\n attemptStartEventJSONSchema,\n connectionCostsEventJSONSchema,\n connectionSelectedEventJSONSchema,\n constraintsPropagatedEventJSONSchema,\n planCompleteEventJSONSchema,\n planFailedEventJSONSchema,\n bestPlanSelectedEventJSONSchema,\n nodeCostEventJSONSchema,\n nodeConstraintEventJSONSchema,\n);\n\nexport type PlanDebugEventJSON = v.Infer<typeof planDebugEventJSONSchema>;\n\nexport {\n attemptStartEventJSONSchema,\n connectionSelectedEventJSONSchema,\n planFailedEventJSONSchema,\n bestPlanSelectedEventJSONSchema,\n nodeConstraintEventJSONSchema,\n};\n\nexport const analyzeQueryResultSchema = v.object({\n warnings: v.array(v.string()),\n syncedRows: v.record(v.array(rowSchema)).optional(),\n syncedRowCount: v.number(),\n start: v.number(),\n /** @deprecated Use start + elapsed instead */\n end: v.number(),\n elapsed: v.number().optional(),\n afterPermissions: v.string().optional(),\n /** @deprecated Use readRowCountsByQuery */\n vendedRowCounts: rowCountsBySourceSchema.optional(),\n /** @deprecated Use readRows */\n vendedRows: rowsBySourceSchema.optional(),\n sqlitePlans: v.record(v.array(v.string())).optional(),\n readRows: rowsBySourceSchema.optional(),\n readRowCountsByQuery: rowCountsBySourceSchema.optional(),\n readRowCount: v.number().optional(),\n dbScansByQuery: rowCountsBySourceSchema.optional(),\n joinPlans: v.array(planDebugEventJSONSchema).optional(),\n});\n\nexport type AnalyzeQueryResult = v.Infer<typeof analyzeQueryResultSchema>;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"application-error.js","names":["#details"],"sources":["../../../../zero-protocol/src/application-error.ts"],"sourcesContent":["import {getErrorDetails, getErrorMessage} from '../../shared/src/error.ts';\nimport type {ReadonlyJSONValue} from '../../shared/src/json.ts';\n\n/**\n * Options accepted by {@link ApplicationError}.\n *\n * Use these when you need to attach additional context to an error that will\n * be sent back to the client.\n */\nexport interface ApplicationErrorOptions<\n T extends ReadonlyJSONValue | undefined,\n> {\n details?: T;\n cause?: unknown;\n}\n\n/**\n * Error type that application code can throw to surface structured metadata back to\n * the client.\n *\n * Use this when you want to return a descriptive message along with the\n * JSON-serializable `details`.\n */\nexport class ApplicationError<\n const T extends ReadonlyJSONValue | undefined = ReadonlyJSONValue | undefined,\n> extends Error {\n /**\n * This maps onto errors for transform and push app-level failures.\n */\n readonly #details: T;\n\n constructor(message: string, options?: ApplicationErrorOptions<T>) {\n super(message, {cause: options?.cause});\n this.name = 'ApplicationError';\n this.#details = options?.details ?? (undefined as T);\n }\n\n get details(): T {\n return this.#details;\n }\n\n get kind(): 'Application' {\n return 'Application';\n }\n}\n\nexport function isApplicationError(error: unknown): error is ApplicationError {\n return error instanceof ApplicationError;\n}\n\nexport function wrapWithApplicationError<\n T extends ReadonlyJSONValue | undefined = ReadonlyJSONValue | undefined,\n>(error: unknown): ApplicationError<T> {\n if (isApplicationError(error)) {\n return error as ApplicationError<T>;\n }\n\n const message = getErrorMessage(error);\n const details = getErrorDetails(error);\n\n return new ApplicationError<T>(message, {\n cause: error,\n details: details as T,\n });\n}\n"],"mappings":";;;;;;;;;AAuBA,IAAa,mBAAb,cAEU,MAAM;;;;CAId;CAEA,YAAY,SAAiB,SAAsC;EACjE,MAAM,SAAS,EAAC,OAAO,SAAS,MAAK,CAAC;EACtC,KAAK,OAAO;EACZ,KAAKA,WAAW,SAAS,WAAY,KAAA;CACvC;CAEA,IAAI,UAAa;EACf,OAAO,KAAKA;CACd;CAEA,IAAI,OAAsB;EACxB,OAAO;CACT;AACF;AAEA,SAAgB,mBAAmB,OAA2C;CAC5E,OAAO,iBAAiB;AAC1B;AAEA,SAAgB,yBAEd,OAAqC;CACrC,IAAI,mBAAmB,KAAK,GAC1B,OAAO;CAMT,OAAO,IAAI,iBAHK,gBAAgB,KAGD,GAAS;EACtC,OAAO;EACE,SAJK,gBAAgB,KAIrB;CACX,CAAC;AACH"}
1
+ {"version":3,"file":"application-error.js","names":[],"sources":["../../../../zero-protocol/src/application-error.ts"],"sourcesContent":["import {getErrorDetails, getErrorMessage} from '../../shared/src/error.ts';\nimport type {ReadonlyJSONValue} from '../../shared/src/json.ts';\n\n/**\n * Options accepted by {@link ApplicationError}.\n *\n * Use these when you need to attach additional context to an error that will\n * be sent back to the client.\n */\nexport interface ApplicationErrorOptions<\n T extends ReadonlyJSONValue | undefined,\n> {\n details?: T;\n cause?: unknown;\n}\n\n/**\n * Error type that application code can throw to surface structured metadata back to\n * the client.\n *\n * Use this when you want to return a descriptive message along with the\n * JSON-serializable `details`.\n */\nexport class ApplicationError<\n const T extends ReadonlyJSONValue | undefined = ReadonlyJSONValue | undefined,\n> extends Error {\n /**\n * This maps onto errors for transform and push app-level failures.\n */\n readonly #details: T;\n\n constructor(message: string, options?: ApplicationErrorOptions<T>) {\n super(message, {cause: options?.cause});\n this.name = 'ApplicationError';\n this.#details = options?.details ?? (undefined as T);\n }\n\n get details(): T {\n return this.#details;\n }\n\n get kind(): 'Application' {\n return 'Application';\n }\n}\n\nexport function isApplicationError(error: unknown): error is ApplicationError {\n return error instanceof ApplicationError;\n}\n\nexport function wrapWithApplicationError<\n T extends ReadonlyJSONValue | undefined = ReadonlyJSONValue | undefined,\n>(error: unknown): ApplicationError<T> {\n if (isApplicationError(error)) {\n return error as ApplicationError<T>;\n }\n\n const message = getErrorMessage(error);\n const details = getErrorDetails(error);\n\n return new ApplicationError<T>(message, {\n cause: error,\n details: details as T,\n });\n}\n"],"mappings":";;;;;;;;;AAuBA,IAAa,mBAAb,cAEU,MAAM;;;;CAId;CAEA,YAAY,SAAiB,SAAsC;EACjE,MAAM,SAAS,EAAC,OAAO,SAAS,MAAK,CAAC;EACtC,KAAK,OAAO;EACZ,KAAK,WAAW,SAAS,WAAY,KAAA;CACvC;CAEA,IAAI,UAAa;EACf,OAAO,KAAK;CACd;CAEA,IAAI,OAAsB;EACxB,OAAO;CACT;AACF;AAEA,SAAgB,mBAAmB,OAA2C;CAC5E,OAAO,iBAAiB;AAC1B;AAEA,SAAgB,yBAEd,OAAqC;CACrC,IAAI,mBAAmB,KAAK,GAC1B,OAAO;CAMT,OAAO,IAAI,iBAHK,gBAAgB,KAGD,GAAS;EACtC,OAAO;EACE,SAJK,gBAAgB,KAIrB;CACX,CAAC;AACH"}
@@ -17,7 +17,8 @@ var SUBQ_PREFIX = "zsubq_";
17
17
  var selectorSchema = valita_exports.string();
18
18
  var toStaticParam = Symbol();
19
19
  var planIdSymbol = Symbol("planId");
20
- var orderingSchema = readonlyArray(readonly(valita_exports.tuple([selectorSchema, literalUnion("asc", "desc")])));
20
+ var orderingElementSchema = readonly(valita_exports.tuple([selectorSchema, literalUnion("asc", "desc")]));
21
+ var orderingSchema = readonlyArray(orderingElementSchema);
21
22
  valita_exports.union(valita_exports.string(), valita_exports.number(), valita_exports.boolean(), valita_exports.null());
22
23
  var equalityOpsSchema = literalUnion("=", "!=", "IS", "IS NOT");
23
24
  var orderOpsSchema = literalUnion("<", ">", "<=", ">=");
@@ -83,14 +84,16 @@ function mustCompoundKey(field) {
83
84
  return field;
84
85
  }
85
86
  var compoundKeySchema = readonly(valita_exports.tuple([valita_exports.string()]).concat(valita_exports.array(valita_exports.string())));
86
- var correlatedSubquerySchema = readonlyObject({
87
- correlation: readonlyObject({
88
- parentField: compoundKeySchema,
89
- childField: compoundKeySchema
90
- }),
87
+ var correlationSchema = readonlyObject({
88
+ parentField: compoundKeySchema,
89
+ childField: compoundKeySchema
90
+ });
91
+ var correlatedSubquerySchemaOmitSubquery = readonlyObject({
92
+ correlation: correlationSchema,
91
93
  hidden: valita_exports.boolean().optional(),
92
94
  system: literalUnion("permissions", "client", "test").optional()
93
- }).extend({ subquery: valita_exports.lazy(() => astSchema) });
95
+ });
96
+ var correlatedSubquerySchema = correlatedSubquerySchemaOmitSubquery.extend({ subquery: valita_exports.lazy(() => astSchema) });
94
97
  var astSchema = readonlyObject({
95
98
  schema: valita_exports.string().optional(),
96
99
  table: valita_exports.string(),
@@ -123,10 +126,17 @@ function conditionExceedsDepth(cond, depth, maxDepth) {
123
126
  return Array.isArray(conditions) && conditions.some((c) => conditionExceedsDepth(c, depth + 1, maxDepth)) || isPlainObject(related) && astExceedsDepth(related.subquery, depth + 1, maxDepth);
124
127
  }
125
128
  /**
129
+ * {@link astSchema} for ASTs sent by clients, which rejects ASTs nested deeper
130
+ * than {@link MAX_AST_DEPTH} before parsing them. ASTs the server stored itself
131
+ * (e.g. in the CVR) are parsed with {@link astSchema} so that ones stored
132
+ * before the limit existed can still be read.
133
+ */
134
+ var depthBoundedAstSchema = Object.assign(valita_exports.unknown().chain((value, options) => exceedsASTDepth(value) ? valita_exports.err(`AST exceeds the maximum depth of 50`) : astSchema.try(value, options)), { depthBounded: astSchema });
135
+ /**
126
136
  * {@link depthBoundedAstSchema} parsed strictly even inside a lenient parse. A
127
137
  * server that ignored an AST field it doesn't know would run a different query.
128
138
  */
129
- var strictASTSchema = strict(Object.assign(valita_exports.unknown().chain((value, options) => exceedsASTDepth(value) ? valita_exports.err(`AST exceeds the maximum depth of 50`) : astSchema.try(value, options)), { depthBounded: astSchema }));
139
+ var strictASTSchema = strict(depthBoundedAstSchema);
130
140
  function transformAST(ast, transform) {
131
141
  const { tableName, columnName } = transform;
132
142
  const colName = (c) => columnName(ast.table, c);
@@ -464,6 +474,6 @@ function cmpOptionalBool(a, b) {
464
474
  return toNum(a) - toNum(b);
465
475
  }
466
476
  //#endregion
467
- export { SUBQ_PREFIX, astSchema, compoundKeySchema, conditionSchema, insertRelated, mapAST, mapCondition, normalizeAST, normalizeCondition, normalizedRelated, orderingSchema, planIdSymbol, strictASTSchema, tableAST, toStaticParam };
477
+ export { SUBQ_PREFIX, astSchema, compoundKeySchema, conditionSchema, correlatedSubqueryConditionOperatorSchema, correlatedSubqueryConditionSchema, correlatedSubquerySchema, correlatedSubquerySchemaOmitSubquery, depthBoundedAstSchema, equalityOpsSchema, exceedsASTDepth, inOpsSchema, insertRelated, likeOpsSchema, mapAST, mapCondition, normalizeAST, normalizeCondition, normalizedAST, normalizedRelated, orderOpsSchema, orderingSchema, planIdSymbol, selectorSchema, simpleConditionSchema, simpleOperatorSchema, strictASTSchema, tableAST, toStaticParam };
468
478
 
469
479
  //# sourceMappingURL=ast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ast.js","names":[],"sources":["../../../../zero-protocol/src/ast.ts"],"sourcesContent":["/**\n * Wire-format representation of the zql AST interface.\n *\n * `v.Type<...>` types are explicitly declared to facilitate Typescript verification\n * that the schemas satisfy the zql type definitions. (Incidentally, explicit types\n * are also required for recursive schema definitions.)\n */\n\nimport {compareUTF8} from 'compare-utf8';\nimport {assert} from '../../shared/src/asserts.ts';\nimport {isPlainObject} from '../../shared/src/deep-merge.ts';\nimport {getOrInsertComputed} from '../../shared/src/map.ts';\nimport {must} from '../../shared/src/must.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport type {NameMapper} from '../../zero-types/src/name-mapper.ts';\nimport {rowSchema, type Row} from './data.ts';\n\nexport const SUBQ_PREFIX = 'zsubq_';\n\nexport const selectorSchema = v.string();\nexport const toStaticParam = Symbol();\nexport const planIdSymbol = Symbol('planId');\n\nconst orderingElementSchema = v.readonly(\n v.tuple([selectorSchema, v.literalUnion('asc', 'desc')]),\n);\n\nexport const orderingSchema = v.readonlyArray(orderingElementSchema);\nexport type System = 'permissions' | 'client' | 'test';\n\nexport const primitiveSchema = v.union(\n v.string(),\n v.number(),\n v.boolean(),\n v.null(),\n);\n\nexport const equalityOpsSchema = v.literalUnion('=', '!=', 'IS', 'IS NOT');\n\nexport const orderOpsSchema = v.literalUnion('<', '>', '<=', '>=');\n\nexport const likeOpsSchema = v.literalUnion(\n 'LIKE',\n 'NOT LIKE',\n 'ILIKE',\n 'NOT ILIKE',\n);\n\nexport const inOpsSchema = v.literalUnion('IN', 'NOT IN');\n\nexport const simpleOperatorSchema = v.union(\n equalityOpsSchema,\n orderOpsSchema,\n likeOpsSchema,\n inOpsSchema,\n);\n\nconst literalReferenceSchema: v.Type<LiteralReference> = v.readonlyObject({\n type: v.literal('literal'),\n value: v.union(\n v.string(),\n v.number(),\n v.boolean(),\n v.null(),\n v.readonlyArray(v.union(v.string(), v.number(), v.boolean())),\n ),\n});\nconst columnReferenceSchema: v.Type<ColumnReference> = v.readonlyObject({\n type: v.literal('column'),\n name: v.string(),\n});\n\n/**\n * A parameter is a value that is not known at the time the query is written\n * and is resolved at runtime.\n *\n * Static parameters refer to something provided by the caller.\n * Static parameters are injected when the query pipeline is built from the AST\n * and do not change for the life of that pipeline.\n *\n * An example static parameter is the current authentication data.\n * When a user is authenticated, queries on the server have access\n * to the user's authentication data in order to evaluate authorization rules.\n * Authentication data doesn't change over the life of a query as a change\n * in auth data would represent a log-in / log-out of the user.\n *\n * AncestorParameters refer to rows encountered while running the query.\n * They are used by subqueries to refer to rows emitted by parent queries.\n */\nconst parameterReferenceSchema = v.readonlyObject({\n type: v.literal('static'),\n // The \"namespace\" of the injected parameter.\n // Write authorization will send the value of a row\n // prior to the mutation being run (preMutationRow).\n // Read and write authorization will both send the\n // current authentication data (authData).\n anchor: v.literalUnion('authData', 'preMutationRow'),\n field: v.union(v.string(), v.array(v.string())),\n});\n\nconst conditionValueSchema = v.union(\n literalReferenceSchema,\n columnReferenceSchema,\n parameterReferenceSchema,\n);\n\nexport type Parameter = v.Infer<typeof parameterReferenceSchema>;\n\nexport const simpleConditionSchema: v.Type<SimpleCondition> = v.readonlyObject({\n type: v.literal('simple'),\n op: simpleOperatorSchema,\n left: conditionValueSchema,\n right: v.union(parameterReferenceSchema, literalReferenceSchema),\n});\n\ntype ConditionValue = v.Infer<typeof conditionValueSchema>;\n\nexport const correlatedSubqueryConditionOperatorSchema: v.Type<CorrelatedSubqueryConditionOperator> =\n v.literalUnion('EXISTS', 'NOT EXISTS');\n\nexport const correlatedSubqueryConditionSchema: v.Type<CorrelatedSubqueryCondition> =\n v.readonlyObject({\n type: v.literal('correlatedSubquery'),\n related: v.lazy(() => correlatedSubquerySchema),\n op: correlatedSubqueryConditionOperatorSchema,\n flip: v.boolean().optional(),\n scalar: v.boolean().optional(),\n });\n\nexport const conditionSchema: v.Type<Condition> = v.union(\n simpleConditionSchema,\n v.lazy(() => conjunctionSchema),\n v.lazy(() => disjunctionSchema),\n correlatedSubqueryConditionSchema,\n);\n\nconst conjunctionSchema: v.Type<Conjunction> = v.readonlyObject({\n type: v.literal('and'),\n conditions: v.readonlyArray(conditionSchema),\n});\n\nconst disjunctionSchema: v.Type<Disjunction> = v.readonlyObject({\n type: v.literal('or'),\n conditions: v.readonlyArray(conditionSchema),\n});\n\nexport type CompoundKey = readonly [string, ...string[]];\n\nfunction mustCompoundKey(field: readonly string[]): CompoundKey {\n assert(\n Array.isArray(field) && field.length >= 1,\n 'Expected non-empty array for compound key',\n );\n return field as unknown as CompoundKey;\n}\n\nexport const compoundKeySchema: v.Type<CompoundKey> = v.readonly(\n // oxlint-disable-next-line e18e/prefer-spread-syntax\n v.tuple([v.string()]).concat(v.array(v.string())),\n);\n\nconst correlationSchema = v.readonlyObject({\n parentField: compoundKeySchema,\n childField: compoundKeySchema,\n});\n\n// Split out so that its inferred type can be checked against\n// Omit<CorrelatedSubquery, 'correlation'> in ast-type-test.ts.\n// The mutually-recursive reference of the 'other' field to astSchema\n// is the only thing added in v.lazy. The v.lazy is necessary due to the\n// mutually-recursive types, but v.lazy prevents inference of the resulting\n// type.\nexport const correlatedSubquerySchemaOmitSubquery = v.readonlyObject({\n correlation: correlationSchema,\n hidden: v.boolean().optional(),\n system: v.literalUnion('permissions', 'client', 'test').optional(),\n});\n\nexport const correlatedSubquerySchema: v.Type<CorrelatedSubquery> =\n correlatedSubquerySchemaOmitSubquery.extend({\n subquery: v.lazy(() => astSchema),\n });\n\nexport const astSchema: v.Type<AST> = v.readonlyObject({\n schema: v.string().optional(),\n table: v.string(),\n alias: v.string().optional(),\n where: conditionSchema.optional(),\n related: v.readonlyArray(correlatedSubquerySchema).optional(),\n limit: v.number().optional(),\n orderBy: orderingSchema.optional(),\n start: v\n .object({\n row: rowSchema,\n exclusive: v.boolean(),\n })\n .optional(),\n});\n\n/**\n * The maximum nesting depth of an AST sent by a client, counting and/or\n * conditions, correlated subqueries and related subqueries. Parsing and the\n * AST visitors in zero-cache are recursive, so a single deeply nested AST can\n * otherwise overflow the stack or burn seconds of CPU. Realistic queries,\n * permission rules included, are less than 10 levels deep.\n */\nexport const MAX_AST_DEPTH = 50;\n\n/**\n * Returns whether the unparsed `ast` is nested deeper than `maxDepth`.\n */\nexport function exceedsASTDepth(\n ast: unknown,\n maxDepth = MAX_AST_DEPTH,\n): boolean {\n return astExceedsDepth(ast, 0, maxDepth);\n}\n\n// Every step down increases the depth, except the one from an AST into its\n// where clause, so the recursion stops within 2 * maxDepth steps and cannot\n// overflow the stack.\nfunction astExceedsDepth(\n ast: unknown,\n depth: number,\n maxDepth: number,\n): boolean {\n if (depth > maxDepth) {\n return true;\n }\n if (!isPlainObject(ast)) {\n return false;\n }\n const {where, related} = ast;\n return (\n conditionExceedsDepth(where, depth, maxDepth) ||\n (Array.isArray(related) &&\n related.some(\n r =>\n isPlainObject(r) && astExceedsDepth(r.subquery, depth + 1, maxDepth),\n ))\n );\n}\n\nfunction conditionExceedsDepth(\n cond: unknown,\n depth: number,\n maxDepth: number,\n): boolean {\n if (depth > maxDepth) {\n return true;\n }\n if (!isPlainObject(cond)) {\n return false;\n }\n const {conditions, related} = cond;\n return (\n (Array.isArray(conditions) &&\n conditions.some(c => conditionExceedsDepth(c, depth + 1, maxDepth))) ||\n (isPlainObject(related) &&\n astExceedsDepth(related.subquery, depth + 1, maxDepth))\n );\n}\n\n/**\n * {@link astSchema} for ASTs sent by clients, which rejects ASTs nested deeper\n * than {@link MAX_AST_DEPTH} before parsing them. ASTs the server stored itself\n * (e.g. in the CVR) are parsed with {@link astSchema} so that ones stored\n * before the limit existed can still be read.\n */\nexport const depthBoundedAstSchema: v.Type<AST> = Object.assign(\n v\n .unknown()\n .chain((value, options) =>\n exceedsASTDepth(value)\n ? v.err(`AST exceeds the maximum depth of ${MAX_AST_DEPTH}`)\n : astSchema.try(value, options),\n ),\n // A transform serializes as just its name. Show astSchema too, so a change\n // to it still changes the hash in protocol-version.test.ts.\n {depthBounded: astSchema},\n);\n\n/**\n * {@link depthBoundedAstSchema} parsed strictly even inside a lenient parse. A\n * server that ignored an AST field it doesn't know would run a different query.\n */\nexport const strictASTSchema: v.Type<AST> = v.strict(depthBoundedAstSchema);\n\nexport type Bound = {\n row: Row;\n exclusive: boolean;\n};\n\n/**\n * As in SQL you can have multiple orderings. We don't currently\n * support ordering on anything other than the root query.\n */\nexport type OrderPart = readonly [field: string, direction: 'asc' | 'desc'];\nexport type Ordering = readonly OrderPart[];\n\nexport type SimpleOperator = EqualityOps | OrderOps | LikeOps | InOps;\nexport type EqualityOps = '=' | '!=' | 'IS' | 'IS NOT';\nexport type OrderOps = '<' | '>' | '<=' | '>=';\nexport type LikeOps = 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE';\nexport type InOps = 'IN' | 'NOT IN';\n\nexport type AST = {\n readonly schema?: string | undefined;\n readonly table: string;\n\n // A query would be aliased if the AST is a subquery.\n // e.g., when two subqueries select from the same table\n // they need an alias to differentiate them.\n // `SELECT\n // [SELECT * FROM issue WHERE issue.id = outer.parentId] AS parent\n // [SELECT * FROM issue WHERE issue.parentId = outer.id] AS children\n // FROM issue as outer`\n readonly alias?: string | undefined;\n\n // `select` is missing given we return all columns for now.\n\n // The PipelineBuilder will pick what to use to correlate\n // a subquery with a parent query. It can choose something from the\n // where conditions or choose the _first_ `related` entry.\n // Choosing the first `related` entry is almost always the best choice if\n // one exists.\n readonly where?: Condition | undefined;\n\n readonly related?: readonly CorrelatedSubquery[] | undefined;\n readonly start?: Bound | undefined;\n readonly limit?: number | undefined;\n readonly orderBy?: Ordering | undefined;\n};\n\nexport type Correlation = {\n readonly parentField: CompoundKey;\n readonly childField: CompoundKey;\n};\n\nexport type CorrelatedSubquery = {\n /**\n * Only equality correlation are supported for now.\n * E.g., direct foreign key relationships.\n */\n readonly correlation: Correlation;\n readonly subquery: AST;\n readonly system?: System | undefined;\n // If a hop in the subquery chain should be hidden from the output view.\n // A common example is junction edges. The query API provides the illusion\n // that they don't exist: `issue.related('labels')` instead of `issue.related('issue_labels').related('labels')`.\n // To maintain this illusion, the junction edge should be hidden.\n // When `hidden` is set to true, this hop will not be included in the output view\n // but its children will be.\n readonly hidden?: boolean | undefined;\n};\n\nexport type ValuePosition = LiteralReference | Parameter | ColumnReference;\n\nexport type ColumnReference = {\n readonly type: 'column';\n /**\n * Not a path yet as we're currently not allowing\n * comparisons across tables. This will need to\n * be a path through the tree in the near future.\n */\n readonly name: string;\n};\n\nexport type LiteralReference = {\n readonly type: 'literal';\n readonly value: LiteralValue;\n};\n\nexport type LiteralValue =\n | string\n | number\n | boolean\n | null\n | ReadonlyArray<string | number | boolean>;\n\n/**\n * Starting only with SimpleCondition for now.\n * ivm1 supports Conjunctions and Disjunctions.\n * We'll support them in the future.\n */\nexport type Condition =\n | SimpleCondition\n | Conjunction\n | Disjunction\n | CorrelatedSubqueryCondition;\n\nexport type SimpleCondition = {\n readonly type: 'simple';\n readonly op: SimpleOperator;\n readonly left: ValuePosition;\n\n /**\n * `null` is absent since we do not have an `IS` or `IS NOT`\n * operator defined and `null != null` in SQL.\n */\n readonly right: Exclude<ValuePosition, ColumnReference>;\n};\n\nexport type Conjunction = {\n type: 'and';\n conditions: readonly Condition[];\n};\n\nexport type Disjunction = {\n type: 'or';\n conditions: readonly Condition[];\n};\n\nexport type CorrelatedSubqueryCondition = {\n type: 'correlatedSubquery';\n related: CorrelatedSubquery;\n op: CorrelatedSubqueryConditionOperator;\n flip?: boolean | undefined;\n scalar?: boolean | undefined;\n [planIdSymbol]?: number | undefined;\n};\n\nexport type CorrelatedSubqueryConditionOperator = 'EXISTS' | 'NOT EXISTS';\n\ninterface ASTTransform {\n tableName(orig: string): string;\n columnName(origTable: string, origColumn: string): string;\n}\n\nfunction transformAST(ast: AST, transform: ASTTransform): Required<AST> {\n // Name mapping functions (e.g. to server names)\n const {tableName, columnName} = transform;\n const colName = (c: string) => columnName(ast.table, c);\n const key = (table: string, k: CompoundKey) => {\n const serverKey = k.map(col => columnName(table, col));\n return mustCompoundKey(serverKey);\n };\n\n const transformed = {\n schema: ast.schema,\n table: tableName(ast.table),\n alias: ast.alias,\n where: ast.where\n ? transformWhere(ast.where, ast.table, transform)\n : undefined,\n related: ast.related?.map(\n r =>\n ({\n correlation: {\n parentField: key(ast.table, r.correlation.parentField),\n childField: key(r.subquery.table, r.correlation.childField),\n },\n hidden: r.hidden,\n subquery: transformAST(r.subquery, transform),\n system: r.system,\n }) satisfies Required<CorrelatedSubquery>,\n ),\n start: ast.start\n ? {\n ...ast.start,\n row: Object.fromEntries(\n Object.entries(ast.start.row).map(([col, val]) => [\n colName(col),\n val,\n ]),\n ),\n }\n : undefined,\n limit: ast.limit,\n orderBy: ast.orderBy?.map(([col, dir]) => [colName(col), dir] as const),\n };\n\n return transformed;\n}\n\nfunction transformWhere(\n where: Condition,\n table: string,\n transform: ASTTransform,\n): Condition {\n // Name mapping functions (e.g. to server names)\n const {columnName} = transform;\n const condValue = (c: ConditionValue) =>\n c.type !== 'column' ? c : {...c, name: columnName(table, c.name)};\n const key = (table: string, k: CompoundKey) => {\n const serverKey = k.map(col => columnName(table, col));\n return mustCompoundKey(serverKey);\n };\n\n if (where.type === 'simple') {\n return {...where, left: condValue(where.left)};\n } else if (where.type === 'correlatedSubquery') {\n const {correlation, subquery} = where.related;\n return {\n ...where,\n related: {\n ...where.related,\n correlation: {\n parentField: key(table, correlation.parentField),\n childField: key(subquery.table, correlation.childField),\n },\n subquery: transformAST(subquery, transform),\n },\n };\n }\n\n return {\n type: where.type,\n conditions: where.conditions.map(c => transformWhere(c, table, transform)),\n };\n}\n\ndeclare const normalizedTag: unique symbol;\n\n/**\n * An {@link AST} in its normalized form: `related` is sorted, `where` is\n * flattened and sorted, and every field is present, in a fixed order. Two ASTs\n * that describe the same query have the same JSON encoding, and thus the same\n * hash, once normalized.\n *\n * The tag only exists in the type, so the only way to get one is from\n * {@link normalizeAST}, {@link normalizedAST} or {@link tableAST}. Spreading\n * one keeps the tag, which is what lets a query builder derive a normalized\n * AST from another one by replacing a field it knows to be safe.\n */\nexport type NormalizedAST = Required<AST> & {readonly [normalizedTag]: true};\n\nfunction asNormalized(ast: Required<AST>): NormalizedAST {\n return ast as NormalizedAST;\n}\n\nconst normalizeCache = new WeakMap<AST, NormalizedAST>();\n\nexport function normalizeAST(ast: AST): NormalizedAST {\n return getOrInsertComputed(normalizeCache, ast, normalizeASTUncached);\n}\n\nfunction normalizeASTUncached(ast: AST): NormalizedAST {\n // normalizedAST() normalizes a single level, so normalize the subqueries\n // first.\n const {where, related} = ast;\n return normalizedAST({\n ...ast,\n where: where && normalizeSubqueries(where),\n related: related?.map(r =>\n normalizedRelated({...r, subquery: normalizeAST(r.subquery)}),\n ),\n });\n}\n\n/**\n * Normalizes the ASTs of the correlated subqueries of `cond`. The condition\n * itself is normalized by {@link normalizeCondition}.\n */\nfunction normalizeSubqueries(cond: Condition): Condition {\n switch (cond.type) {\n case 'simple':\n return cond;\n case 'correlatedSubquery':\n return {\n ...cond,\n related: {\n ...cond.related,\n subquery: normalizeAST(cond.related.subquery),\n },\n };\n default:\n return {\n type: cond.type,\n conditions: cond.conditions.map(normalizeSubqueries),\n };\n }\n}\n\n/**\n * Normalizes a single level of an AST, assuming that the ASTs of its\n * subqueries (i.e. those in `related` and in correlated subquery conditions)\n * are already normalized and that the `related` entries have the shape that\n * {@link normalizedRelated} gives them.\n *\n * This lets a query builder keep its AST normalized as it builds it up\n * instead of normalizing the whole tree afterwards. A builder that knows\n * which of the rules a step can break at all is better off applying just\n * those (see {@link tableAST}, {@link insertRelated} and\n * {@link normalizeCondition}).\n */\nexport function normalizedAST(ast: AST): NormalizedAST {\n const {schema, table, alias, where, related, start, limit, orderBy} = ast;\n // Every field is written, in the same order, so that all normalized ASTs\n // have the same shape (one hidden class) and the same JSON encoding (and\n // thus the same hash) no matter how they were put together. The fields that\n // are undefined are dropped by JSON.stringify() anyway.\n return asNormalized({\n schema,\n table,\n alias,\n where: where === undefined ? undefined : normalizeCondition(where),\n related: related === undefined ? undefined : normalizeRelated(related),\n start,\n limit,\n orderBy,\n });\n}\n\n/**\n * The normalized AST that selects a whole table. Spreading it (or any other\n * normalized AST) and replacing a field keeps the field order, since a\n * normalized AST has every field.\n */\nexport function tableAST(\n table: string,\n alias?: string | undefined,\n): NormalizedAST {\n return asNormalized({\n schema: undefined,\n table,\n alias,\n where: undefined,\n related: undefined,\n start: undefined,\n limit: undefined,\n orderBy: undefined,\n });\n}\n\n/**\n * Adds `subquery` to the `related` of a normalized AST, at the position that\n * keeps it sorted.\n */\nexport function insertRelated(\n related: readonly CorrelatedSubquery[] | undefined,\n subquery: CorrelatedSubquery,\n): readonly CorrelatedSubquery[] {\n const normalized = normalizedRelated(subquery);\n if (related === undefined) {\n return [normalized];\n }\n // Sorting is stable, so an entry goes after the ones it compares equal to.\n let i = related.length;\n while (i > 0 && cmpRelated(related[i - 1], normalized) > 0) {\n i--;\n }\n return related.toSpliced(i, 0, normalized);\n}\n\n// Conjunctions and disjunctions that are known to be normalized. The query\n// builder rebuilds its AST for every step, so this keeps the conditions that\n// did not change from being normalized over and over again.\nconst normalizedConditions = new WeakSet<Condition>();\n\nfunction normalizeRelated(\n related: readonly CorrelatedSubquery[],\n): readonly CorrelatedSubquery[] {\n for (let i = 1; i < related.length; i++) {\n if (cmpRelated(related[i - 1], related[i]) > 0) {\n return related.toSorted(cmpRelated);\n }\n }\n return related;\n}\n\n/**\n * Gives a correlated subquery the shape that a normalized AST has: every\n * field, in a fixed order (see {@link normalizedAST}). Its `subquery` must\n * already be normalized.\n */\nexport function normalizedRelated(\n related: CorrelatedSubquery,\n): Required<CorrelatedSubquery> {\n const {correlation, hidden, subquery, system} = related;\n return {\n correlation: {\n parentField: correlation.parentField,\n childField: correlation.childField,\n },\n hidden,\n subquery,\n system,\n };\n}\n\nfunction normalizeValuePosition<T extends ValuePosition>(v: T): T {\n switch (v.type) {\n case 'literal':\n return {type: 'literal', value: v.value} as T;\n case 'column':\n return {type: 'column', name: v.name} as T;\n default:\n return {type: 'static', anchor: v.anchor, field: v.field} as T;\n }\n}\n\n/**\n * Normalizes a condition, assuming that the ASTs of any correlated subqueries\n * it contains are already normalized.\n *\n * Like {@link normalizedAST}, this rebuilds every node with its fields in a\n * fixed order, so that structurally equal conditions have the same JSON\n * encoding (and thus the same hash) no matter how they were put together.\n * That includes a round trip through Postgres, whose jsonb type reorders\n * object keys: without the rebuild, every query record reloaded from the CVR\n * re-hashed to a different transformationHash than was stored, making it look\n * changed and re-execute on every view-syncer restart.\n */\nexport function normalizeCondition(cond: Condition): Condition {\n if (normalizedConditions.has(cond)) {\n return cond;\n }\n if (cond.type === 'simple') {\n const normalized: Condition = {\n type: 'simple',\n op: cond.op,\n left: normalizeValuePosition(cond.left),\n right: normalizeValuePosition(cond.right),\n };\n normalizedConditions.add(normalized);\n return normalized;\n }\n if (cond.type === 'correlatedSubquery') {\n const normalized: Condition = {\n type: 'correlatedSubquery',\n related: normalizedRelated(cond.related),\n op: cond.op,\n flip: cond.flip,\n scalar: cond.scalar,\n };\n normalizedConditions.add(normalized);\n return normalized;\n }\n\n // Flatten the conditions of nested conjunctions of the same type and sort\n // them. The nested conditions are normalized (and thus flattened and sorted)\n // first.\n const conditions: Condition[] = [];\n for (const c of cond.conditions) {\n const n = normalizeCondition(c);\n if (n.type === cond.type) {\n conditions.push(...n.conditions);\n } else {\n conditions.push(n);\n }\n }\n\n // A singleton conjunction is the same as the condition itself. Empty\n // conjunctions, on the other hand, are meaningful: an empty 'and' is always\n // true and an empty 'or' is always false.\n if (conditions.length === 1) {\n return conditions[0];\n }\n conditions.sort(cmpCondition);\n const normalized: Condition = {type: cond.type, conditions};\n normalizedConditions.add(normalized);\n return normalized;\n}\n\n/**\n * Maps the table and column names of `ast`. The result is not a\n * {@link NormalizedAST} even if `ast` was normalized: the names it sorts by\n * are the ones that changed.\n */\nexport function mapAST(ast: AST, mapper: NameMapper) {\n return transformAST(ast, {\n tableName: table => mapper.tableName(table),\n columnName: (table, col) => mapper.columnName(table, col),\n });\n}\n\nexport function mapCondition(\n cond: Condition,\n table: string,\n mapper: NameMapper,\n) {\n return transformWhere(cond, table, {\n tableName: table => mapper.tableName(table),\n columnName: (table, col) => mapper.columnName(table, col),\n });\n}\n\nfunction cmpCondition(a: Condition, b: Condition): number {\n if (a.type === 'simple') {\n if (b.type !== 'simple') {\n return -1; // Order SimpleConditions first\n }\n\n return (\n compareValuePosition(a.left, b.left) ||\n compareUTF8MaybeNull(a.op, b.op) ||\n compareValuePosition(a.right, b.right)\n );\n }\n\n if (b.type === 'simple') {\n return 1; // Order SimpleConditions first\n }\n\n if (a.type === 'correlatedSubquery') {\n if (b.type !== 'correlatedSubquery') {\n return -1; // Order subquery before conjuctions/disjuctions\n }\n return (\n cmpRelated(a.related, b.related) ||\n compareUTF8MaybeNull(a.op, b.op) ||\n cmpOptionalBool(a.flip, b.flip) ||\n cmpOptionalBool(a.scalar, b.scalar)\n );\n }\n if (b.type === 'correlatedSubquery') {\n return -1; // Order correlatedSubquery before conjuctions/disjuctions\n }\n\n const val = compareUTF8MaybeNull(a.type, b.type);\n if (val !== 0) {\n return val;\n }\n for (\n let l = 0, r = 0;\n l < a.conditions.length && r < b.conditions.length;\n l++, r++\n ) {\n const val = cmpCondition(a.conditions[l], b.conditions[r]);\n if (val !== 0) {\n return val;\n }\n }\n // prefixes first\n return a.conditions.length - b.conditions.length;\n}\n\nfunction compareValuePosition(a: ValuePosition, b: ValuePosition): number {\n if (a.type !== b.type) {\n return compareUTF8(a.type, b.type);\n }\n switch (a.type) {\n case 'literal':\n assert(b.type === 'literal', 'Expected literal type for comparison');\n return cmpLiteralValue(a.value, b.value);\n case 'column':\n assert(b.type === 'column', 'Expected column type for comparison');\n return compareUTF8(a.name, b.name);\n case 'static':\n assert(b.type === 'static', 'Expected static type for comparison');\n // A field is a string or a path of strings, which cmpLiteralValue()\n // tells apart.\n return (\n compareUTF8(a.anchor, b.anchor) || cmpLiteralValue(a.field, b.field)\n );\n }\n}\n\n// null < boolean < number < string < array. Ordering values of different\n// types by their string form would make distinct values compare equal (['a',\n// 'b'] and 'a,b', or 1 and '1'), which would leave their order up to the\n// order they were written in, and with it the hash of the query.\nconst LITERAL_VALUE_TYPES = ['object', 'boolean', 'number', 'string'];\n\nfunction literalValueType(value: LiteralValue): number {\n return Array.isArray(value)\n ? LITERAL_VALUE_TYPES.length\n : LITERAL_VALUE_TYPES.indexOf(typeof value);\n}\n\nfunction cmpLiteralValue(a: LiteralValue, b: LiteralValue): number {\n const type = literalValueType(a) - literalValueType(b);\n if (type !== 0) {\n return type;\n }\n\n if (Array.isArray(a)) {\n assert(Array.isArray(b), 'Expected array for comparison');\n for (let i = 0; i < a.length && i < b.length; i++) {\n const val = cmpLiteralValue(a[i], b[i]);\n if (val !== 0) {\n return val;\n }\n }\n // prefixes first\n return a.length - b.length;\n }\n\n switch (typeof a) {\n case 'string':\n assert(typeof b === 'string', 'Expected string for comparison');\n return compareUTF8(a, b);\n case 'number':\n assert(typeof b === 'number', 'Expected number for comparison');\n return a < b ? -1 : a > b ? 1 : 0;\n case 'boolean':\n assert(typeof b === 'boolean', 'Expected boolean for comparison');\n return Number(a) - Number(b);\n default:\n return 0; // null\n }\n}\n\nfunction cmpRelated(a: CorrelatedSubquery, b: CorrelatedSubquery): number {\n return compareUTF8(must(a.subquery.alias), must(b.subquery.alias));\n}\n\nfunction compareUTF8MaybeNull(a: string | null, b: string | null): number {\n if (a !== null && b !== null) {\n return compareUTF8(a, b);\n }\n if (b !== null) {\n return -1;\n }\n if (a !== null) {\n return 1;\n }\n return 0;\n}\n\nfunction cmpOptionalBool(\n a: boolean | undefined,\n b: boolean | undefined,\n): number {\n // undefined < false < true\n const toNum = (v: boolean | undefined) => (v === undefined ? 0 : v ? 2 : 1);\n return toNum(a) - toNum(b);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,IAAa,cAAc;AAE3B,IAAa,iBAAiB,eAAE,OAAO;AACvC,IAAa,gBAAgB,OAAO;AACpC,IAAa,eAAe,OAAO,QAAQ;AAM3C,IAAa,iBAAiB,cAJA,SAC5B,eAAE,MAAM,CAAC,gBAAgB,aAAe,OAAO,MAAM,CAAC,CAAC,CAGX,CAAqB;AAGpC,eAAE,MAC/B,eAAE,OAAO,GACT,eAAE,OAAO,GACT,eAAE,QAAQ,GACV,eAAE,KAAK,CACT;AAEA,IAAa,oBAAoB,aAAe,KAAK,MAAM,MAAM,QAAQ;AAEzE,IAAa,iBAAiB,aAAe,KAAK,KAAK,MAAM,IAAI;AAEjE,IAAa,gBAAgB,aAC3B,QACA,YACA,SACA,WACF;AAEA,IAAa,cAAc,aAAe,MAAM,QAAQ;AAExD,IAAa,uBAAuB,eAAE,MACpC,mBACA,gBACA,eACA,WACF;AAEA,IAAM,yBAAmD,eAAiB;CACxE,MAAM,eAAE,QAAQ,SAAS;CACzB,OAAO,eAAE,MACP,eAAE,OAAO,GACT,eAAE,OAAO,GACT,eAAE,QAAQ,GACV,eAAE,KAAK,GACP,cAAgB,eAAE,MAAM,eAAE,OAAO,GAAG,eAAE,OAAO,GAAG,eAAE,QAAQ,CAAC,CAAC,CAC9D;AACF,CAAC;AACD,IAAM,wBAAiD,eAAiB;CACtE,MAAM,eAAE,QAAQ,QAAQ;CACxB,MAAM,eAAE,OAAO;AACjB,CAAC;;;;;;;;;;;;;;;;;;AAmBD,IAAM,2BAA2B,eAAiB;CAChD,MAAM,eAAE,QAAQ,QAAQ;CAMxB,QAAQ,aAAe,YAAY,gBAAgB;CACnD,OAAO,eAAE,MAAM,eAAE,OAAO,GAAG,eAAE,MAAM,eAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,IAAM,uBAAuB,eAAE,MAC7B,wBACA,uBACA,wBACF;AAIA,IAAa,wBAAiD,eAAiB;CAC7E,MAAM,eAAE,QAAQ,QAAQ;CACxB,IAAI;CACJ,MAAM;CACN,OAAO,eAAE,MAAM,0BAA0B,sBAAsB;AACjE,CAAC;AAID,IAAa,4CACX,aAAe,UAAU,YAAY;AAEvC,IAAa,oCACX,eAAiB;CACf,MAAM,eAAE,QAAQ,oBAAoB;CACpC,SAAS,eAAE,WAAW,wBAAwB;CAC9C,IAAI;CACJ,MAAM,eAAE,QAAQ,EAAE,SAAS;CAC3B,QAAQ,eAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAEH,IAAa,kBAAqC,eAAE,MAClD,uBACA,eAAE,WAAW,iBAAiB,GAC9B,eAAE,WAAW,iBAAiB,GAC9B,iCACF;AAEA,IAAM,oBAAyC,eAAiB;CAC9D,MAAM,eAAE,QAAQ,KAAK;CACrB,YAAY,cAAgB,eAAe;AAC7C,CAAC;AAED,IAAM,oBAAyC,eAAiB;CAC9D,MAAM,eAAE,QAAQ,IAAI;CACpB,YAAY,cAAgB,eAAe;AAC7C,CAAC;AAID,SAAS,gBAAgB,OAAuC;CAC9D,OACE,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,GACxC,2CACF;CACA,OAAO;AACT;AAEA,IAAa,oBAAyC,SAEpD,eAAE,MAAM,CAAC,eAAE,OAAO,CAAC,CAAC,EAAE,OAAO,eAAE,MAAM,eAAE,OAAO,CAAC,CAAC,CAClD;AAmBA,IAAa,2BANuC,eAAiB;CACnE,aAZwB,eAAiB;EACzC,aAAa;EACb,YAAY;CACd,CASe;CACb,QAAQ,eAAE,QAAQ,EAAE,SAAS;CAC7B,QAAQ,aAAe,eAAe,UAAU,MAAM,EAAE,SAAS;AACnE,CAGE,EAAqC,OAAO,EAC1C,UAAU,eAAE,WAAW,SAAS,EAClC,CAAC;AAEH,IAAa,YAAyB,eAAiB;CACrD,QAAQ,eAAE,OAAO,EAAE,SAAS;CAC5B,OAAO,eAAE,OAAO;CAChB,OAAO,eAAE,OAAO,EAAE,SAAS;CAC3B,OAAO,gBAAgB,SAAS;CAChC,SAAS,cAAgB,wBAAwB,EAAE,SAAS;CAC5D,OAAO,eAAE,OAAO,EAAE,SAAS;CAC3B,SAAS,eAAe,SAAS;CACjC,OAAO,eACJ,OAAO;EACN,KAAK;EACL,WAAW,eAAE,QAAQ;CACvB,CAAC,EACA,SAAS;AACd,CAAC;;;;AAcD,SAAgB,gBACd,KACA,WAAA,IACS;CACT,OAAO,gBAAgB,KAAK,GAAG,QAAQ;AACzC;AAKA,SAAS,gBACP,KACA,OACA,UACS;CACT,IAAI,QAAQ,UACV,OAAO;CAET,IAAI,CAAC,cAAc,GAAG,GACpB,OAAO;CAET,MAAM,EAAC,OAAO,YAAW;CACzB,OACE,sBAAsB,OAAO,OAAO,QAAQ,KAC3C,MAAM,QAAQ,OAAO,KACpB,QAAQ,MACN,MACE,cAAc,CAAC,KAAK,gBAAgB,EAAE,UAAU,QAAQ,GAAG,QAAQ,CACvE;AAEN;AAEA,SAAS,sBACP,MACA,OACA,UACS;CACT,IAAI,QAAQ,UACV,OAAO;CAET,IAAI,CAAC,cAAc,IAAI,GACrB,OAAO;CAET,MAAM,EAAC,YAAY,YAAW;CAC9B,OACG,MAAM,QAAQ,UAAU,KACvB,WAAW,MAAK,MAAK,sBAAsB,GAAG,QAAQ,GAAG,QAAQ,CAAC,KACnE,cAAc,OAAO,KACpB,gBAAgB,QAAQ,UAAU,QAAQ,GAAG,QAAQ;AAE3D;;;;;AAyBA,IAAa,kBAA+B,OAjBM,OAAO,OACvD,eACG,QAAQ,EACR,OAAO,OAAO,YACb,gBAAgB,KAAK,IACjB,eAAE,IAAI,qCAAmD,IACzD,UAAU,IAAI,OAAO,OAAO,CAClC,GAGF,EAAC,cAAc,UAAS,CAO2B,CAAqB;AA+I1E,SAAS,aAAa,KAAU,WAAwC;CAEtE,MAAM,EAAC,WAAW,eAAc;CAChC,MAAM,WAAW,MAAc,WAAW,IAAI,OAAO,CAAC;CACtD,MAAM,OAAO,OAAe,MAAmB;EAE7C,OAAO,gBADW,EAAE,KAAI,QAAO,WAAW,OAAO,GAAG,CAC7B,CAAS;CAClC;CAoCA,OAAO;EAjCL,QAAQ,IAAI;EACZ,OAAO,UAAU,IAAI,KAAK;EAC1B,OAAO,IAAI;EACX,OAAO,IAAI,QACP,eAAe,IAAI,OAAO,IAAI,OAAO,SAAS,IAC9C,KAAA;EACJ,SAAS,IAAI,SAAS,KACpB,OACG;GACC,aAAa;IACX,aAAa,IAAI,IAAI,OAAO,EAAE,YAAY,WAAW;IACrD,YAAY,IAAI,EAAE,SAAS,OAAO,EAAE,YAAY,UAAU;GAC5D;GACA,QAAQ,EAAE;GACV,UAAU,aAAa,EAAE,UAAU,SAAS;GAC5C,QAAQ,EAAE;EACZ,EACJ;EACA,OAAO,IAAI,QACP;GACE,GAAG,IAAI;GACP,KAAK,OAAO,YACV,OAAO,QAAQ,IAAI,MAAM,GAAG,EAAE,KAAK,CAAC,KAAK,SAAS,CAChD,QAAQ,GAAG,GACX,GACF,CAAC,CACH;EACF,IACA,KAAA;EACJ,OAAO,IAAI;EACX,SAAS,IAAI,SAAS,KAAK,CAAC,KAAK,SAAS,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAU;CAGjE;AACT;AAEA,SAAS,eACP,OACA,OACA,WACW;CAEX,MAAM,EAAC,eAAc;CACrB,MAAM,aAAa,MACjB,EAAE,SAAS,WAAW,IAAI;EAAC,GAAG;EAAG,MAAM,WAAW,OAAO,EAAE,IAAI;CAAC;CAClE,MAAM,OAAO,OAAe,MAAmB;EAE7C,OAAO,gBADW,EAAE,KAAI,QAAO,WAAW,OAAO,GAAG,CAC7B,CAAS;CAClC;CAEA,IAAI,MAAM,SAAS,UACjB,OAAO;EAAC,GAAG;EAAO,MAAM,UAAU,MAAM,IAAI;CAAC;MACxC,IAAI,MAAM,SAAS,sBAAsB;EAC9C,MAAM,EAAC,aAAa,aAAY,MAAM;EACtC,OAAO;GACL,GAAG;GACH,SAAS;IACP,GAAG,MAAM;IACT,aAAa;KACX,aAAa,IAAI,OAAO,YAAY,WAAW;KAC/C,YAAY,IAAI,SAAS,OAAO,YAAY,UAAU;IACxD;IACA,UAAU,aAAa,UAAU,SAAS;GAC5C;EACF;CACF;CAEA,OAAO;EACL,MAAM,MAAM;EACZ,YAAY,MAAM,WAAW,KAAI,MAAK,eAAe,GAAG,OAAO,SAAS,CAAC;CAC3E;AACF;AAiBA,SAAS,aAAa,KAAmC;CACvD,OAAO;AACT;AAEA,IAAM,iCAAiB,IAAI,QAA4B;AAEvD,SAAgB,aAAa,KAAyB;CACpD,OAAO,oBAAoB,gBAAgB,KAAK,oBAAoB;AACtE;AAEA,SAAS,qBAAqB,KAAyB;CAGrD,MAAM,EAAC,OAAO,YAAW;CACzB,OAAO,cAAc;EACnB,GAAG;EACH,OAAO,SAAS,oBAAoB,KAAK;EACzC,SAAS,SAAS,KAAI,MACpB,kBAAkB;GAAC,GAAG;GAAG,UAAU,aAAa,EAAE,QAAQ;EAAC,CAAC,CAC9D;CACF,CAAC;AACH;;;;;AAMA,SAAS,oBAAoB,MAA4B;CACvD,QAAQ,KAAK,MAAb;EACE,KAAK,UACH,OAAO;EACT,KAAK,sBACH,OAAO;GACL,GAAG;GACH,SAAS;IACP,GAAG,KAAK;IACR,UAAU,aAAa,KAAK,QAAQ,QAAQ;GAC9C;EACF;EACF,SACE,OAAO;GACL,MAAM,KAAK;GACX,YAAY,KAAK,WAAW,IAAI,mBAAmB;EACrD;CACJ;AACF;;;;;;;;;;;;;AAcA,SAAgB,cAAc,KAAyB;CACrD,MAAM,EAAC,QAAQ,OAAO,OAAO,OAAO,SAAS,OAAO,OAAO,YAAW;CAKtE,OAAO,aAAa;EAClB;EACA;EACA;EACA,OAAO,UAAU,KAAA,IAAY,KAAA,IAAY,mBAAmB,KAAK;EACjE,SAAS,YAAY,KAAA,IAAY,KAAA,IAAY,iBAAiB,OAAO;EACrE;EACA;EACA;CACF,CAAC;AACH;;;;;;AAOA,SAAgB,SACd,OACA,OACe;CACf,OAAO,aAAa;EAClB,QAAQ,KAAA;EACR;EACA;EACA,OAAO,KAAA;EACP,SAAS,KAAA;EACT,OAAO,KAAA;EACP,OAAO,KAAA;EACP,SAAS,KAAA;CACX,CAAC;AACH;;;;;AAMA,SAAgB,cACd,SACA,UAC+B;CAC/B,MAAM,aAAa,kBAAkB,QAAQ;CAC7C,IAAI,YAAY,KAAA,GACd,OAAO,CAAC,UAAU;CAGpB,IAAI,IAAI,QAAQ;CAChB,OAAO,IAAI,KAAK,WAAW,QAAQ,IAAI,IAAI,UAAU,IAAI,GACvD;CAEF,OAAO,QAAQ,UAAU,GAAG,GAAG,UAAU;AAC3C;AAKA,IAAM,uCAAuB,IAAI,QAAmB;AAEpD,SAAS,iBACP,SAC+B;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,IAAI,WAAW,QAAQ,IAAI,IAAI,QAAQ,EAAE,IAAI,GAC3C,OAAO,QAAQ,SAAS,UAAU;CAGtC,OAAO;AACT;;;;;;AAOA,SAAgB,kBACd,SAC8B;CAC9B,MAAM,EAAC,aAAa,QAAQ,UAAU,WAAU;CAChD,OAAO;EACL,aAAa;GACX,aAAa,YAAY;GACzB,YAAY,YAAY;EAC1B;EACA;EACA;EACA;CACF;AACF;AAEA,SAAS,uBAAgD,GAAS;CAChE,QAAQ,EAAE,MAAV;EACE,KAAK,WACH,OAAO;GAAC,MAAM;GAAW,OAAO,EAAE;EAAK;EACzC,KAAK,UACH,OAAO;GAAC,MAAM;GAAU,MAAM,EAAE;EAAI;EACtC,SACE,OAAO;GAAC,MAAM;GAAU,QAAQ,EAAE;GAAQ,OAAO,EAAE;EAAK;CAC5D;AACF;;;;;;;;;;;;;AAcA,SAAgB,mBAAmB,MAA4B;CAC7D,IAAI,qBAAqB,IAAI,IAAI,GAC/B,OAAO;CAET,IAAI,KAAK,SAAS,UAAU;EAC1B,MAAM,aAAwB;GAC5B,MAAM;GACN,IAAI,KAAK;GACT,MAAM,uBAAuB,KAAK,IAAI;GACtC,OAAO,uBAAuB,KAAK,KAAK;EAC1C;EACA,qBAAqB,IAAI,UAAU;EACnC,OAAO;CACT;CACA,IAAI,KAAK,SAAS,sBAAsB;EACtC,MAAM,aAAwB;GAC5B,MAAM;GACN,SAAS,kBAAkB,KAAK,OAAO;GACvC,IAAI,KAAK;GACT,MAAM,KAAK;GACX,QAAQ,KAAK;EACf;EACA,qBAAqB,IAAI,UAAU;EACnC,OAAO;CACT;CAKA,MAAM,aAA0B,CAAC;CACjC,KAAK,MAAM,KAAK,KAAK,YAAY;EAC/B,MAAM,IAAI,mBAAmB,CAAC;EAC9B,IAAI,EAAE,SAAS,KAAK,MAClB,WAAW,KAAK,GAAG,EAAE,UAAU;OAE/B,WAAW,KAAK,CAAC;CAErB;CAKA,IAAI,WAAW,WAAW,GACxB,OAAO,WAAW;CAEpB,WAAW,KAAK,YAAY;CAC5B,MAAM,aAAwB;EAAC,MAAM,KAAK;EAAM;CAAU;CAC1D,qBAAqB,IAAI,UAAU;CACnC,OAAO;AACT;;;;;;AAOA,SAAgB,OAAO,KAAU,QAAoB;CACnD,OAAO,aAAa,KAAK;EACvB,YAAW,UAAS,OAAO,UAAU,KAAK;EAC1C,aAAa,OAAO,QAAQ,OAAO,WAAW,OAAO,GAAG;CAC1D,CAAC;AACH;AAEA,SAAgB,aACd,MACA,OACA,QACA;CACA,OAAO,eAAe,MAAM,OAAO;EACjC,YAAW,UAAS,OAAO,UAAU,KAAK;EAC1C,aAAa,OAAO,QAAQ,OAAO,WAAW,OAAO,GAAG;CAC1D,CAAC;AACH;AAEA,SAAS,aAAa,GAAc,GAAsB;CACxD,IAAI,EAAE,SAAS,UAAU;EACvB,IAAI,EAAE,SAAS,UACb,OAAO;EAGT,OACE,qBAAqB,EAAE,MAAM,EAAE,IAAI,KACnC,qBAAqB,EAAE,IAAI,EAAE,EAAE,KAC/B,qBAAqB,EAAE,OAAO,EAAE,KAAK;CAEzC;CAEA,IAAI,EAAE,SAAS,UACb,OAAO;CAGT,IAAI,EAAE,SAAS,sBAAsB;EACnC,IAAI,EAAE,SAAS,sBACb,OAAO;EAET,OACE,WAAW,EAAE,SAAS,EAAE,OAAO,KAC/B,qBAAqB,EAAE,IAAI,EAAE,EAAE,KAC/B,gBAAgB,EAAE,MAAM,EAAE,IAAI,KAC9B,gBAAgB,EAAE,QAAQ,EAAE,MAAM;CAEtC;CACA,IAAI,EAAE,SAAS,sBACb,OAAO;CAGT,MAAM,MAAM,qBAAqB,EAAE,MAAM,EAAE,IAAI;CAC/C,IAAI,QAAQ,GACV,OAAO;CAET,KACE,IAAI,IAAI,GAAG,IAAI,GACf,IAAI,EAAE,WAAW,UAAU,IAAI,EAAE,WAAW,QAC5C,KAAK,KACL;EACA,MAAM,MAAM,aAAa,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE;EACzD,IAAI,QAAQ,GACV,OAAO;CAEX;CAEA,OAAO,EAAE,WAAW,SAAS,EAAE,WAAW;AAC5C;AAEA,SAAS,qBAAqB,GAAkB,GAA0B;CACxE,IAAI,EAAE,SAAS,EAAE,MACf,OAAO,YAAY,EAAE,MAAM,EAAE,IAAI;CAEnC,QAAQ,EAAE,MAAV;EACE,KAAK;GACH,OAAO,EAAE,SAAS,WAAW,sCAAsC;GACnE,OAAO,gBAAgB,EAAE,OAAO,EAAE,KAAK;EACzC,KAAK;GACH,OAAO,EAAE,SAAS,UAAU,qCAAqC;GACjE,OAAO,YAAY,EAAE,MAAM,EAAE,IAAI;EACnC,KAAK;GACH,OAAO,EAAE,SAAS,UAAU,qCAAqC;GAGjE,OACE,YAAY,EAAE,QAAQ,EAAE,MAAM,KAAK,gBAAgB,EAAE,OAAO,EAAE,KAAK;CAEzE;AACF;AAMA,IAAM,sBAAsB;CAAC;CAAU;CAAW;CAAU;AAAQ;AAEpE,SAAS,iBAAiB,OAA6B;CACrD,OAAO,MAAM,QAAQ,KAAK,IACtB,oBAAoB,SACpB,oBAAoB,QAAQ,OAAO,KAAK;AAC9C;AAEA,SAAS,gBAAgB,GAAiB,GAAyB;CACjE,MAAM,OAAO,iBAAiB,CAAC,IAAI,iBAAiB,CAAC;CACrD,IAAI,SAAS,GACX,OAAO;CAGT,IAAI,MAAM,QAAQ,CAAC,GAAG;EACpB,OAAO,MAAM,QAAQ,CAAC,GAAG,+BAA+B;EACxD,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,UAAU,IAAI,EAAE,QAAQ,KAAK;GACjD,MAAM,MAAM,gBAAgB,EAAE,IAAI,EAAE,EAAE;GACtC,IAAI,QAAQ,GACV,OAAO;EAEX;EAEA,OAAO,EAAE,SAAS,EAAE;CACtB;CAEA,QAAQ,OAAO,GAAf;EACE,KAAK;GACH,OAAO,OAAO,MAAM,UAAU,gCAAgC;GAC9D,OAAO,YAAY,GAAG,CAAC;EACzB,KAAK;GACH,OAAO,OAAO,MAAM,UAAU,gCAAgC;GAC9D,OAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;EAClC,KAAK;GACH,OAAO,OAAO,MAAM,WAAW,iCAAiC;GAChE,OAAO,OAAO,CAAC,IAAI,OAAO,CAAC;EAC7B,SACE,OAAO;CACX;AACF;AAEA,SAAS,WAAW,GAAuB,GAA+B;CACxE,OAAO,YAAY,KAAK,EAAE,SAAS,KAAK,GAAG,KAAK,EAAE,SAAS,KAAK,CAAC;AACnE;AAEA,SAAS,qBAAqB,GAAkB,GAA0B;CACxE,IAAI,MAAM,QAAQ,MAAM,MACtB,OAAO,YAAY,GAAG,CAAC;CAEzB,IAAI,MAAM,MACR,OAAO;CAET,IAAI,MAAM,MACR,OAAO;CAET,OAAO;AACT;AAEA,SAAS,gBACP,GACA,GACQ;CAER,MAAM,SAAS,MAA4B,MAAM,KAAA,IAAY,IAAI,IAAI,IAAI;CACzE,OAAO,MAAM,CAAC,IAAI,MAAM,CAAC;AAC3B"}
1
+ {"version":3,"file":"ast.js","names":["v","v.readonly","v.literalUnion","v.readonlyArray","v.readonlyObject","v.strict"],"sources":["../../../../zero-protocol/src/ast.ts"],"sourcesContent":["/**\n * Wire-format representation of the zql AST interface.\n *\n * `v.Type<...>` types are explicitly declared to facilitate Typescript verification\n * that the schemas satisfy the zql type definitions. (Incidentally, explicit types\n * are also required for recursive schema definitions.)\n */\n\nimport {compareUTF8} from 'compare-utf8';\nimport {assert} from '../../shared/src/asserts.ts';\nimport {isPlainObject} from '../../shared/src/deep-merge.ts';\nimport {getOrInsertComputed} from '../../shared/src/map.ts';\nimport {must} from '../../shared/src/must.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport type {NameMapper} from '../../zero-types/src/name-mapper.ts';\nimport {rowSchema, type Row} from './data.ts';\n\nexport const SUBQ_PREFIX = 'zsubq_';\n\nexport const selectorSchema = v.string();\nexport const toStaticParam = Symbol();\nexport const planIdSymbol = Symbol('planId');\n\nconst orderingElementSchema = v.readonly(\n v.tuple([selectorSchema, v.literalUnion('asc', 'desc')]),\n);\n\nexport const orderingSchema = v.readonlyArray(orderingElementSchema);\nexport type System = 'permissions' | 'client' | 'test';\n\nexport const primitiveSchema = v.union(\n v.string(),\n v.number(),\n v.boolean(),\n v.null(),\n);\n\nexport const equalityOpsSchema = v.literalUnion('=', '!=', 'IS', 'IS NOT');\n\nexport const orderOpsSchema = v.literalUnion('<', '>', '<=', '>=');\n\nexport const likeOpsSchema = v.literalUnion(\n 'LIKE',\n 'NOT LIKE',\n 'ILIKE',\n 'NOT ILIKE',\n);\n\nexport const inOpsSchema = v.literalUnion('IN', 'NOT IN');\n\nexport const simpleOperatorSchema = v.union(\n equalityOpsSchema,\n orderOpsSchema,\n likeOpsSchema,\n inOpsSchema,\n);\n\nconst literalReferenceSchema: v.Type<LiteralReference> = v.readonlyObject({\n type: v.literal('literal'),\n value: v.union(\n v.string(),\n v.number(),\n v.boolean(),\n v.null(),\n v.readonlyArray(v.union(v.string(), v.number(), v.boolean())),\n ),\n});\nconst columnReferenceSchema: v.Type<ColumnReference> = v.readonlyObject({\n type: v.literal('column'),\n name: v.string(),\n});\n\n/**\n * A parameter is a value that is not known at the time the query is written\n * and is resolved at runtime.\n *\n * Static parameters refer to something provided by the caller.\n * Static parameters are injected when the query pipeline is built from the AST\n * and do not change for the life of that pipeline.\n *\n * An example static parameter is the current authentication data.\n * When a user is authenticated, queries on the server have access\n * to the user's authentication data in order to evaluate authorization rules.\n * Authentication data doesn't change over the life of a query as a change\n * in auth data would represent a log-in / log-out of the user.\n *\n * AncestorParameters refer to rows encountered while running the query.\n * They are used by subqueries to refer to rows emitted by parent queries.\n */\nconst parameterReferenceSchema = v.readonlyObject({\n type: v.literal('static'),\n // The \"namespace\" of the injected parameter.\n // Write authorization will send the value of a row\n // prior to the mutation being run (preMutationRow).\n // Read and write authorization will both send the\n // current authentication data (authData).\n anchor: v.literalUnion('authData', 'preMutationRow'),\n field: v.union(v.string(), v.array(v.string())),\n});\n\nconst conditionValueSchema = v.union(\n literalReferenceSchema,\n columnReferenceSchema,\n parameterReferenceSchema,\n);\n\nexport type Parameter = v.Infer<typeof parameterReferenceSchema>;\n\nexport const simpleConditionSchema: v.Type<SimpleCondition> = v.readonlyObject({\n type: v.literal('simple'),\n op: simpleOperatorSchema,\n left: conditionValueSchema,\n right: v.union(parameterReferenceSchema, literalReferenceSchema),\n});\n\ntype ConditionValue = v.Infer<typeof conditionValueSchema>;\n\nexport const correlatedSubqueryConditionOperatorSchema: v.Type<CorrelatedSubqueryConditionOperator> =\n v.literalUnion('EXISTS', 'NOT EXISTS');\n\nexport const correlatedSubqueryConditionSchema: v.Type<CorrelatedSubqueryCondition> =\n v.readonlyObject({\n type: v.literal('correlatedSubquery'),\n related: v.lazy(() => correlatedSubquerySchema),\n op: correlatedSubqueryConditionOperatorSchema,\n flip: v.boolean().optional(),\n scalar: v.boolean().optional(),\n });\n\nexport const conditionSchema: v.Type<Condition> = v.union(\n simpleConditionSchema,\n v.lazy(() => conjunctionSchema),\n v.lazy(() => disjunctionSchema),\n correlatedSubqueryConditionSchema,\n);\n\nconst conjunctionSchema: v.Type<Conjunction> = v.readonlyObject({\n type: v.literal('and'),\n conditions: v.readonlyArray(conditionSchema),\n});\n\nconst disjunctionSchema: v.Type<Disjunction> = v.readonlyObject({\n type: v.literal('or'),\n conditions: v.readonlyArray(conditionSchema),\n});\n\nexport type CompoundKey = readonly [string, ...string[]];\n\nfunction mustCompoundKey(field: readonly string[]): CompoundKey {\n assert(\n Array.isArray(field) && field.length >= 1,\n 'Expected non-empty array for compound key',\n );\n return field as unknown as CompoundKey;\n}\n\nexport const compoundKeySchema: v.Type<CompoundKey> = v.readonly(\n // oxlint-disable-next-line e18e/prefer-spread-syntax\n v.tuple([v.string()]).concat(v.array(v.string())),\n);\n\nconst correlationSchema = v.readonlyObject({\n parentField: compoundKeySchema,\n childField: compoundKeySchema,\n});\n\n// Split out so that its inferred type can be checked against\n// Omit<CorrelatedSubquery, 'correlation'> in ast-type-test.ts.\n// The mutually-recursive reference of the 'other' field to astSchema\n// is the only thing added in v.lazy. The v.lazy is necessary due to the\n// mutually-recursive types, but v.lazy prevents inference of the resulting\n// type.\nexport const correlatedSubquerySchemaOmitSubquery = v.readonlyObject({\n correlation: correlationSchema,\n hidden: v.boolean().optional(),\n system: v.literalUnion('permissions', 'client', 'test').optional(),\n});\n\nexport const correlatedSubquerySchema: v.Type<CorrelatedSubquery> =\n correlatedSubquerySchemaOmitSubquery.extend({\n subquery: v.lazy(() => astSchema),\n });\n\nexport const astSchema: v.Type<AST> = v.readonlyObject({\n schema: v.string().optional(),\n table: v.string(),\n alias: v.string().optional(),\n where: conditionSchema.optional(),\n related: v.readonlyArray(correlatedSubquerySchema).optional(),\n limit: v.number().optional(),\n orderBy: orderingSchema.optional(),\n start: v\n .object({\n row: rowSchema,\n exclusive: v.boolean(),\n })\n .optional(),\n});\n\n/**\n * The maximum nesting depth of an AST sent by a client, counting and/or\n * conditions, correlated subqueries and related subqueries. Parsing and the\n * AST visitors in zero-cache are recursive, so a single deeply nested AST can\n * otherwise overflow the stack or burn seconds of CPU. Realistic queries,\n * permission rules included, are less than 10 levels deep.\n */\nexport const MAX_AST_DEPTH = 50;\n\n/**\n * Returns whether the unparsed `ast` is nested deeper than `maxDepth`.\n */\nexport function exceedsASTDepth(\n ast: unknown,\n maxDepth = MAX_AST_DEPTH,\n): boolean {\n return astExceedsDepth(ast, 0, maxDepth);\n}\n\n// Every step down increases the depth, except the one from an AST into its\n// where clause, so the recursion stops within 2 * maxDepth steps and cannot\n// overflow the stack.\nfunction astExceedsDepth(\n ast: unknown,\n depth: number,\n maxDepth: number,\n): boolean {\n if (depth > maxDepth) {\n return true;\n }\n if (!isPlainObject(ast)) {\n return false;\n }\n const {where, related} = ast;\n return (\n conditionExceedsDepth(where, depth, maxDepth) ||\n (Array.isArray(related) &&\n related.some(\n r =>\n isPlainObject(r) && astExceedsDepth(r.subquery, depth + 1, maxDepth),\n ))\n );\n}\n\nfunction conditionExceedsDepth(\n cond: unknown,\n depth: number,\n maxDepth: number,\n): boolean {\n if (depth > maxDepth) {\n return true;\n }\n if (!isPlainObject(cond)) {\n return false;\n }\n const {conditions, related} = cond;\n return (\n (Array.isArray(conditions) &&\n conditions.some(c => conditionExceedsDepth(c, depth + 1, maxDepth))) ||\n (isPlainObject(related) &&\n astExceedsDepth(related.subquery, depth + 1, maxDepth))\n );\n}\n\n/**\n * {@link astSchema} for ASTs sent by clients, which rejects ASTs nested deeper\n * than {@link MAX_AST_DEPTH} before parsing them. ASTs the server stored itself\n * (e.g. in the CVR) are parsed with {@link astSchema} so that ones stored\n * before the limit existed can still be read.\n */\nexport const depthBoundedAstSchema: v.Type<AST> = Object.assign(\n v\n .unknown()\n .chain((value, options) =>\n exceedsASTDepth(value)\n ? v.err(`AST exceeds the maximum depth of ${MAX_AST_DEPTH}`)\n : astSchema.try(value, options),\n ),\n // A transform serializes as just its name. Show astSchema too, so a change\n // to it still changes the hash in protocol-version.test.ts.\n {depthBounded: astSchema},\n);\n\n/**\n * {@link depthBoundedAstSchema} parsed strictly even inside a lenient parse. A\n * server that ignored an AST field it doesn't know would run a different query.\n */\nexport const strictASTSchema: v.Type<AST> = v.strict(depthBoundedAstSchema);\n\nexport type Bound = {\n row: Row;\n exclusive: boolean;\n};\n\n/**\n * As in SQL you can have multiple orderings. We don't currently\n * support ordering on anything other than the root query.\n */\nexport type OrderPart = readonly [field: string, direction: 'asc' | 'desc'];\nexport type Ordering = readonly OrderPart[];\n\nexport type SimpleOperator = EqualityOps | OrderOps | LikeOps | InOps;\nexport type EqualityOps = '=' | '!=' | 'IS' | 'IS NOT';\nexport type OrderOps = '<' | '>' | '<=' | '>=';\nexport type LikeOps = 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE';\nexport type InOps = 'IN' | 'NOT IN';\n\nexport type AST = {\n readonly schema?: string | undefined;\n readonly table: string;\n\n // A query would be aliased if the AST is a subquery.\n // e.g., when two subqueries select from the same table\n // they need an alias to differentiate them.\n // `SELECT\n // [SELECT * FROM issue WHERE issue.id = outer.parentId] AS parent\n // [SELECT * FROM issue WHERE issue.parentId = outer.id] AS children\n // FROM issue as outer`\n readonly alias?: string | undefined;\n\n // `select` is missing given we return all columns for now.\n\n // The PipelineBuilder will pick what to use to correlate\n // a subquery with a parent query. It can choose something from the\n // where conditions or choose the _first_ `related` entry.\n // Choosing the first `related` entry is almost always the best choice if\n // one exists.\n readonly where?: Condition | undefined;\n\n readonly related?: readonly CorrelatedSubquery[] | undefined;\n readonly start?: Bound | undefined;\n readonly limit?: number | undefined;\n readonly orderBy?: Ordering | undefined;\n};\n\nexport type Correlation = {\n readonly parentField: CompoundKey;\n readonly childField: CompoundKey;\n};\n\nexport type CorrelatedSubquery = {\n /**\n * Only equality correlation are supported for now.\n * E.g., direct foreign key relationships.\n */\n readonly correlation: Correlation;\n readonly subquery: AST;\n readonly system?: System | undefined;\n // If a hop in the subquery chain should be hidden from the output view.\n // A common example is junction edges. The query API provides the illusion\n // that they don't exist: `issue.related('labels')` instead of `issue.related('issue_labels').related('labels')`.\n // To maintain this illusion, the junction edge should be hidden.\n // When `hidden` is set to true, this hop will not be included in the output view\n // but its children will be.\n readonly hidden?: boolean | undefined;\n};\n\nexport type ValuePosition = LiteralReference | Parameter | ColumnReference;\n\nexport type ColumnReference = {\n readonly type: 'column';\n /**\n * Not a path yet as we're currently not allowing\n * comparisons across tables. This will need to\n * be a path through the tree in the near future.\n */\n readonly name: string;\n};\n\nexport type LiteralReference = {\n readonly type: 'literal';\n readonly value: LiteralValue;\n};\n\nexport type LiteralValue =\n | string\n | number\n | boolean\n | null\n | ReadonlyArray<string | number | boolean>;\n\n/**\n * Starting only with SimpleCondition for now.\n * ivm1 supports Conjunctions and Disjunctions.\n * We'll support them in the future.\n */\nexport type Condition =\n | SimpleCondition\n | Conjunction\n | Disjunction\n | CorrelatedSubqueryCondition;\n\nexport type SimpleCondition = {\n readonly type: 'simple';\n readonly op: SimpleOperator;\n readonly left: ValuePosition;\n\n /**\n * `null` is absent since we do not have an `IS` or `IS NOT`\n * operator defined and `null != null` in SQL.\n */\n readonly right: Exclude<ValuePosition, ColumnReference>;\n};\n\nexport type Conjunction = {\n type: 'and';\n conditions: readonly Condition[];\n};\n\nexport type Disjunction = {\n type: 'or';\n conditions: readonly Condition[];\n};\n\nexport type CorrelatedSubqueryCondition = {\n type: 'correlatedSubquery';\n related: CorrelatedSubquery;\n op: CorrelatedSubqueryConditionOperator;\n flip?: boolean | undefined;\n scalar?: boolean | undefined;\n [planIdSymbol]?: number | undefined;\n};\n\nexport type CorrelatedSubqueryConditionOperator = 'EXISTS' | 'NOT EXISTS';\n\ninterface ASTTransform {\n tableName(orig: string): string;\n columnName(origTable: string, origColumn: string): string;\n}\n\nfunction transformAST(ast: AST, transform: ASTTransform): Required<AST> {\n // Name mapping functions (e.g. to server names)\n const {tableName, columnName} = transform;\n const colName = (c: string) => columnName(ast.table, c);\n const key = (table: string, k: CompoundKey) => {\n const serverKey = k.map(col => columnName(table, col));\n return mustCompoundKey(serverKey);\n };\n\n const transformed = {\n schema: ast.schema,\n table: tableName(ast.table),\n alias: ast.alias,\n where: ast.where\n ? transformWhere(ast.where, ast.table, transform)\n : undefined,\n related: ast.related?.map(\n r =>\n ({\n correlation: {\n parentField: key(ast.table, r.correlation.parentField),\n childField: key(r.subquery.table, r.correlation.childField),\n },\n hidden: r.hidden,\n subquery: transformAST(r.subquery, transform),\n system: r.system,\n }) satisfies Required<CorrelatedSubquery>,\n ),\n start: ast.start\n ? {\n ...ast.start,\n row: Object.fromEntries(\n Object.entries(ast.start.row).map(([col, val]) => [\n colName(col),\n val,\n ]),\n ),\n }\n : undefined,\n limit: ast.limit,\n orderBy: ast.orderBy?.map(([col, dir]) => [colName(col), dir] as const),\n };\n\n return transformed;\n}\n\nfunction transformWhere(\n where: Condition,\n table: string,\n transform: ASTTransform,\n): Condition {\n // Name mapping functions (e.g. to server names)\n const {columnName} = transform;\n const condValue = (c: ConditionValue) =>\n c.type !== 'column' ? c : {...c, name: columnName(table, c.name)};\n const key = (table: string, k: CompoundKey) => {\n const serverKey = k.map(col => columnName(table, col));\n return mustCompoundKey(serverKey);\n };\n\n if (where.type === 'simple') {\n return {...where, left: condValue(where.left)};\n } else if (where.type === 'correlatedSubquery') {\n const {correlation, subquery} = where.related;\n return {\n ...where,\n related: {\n ...where.related,\n correlation: {\n parentField: key(table, correlation.parentField),\n childField: key(subquery.table, correlation.childField),\n },\n subquery: transformAST(subquery, transform),\n },\n };\n }\n\n return {\n type: where.type,\n conditions: where.conditions.map(c => transformWhere(c, table, transform)),\n };\n}\n\ndeclare const normalizedTag: unique symbol;\n\n/**\n * An {@link AST} in its normalized form: `related` is sorted, `where` is\n * flattened and sorted, and every field is present, in a fixed order. Two ASTs\n * that describe the same query have the same JSON encoding, and thus the same\n * hash, once normalized.\n *\n * The tag only exists in the type, so the only way to get one is from\n * {@link normalizeAST}, {@link normalizedAST} or {@link tableAST}. Spreading\n * one keeps the tag, which is what lets a query builder derive a normalized\n * AST from another one by replacing a field it knows to be safe.\n */\nexport type NormalizedAST = Required<AST> & {readonly [normalizedTag]: true};\n\nfunction asNormalized(ast: Required<AST>): NormalizedAST {\n return ast as NormalizedAST;\n}\n\nconst normalizeCache = new WeakMap<AST, NormalizedAST>();\n\nexport function normalizeAST(ast: AST): NormalizedAST {\n return getOrInsertComputed(normalizeCache, ast, normalizeASTUncached);\n}\n\nfunction normalizeASTUncached(ast: AST): NormalizedAST {\n // normalizedAST() normalizes a single level, so normalize the subqueries\n // first.\n const {where, related} = ast;\n return normalizedAST({\n ...ast,\n where: where && normalizeSubqueries(where),\n related: related?.map(r =>\n normalizedRelated({...r, subquery: normalizeAST(r.subquery)}),\n ),\n });\n}\n\n/**\n * Normalizes the ASTs of the correlated subqueries of `cond`. The condition\n * itself is normalized by {@link normalizeCondition}.\n */\nfunction normalizeSubqueries(cond: Condition): Condition {\n switch (cond.type) {\n case 'simple':\n return cond;\n case 'correlatedSubquery':\n return {\n ...cond,\n related: {\n ...cond.related,\n subquery: normalizeAST(cond.related.subquery),\n },\n };\n default:\n return {\n type: cond.type,\n conditions: cond.conditions.map(normalizeSubqueries),\n };\n }\n}\n\n/**\n * Normalizes a single level of an AST, assuming that the ASTs of its\n * subqueries (i.e. those in `related` and in correlated subquery conditions)\n * are already normalized and that the `related` entries have the shape that\n * {@link normalizedRelated} gives them.\n *\n * This lets a query builder keep its AST normalized as it builds it up\n * instead of normalizing the whole tree afterwards. A builder that knows\n * which of the rules a step can break at all is better off applying just\n * those (see {@link tableAST}, {@link insertRelated} and\n * {@link normalizeCondition}).\n */\nexport function normalizedAST(ast: AST): NormalizedAST {\n const {schema, table, alias, where, related, start, limit, orderBy} = ast;\n // Every field is written, in the same order, so that all normalized ASTs\n // have the same shape (one hidden class) and the same JSON encoding (and\n // thus the same hash) no matter how they were put together. The fields that\n // are undefined are dropped by JSON.stringify() anyway.\n return asNormalized({\n schema,\n table,\n alias,\n where: where === undefined ? undefined : normalizeCondition(where),\n related: related === undefined ? undefined : normalizeRelated(related),\n start,\n limit,\n orderBy,\n });\n}\n\n/**\n * The normalized AST that selects a whole table. Spreading it (or any other\n * normalized AST) and replacing a field keeps the field order, since a\n * normalized AST has every field.\n */\nexport function tableAST(\n table: string,\n alias?: string | undefined,\n): NormalizedAST {\n return asNormalized({\n schema: undefined,\n table,\n alias,\n where: undefined,\n related: undefined,\n start: undefined,\n limit: undefined,\n orderBy: undefined,\n });\n}\n\n/**\n * Adds `subquery` to the `related` of a normalized AST, at the position that\n * keeps it sorted.\n */\nexport function insertRelated(\n related: readonly CorrelatedSubquery[] | undefined,\n subquery: CorrelatedSubquery,\n): readonly CorrelatedSubquery[] {\n const normalized = normalizedRelated(subquery);\n if (related === undefined) {\n return [normalized];\n }\n // Sorting is stable, so an entry goes after the ones it compares equal to.\n let i = related.length;\n while (i > 0 && cmpRelated(related[i - 1], normalized) > 0) {\n i--;\n }\n return related.toSpliced(i, 0, normalized);\n}\n\n// Conjunctions and disjunctions that are known to be normalized. The query\n// builder rebuilds its AST for every step, so this keeps the conditions that\n// did not change from being normalized over and over again.\nconst normalizedConditions = new WeakSet<Condition>();\n\nfunction normalizeRelated(\n related: readonly CorrelatedSubquery[],\n): readonly CorrelatedSubquery[] {\n for (let i = 1; i < related.length; i++) {\n if (cmpRelated(related[i - 1], related[i]) > 0) {\n return related.toSorted(cmpRelated);\n }\n }\n return related;\n}\n\n/**\n * Gives a correlated subquery the shape that a normalized AST has: every\n * field, in a fixed order (see {@link normalizedAST}). Its `subquery` must\n * already be normalized.\n */\nexport function normalizedRelated(\n related: CorrelatedSubquery,\n): Required<CorrelatedSubquery> {\n const {correlation, hidden, subquery, system} = related;\n return {\n correlation: {\n parentField: correlation.parentField,\n childField: correlation.childField,\n },\n hidden,\n subquery,\n system,\n };\n}\n\nfunction normalizeValuePosition<T extends ValuePosition>(v: T): T {\n switch (v.type) {\n case 'literal':\n return {type: 'literal', value: v.value} as T;\n case 'column':\n return {type: 'column', name: v.name} as T;\n default:\n return {type: 'static', anchor: v.anchor, field: v.field} as T;\n }\n}\n\n/**\n * Normalizes a condition, assuming that the ASTs of any correlated subqueries\n * it contains are already normalized.\n *\n * Like {@link normalizedAST}, this rebuilds every node with its fields in a\n * fixed order, so that structurally equal conditions have the same JSON\n * encoding (and thus the same hash) no matter how they were put together.\n * That includes a round trip through Postgres, whose jsonb type reorders\n * object keys: without the rebuild, every query record reloaded from the CVR\n * re-hashed to a different transformationHash than was stored, making it look\n * changed and re-execute on every view-syncer restart.\n */\nexport function normalizeCondition(cond: Condition): Condition {\n if (normalizedConditions.has(cond)) {\n return cond;\n }\n if (cond.type === 'simple') {\n const normalized: Condition = {\n type: 'simple',\n op: cond.op,\n left: normalizeValuePosition(cond.left),\n right: normalizeValuePosition(cond.right),\n };\n normalizedConditions.add(normalized);\n return normalized;\n }\n if (cond.type === 'correlatedSubquery') {\n const normalized: Condition = {\n type: 'correlatedSubquery',\n related: normalizedRelated(cond.related),\n op: cond.op,\n flip: cond.flip,\n scalar: cond.scalar,\n };\n normalizedConditions.add(normalized);\n return normalized;\n }\n\n // Flatten the conditions of nested conjunctions of the same type and sort\n // them. The nested conditions are normalized (and thus flattened and sorted)\n // first.\n const conditions: Condition[] = [];\n for (const c of cond.conditions) {\n const n = normalizeCondition(c);\n if (n.type === cond.type) {\n conditions.push(...n.conditions);\n } else {\n conditions.push(n);\n }\n }\n\n // A singleton conjunction is the same as the condition itself. Empty\n // conjunctions, on the other hand, are meaningful: an empty 'and' is always\n // true and an empty 'or' is always false.\n if (conditions.length === 1) {\n return conditions[0];\n }\n conditions.sort(cmpCondition);\n const normalized: Condition = {type: cond.type, conditions};\n normalizedConditions.add(normalized);\n return normalized;\n}\n\n/**\n * Maps the table and column names of `ast`. The result is not a\n * {@link NormalizedAST} even if `ast` was normalized: the names it sorts by\n * are the ones that changed.\n */\nexport function mapAST(ast: AST, mapper: NameMapper) {\n return transformAST(ast, {\n tableName: table => mapper.tableName(table),\n columnName: (table, col) => mapper.columnName(table, col),\n });\n}\n\nexport function mapCondition(\n cond: Condition,\n table: string,\n mapper: NameMapper,\n) {\n return transformWhere(cond, table, {\n tableName: table => mapper.tableName(table),\n columnName: (table, col) => mapper.columnName(table, col),\n });\n}\n\nfunction cmpCondition(a: Condition, b: Condition): number {\n if (a.type === 'simple') {\n if (b.type !== 'simple') {\n return -1; // Order SimpleConditions first\n }\n\n return (\n compareValuePosition(a.left, b.left) ||\n compareUTF8MaybeNull(a.op, b.op) ||\n compareValuePosition(a.right, b.right)\n );\n }\n\n if (b.type === 'simple') {\n return 1; // Order SimpleConditions first\n }\n\n if (a.type === 'correlatedSubquery') {\n if (b.type !== 'correlatedSubquery') {\n return -1; // Order subquery before conjuctions/disjuctions\n }\n return (\n cmpRelated(a.related, b.related) ||\n compareUTF8MaybeNull(a.op, b.op) ||\n cmpOptionalBool(a.flip, b.flip) ||\n cmpOptionalBool(a.scalar, b.scalar)\n );\n }\n if (b.type === 'correlatedSubquery') {\n return -1; // Order correlatedSubquery before conjuctions/disjuctions\n }\n\n const val = compareUTF8MaybeNull(a.type, b.type);\n if (val !== 0) {\n return val;\n }\n for (\n let l = 0, r = 0;\n l < a.conditions.length && r < b.conditions.length;\n l++, r++\n ) {\n const val = cmpCondition(a.conditions[l], b.conditions[r]);\n if (val !== 0) {\n return val;\n }\n }\n // prefixes first\n return a.conditions.length - b.conditions.length;\n}\n\nfunction compareValuePosition(a: ValuePosition, b: ValuePosition): number {\n if (a.type !== b.type) {\n return compareUTF8(a.type, b.type);\n }\n switch (a.type) {\n case 'literal':\n assert(b.type === 'literal', 'Expected literal type for comparison');\n return cmpLiteralValue(a.value, b.value);\n case 'column':\n assert(b.type === 'column', 'Expected column type for comparison');\n return compareUTF8(a.name, b.name);\n case 'static':\n assert(b.type === 'static', 'Expected static type for comparison');\n // A field is a string or a path of strings, which cmpLiteralValue()\n // tells apart.\n return (\n compareUTF8(a.anchor, b.anchor) || cmpLiteralValue(a.field, b.field)\n );\n }\n}\n\n// null < boolean < number < string < array. Ordering values of different\n// types by their string form would make distinct values compare equal (['a',\n// 'b'] and 'a,b', or 1 and '1'), which would leave their order up to the\n// order they were written in, and with it the hash of the query.\nconst LITERAL_VALUE_TYPES = ['object', 'boolean', 'number', 'string'];\n\nfunction literalValueType(value: LiteralValue): number {\n return Array.isArray(value)\n ? LITERAL_VALUE_TYPES.length\n : LITERAL_VALUE_TYPES.indexOf(typeof value);\n}\n\nfunction cmpLiteralValue(a: LiteralValue, b: LiteralValue): number {\n const type = literalValueType(a) - literalValueType(b);\n if (type !== 0) {\n return type;\n }\n\n if (Array.isArray(a)) {\n assert(Array.isArray(b), 'Expected array for comparison');\n for (let i = 0; i < a.length && i < b.length; i++) {\n const val = cmpLiteralValue(a[i], b[i]);\n if (val !== 0) {\n return val;\n }\n }\n // prefixes first\n return a.length - b.length;\n }\n\n switch (typeof a) {\n case 'string':\n assert(typeof b === 'string', 'Expected string for comparison');\n return compareUTF8(a, b);\n case 'number':\n assert(typeof b === 'number', 'Expected number for comparison');\n return a < b ? -1 : a > b ? 1 : 0;\n case 'boolean':\n assert(typeof b === 'boolean', 'Expected boolean for comparison');\n return Number(a) - Number(b);\n default:\n return 0; // null\n }\n}\n\nfunction cmpRelated(a: CorrelatedSubquery, b: CorrelatedSubquery): number {\n return compareUTF8(must(a.subquery.alias), must(b.subquery.alias));\n}\n\nfunction compareUTF8MaybeNull(a: string | null, b: string | null): number {\n if (a !== null && b !== null) {\n return compareUTF8(a, b);\n }\n if (b !== null) {\n return -1;\n }\n if (a !== null) {\n return 1;\n }\n return 0;\n}\n\nfunction cmpOptionalBool(\n a: boolean | undefined,\n b: boolean | undefined,\n): number {\n // undefined < false < true\n const toNum = (v: boolean | undefined) => (v === undefined ? 0 : v ? 2 : 1);\n return toNum(a) - toNum(b);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"change-desired-queries.js","names":[],"sources":["../../../../zero-protocol/src/change-desired-queries.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\nimport {upQueriesPatchSchema} from './queries-patch.ts';\n\nconst changeDesiredQueriesBodySchema = v.object({\n desiredQueriesPatch: upQueriesPatchSchema,\n /** W3C traceparent header for distributed tracing. */\n traceparent: v.string().optional(),\n});\n\nexport const changeDesiredQueriesMessageSchema = v.tuple([\n v.literal('changeDesiredQueries'),\n changeDesiredQueriesBodySchema,\n]);\n\nexport type ChangeDesiredQueriesBody = v.Infer<\n typeof changeDesiredQueriesBodySchema\n>;\nexport type ChangeDesiredQueriesMessage = v.Infer<\n typeof changeDesiredQueriesMessageSchema\n>;\n"],"mappings":";;;AAGA,IAAM,iCAAiC,eAAE,OAAO;CAC9C,qBAAqB;;CAErB,aAAa,eAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAED,IAAa,oCAAoC,eAAE,MAAM,CACvD,eAAE,QAAQ,sBAAsB,GAChC,8BACF,CAAC"}
1
+ {"version":3,"file":"change-desired-queries.js","names":["v"],"sources":["../../../../zero-protocol/src/change-desired-queries.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\nimport {upQueriesPatchSchema} from './queries-patch.ts';\n\nconst changeDesiredQueriesBodySchema = v.object({\n desiredQueriesPatch: upQueriesPatchSchema,\n /** W3C traceparent header for distributed tracing. */\n traceparent: v.string().optional(),\n});\n\nexport const changeDesiredQueriesMessageSchema = v.tuple([\n v.literal('changeDesiredQueries'),\n changeDesiredQueriesBodySchema,\n]);\n\nexport type ChangeDesiredQueriesBody = v.Infer<\n typeof changeDesiredQueriesBodySchema\n>;\nexport type ChangeDesiredQueriesMessage = v.Infer<\n typeof changeDesiredQueriesMessageSchema\n>;\n"],"mappings":";;;AAGA,IAAM,iCAAiCA,eAAE,OAAO;CAC9C,qBAAqB;;CAErB,aAAaA,eAAE,OAAO,CAAC,CAAC,SAAS;AACnC,CAAC;AAED,IAAa,oCAAoCA,eAAE,MAAM,CACvDA,eAAE,QAAQ,sBAAsB,GAChC,8BACF,CAAC"}
@@ -21,6 +21,6 @@ function normalizeClientSchema(schema) {
21
21
  }])) };
22
22
  }
23
23
  //#endregion
24
- export { clientSchemaSchema, normalizeClientSchema, valueTypeSchema };
24
+ export { clientSchemaSchema, columnSchemaSchema, normalizeClientSchema, tableSchemaSchema, valueTypeSchema };
25
25
 
26
26
  //# sourceMappingURL=client-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-schema.js","names":[],"sources":["../../../../zero-protocol/src/client-schema.ts"],"sourcesContent":["import {must} from '../../shared/src/must.ts';\nimport {mapAllEntries} from '../../shared/src/objects.ts';\nimport * as v from '../../shared/src/valita.ts';\n\nexport type ValueType = 'string' | 'number' | 'boolean' | 'null' | 'json';\n\nexport const valueTypeSchema: v.Type<ValueType> = v.literalUnion(\n 'string',\n 'number',\n 'boolean',\n 'null',\n 'json',\n);\n\nexport const columnSchemaSchema = v.object({\n type: valueTypeSchema,\n});\n\nexport type ColumnSchema = v.Infer<typeof columnSchemaSchema>;\n\nexport const tableSchemaSchema = v.object({\n columns: v.record(columnSchemaSchema),\n primaryKey: v.array(v.string()),\n});\n\nexport type TableSchema = v.Infer<typeof tableSchemaSchema>;\n\nexport const clientSchemaSchema = v.object({\n tables: v.record(tableSchemaSchema),\n});\n\nexport type ClientSchema = v.Infer<typeof clientSchemaSchema>;\n\nconst keyCmp = ([a]: [a: string, _: unknown], [b]: [b: string, _: unknown]) =>\n a < b ? -1 : a > b ? 1 : 0;\n\n/**\n * Returns a normalized schema (with the tables and columns sorted)\n * suitable for hashing.\n */\nexport function normalizeClientSchema(schema: ClientSchema): ClientSchema {\n return {\n tables: mapAllEntries(schema.tables, tables =>\n tables.sort(keyCmp).map(([name, table]) => [\n name,\n {\n columns: mapAllEntries(table.columns, e => e.sort(keyCmp)),\n primaryKey: must(\n table.primaryKey,\n `new clients always specify a primaryKey`,\n ).sort(),\n },\n ]),\n ),\n };\n}\n"],"mappings":";;;;AAMA,IAAa,kBAAqC,aAChD,UACA,UACA,WACA,QACA,MACF;AAEA,IAAa,qBAAqB,eAAE,OAAO,EACzC,MAAM,gBACR,CAAC;AAID,IAAa,oBAAoB,eAAE,OAAO;CACxC,SAAS,eAAE,OAAO,kBAAkB;CACpC,YAAY,eAAE,MAAM,eAAE,OAAO,CAAC;AAChC,CAAC;AAID,IAAa,qBAAqB,eAAE,OAAO,EACzC,QAAQ,eAAE,OAAO,iBAAiB,EACpC,CAAC;AAID,IAAM,UAAU,CAAC,IAA6B,CAAC,OAC7C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;;;;;AAM3B,SAAgB,sBAAsB,QAAoC;CACxE,OAAO,EACL,QAAQ,cAAc,OAAO,SAAQ,WACnC,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,MAAM,WAAW,CACzC,MACA;EACE,SAAS,cAAc,MAAM,UAAS,MAAK,EAAE,KAAK,MAAM,CAAC;EACzD,YAAY,KACV,MAAM,YACN,yCACF,EAAE,KAAK;CACT,CACF,CAAC,CACH,EACF;AACF"}
1
+ {"version":3,"file":"client-schema.js","names":["v.literalUnion","v"],"sources":["../../../../zero-protocol/src/client-schema.ts"],"sourcesContent":["import {must} from '../../shared/src/must.ts';\nimport {mapAllEntries} from '../../shared/src/objects.ts';\nimport * as v from '../../shared/src/valita.ts';\n\nexport type ValueType = 'string' | 'number' | 'boolean' | 'null' | 'json';\n\nexport const valueTypeSchema: v.Type<ValueType> = v.literalUnion(\n 'string',\n 'number',\n 'boolean',\n 'null',\n 'json',\n);\n\nexport const columnSchemaSchema = v.object({\n type: valueTypeSchema,\n});\n\nexport type ColumnSchema = v.Infer<typeof columnSchemaSchema>;\n\nexport const tableSchemaSchema = v.object({\n columns: v.record(columnSchemaSchema),\n primaryKey: v.array(v.string()),\n});\n\nexport type TableSchema = v.Infer<typeof tableSchemaSchema>;\n\nexport const clientSchemaSchema = v.object({\n tables: v.record(tableSchemaSchema),\n});\n\nexport type ClientSchema = v.Infer<typeof clientSchemaSchema>;\n\nconst keyCmp = ([a]: [a: string, _: unknown], [b]: [b: string, _: unknown]) =>\n a < b ? -1 : a > b ? 1 : 0;\n\n/**\n * Returns a normalized schema (with the tables and columns sorted)\n * suitable for hashing.\n */\nexport function normalizeClientSchema(schema: ClientSchema): ClientSchema {\n return {\n tables: mapAllEntries(schema.tables, tables =>\n tables.sort(keyCmp).map(([name, table]) => [\n name,\n {\n columns: mapAllEntries(table.columns, e => e.sort(keyCmp)),\n primaryKey: must(\n table.primaryKey,\n `new clients always specify a primaryKey`,\n ).sort(),\n },\n ]),\n ),\n };\n}\n"],"mappings":";;;;AAMA,IAAa,kBAAqCA,aAChD,UACA,UACA,WACA,QACA,MACF;AAEA,IAAa,qBAAqBC,eAAE,OAAO,EACzC,MAAM,gBACR,CAAC;AAID,IAAa,oBAAoBA,eAAE,OAAO;CACxC,SAASA,eAAE,OAAO,kBAAkB;CACpC,YAAYA,eAAE,MAAMA,eAAE,OAAO,CAAC;AAChC,CAAC;AAID,IAAa,qBAAqBA,eAAE,OAAO,EACzC,QAAQA,eAAE,OAAO,iBAAiB,EACpC,CAAC;AAID,IAAM,UAAU,CAAC,IAA6B,CAAC,OAC7C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;;;;;AAM3B,SAAgB,sBAAsB,QAAoC;CACxE,OAAO,EACL,QAAQ,cAAc,OAAO,SAAQ,WACnC,OAAO,KAAK,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CACzC,MACA;EACE,SAAS,cAAc,MAAM,UAAS,MAAK,EAAE,KAAK,MAAM,CAAC;EACzD,YAAY,KACV,MAAM,YACN,yCACF,CAAC,CAAC,KAAK;CACT,CACF,CAAC,CACH,EACF;AACF"}
@@ -15,6 +15,6 @@ var closeConnectionBodySchema = valita_exports.array(valita_exports.unknown());
15
15
  */
16
16
  var closeConnectionMessageSchema = valita_exports.tuple([valita_exports.literal("closeConnection"), closeConnectionBodySchema]);
17
17
  //#endregion
18
- export { closeConnectionMessageSchema };
18
+ export { closeConnectionBodySchema, closeConnectionMessageSchema };
19
19
 
20
20
  //# sourceMappingURL=close-connection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"close-connection.js","names":[],"sources":["../../../../zero-protocol/src/close-connection.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\n\n/**\n * We do not use the body yet.\n */\nexport const closeConnectionBodySchema = v.array(v.unknown());\n\n/**\n * This message gets sent as part of the close reason in the WebSocket close event.\n * The close reason is a string, so we serialize this message to JSON.\n \n * \"The value must be no longer than 123 bytes (encoded in UTF-8).\" -\n * https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close#reason\n * \n * @deprecated\n */\nexport const closeConnectionMessageSchema = v.tuple([\n v.literal('closeConnection'),\n closeConnectionBodySchema,\n]);\n\n/** @deprecated */\nexport type CloseConnectionBody = v.Infer<typeof closeConnectionBodySchema>;\n\n/** @deprecated */\nexport type CloseConnectionMessage = v.Infer<\n typeof closeConnectionMessageSchema\n>;\n"],"mappings":";;;;;AAKA,IAAa,4BAA4B,eAAE,MAAM,eAAE,QAAQ,CAAC;;;;;;;;;;AAW5D,IAAa,+BAA+B,eAAE,MAAM,CAClD,eAAE,QAAQ,iBAAiB,GAC3B,yBACF,CAAC"}
1
+ {"version":3,"file":"close-connection.js","names":["v"],"sources":["../../../../zero-protocol/src/close-connection.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\n\n/**\n * We do not use the body yet.\n */\nexport const closeConnectionBodySchema = v.array(v.unknown());\n\n/**\n * This message gets sent as part of the close reason in the WebSocket close event.\n * The close reason is a string, so we serialize this message to JSON.\n \n * \"The value must be no longer than 123 bytes (encoded in UTF-8).\" -\n * https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close#reason\n * \n * @deprecated\n */\nexport const closeConnectionMessageSchema = v.tuple([\n v.literal('closeConnection'),\n closeConnectionBodySchema,\n]);\n\n/** @deprecated */\nexport type CloseConnectionBody = v.Infer<typeof closeConnectionBodySchema>;\n\n/** @deprecated */\nexport type CloseConnectionMessage = v.Infer<\n typeof closeConnectionMessageSchema\n>;\n"],"mappings":";;;;;AAKA,IAAa,4BAA4BA,eAAE,MAAMA,eAAE,QAAQ,CAAC;;;;;;;;;;AAW5D,IAAa,+BAA+BA,eAAE,MAAM,CAClDA,eAAE,QAAQ,iBAAiB,GAC3B,yBACF,CAAC"}
@@ -49,6 +49,6 @@ function decodeSecProtocols(secProtocol) {
49
49
  return JSON.parse(new TextDecoder().decode(bytes));
50
50
  }
51
51
  //#endregion
52
- export { connectedMessageSchema, decodeSecProtocols, encodeSecProtocols, initConnectionMessageSchema };
52
+ export { connectedBodySchema, connectedMessageSchema, decodeSecProtocols, encodeSecProtocols, initConnectionMessageSchema };
53
53
 
54
54
  //# sourceMappingURL=connect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","names":[],"sources":["../../../../zero-protocol/src/connect.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\nimport {clientSchemaSchema} from './client-schema.ts';\nimport {deleteClientsBodySchema} from './delete-clients.ts';\nimport {upQueriesPatchSchema} from './queries-patch.ts';\n\n/**\n * After opening a websocket the client waits for a `connected` message\n * from the server. It then sends an `initConnection` message to the\n * server. The server waits for the `initConnection` message before\n * beginning to send pokes to the newly connected client, so as to avoid\n * syncing lots of queries which are no longer desired by the client.\n */\n\nexport const connectedBodySchema = v.object({\n wsid: v.string(),\n timestamp: v.number().optional(),\n});\n\nexport const connectedMessageSchema = v.tuple([\n v.literal('connected'),\n connectedBodySchema,\n]);\n\nconst initConnectionBodySchema = v.object({\n desiredQueriesPatch: upQueriesPatchSchema,\n // As the schema can be large, client only sends when it does not have a\n // server snapshot (i.e. a snapshot with a cookie). Once it has a server\n // snapshot it will assume the zero-cache already has the schema for this\n // client's client group in the CVR store.\n clientSchema: clientSchemaSchema.optional(),\n deleted: deleteClientsBodySchema.optional(),\n // parameters to configure the mutate endpoint\n userPushURL: v.string().optional(),\n userPushHeaders: v.record(v.string()).optional(),\n // parameters to configure the query endpoint\n userQueryURL: v.string().optional(),\n userQueryHeaders: v.record(v.string()).optional(),\n\n /**\n * `activeClients` is an optional array of client IDs that are currently active\n * in the client group. This is used to inform the server about the clients\n * that are currently active (aka running, aka alive), so it can inactive\n * queries from inactive clients.\n */\n activeClients: v.array(v.string()).optional(),\n /** W3C traceparent header for distributed tracing. */\n traceparent: v.string().optional(),\n});\n\nexport const initConnectionMessageSchema = v.tuple([\n v.literal('initConnection'),\n initConnectionBodySchema,\n]);\n\nexport type ConnectedBody = v.Infer<typeof connectedBodySchema>;\nexport type ConnectedMessage = v.Infer<typeof connectedMessageSchema>;\nexport type InitConnectionBody = v.Infer<typeof initConnectionBodySchema>;\nexport type InitConnectionMessage = v.Infer<typeof initConnectionMessageSchema>;\n\nexport function encodeSecProtocols(\n initConnectionMessage: InitConnectionMessage | undefined,\n authToken: string | undefined,\n): string {\n const protocols = {\n initConnectionMessage,\n authToken,\n };\n // WS sec protocols needs to be URI encoded. To save space, we base64 encode\n // the JSON before URI encoding it. But InitConnectionMessage can contain\n // arbitrary unicode strings, so we need to encode the JSON as UTF-8 first.\n // Phew!\n const bytes = new TextEncoder().encode(JSON.stringify(protocols));\n\n // Convert bytes to string without spreading all bytes as arguments\n // to avoid \"Maximum call stack size exceeded\" error with large data\n const s = Array.from(bytes, byte => String.fromCharCode(byte)).join('');\n\n return encodeURIComponent(btoa(s));\n}\n\nexport function decodeSecProtocols(secProtocol: string): {\n initConnectionMessage: InitConnectionMessage | undefined;\n authToken: string | undefined;\n} {\n const binString = atob(decodeURIComponent(secProtocol));\n const bytes = Uint8Array.from(binString, c => c.charCodeAt(0));\n return JSON.parse(new TextDecoder().decode(bytes));\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAa,sBAAsB,eAAE,OAAO;CAC1C,MAAM,eAAE,OAAO;CACf,WAAW,eAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAED,IAAa,yBAAyB,eAAE,MAAM,CAC5C,eAAE,QAAQ,WAAW,GACrB,mBACF,CAAC;AAED,IAAM,2BAA2B,eAAE,OAAO;CACxC,qBAAqB;CAKrB,cAAc,mBAAmB,SAAS;CAC1C,SAAS,wBAAwB,SAAS;CAE1C,aAAa,eAAE,OAAO,EAAE,SAAS;CACjC,iBAAiB,eAAE,OAAO,eAAE,OAAO,CAAC,EAAE,SAAS;CAE/C,cAAc,eAAE,OAAO,EAAE,SAAS;CAClC,kBAAkB,eAAE,OAAO,eAAE,OAAO,CAAC,EAAE,SAAS;;;;;;;CAQhD,eAAe,eAAE,MAAM,eAAE,OAAO,CAAC,EAAE,SAAS;;CAE5C,aAAa,eAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAED,IAAa,8BAA8B,eAAE,MAAM,CACjD,eAAE,QAAQ,gBAAgB,GAC1B,wBACF,CAAC;AAOD,SAAgB,mBACd,uBACA,WACQ;CACR,MAAM,YAAY;EAChB;EACA;CACF;CAKA,MAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,SAAS,CAAC;CAIhE,MAAM,IAAI,MAAM,KAAK,QAAO,SAAQ,OAAO,aAAa,IAAI,CAAC,EAAE,KAAK,EAAE;CAEtE,OAAO,mBAAmB,KAAK,CAAC,CAAC;AACnC;AAEA,SAAgB,mBAAmB,aAGjC;CACA,MAAM,YAAY,KAAK,mBAAmB,WAAW,CAAC;CACtD,MAAM,QAAQ,WAAW,KAAK,YAAW,MAAK,EAAE,WAAW,CAAC,CAAC;CAC7D,OAAO,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,KAAK,CAAC;AACnD"}
1
+ {"version":3,"file":"connect.js","names":["v"],"sources":["../../../../zero-protocol/src/connect.ts"],"sourcesContent":["import * as v from '../../shared/src/valita.ts';\nimport {clientSchemaSchema} from './client-schema.ts';\nimport {deleteClientsBodySchema} from './delete-clients.ts';\nimport {upQueriesPatchSchema} from './queries-patch.ts';\n\n/**\n * After opening a websocket the client waits for a `connected` message\n * from the server. It then sends an `initConnection` message to the\n * server. The server waits for the `initConnection` message before\n * beginning to send pokes to the newly connected client, so as to avoid\n * syncing lots of queries which are no longer desired by the client.\n */\n\nexport const connectedBodySchema = v.object({\n wsid: v.string(),\n timestamp: v.number().optional(),\n});\n\nexport const connectedMessageSchema = v.tuple([\n v.literal('connected'),\n connectedBodySchema,\n]);\n\nconst initConnectionBodySchema = v.object({\n desiredQueriesPatch: upQueriesPatchSchema,\n // As the schema can be large, client only sends when it does not have a\n // server snapshot (i.e. a snapshot with a cookie). Once it has a server\n // snapshot it will assume the zero-cache already has the schema for this\n // client's client group in the CVR store.\n clientSchema: clientSchemaSchema.optional(),\n deleted: deleteClientsBodySchema.optional(),\n // parameters to configure the mutate endpoint\n userPushURL: v.string().optional(),\n userPushHeaders: v.record(v.string()).optional(),\n // parameters to configure the query endpoint\n userQueryURL: v.string().optional(),\n userQueryHeaders: v.record(v.string()).optional(),\n\n /**\n * `activeClients` is an optional array of client IDs that are currently active\n * in the client group. This is used to inform the server about the clients\n * that are currently active (aka running, aka alive), so it can inactive\n * queries from inactive clients.\n */\n activeClients: v.array(v.string()).optional(),\n /** W3C traceparent header for distributed tracing. */\n traceparent: v.string().optional(),\n});\n\nexport const initConnectionMessageSchema = v.tuple([\n v.literal('initConnection'),\n initConnectionBodySchema,\n]);\n\nexport type ConnectedBody = v.Infer<typeof connectedBodySchema>;\nexport type ConnectedMessage = v.Infer<typeof connectedMessageSchema>;\nexport type InitConnectionBody = v.Infer<typeof initConnectionBodySchema>;\nexport type InitConnectionMessage = v.Infer<typeof initConnectionMessageSchema>;\n\nexport function encodeSecProtocols(\n initConnectionMessage: InitConnectionMessage | undefined,\n authToken: string | undefined,\n): string {\n const protocols = {\n initConnectionMessage,\n authToken,\n };\n // WS sec protocols needs to be URI encoded. To save space, we base64 encode\n // the JSON before URI encoding it. But InitConnectionMessage can contain\n // arbitrary unicode strings, so we need to encode the JSON as UTF-8 first.\n // Phew!\n const bytes = new TextEncoder().encode(JSON.stringify(protocols));\n\n // Convert bytes to string without spreading all bytes as arguments\n // to avoid \"Maximum call stack size exceeded\" error with large data\n const s = Array.from(bytes, byte => String.fromCharCode(byte)).join('');\n\n return encodeURIComponent(btoa(s));\n}\n\nexport function decodeSecProtocols(secProtocol: string): {\n initConnectionMessage: InitConnectionMessage | undefined;\n authToken: string | undefined;\n} {\n const binString = atob(decodeURIComponent(secProtocol));\n const bytes = Uint8Array.from(binString, c => c.charCodeAt(0));\n return JSON.parse(new TextDecoder().decode(bytes));\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAa,sBAAsBA,eAAE,OAAO;CAC1C,MAAMA,eAAE,OAAO;CACf,WAAWA,eAAE,OAAO,CAAC,CAAC,SAAS;AACjC,CAAC;AAED,IAAa,yBAAyBA,eAAE,MAAM,CAC5CA,eAAE,QAAQ,WAAW,GACrB,mBACF,CAAC;AAED,IAAM,2BAA2BA,eAAE,OAAO;CACxC,qBAAqB;CAKrB,cAAc,mBAAmB,SAAS;CAC1C,SAAS,wBAAwB,SAAS;CAE1C,aAAaA,eAAE,OAAO,CAAC,CAAC,SAAS;CACjC,iBAAiBA,eAAE,OAAOA,eAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CAE/C,cAAcA,eAAE,OAAO,CAAC,CAAC,SAAS;CAClC,kBAAkBA,eAAE,OAAOA,eAAE,OAAO,CAAC,CAAC,CAAC,SAAS;;;;;;;CAQhD,eAAeA,eAAE,MAAMA,eAAE,OAAO,CAAC,CAAC,CAAC,SAAS;;CAE5C,aAAaA,eAAE,OAAO,CAAC,CAAC,SAAS;AACnC,CAAC;AAED,IAAa,8BAA8BA,eAAE,MAAM,CACjDA,eAAE,QAAQ,gBAAgB,GAC1B,wBACF,CAAC;AAOD,SAAgB,mBACd,uBACA,WACQ;CACR,MAAM,YAAY;EAChB;EACA;CACF;CAKA,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,UAAU,SAAS,CAAC;CAIhE,MAAM,IAAI,MAAM,KAAK,QAAO,SAAQ,OAAO,aAAa,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;CAEtE,OAAO,mBAAmB,KAAK,CAAC,CAAC;AACnC;AAEA,SAAgB,mBAAmB,aAGjC;CACA,MAAM,YAAY,KAAK,mBAAmB,WAAW,CAAC;CACtD,MAAM,QAAQ,WAAW,KAAK,YAAW,MAAK,EAAE,WAAW,CAAC,CAAC;CAC7D,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,CAAC;AACnD"}