@rocicorp/zero 0.26.0-canary.7 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/out/ast-to-zql/src/ast-to-zql.d.ts.map +1 -1
  2. package/out/ast-to-zql/src/ast-to-zql.js +16 -27
  3. package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
  4. package/out/otel/src/log-options.d.ts +2 -2
  5. package/out/replicache/src/bg-interval.d.ts.map +1 -1
  6. package/out/replicache/src/bg-interval.js +3 -0
  7. package/out/replicache/src/bg-interval.js.map +1 -1
  8. package/out/shared/src/arrays.js +1 -1
  9. package/out/shared/src/arrays.js.map +1 -1
  10. package/out/shared/src/browser-env.js +0 -4
  11. package/out/shared/src/browser-env.js.map +1 -1
  12. package/out/shared/src/btree-set.js +4 -1
  13. package/out/shared/src/btree-set.js.map +1 -1
  14. package/out/shared/src/options.js +1 -1
  15. package/out/shared/src/options.js.map +1 -1
  16. package/out/shared/src/queue.js +1 -1
  17. package/out/shared/src/queue.js.map +1 -1
  18. package/out/z2s/src/compiler.d.ts.map +1 -1
  19. package/out/z2s/src/compiler.js +13 -11
  20. package/out/z2s/src/compiler.js.map +1 -1
  21. package/out/zero/package.json.js +1 -1
  22. package/out/zero/src/react.js +1 -3
  23. package/out/zero/src/react.js.map +1 -1
  24. package/out/zero-cache/src/auth/read-authorizer.js +0 -7
  25. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  26. package/out/zero-cache/src/config/network.d.ts +3 -2
  27. package/out/zero-cache/src/config/network.d.ts.map +1 -1
  28. package/out/zero-cache/src/config/network.js +9 -2
  29. package/out/zero-cache/src/config/network.js.map +1 -1
  30. package/out/zero-cache/src/config/server-context.d.ts +16 -0
  31. package/out/zero-cache/src/config/server-context.d.ts.map +1 -0
  32. package/out/zero-cache/src/config/server-context.js +32 -0
  33. package/out/zero-cache/src/config/server-context.js.map +1 -0
  34. package/out/zero-cache/src/config/zero-config.d.ts +3 -3
  35. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  36. package/out/zero-cache/src/config/zero-config.js +2 -6
  37. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  38. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  39. package/out/zero-cache/src/db/migration.js +40 -51
  40. package/out/zero-cache/src/db/migration.js.map +1 -1
  41. package/out/zero-cache/src/db/run-transaction.d.ts +17 -0
  42. package/out/zero-cache/src/db/run-transaction.d.ts.map +1 -0
  43. package/out/zero-cache/src/db/run-transaction.js +24 -0
  44. package/out/zero-cache/src/db/run-transaction.js.map +1 -0
  45. package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
  46. package/out/zero-cache/src/db/transaction-pool.js +3 -3
  47. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  48. package/out/zero-cache/src/scripts/decommission.d.ts +1 -1
  49. package/out/zero-cache/src/scripts/deploy-permissions.js +2 -1
  50. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  51. package/out/zero-cache/src/scripts/permissions.d.ts +1 -1
  52. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  53. package/out/zero-cache/src/server/change-streamer.js +6 -2
  54. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  55. package/out/zero-cache/src/server/main.js +1 -1
  56. package/out/zero-cache/src/server/main.js.map +1 -1
  57. package/out/zero-cache/src/server/runner/run-worker.d.ts.map +1 -1
  58. package/out/zero-cache/src/server/runner/run-worker.js +7 -3
  59. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  60. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts +1 -1
  61. package/out/zero-cache/src/services/change-source/common/backfill-manager.d.ts.map +1 -1
  62. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +11 -9
  63. package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
  64. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  65. package/out/zero-cache/src/services/change-source/common/replica-schema.js +11 -0
  66. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  67. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +5 -2
  68. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  69. package/out/zero-cache/src/services/change-source/custom/change-source.js +6 -6
  70. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  71. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +6 -4
  72. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  73. package/out/zero-cache/src/services/change-source/pg/change-source.js +148 -54
  74. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  75. package/out/zero-cache/src/services/change-source/pg/decommission.d.ts.map +1 -1
  76. package/out/zero-cache/src/services/change-source/pg/decommission.js +2 -1
  77. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
  78. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +4 -1
  79. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  80. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +35 -10
  81. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  82. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +1 -1
  83. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  84. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  85. package/out/zero-cache/src/services/change-source/pg/schema/init.js +10 -0
  86. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  87. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +6 -3
  88. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  89. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +19 -10
  90. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  91. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +1 -0
  92. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  93. package/out/zero-cache/src/services/change-source/protocol/current/data.js +4 -2
  94. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  95. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +3 -0
  96. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  97. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts +6 -4
  98. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts.map +1 -1
  99. package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
  100. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts +2 -2
  101. package/out/zero-cache/src/services/change-streamer/backup-monitor.d.ts.map +1 -1
  102. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +30 -12
  103. package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
  104. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +23 -3
  105. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  106. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +1 -0
  107. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  108. package/out/zero-cache/src/services/change-streamer/forwarder.js +1 -1
  109. package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
  110. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +1 -1
  111. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  112. package/out/zero-cache/src/services/change-streamer/schema/tables.js +12 -4
  113. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  114. package/out/zero-cache/src/services/change-streamer/storer.d.ts +11 -2
  115. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  116. package/out/zero-cache/src/services/change-streamer/storer.js +80 -42
  117. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  118. package/out/zero-cache/src/services/litestream/commands.d.ts +1 -1
  119. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  120. package/out/zero-cache/src/services/litestream/commands.js +2 -1
  121. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  122. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  123. package/out/zero-cache/src/services/mutagen/mutagen.js +22 -17
  124. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  125. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +10 -1
  126. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  127. package/out/zero-cache/src/services/replicator/schema/replication-state.js +49 -9
  128. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  129. package/out/zero-cache/src/services/running-state.d.ts +1 -0
  130. package/out/zero-cache/src/services/running-state.d.ts.map +1 -1
  131. package/out/zero-cache/src/services/running-state.js +3 -0
  132. package/out/zero-cache/src/services/running-state.js.map +1 -1
  133. package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts.map +1 -1
  134. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +32 -28
  135. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  136. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  137. package/out/zero-cache/src/services/view-syncer/cvr-store.js +329 -155
  138. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  139. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  140. package/out/zero-cache/src/services/view-syncer/cvr.js +387 -345
  141. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  142. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  143. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +68 -16
  144. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  145. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
  146. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +13 -8
  147. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  148. package/out/zero-cache/src/services/view-syncer/tracer.d.ts +2 -0
  149. package/out/zero-cache/src/services/view-syncer/tracer.d.ts.map +1 -0
  150. package/out/zero-cache/src/services/view-syncer/tracer.js +7 -0
  151. package/out/zero-cache/src/services/view-syncer/tracer.js.map +1 -0
  152. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  153. package/out/zero-cache/src/services/view-syncer/view-syncer.js +58 -43
  154. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  155. package/out/zero-cache/src/types/pg.js +0 -4
  156. package/out/zero-cache/src/types/pg.js.map +1 -1
  157. package/out/zero-cache/src/types/streams.d.ts +3 -1
  158. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  159. package/out/zero-cache/src/types/streams.js +1 -1
  160. package/out/zero-cache/src/types/streams.js.map +1 -1
  161. package/out/zero-cache/src/types/subscription.d.ts +7 -1
  162. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  163. package/out/zero-cache/src/types/subscription.js +8 -2
  164. package/out/zero-cache/src/types/subscription.js.map +1 -1
  165. package/out/zero-client/src/client/options.d.ts +7 -7
  166. package/out/zero-client/src/client/options.d.ts.map +1 -1
  167. package/out/zero-client/src/client/options.js.map +1 -1
  168. package/out/zero-client/src/client/query-manager.js +1 -1
  169. package/out/zero-client/src/client/query-manager.js.map +1 -1
  170. package/out/zero-client/src/client/version.js +1 -1
  171. package/out/zero-client/src/client/zero-poke-handler.d.ts +5 -5
  172. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  173. package/out/zero-client/src/client/zero-poke-handler.js +15 -17
  174. package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
  175. package/out/zero-client/src/client/zero.d.ts +6 -2
  176. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  177. package/out/zero-client/src/client/zero.js +44 -8
  178. package/out/zero-client/src/client/zero.js.map +1 -1
  179. package/out/zero-client/src/mod.d.ts +1 -1
  180. package/out/zero-client/src/mod.d.ts.map +1 -1
  181. package/out/zero-protocol/src/ast.d.ts +2 -9
  182. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  183. package/out/zero-protocol/src/ast.js +15 -32
  184. package/out/zero-protocol/src/ast.js.map +1 -1
  185. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  186. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  187. package/out/zero-protocol/src/protocol-version.js +5 -2
  188. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  189. package/out/zero-react/src/mod.d.ts +0 -2
  190. package/out/zero-react/src/mod.d.ts.map +1 -1
  191. package/out/zero-react/src/use-query.d.ts +6 -6
  192. package/out/zero-react/src/use-query.d.ts.map +1 -1
  193. package/out/zero-react/src/use-query.js +9 -2
  194. package/out/zero-react/src/use-query.js.map +1 -1
  195. package/out/zero-react/src/zero-provider.d.ts +5 -5
  196. package/out/zero-react/src/zero-provider.d.ts.map +1 -1
  197. package/out/zero-react/src/zero-provider.js.map +1 -1
  198. package/out/zero-solid/src/solid-view.d.ts +0 -42
  199. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  200. package/out/zero-solid/src/solid-view.js +1 -1
  201. package/out/zero-solid/src/solid-view.js.map +1 -1
  202. package/out/zero-solid/src/use-query.d.ts +4 -4
  203. package/out/zero-solid/src/use-query.d.ts.map +1 -1
  204. package/out/zero-solid/src/use-query.js.map +1 -1
  205. package/out/zero-solid/src/use-zero.d.ts +5 -5
  206. package/out/zero-solid/src/use-zero.d.ts.map +1 -1
  207. package/out/zero-solid/src/use-zero.js.map +1 -1
  208. package/out/zero-types/src/default-types.d.ts +2 -0
  209. package/out/zero-types/src/default-types.d.ts.map +1 -1
  210. package/out/zql/src/builder/builder.d.ts.map +1 -1
  211. package/out/zql/src/builder/builder.js +6 -48
  212. package/out/zql/src/builder/builder.js.map +1 -1
  213. package/out/zql/src/builder/filter.d.ts.map +1 -1
  214. package/out/zql/src/builder/filter.js +0 -1
  215. package/out/zql/src/builder/filter.js.map +1 -1
  216. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  217. package/out/zql/src/ivm/array-view.js +6 -57
  218. package/out/zql/src/ivm/array-view.js.map +1 -1
  219. package/out/zql/src/ivm/view-apply-change.d.ts +3 -50
  220. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  221. package/out/zql/src/ivm/view-apply-change.js +105 -358
  222. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  223. package/out/zql/src/mutate/mutator-registry.d.ts +3 -3
  224. package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
  225. package/out/zql/src/mutate/mutator-registry.js.map +1 -1
  226. package/out/zql/src/planner/planner-builder.d.ts.map +1 -1
  227. package/out/zql/src/planner/planner-builder.js +1 -2
  228. package/out/zql/src/planner/planner-builder.js.map +1 -1
  229. package/out/zql/src/query/complete-ordering.js +0 -6
  230. package/out/zql/src/query/complete-ordering.js.map +1 -1
  231. package/out/zql/src/query/expression.d.ts +2 -19
  232. package/out/zql/src/query/expression.d.ts.map +1 -1
  233. package/out/zql/src/query/expression.js +6 -50
  234. package/out/zql/src/query/expression.js.map +1 -1
  235. package/out/zql/src/query/query-delegate-base.js +3 -1
  236. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  237. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  238. package/out/zql/src/query/query-impl.js +8 -12
  239. package/out/zql/src/query/query-impl.js.map +1 -1
  240. package/out/zql/src/query/query-internals.js.map +1 -1
  241. package/out/zql/src/query/query-registry.d.ts +3 -3
  242. package/out/zql/src/query/query-registry.d.ts.map +1 -1
  243. package/out/zql/src/query/query-registry.js.map +1 -1
  244. package/out/zql/src/query/query.d.ts +28 -5
  245. package/out/zql/src/query/query.d.ts.map +1 -1
  246. package/out/zqlite/src/query-builder.d.ts +0 -2
  247. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  248. package/out/zqlite/src/query-builder.js.map +1 -1
  249. package/out/zqlite/src/resolve-scalar-subqueries.d.ts +10 -2
  250. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
  251. package/out/zqlite/src/resolve-scalar-subqueries.js +41 -9
  252. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  253. package/out/zqlite/src/sqlite-cost-model.d.ts.map +1 -1
  254. package/out/zqlite/src/sqlite-cost-model.js +0 -1
  255. package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
  256. package/package.json +3 -5
  257. package/out/zero-cache/src/services/change-source/custom/sync-schema.d.ts +0 -4
  258. package/out/zero-cache/src/services/change-source/custom/sync-schema.d.ts.map +0 -1
  259. package/out/zero-cache/src/services/change-source/custom/sync-schema.js +0 -14
  260. package/out/zero-cache/src/services/change-source/custom/sync-schema.js.map +0 -1
  261. package/out/zero-cache/src/services/change-source/pg/sync-schema.d.ts +0 -5
  262. package/out/zero-cache/src/services/change-source/pg/sync-schema.d.ts.map +0 -1
  263. package/out/zero-cache/src/services/change-source/pg/sync-schema.js +0 -14
  264. package/out/zero-cache/src/services/change-source/pg/sync-schema.js.map +0 -1
  265. package/out/zero-react/src/paging-reducer.d.ts +0 -61
  266. package/out/zero-react/src/paging-reducer.d.ts.map +0 -1
  267. package/out/zero-react/src/paging-reducer.js +0 -77
  268. package/out/zero-react/src/paging-reducer.js.map +0 -1
  269. package/out/zero-react/src/use-rows.d.ts +0 -39
  270. package/out/zero-react/src/use-rows.d.ts.map +0 -1
  271. package/out/zero-react/src/use-rows.js +0 -130
  272. package/out/zero-react/src/use-rows.js.map +0 -1
  273. package/out/zero-react/src/use-zero-virtualizer.d.ts +0 -122
  274. package/out/zero-react/src/use-zero-virtualizer.d.ts.map +0 -1
  275. package/out/zero-react/src/use-zero-virtualizer.js +0 -342
  276. package/out/zero-react/src/use-zero-virtualizer.js.map +0 -1
@@ -196,9 +196,10 @@ function where(spec, condition, table) {
196
196
  " OR "
197
197
  )})`;
198
198
  case "correlatedSubquery":
199
+ if (condition.scalar) {
200
+ return scalarSubquery(spec, condition, table);
201
+ }
199
202
  return exists(spec, condition, table);
200
- case "scalarSubquery":
201
- return scalarSubquery(spec, condition, table);
202
203
  case "simple":
203
204
  return simple(spec, condition, table);
204
205
  }
@@ -236,22 +237,23 @@ function exists(spec, condition, parentTable) {
236
237
  }
237
238
  }
238
239
  function scalarSubquery(spec, condition, parentTable) {
240
+ const parentField = condition.related.correlation.parentField[0];
241
+ const childField = condition.related.correlation.childField[0];
242
+ const subqueryAST = condition.related.subquery;
239
243
  const parentCol = colIdent(spec.server, {
240
244
  table: parentTable,
241
- zql: condition.parentField
245
+ zql: parentField
242
246
  });
243
- const subqueryTable = makeTable(spec, condition.subquery.table);
247
+ const subqueryTable = makeTable(spec, subqueryAST.table);
244
248
  const childCol = colIdent(spec.server, {
245
249
  table: subqueryTable,
246
- zql: condition.childField
250
+ zql: childField
247
251
  });
248
- const op = sql.__dangerous__rawValue(condition.op);
249
- const subqueryWhere = condition.subquery.where ? sql`WHERE ${where(spec, condition.subquery.where, subqueryTable)}` : sql``;
250
- const subqueryOrderBy = orderBy(
251
- spec,
252
- condition.subquery.orderBy,
253
- subqueryTable
252
+ const op = sql.__dangerous__rawValue(
253
+ condition.op === "EXISTS" ? "=" : "IS NOT"
254
254
  );
255
+ const subqueryWhere = subqueryAST.where ? sql`WHERE ${where(spec, subqueryAST.where, subqueryTable)}` : sql``;
256
+ const subqueryOrderBy = orderBy(spec, subqueryAST.orderBy, subqueryTable);
255
257
  return sql`${parentCol} ${op} (SELECT ${childCol} FROM ${fromIdent(spec.server, subqueryTable)} ${subqueryWhere} ${subqueryOrderBy} LIMIT 1)`;
256
258
  }
257
259
  function makeCorrelator(spec, parentFields, childZqlFields) {
@@ -1 +1 @@
1
- {"version":3,"file":"compiler.js","sources":["../../../../z2s/src/compiler.ts"],"sourcesContent":["import type {SQLQuery} from '@databases/sql';\nimport {last, zip} from '../../shared/src/arrays.ts';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {\n parse as parseBigIntJson,\n type JSONValue as BigIntJSONValue,\n} from '../../shared/src/bigint-json.ts';\nimport {hasOwn} from '../../shared/src/has-own.ts';\nimport {type JSONValue} from '../../shared/src/json.ts';\nimport {must} from '../../shared/src/must.ts';\nimport {pgToZqlStringTypeMap} from '../../zero-cache/src/types/pg-data-type.ts';\nimport type {\n AST,\n Condition,\n CorrelatedSubquery,\n CorrelatedSubqueryCondition,\n Correlation,\n LiteralReference,\n Ordering,\n ScalarSubqueryCondition,\n SimpleCondition,\n ValuePosition,\n} from '../../zero-protocol/src/ast.ts';\nimport {\n clientToServer,\n type NameMapper,\n} from '../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {\n ServerColumnSchema,\n ServerSchema,\n} from '../../zero-types/src/server-schema.ts';\nimport type {Format} from '../../zql/src/ivm/view.ts';\nimport {completeOrdering} from '../../zql/src/query/complete-ordering.ts';\nimport {\n sql,\n sqlConvertColumnArg,\n sqlConvertPluralLiteralArg,\n sqlConvertSingularLiteralArg,\n Z2S_COLLATION,\n type PluralLiteralType,\n} from './sql.ts';\n\ntype Table = {\n zql: string;\n alias: string;\n};\n\ntype QualifiedColumn = {\n table: Table;\n zql: string;\n};\n\ntype ServerSpec = {\n schema: ServerSchema;\n // maps zql names to server names\n mapper: NameMapper;\n};\n\nexport type Spec = {\n server: ServerSpec;\n zql: Schema['tables'];\n aliasCount: number;\n};\n\nconst ZQL_RESULT_KEY = 'zql_result';\nconst ZQL_RESULT_KEY_IDENT = sql.ident(ZQL_RESULT_KEY);\n\nconst ZQL_RESULT_TABLE_KEY = 'zql_root';\nconst ZQL_RESULT_TABLE_IDENT = sql.ident(ZQL_RESULT_TABLE_KEY);\n\nexport function compile(\n serverSchema: ServerSchema,\n zqlSchema: Schema,\n ast: AST,\n format?: Format,\n): SQLQuery {\n ast = completeOrdering(\n ast,\n tableName => zqlSchema.tables[tableName].primaryKey,\n );\n const spec: Spec = {\n aliasCount: 0,\n server: {\n schema: serverSchema,\n mapper: clientToServer(zqlSchema.tables),\n },\n zql: zqlSchema.tables,\n };\n return sql`SELECT \n ${toJSON(ZQL_RESULT_TABLE_KEY, format?.singular)}::text AS ${ZQL_RESULT_KEY_IDENT}\n FROM (${select(spec, ast, format)}) ${ZQL_RESULT_TABLE_IDENT}`;\n}\n\nfunction select(\n spec: Spec,\n ast: AST,\n format: Format | undefined,\n correlate?: (childTable: Table) => SQLQuery,\n): SQLQuery {\n const table = makeTable(spec, ast.table);\n const selectionSet = related(spec, ast.related ?? [], format, table);\n const tableSchema = spec.zql[ast.table];\n const usedAliases = new Set<string>(\n ast.related?.map(r => r.subquery.alias ?? ''),\n );\n for (const column of Object.keys(tableSchema.columns)) {\n if (!usedAliases.has(column)) {\n selectionSet.push(\n selectIdent(spec.server, {\n table,\n zql: column,\n }),\n );\n }\n }\n\n let appliedWhere = false;\n function maybeWhere(test: unknown | undefined) {\n if (!test) {\n return sql``;\n }\n\n const ret = appliedWhere ? sql`AND` : sql`WHERE`;\n appliedWhere = true;\n return ret;\n }\n\n return sql`SELECT ${sql.join(selectionSet, ',')}\n FROM ${fromIdent(spec.server, table)}\n ${maybeWhere(ast.where)} ${where(spec, ast.where, table)}\n ${maybeWhere(correlate)} ${correlate ? correlate(table) : sql``}\n ${orderBy(spec, ast.orderBy, table)}\n ${limit(ast.limit, format?.singular)}`;\n}\n\nexport function limit(\n limit: number | undefined,\n singular: boolean | undefined,\n): SQLQuery {\n if (limit === 0) {\n return sql`LIMIT 0`;\n }\n if (singular) {\n return sql`LIMIT 1`;\n }\n if (limit === undefined) {\n return sql``;\n }\n return sql`LIMIT ${sqlConvertSingularLiteralArg(limit)}`;\n}\n\nfunction makeTable(spec: Spec, zql: string, alias?: string): Table {\n alias = alias ?? zql + '_' + spec.aliasCount++;\n return {\n zql,\n alias,\n };\n}\n\nexport function orderBy(\n spec: Spec,\n orderBy: Ordering | undefined,\n table: Table,\n): SQLQuery {\n if (!orderBy) {\n return sql``;\n }\n return sql`ORDER BY ${sql.join(\n orderBy.map(([col, dir]) => {\n const serverColumnSchema = getServerColumn(spec.server, table, col);\n return dir === 'asc'\n ? // Oh postgres. The table must be referred to by client name but the column by server name.\n // E.g., `SELECT server_col as client_col FROM server_table as client_table ORDER BY client_Table.server_col`\n sql`${colIdent(spec.server, {\n table,\n zql: col,\n })}${maybeCollate(serverColumnSchema)} ASC NULLS FIRST`\n : sql`${colIdent(spec.server, {\n table,\n zql: col,\n })}${maybeCollate(serverColumnSchema)} DESC NULLS LAST`;\n }),\n ', ',\n )}`;\n}\n\nfunction maybeCollate(serverColumnSchema: ServerColumnSchema): SQLQuery {\n if (serverColumnSchema.type === 'uuid' || serverColumnSchema.isEnum) {\n return sql`::text COLLATE ${sql.ident(Z2S_COLLATION)}`;\n }\n if (Object.hasOwn(pgToZqlStringTypeMap, serverColumnSchema.type)) {\n return sql` COLLATE ${sql.ident(Z2S_COLLATION)}`;\n }\n\n return sql``;\n}\n\nfunction related(\n spec: Spec,\n relationships: readonly CorrelatedSubquery[],\n format: Format | undefined,\n parentTable: Table,\n): SQLQuery[] {\n return relationships.map(relationship =>\n relationshipSubquery(\n spec,\n relationship,\n format?.relationships[must(relationship.subquery.alias)],\n parentTable,\n ),\n );\n}\n\nfunction relationshipSubquery(\n spec: Spec,\n relationship: CorrelatedSubquery,\n format: Format | undefined,\n parentTable: Table,\n): SQLQuery {\n const innerAlias = `inner_${relationship.subquery.alias}`;\n if (relationship.hidden) {\n const {join, participatingTables} = makeJunctionJoin(spec, relationship);\n const lastTable = must(last(participatingTables)).table;\n\n assert(\n relationship.subquery.related,\n 'hidden relationship must be a junction',\n );\n const nestedAst = relationship.subquery.related[0].subquery;\n const selectionSet = related(\n spec,\n nestedAst.related ?? [],\n format,\n lastTable,\n );\n const tableSchema = spec.zql[nestedAst.table];\n for (const column of Object.keys(tableSchema.columns)) {\n selectionSet.push(\n selectIdent(spec.server, {\n table: lastTable,\n zql: column,\n }),\n );\n }\n\n return sql`(\n SELECT ${toJSON(innerAlias, format?.singular)} FROM (SELECT ${sql.join(\n selectionSet,\n ',',\n )} FROM ${join} WHERE (${makeCorrelator(\n spec,\n relationship.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n relationship.correlation.childField,\n )(participatingTables[0].table)}) ${\n nestedAst.where\n ? sql`AND ${where(spec, nestedAst.where, lastTable)}`\n : sql``\n } ${orderBy(spec, nestedAst.orderBy, lastTable)} ${limit(\n last(participatingTables)?.limit,\n format?.singular,\n )} ) ${sql.ident(innerAlias)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n }\n\n return sql`(\n SELECT ${toJSON(innerAlias, format?.singular)} FROM (${select(\n spec,\n relationship.subquery,\n format,\n makeCorrelator(\n spec,\n relationship.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n relationship.correlation.childField,\n ),\n )}) ${sql.ident(innerAlias)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n}\n\nfunction where(\n spec: Spec,\n condition: Condition | undefined,\n table: Table,\n): SQLQuery {\n if (!condition) {\n return sql``;\n }\n\n switch (condition.type) {\n case 'and':\n return sql`(${sql.join(\n condition.conditions.map(c => where(spec, c, table)),\n ' AND ',\n )})`;\n case 'or':\n return sql`(${sql.join(\n condition.conditions.map(c => where(spec, c, table)),\n ' OR ',\n )})`;\n case 'correlatedSubquery':\n return exists(spec, condition, table);\n case 'scalarSubquery':\n return scalarSubquery(spec, condition, table);\n case 'simple':\n return simple(spec, condition, table);\n }\n}\n\nfunction exists(\n spec: Spec,\n condition: CorrelatedSubqueryCondition,\n parentTable: Table,\n): SQLQuery {\n switch (condition.op) {\n case 'EXISTS':\n return sql`EXISTS (${select(\n spec,\n condition.related.subquery,\n undefined,\n makeCorrelator(\n spec,\n condition.related.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n condition.related.correlation.childField,\n ),\n )})`;\n case 'NOT EXISTS':\n return sql`NOT EXISTS (${select(\n spec,\n condition.related.subquery,\n undefined,\n makeCorrelator(\n spec,\n condition.related.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n condition.related.correlation.childField,\n ),\n )})`;\n }\n}\n\nfunction scalarSubquery(\n spec: Spec,\n condition: ScalarSubqueryCondition,\n parentTable: Table,\n): SQLQuery {\n const parentCol = colIdent(spec.server, {\n table: parentTable,\n zql: condition.parentField,\n });\n\n const subqueryTable = makeTable(spec, condition.subquery.table);\n const childCol = colIdent(spec.server, {\n table: subqueryTable,\n zql: condition.childField,\n });\n\n const op = sql.__dangerous__rawValue(condition.op);\n\n const subqueryWhere = condition.subquery.where\n ? sql`WHERE ${where(spec, condition.subquery.where, subqueryTable)}`\n : sql``;\n const subqueryOrderBy = orderBy(\n spec,\n condition.subquery.orderBy,\n subqueryTable,\n );\n\n return sql`${parentCol} ${op} (SELECT ${childCol} FROM ${fromIdent(spec.server, subqueryTable)} ${subqueryWhere} ${subqueryOrderBy} LIMIT 1)`;\n}\n\nexport function makeCorrelator(\n spec: Spec,\n parentFields: readonly QualifiedColumn[],\n childZqlFields: readonly string[],\n): (childTable: Table) => SQLQuery {\n return (childTable: Table) => {\n const childFields = childZqlFields.map(zqlField => ({\n table: childTable,\n zql: zqlField,\n }));\n return sql.join(\n zip(parentFields, childFields).map(\n ([parentColumn, childColumn]) =>\n sql`${colIdent(spec.server, parentColumn)} = ${colIdent(\n spec.server,\n childColumn,\n )}`,\n ),\n ' AND ',\n );\n };\n}\n\nexport function simple(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n switch (condition.op) {\n case '!=':\n case '<':\n case '<=':\n case '=':\n case '>':\n case '>=':\n case 'ILIKE':\n case 'LIKE':\n case 'NOT ILIKE':\n case 'NOT LIKE':\n return sql`${valueComparison(\n spec,\n condition.left,\n table,\n condition.right,\n false,\n )} ${sql.__dangerous__rawValue(condition.op)} ${valueComparison(\n spec,\n condition.right,\n table,\n condition.left,\n false,\n )}`;\n case 'NOT IN':\n case 'IN':\n return any(spec, condition, table);\n case 'IS':\n case 'IS NOT':\n return distinctFrom(spec, condition, table);\n }\n}\n\nexport function any(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n return sql`${condition.op === 'NOT IN' ? sql`NOT` : sql``}\n (\n ${valueComparison(spec, condition.left, table, condition.right, false)} = ANY \n (${valueComparison(spec, condition.right, table, condition.left, true)})\n )`;\n}\n\nexport function distinctFrom(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n return sql`${valueComparison(spec, condition.left, table, condition.right, false)} ${\n condition.op === 'IS' ? sql`IS NOT DISTINCT FROM` : sql`IS DISTINCT FROM`\n } ${valueComparison(spec, condition.right, table, condition.left, false)}`;\n}\n\nfunction valueComparison(\n spec: Spec,\n valuePos: ValuePosition,\n table: Table,\n otherValuePos: ValuePosition,\n plural: boolean,\n): SQLQuery {\n const valuePosType = valuePos.type;\n switch (valuePosType) {\n case 'column': {\n const serverColumnSchema = getServerColumn(\n spec.server,\n table,\n valuePos.name,\n );\n const qualified: QualifiedColumn = {\n table,\n zql: valuePos.name,\n };\n if (serverColumnSchema.type === 'uuid' || serverColumnSchema.isEnum) {\n return sql`${colIdent(spec.server, qualified)}::text`;\n }\n return colIdent(spec.server, qualified);\n }\n case 'literal':\n return literalValueComparison(\n spec,\n valuePos,\n table,\n otherValuePos,\n plural,\n );\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n default:\n unreachable(valuePosType);\n break;\n }\n}\n\nfunction literalValueComparison(\n spec: Spec,\n valuePos: LiteralReference,\n table: Table,\n otherValuePos: ValuePosition,\n plural: boolean,\n): SQLQuery {\n const otherType = otherValuePos.type;\n switch (otherType) {\n case 'column':\n return sqlConvertColumnArg(\n getServerColumn(spec.server, table, otherValuePos.name),\n valuePos.value,\n plural,\n true,\n );\n case 'literal': {\n assert(plural === Array.isArray(valuePos.value));\n if (Array.isArray(valuePos.value)) {\n if (valuePos.value.length > 0) {\n // If the array is non-empty base its type on its first\n // element\n return sqlConvertPluralLiteralArg(\n typeof valuePos.value[0] as PluralLiteralType,\n valuePos.value as PluralLiteralType[],\n );\n }\n // If the array is empty, base its type on the other value\n // position's type (as long as the other value position is non-null,\n // cannot have a null[]).\n if (otherValuePos.value !== null) {\n return sqlConvertPluralLiteralArg(\n typeof otherValuePos.value as PluralLiteralType,\n [],\n );\n }\n // If the other value position is null, it can be compared to any\n // type of empty array, chose 'string' arbitrarily.\n return sqlConvertPluralLiteralArg('string', []);\n }\n if (\n typeof valuePos.value === 'string' ||\n typeof valuePos.value === 'number' ||\n typeof valuePos.value === 'boolean'\n ) {\n return sqlConvertSingularLiteralArg(valuePos.value);\n }\n throw new Error(\n `Literal of unexpected type. ${valuePos.value} of type ${typeof valuePos.value}`,\n );\n }\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n default:\n unreachable(otherType);\n }\n}\n\nexport function makeJunctionJoin(\n spec: Spec,\n relationship: CorrelatedSubquery,\n): {\n join: SQLQuery;\n participatingTables: ReturnType<typeof pullTablesForJunction>;\n} {\n const participatingTables = pullTablesForJunction(spec, relationship);\n const joins: SQLQuery[] = [];\n\n for (const {table} of participatingTables) {\n if (joins.length === 0) {\n joins.push(fromIdent(spec.server, table));\n continue;\n }\n joins.push(\n sql` JOIN ${fromIdent(spec.server, table)} ON ${makeCorrelator(\n spec,\n participatingTables[joins.length].correlation.parentField.map(f => ({\n table: participatingTables[joins.length - 1].table,\n zql: f,\n })),\n participatingTables[joins.length].correlation.childField,\n )(participatingTables[joins.length].table)}`,\n );\n }\n\n return {\n join: sql`${sql.join(joins, '')}`,\n participatingTables,\n // lastTable: participatingTables[participatingTables.length - 1].table,\n // lastLimit: participatingTables[participatingTables.length - 1].limit,\n };\n}\n\nexport function pullTablesForJunction(\n spec: Spec,\n relationship: CorrelatedSubquery,\n): [\n {\n table: Table;\n correlation: Correlation;\n limit: number | undefined;\n },\n {table: Table; correlation: Correlation; limit: number | undefined},\n] {\n assert(\n relationship.subquery.related?.length === 1,\n 'Too many related tables for a junction edge',\n );\n const otherRelationship = relationship.subquery.related[0];\n assert(!otherRelationship.hidden);\n return [\n {\n table: makeTable(spec, relationship.subquery.table),\n correlation: relationship.correlation,\n limit: relationship.subquery.limit,\n },\n {\n table: makeTable(spec, otherRelationship.subquery.table),\n correlation: otherRelationship.correlation,\n limit: otherRelationship.subquery.limit,\n },\n ];\n}\n\nfunction toJSON(table: string, singular = false): SQLQuery {\n return sql`${\n singular ? sql`` : sql`COALESCE(json_agg`\n }(row_to_json(${sql.ident(table)}))${singular ? sql`` : sql`, '[]'::json)`}`;\n}\n\nfunction selectIdent(server: ServerSpec, column: QualifiedColumn): SQLQuery {\n const serverColumnSchema =\n server.schema[server.mapper.tableName(column.table.zql)][\n server.mapper.columnName(column.table.zql, column.zql)\n ];\n const serverType = serverColumnSchema.type;\n if (\n !serverColumnSchema.isEnum &&\n (serverType === 'date' ||\n serverType === 'timestamp' ||\n serverType === 'timestamp without time zone' ||\n serverType === 'timestamptz' ||\n serverType === 'timestamp with time zone')\n ) {\n if (serverColumnSchema.isArray) {\n // Map EXTRACT(EPOCH FROM ...) * 1000 over array elements\n return sql`ARRAY(SELECT EXTRACT(EPOCH FROM unnest(${colIdent(server, column)})) * 1000) as ${sql.ident(column.zql)}`;\n }\n return sql`EXTRACT(EPOCH FROM ${colIdent(server, column)}) * 1000 as ${sql.ident(column.zql)}`;\n }\n return sql`${colIdent(server, column)} as ${sql.ident(column.zql)}`;\n}\n\nfunction colIdent(server: ServerSpec, column: QualifiedColumn) {\n return sql.ident(\n column.table.alias,\n server.mapper.columnName(column.table.zql, column.zql),\n );\n}\n\nfunction fromIdent(server: ServerSpec, table: Table) {\n return sql`${sql.ident(server.mapper.tableName(table.zql))} AS ${sql.ident(table.alias)}`;\n}\n\nfunction getServerColumn(spec: ServerSpec, table: Table, zqlColumn: string) {\n return spec.schema[spec.mapper.tableName(table.zql)][\n spec.mapper.columnName(table.zql, zqlColumn)\n ];\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function extractZqlResult(pgResult: Array<any>): JSONValue {\n const bigIntJson: BigIntJSONValue = parseBigIntJson(\n pgResult[0][ZQL_RESULT_KEY],\n );\n assertJSONValue(bigIntJson);\n return bigIntJson;\n}\n\nfunction assertJSONValue(v: BigIntJSONValue): asserts v is JSONValue {\n const path = findPathToBigInt(v);\n if (path) {\n throw new Error(`Value exceeds safe Number range. ${path}`);\n }\n}\n\nfunction findPathToBigInt(v: BigIntJSONValue): string | undefined {\n const typeOfV = typeof v;\n switch (typeOfV) {\n case 'bigint':\n return ` = ${v}`;\n case 'object': {\n if (v === null) {\n return;\n }\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) {\n const path = findPathToBigInt(v[i]);\n if (path) {\n return `[${i}]${path}`;\n }\n }\n return undefined;\n }\n\n const o = v as Record<string, BigIntJSONValue>;\n for (const k in o) {\n if (hasOwn(o, k)) {\n const path = findPathToBigInt(o[k]);\n if (path) {\n return `['${k}']${path}`;\n }\n }\n }\n return undefined;\n }\n case 'number':\n return undefined;\n case 'boolean':\n return undefined;\n default:\n return undefined;\n }\n}\n"],"names":["limit","orderBy","parseBigIntJson"],"mappings":"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"}
1
+ {"version":3,"file":"compiler.js","sources":["../../../../z2s/src/compiler.ts"],"sourcesContent":["import type {SQLQuery} from '@databases/sql';\nimport {last, zip} from '../../shared/src/arrays.ts';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {\n parse as parseBigIntJson,\n type JSONValue as BigIntJSONValue,\n} from '../../shared/src/bigint-json.ts';\nimport {hasOwn} from '../../shared/src/has-own.ts';\nimport {type JSONValue} from '../../shared/src/json.ts';\nimport {must} from '../../shared/src/must.ts';\nimport {pgToZqlStringTypeMap} from '../../zero-cache/src/types/pg-data-type.ts';\nimport type {\n AST,\n Condition,\n CorrelatedSubquery,\n CorrelatedSubqueryCondition,\n Correlation,\n LiteralReference,\n Ordering,\n SimpleCondition,\n ValuePosition,\n} from '../../zero-protocol/src/ast.ts';\nimport {\n clientToServer,\n type NameMapper,\n} from '../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {\n ServerColumnSchema,\n ServerSchema,\n} from '../../zero-types/src/server-schema.ts';\nimport type {Format} from '../../zql/src/ivm/view.ts';\nimport {completeOrdering} from '../../zql/src/query/complete-ordering.ts';\nimport {\n sql,\n sqlConvertColumnArg,\n sqlConvertPluralLiteralArg,\n sqlConvertSingularLiteralArg,\n Z2S_COLLATION,\n type PluralLiteralType,\n} from './sql.ts';\n\ntype Table = {\n zql: string;\n alias: string;\n};\n\ntype QualifiedColumn = {\n table: Table;\n zql: string;\n};\n\ntype ServerSpec = {\n schema: ServerSchema;\n // maps zql names to server names\n mapper: NameMapper;\n};\n\nexport type Spec = {\n server: ServerSpec;\n zql: Schema['tables'];\n aliasCount: number;\n};\n\nconst ZQL_RESULT_KEY = 'zql_result';\nconst ZQL_RESULT_KEY_IDENT = sql.ident(ZQL_RESULT_KEY);\n\nconst ZQL_RESULT_TABLE_KEY = 'zql_root';\nconst ZQL_RESULT_TABLE_IDENT = sql.ident(ZQL_RESULT_TABLE_KEY);\n\nexport function compile(\n serverSchema: ServerSchema,\n zqlSchema: Schema,\n ast: AST,\n format?: Format,\n): SQLQuery {\n ast = completeOrdering(\n ast,\n tableName => zqlSchema.tables[tableName].primaryKey,\n );\n const spec: Spec = {\n aliasCount: 0,\n server: {\n schema: serverSchema,\n mapper: clientToServer(zqlSchema.tables),\n },\n zql: zqlSchema.tables,\n };\n return sql`SELECT \n ${toJSON(ZQL_RESULT_TABLE_KEY, format?.singular)}::text AS ${ZQL_RESULT_KEY_IDENT}\n FROM (${select(spec, ast, format)}) ${ZQL_RESULT_TABLE_IDENT}`;\n}\n\nfunction select(\n spec: Spec,\n ast: AST,\n format: Format | undefined,\n correlate?: (childTable: Table) => SQLQuery,\n): SQLQuery {\n const table = makeTable(spec, ast.table);\n const selectionSet = related(spec, ast.related ?? [], format, table);\n const tableSchema = spec.zql[ast.table];\n const usedAliases = new Set<string>(\n ast.related?.map(r => r.subquery.alias ?? ''),\n );\n for (const column of Object.keys(tableSchema.columns)) {\n if (!usedAliases.has(column)) {\n selectionSet.push(\n selectIdent(spec.server, {\n table,\n zql: column,\n }),\n );\n }\n }\n\n let appliedWhere = false;\n function maybeWhere(test: unknown | undefined) {\n if (!test) {\n return sql``;\n }\n\n const ret = appliedWhere ? sql`AND` : sql`WHERE`;\n appliedWhere = true;\n return ret;\n }\n\n return sql`SELECT ${sql.join(selectionSet, ',')}\n FROM ${fromIdent(spec.server, table)}\n ${maybeWhere(ast.where)} ${where(spec, ast.where, table)}\n ${maybeWhere(correlate)} ${correlate ? correlate(table) : sql``}\n ${orderBy(spec, ast.orderBy, table)}\n ${limit(ast.limit, format?.singular)}`;\n}\n\nexport function limit(\n limit: number | undefined,\n singular: boolean | undefined,\n): SQLQuery {\n if (limit === 0) {\n return sql`LIMIT 0`;\n }\n if (singular) {\n return sql`LIMIT 1`;\n }\n if (limit === undefined) {\n return sql``;\n }\n return sql`LIMIT ${sqlConvertSingularLiteralArg(limit)}`;\n}\n\nfunction makeTable(spec: Spec, zql: string, alias?: string): Table {\n alias = alias ?? zql + '_' + spec.aliasCount++;\n return {\n zql,\n alias,\n };\n}\n\nexport function orderBy(\n spec: Spec,\n orderBy: Ordering | undefined,\n table: Table,\n): SQLQuery {\n if (!orderBy) {\n return sql``;\n }\n return sql`ORDER BY ${sql.join(\n orderBy.map(([col, dir]) => {\n const serverColumnSchema = getServerColumn(spec.server, table, col);\n return dir === 'asc'\n ? // Oh postgres. The table must be referred to by client name but the column by server name.\n // E.g., `SELECT server_col as client_col FROM server_table as client_table ORDER BY client_Table.server_col`\n sql`${colIdent(spec.server, {\n table,\n zql: col,\n })}${maybeCollate(serverColumnSchema)} ASC NULLS FIRST`\n : sql`${colIdent(spec.server, {\n table,\n zql: col,\n })}${maybeCollate(serverColumnSchema)} DESC NULLS LAST`;\n }),\n ', ',\n )}`;\n}\n\nfunction maybeCollate(serverColumnSchema: ServerColumnSchema): SQLQuery {\n if (serverColumnSchema.type === 'uuid' || serverColumnSchema.isEnum) {\n return sql`::text COLLATE ${sql.ident(Z2S_COLLATION)}`;\n }\n if (Object.hasOwn(pgToZqlStringTypeMap, serverColumnSchema.type)) {\n return sql` COLLATE ${sql.ident(Z2S_COLLATION)}`;\n }\n\n return sql``;\n}\n\nfunction related(\n spec: Spec,\n relationships: readonly CorrelatedSubquery[],\n format: Format | undefined,\n parentTable: Table,\n): SQLQuery[] {\n return relationships.map(relationship =>\n relationshipSubquery(\n spec,\n relationship,\n format?.relationships[must(relationship.subquery.alias)],\n parentTable,\n ),\n );\n}\n\nfunction relationshipSubquery(\n spec: Spec,\n relationship: CorrelatedSubquery,\n format: Format | undefined,\n parentTable: Table,\n): SQLQuery {\n const innerAlias = `inner_${relationship.subquery.alias}`;\n if (relationship.hidden) {\n const {join, participatingTables} = makeJunctionJoin(spec, relationship);\n const lastTable = must(last(participatingTables)).table;\n\n assert(\n relationship.subquery.related,\n 'hidden relationship must be a junction',\n );\n const nestedAst = relationship.subquery.related[0].subquery;\n const selectionSet = related(\n spec,\n nestedAst.related ?? [],\n format,\n lastTable,\n );\n const tableSchema = spec.zql[nestedAst.table];\n for (const column of Object.keys(tableSchema.columns)) {\n selectionSet.push(\n selectIdent(spec.server, {\n table: lastTable,\n zql: column,\n }),\n );\n }\n\n return sql`(\n SELECT ${toJSON(innerAlias, format?.singular)} FROM (SELECT ${sql.join(\n selectionSet,\n ',',\n )} FROM ${join} WHERE (${makeCorrelator(\n spec,\n relationship.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n relationship.correlation.childField,\n )(participatingTables[0].table)}) ${\n nestedAst.where\n ? sql`AND ${where(spec, nestedAst.where, lastTable)}`\n : sql``\n } ${orderBy(spec, nestedAst.orderBy, lastTable)} ${limit(\n last(participatingTables)?.limit,\n format?.singular,\n )} ) ${sql.ident(innerAlias)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n }\n\n return sql`(\n SELECT ${toJSON(innerAlias, format?.singular)} FROM (${select(\n spec,\n relationship.subquery,\n format,\n makeCorrelator(\n spec,\n relationship.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n relationship.correlation.childField,\n ),\n )}) ${sql.ident(innerAlias)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n}\n\nfunction where(\n spec: Spec,\n condition: Condition | undefined,\n table: Table,\n): SQLQuery {\n if (!condition) {\n return sql``;\n }\n\n switch (condition.type) {\n case 'and':\n return sql`(${sql.join(\n condition.conditions.map(c => where(spec, c, table)),\n ' AND ',\n )})`;\n case 'or':\n return sql`(${sql.join(\n condition.conditions.map(c => where(spec, c, table)),\n ' OR ',\n )})`;\n case 'correlatedSubquery':\n if (condition.scalar) {\n return scalarSubquery(spec, condition, table);\n }\n return exists(spec, condition, table);\n case 'simple':\n return simple(spec, condition, table);\n }\n}\n\nfunction exists(\n spec: Spec,\n condition: CorrelatedSubqueryCondition,\n parentTable: Table,\n): SQLQuery {\n switch (condition.op) {\n case 'EXISTS':\n return sql`EXISTS (${select(\n spec,\n condition.related.subquery,\n undefined,\n makeCorrelator(\n spec,\n condition.related.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n condition.related.correlation.childField,\n ),\n )})`;\n case 'NOT EXISTS':\n return sql`NOT EXISTS (${select(\n spec,\n condition.related.subquery,\n undefined,\n makeCorrelator(\n spec,\n condition.related.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n condition.related.correlation.childField,\n ),\n )})`;\n }\n}\n\nfunction scalarSubquery(\n spec: Spec,\n condition: CorrelatedSubqueryCondition,\n parentTable: Table,\n): SQLQuery {\n const parentField = condition.related.correlation.parentField[0];\n const childField = condition.related.correlation.childField[0];\n const subqueryAST = condition.related.subquery;\n\n const parentCol = colIdent(spec.server, {\n table: parentTable,\n zql: parentField,\n });\n\n const subqueryTable = makeTable(spec, subqueryAST.table);\n const childCol = colIdent(spec.server, {\n table: subqueryTable,\n zql: childField,\n });\n\n const op = sql.__dangerous__rawValue(\n condition.op === 'EXISTS' ? '=' : 'IS NOT',\n );\n\n const subqueryWhere = subqueryAST.where\n ? sql`WHERE ${where(spec, subqueryAST.where, subqueryTable)}`\n : sql``;\n const subqueryOrderBy = orderBy(spec, subqueryAST.orderBy, subqueryTable);\n\n return sql`${parentCol} ${op} (SELECT ${childCol} FROM ${fromIdent(spec.server, subqueryTable)} ${subqueryWhere} ${subqueryOrderBy} LIMIT 1)`;\n}\n\nexport function makeCorrelator(\n spec: Spec,\n parentFields: readonly QualifiedColumn[],\n childZqlFields: readonly string[],\n): (childTable: Table) => SQLQuery {\n return (childTable: Table) => {\n const childFields = childZqlFields.map(zqlField => ({\n table: childTable,\n zql: zqlField,\n }));\n return sql.join(\n zip(parentFields, childFields).map(\n ([parentColumn, childColumn]) =>\n sql`${colIdent(spec.server, parentColumn)} = ${colIdent(\n spec.server,\n childColumn,\n )}`,\n ),\n ' AND ',\n );\n };\n}\n\nexport function simple(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n switch (condition.op) {\n case '!=':\n case '<':\n case '<=':\n case '=':\n case '>':\n case '>=':\n case 'ILIKE':\n case 'LIKE':\n case 'NOT ILIKE':\n case 'NOT LIKE':\n return sql`${valueComparison(\n spec,\n condition.left,\n table,\n condition.right,\n false,\n )} ${sql.__dangerous__rawValue(condition.op)} ${valueComparison(\n spec,\n condition.right,\n table,\n condition.left,\n false,\n )}`;\n case 'NOT IN':\n case 'IN':\n return any(spec, condition, table);\n case 'IS':\n case 'IS NOT':\n return distinctFrom(spec, condition, table);\n }\n}\n\nexport function any(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n return sql`${condition.op === 'NOT IN' ? sql`NOT` : sql``}\n (\n ${valueComparison(spec, condition.left, table, condition.right, false)} = ANY \n (${valueComparison(spec, condition.right, table, condition.left, true)})\n )`;\n}\n\nexport function distinctFrom(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n return sql`${valueComparison(spec, condition.left, table, condition.right, false)} ${\n condition.op === 'IS' ? sql`IS NOT DISTINCT FROM` : sql`IS DISTINCT FROM`\n } ${valueComparison(spec, condition.right, table, condition.left, false)}`;\n}\n\nfunction valueComparison(\n spec: Spec,\n valuePos: ValuePosition,\n table: Table,\n otherValuePos: ValuePosition,\n plural: boolean,\n): SQLQuery {\n const valuePosType = valuePos.type;\n switch (valuePosType) {\n case 'column': {\n const serverColumnSchema = getServerColumn(\n spec.server,\n table,\n valuePos.name,\n );\n const qualified: QualifiedColumn = {\n table,\n zql: valuePos.name,\n };\n if (serverColumnSchema.type === 'uuid' || serverColumnSchema.isEnum) {\n return sql`${colIdent(spec.server, qualified)}::text`;\n }\n return colIdent(spec.server, qualified);\n }\n case 'literal':\n return literalValueComparison(\n spec,\n valuePos,\n table,\n otherValuePos,\n plural,\n );\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n default:\n unreachable(valuePosType);\n break;\n }\n}\n\nfunction literalValueComparison(\n spec: Spec,\n valuePos: LiteralReference,\n table: Table,\n otherValuePos: ValuePosition,\n plural: boolean,\n): SQLQuery {\n const otherType = otherValuePos.type;\n switch (otherType) {\n case 'column':\n return sqlConvertColumnArg(\n getServerColumn(spec.server, table, otherValuePos.name),\n valuePos.value,\n plural,\n true,\n );\n case 'literal': {\n assert(plural === Array.isArray(valuePos.value));\n if (Array.isArray(valuePos.value)) {\n if (valuePos.value.length > 0) {\n // If the array is non-empty base its type on its first\n // element\n return sqlConvertPluralLiteralArg(\n typeof valuePos.value[0] as PluralLiteralType,\n valuePos.value as PluralLiteralType[],\n );\n }\n // If the array is empty, base its type on the other value\n // position's type (as long as the other value position is non-null,\n // cannot have a null[]).\n if (otherValuePos.value !== null) {\n return sqlConvertPluralLiteralArg(\n typeof otherValuePos.value as PluralLiteralType,\n [],\n );\n }\n // If the other value position is null, it can be compared to any\n // type of empty array, chose 'string' arbitrarily.\n return sqlConvertPluralLiteralArg('string', []);\n }\n if (\n typeof valuePos.value === 'string' ||\n typeof valuePos.value === 'number' ||\n typeof valuePos.value === 'boolean'\n ) {\n return sqlConvertSingularLiteralArg(valuePos.value);\n }\n throw new Error(\n `Literal of unexpected type. ${valuePos.value} of type ${typeof valuePos.value}`,\n );\n }\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n default:\n unreachable(otherType);\n }\n}\n\nexport function makeJunctionJoin(\n spec: Spec,\n relationship: CorrelatedSubquery,\n): {\n join: SQLQuery;\n participatingTables: ReturnType<typeof pullTablesForJunction>;\n} {\n const participatingTables = pullTablesForJunction(spec, relationship);\n const joins: SQLQuery[] = [];\n\n for (const {table} of participatingTables) {\n if (joins.length === 0) {\n joins.push(fromIdent(spec.server, table));\n continue;\n }\n joins.push(\n sql` JOIN ${fromIdent(spec.server, table)} ON ${makeCorrelator(\n spec,\n participatingTables[joins.length].correlation.parentField.map(f => ({\n table: participatingTables[joins.length - 1].table,\n zql: f,\n })),\n participatingTables[joins.length].correlation.childField,\n )(participatingTables[joins.length].table)}`,\n );\n }\n\n return {\n join: sql`${sql.join(joins, '')}`,\n participatingTables,\n // lastTable: participatingTables[participatingTables.length - 1].table,\n // lastLimit: participatingTables[participatingTables.length - 1].limit,\n };\n}\n\nexport function pullTablesForJunction(\n spec: Spec,\n relationship: CorrelatedSubquery,\n): [\n {\n table: Table;\n correlation: Correlation;\n limit: number | undefined;\n },\n {table: Table; correlation: Correlation; limit: number | undefined},\n] {\n assert(\n relationship.subquery.related?.length === 1,\n 'Too many related tables for a junction edge',\n );\n const otherRelationship = relationship.subquery.related[0];\n assert(!otherRelationship.hidden);\n return [\n {\n table: makeTable(spec, relationship.subquery.table),\n correlation: relationship.correlation,\n limit: relationship.subquery.limit,\n },\n {\n table: makeTable(spec, otherRelationship.subquery.table),\n correlation: otherRelationship.correlation,\n limit: otherRelationship.subquery.limit,\n },\n ];\n}\n\nfunction toJSON(table: string, singular = false): SQLQuery {\n return sql`${\n singular ? sql`` : sql`COALESCE(json_agg`\n }(row_to_json(${sql.ident(table)}))${singular ? sql`` : sql`, '[]'::json)`}`;\n}\n\nfunction selectIdent(server: ServerSpec, column: QualifiedColumn): SQLQuery {\n const serverColumnSchema =\n server.schema[server.mapper.tableName(column.table.zql)][\n server.mapper.columnName(column.table.zql, column.zql)\n ];\n const serverType = serverColumnSchema.type;\n if (\n !serverColumnSchema.isEnum &&\n (serverType === 'date' ||\n serverType === 'timestamp' ||\n serverType === 'timestamp without time zone' ||\n serverType === 'timestamptz' ||\n serverType === 'timestamp with time zone')\n ) {\n if (serverColumnSchema.isArray) {\n // Map EXTRACT(EPOCH FROM ...) * 1000 over array elements\n return sql`ARRAY(SELECT EXTRACT(EPOCH FROM unnest(${colIdent(server, column)})) * 1000) as ${sql.ident(column.zql)}`;\n }\n return sql`EXTRACT(EPOCH FROM ${colIdent(server, column)}) * 1000 as ${sql.ident(column.zql)}`;\n }\n return sql`${colIdent(server, column)} as ${sql.ident(column.zql)}`;\n}\n\nfunction colIdent(server: ServerSpec, column: QualifiedColumn) {\n return sql.ident(\n column.table.alias,\n server.mapper.columnName(column.table.zql, column.zql),\n );\n}\n\nfunction fromIdent(server: ServerSpec, table: Table) {\n return sql`${sql.ident(server.mapper.tableName(table.zql))} AS ${sql.ident(table.alias)}`;\n}\n\nfunction getServerColumn(spec: ServerSpec, table: Table, zqlColumn: string) {\n return spec.schema[spec.mapper.tableName(table.zql)][\n spec.mapper.columnName(table.zql, zqlColumn)\n ];\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function extractZqlResult(pgResult: Array<any>): JSONValue {\n const bigIntJson: BigIntJSONValue = parseBigIntJson(\n pgResult[0][ZQL_RESULT_KEY],\n );\n assertJSONValue(bigIntJson);\n return bigIntJson;\n}\n\nfunction assertJSONValue(v: BigIntJSONValue): asserts v is JSONValue {\n const path = findPathToBigInt(v);\n if (path) {\n throw new Error(`Value exceeds safe Number range. ${path}`);\n }\n}\n\nfunction findPathToBigInt(v: BigIntJSONValue): string | undefined {\n const typeOfV = typeof v;\n switch (typeOfV) {\n case 'bigint':\n return ` = ${v}`;\n case 'object': {\n if (v === null) {\n return;\n }\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) {\n const path = findPathToBigInt(v[i]);\n if (path) {\n return `[${i}]${path}`;\n }\n }\n return undefined;\n }\n\n const o = v as Record<string, BigIntJSONValue>;\n for (const k in o) {\n if (hasOwn(o, k)) {\n const path = findPathToBigInt(o[k]);\n if (path) {\n return `['${k}']${path}`;\n }\n }\n }\n return undefined;\n }\n case 'number':\n return undefined;\n case 'boolean':\n return undefined;\n default:\n return undefined;\n }\n}\n"],"names":["limit","orderBy","parseBigIntJson"],"mappings":";;;;;;;;;;AAgEA,MAAM,iBAAiB;AACvB,MAAM,uBAAuB,IAAI,MAAM,cAAc;AAErD,MAAM,uBAAuB;AAC7B,MAAM,yBAAyB,IAAI,MAAM,oBAAoB;AAEtD,SAAS,QACd,cACA,WACA,KACA,QACU;AACV,QAAM;AAAA,IACJ;AAAA,IACA,CAAA,cAAa,UAAU,OAAO,SAAS,EAAE;AAAA,EAAA;AAE3C,QAAM,OAAa;AAAA,IACjB,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,eAAe,UAAU,MAAM;AAAA,IAAA;AAAA,IAEzC,KAAK,UAAU;AAAA,EAAA;AAEjB,SAAO;AAAA,MACH,OAAO,sBAAsB,QAAQ,QAAQ,CAAC,aAAa,oBAAoB;AAAA,YACzE,OAAO,MAAM,KAAK,MAAM,CAAC,KAAK,sBAAsB;AAChE;AAEA,SAAS,OACP,MACA,KACA,QACA,WACU;AACV,QAAM,QAAQ,UAAU,MAAM,IAAI,KAAK;AACvC,QAAM,eAAe,QAAQ,MAAM,IAAI,WAAW,CAAA,GAAI,QAAQ,KAAK;AACnE,QAAM,cAAc,KAAK,IAAI,IAAI,KAAK;AACtC,QAAM,cAAc,IAAI;AAAA,IACtB,IAAI,SAAS,IAAI,OAAK,EAAE,SAAS,SAAS,EAAE;AAAA,EAAA;AAE9C,aAAW,UAAU,OAAO,KAAK,YAAY,OAAO,GAAG;AACrD,QAAI,CAAC,YAAY,IAAI,MAAM,GAAG;AAC5B,mBAAa;AAAA,QACX,YAAY,KAAK,QAAQ;AAAA,UACvB;AAAA,UACA,KAAK;AAAA,QAAA,CACN;AAAA,MAAA;AAAA,IAEL;AAAA,EACF;AAEA,MAAI,eAAe;AACnB,WAAS,WAAW,MAA2B;AAC7C,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,eAAe,WAAW;AACtC,mBAAe;AACf,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,IAAI,KAAK,cAAc,GAAG,CAAC;AAAA,WACtC,UAAU,KAAK,QAAQ,KAAK,CAAC;AAAA,MAClC,WAAW,IAAI,KAAK,CAAC,IAAI,MAAM,MAAM,IAAI,OAAO,KAAK,CAAC;AAAA,MACtD,WAAW,SAAS,CAAC,IAAI,YAAY,UAAU,KAAK,IAAI,KAAK;AAAA,MAC7D,QAAQ,MAAM,IAAI,SAAS,KAAK,CAAC;AAAA,MACjC,MAAM,IAAI,OAAO,QAAQ,QAAQ,CAAC;AACxC;AAEO,SAAS,MACdA,QACA,UACU;AACV,MAAIA,WAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,MAAIA,WAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO,YAAY,6BAA6BA,MAAK,CAAC;AACxD;AAEA,SAAS,UAAU,MAAY,KAAa,OAAuB;AACjE,UAAQ,SAAS,MAAM,MAAM,KAAK;AAClC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EAAA;AAEJ;AAEO,SAAS,QACd,MACAC,UACA,OACU;AACV,MAAI,CAACA,UAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,eAAe,IAAI;AAAA,IACxBA,SAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;AAC1B,YAAM,qBAAqB,gBAAgB,KAAK,QAAQ,OAAO,GAAG;AAClE,aAAO,QAAQ;AAAA;AAAA;AAAA,QAGX,MAAM,SAAS,KAAK,QAAQ;AAAA,UAC1B;AAAA,UACA,KAAK;AAAA,QAAA,CACN,CAAC,GAAG,aAAa,kBAAkB,CAAC;AAAA,UACrC,MAAM,SAAS,KAAK,QAAQ;AAAA,QAC1B;AAAA,QACA,KAAK;AAAA,MAAA,CACN,CAAC,GAAG,aAAa,kBAAkB,CAAC;AAAA,IAC3C,CAAC;AAAA,IACD;AAAA,EAAA,CACD;AACH;AAEA,SAAS,aAAa,oBAAkD;AACtE,MAAI,mBAAmB,SAAS,UAAU,mBAAmB,QAAQ;AACnE,WAAO,qBAAqB,IAAI,MAAM,aAAa,CAAC;AAAA,EACtD;AACA,MAAI,OAAO,OAAO,sBAAsB,mBAAmB,IAAI,GAAG;AAChE,WAAO,eAAe,IAAI,MAAM,aAAa,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,SAAS,QACP,MACA,eACA,QACA,aACY;AACZ,SAAO,cAAc;AAAA,IAAI,CAAA,iBACvB;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ,cAAc,KAAK,aAAa,SAAS,KAAK,CAAC;AAAA,MACvD;AAAA,IAAA;AAAA,EACF;AAEJ;AAEA,SAAS,qBACP,MACA,cACA,QACA,aACU;AACV,QAAM,aAAa,SAAS,aAAa,SAAS,KAAK;AACvD,MAAI,aAAa,QAAQ;AACvB,UAAM,EAAC,MAAM,oBAAA,IAAuB,iBAAiB,MAAM,YAAY;AACvE,UAAM,YAAY,KAAK,KAAK,mBAAmB,CAAC,EAAE;AAElD;AAAA,MACE,aAAa,SAAS;AAAA,MACtB;AAAA,IAAA;AAEF,UAAM,YAAY,aAAa,SAAS,QAAQ,CAAC,EAAE;AACnD,UAAM,eAAe;AAAA,MACnB;AAAA,MACA,UAAU,WAAW,CAAA;AAAA,MACrB;AAAA,MACA;AAAA,IAAA;AAEF,UAAM,cAAc,KAAK,IAAI,UAAU,KAAK;AAC5C,eAAW,UAAU,OAAO,KAAK,YAAY,OAAO,GAAG;AACrD,mBAAa;AAAA,QACX,YAAY,KAAK,QAAQ;AAAA,UACvB,OAAO;AAAA,UACP,KAAK;AAAA,QAAA,CACN;AAAA,MAAA;AAAA,IAEL;AAEA,WAAO;AAAA,iBACM,OAAO,YAAY,QAAQ,QAAQ,CAAC,iBAAiB,IAAI;AAAA,MAChE;AAAA,MACA;AAAA,IAAA,CACD,SAAS,IAAI,WAAW;AAAA,MACvB;AAAA,MACA,aAAa,YAAY,YAAY,IAAI,CAAA,OAAM;AAAA,QAC7C,OAAO;AAAA,QACP,KAAK;AAAA,MAAA,EACL;AAAA,MACF,aAAa,YAAY;AAAA,IAAA,EACzB,oBAAoB,CAAC,EAAE,KAAK,CAAC,KAC7B,UAAU,QACN,UAAU,MAAM,MAAM,UAAU,OAAO,SAAS,CAAC,KACjD,KACN,IAAI,QAAQ,MAAM,UAAU,SAAS,SAAS,CAAC,IAAI;AAAA,MACjD,KAAK,mBAAmB,GAAG;AAAA,MAC3B,QAAQ;AAAA,IAAA,CACT,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,aACvB,IAAI,MAAM,aAAa,SAAS,KAAK,CAAC;AAAA,EACjD;AAEA,SAAO;AAAA,eACM,OAAO,YAAY,QAAQ,QAAQ,CAAC,UAAU;AAAA,IACrD;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,MACE;AAAA,MACA,aAAa,YAAY,YAAY,IAAI,CAAA,OAAM;AAAA,QAC7C,OAAO;AAAA,QACP,KAAK;AAAA,MAAA,EACL;AAAA,MACF,aAAa,YAAY;AAAA,IAAA;AAAA,EAC3B,CACD,KAAK,IAAI,MAAM,UAAU,CAAC;AAAA,WACtB,IAAI,MAAM,aAAa,SAAS,KAAK,CAAC;AACjD;AAEA,SAAS,MACP,MACA,WACA,OACU;AACV,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,UAAQ,UAAU,MAAA;AAAA,IAChB,KAAK;AACH,aAAO,OAAO,IAAI;AAAA,QAChB,UAAU,WAAW,IAAI,CAAA,MAAK,MAAM,MAAM,GAAG,KAAK,CAAC;AAAA,QACnD;AAAA,MAAA,CACD;AAAA,IACH,KAAK;AACH,aAAO,OAAO,IAAI;AAAA,QAChB,UAAU,WAAW,IAAI,CAAA,MAAK,MAAM,MAAM,GAAG,KAAK,CAAC;AAAA,QACnD;AAAA,MAAA,CACD;AAAA,IACH,KAAK;AACH,UAAI,UAAU,QAAQ;AACpB,eAAO,eAAe,MAAM,WAAW,KAAK;AAAA,MAC9C;AACA,aAAO,OAAO,MAAM,WAAW,KAAK;AAAA,IACtC,KAAK;AACH,aAAO,OAAO,MAAM,WAAW,KAAK;AAAA,EAAA;AAE1C;AAEA,SAAS,OACP,MACA,WACA,aACU;AACV,UAAQ,UAAU,IAAA;AAAA,IAChB,KAAK;AACH,aAAO,cAAc;AAAA,QACnB;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,UACE;AAAA,UACA,UAAU,QAAQ,YAAY,YAAY,IAAI,CAAA,OAAM;AAAA,YAClD,OAAO;AAAA,YACP,KAAK;AAAA,UAAA,EACL;AAAA,UACF,UAAU,QAAQ,YAAY;AAAA,QAAA;AAAA,MAChC,CACD;AAAA,IACH,KAAK;AACH,aAAO,kBAAkB;AAAA,QACvB;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,UACE;AAAA,UACA,UAAU,QAAQ,YAAY,YAAY,IAAI,CAAA,OAAM;AAAA,YAClD,OAAO;AAAA,YACP,KAAK;AAAA,UAAA,EACL;AAAA,UACF,UAAU,QAAQ,YAAY;AAAA,QAAA;AAAA,MAChC,CACD;AAAA,EAAA;AAEP;AAEA,SAAS,eACP,MACA,WACA,aACU;AACV,QAAM,cAAc,UAAU,QAAQ,YAAY,YAAY,CAAC;AAC/D,QAAM,aAAa,UAAU,QAAQ,YAAY,WAAW,CAAC;AAC7D,QAAM,cAAc,UAAU,QAAQ;AAEtC,QAAM,YAAY,SAAS,KAAK,QAAQ;AAAA,IACtC,OAAO;AAAA,IACP,KAAK;AAAA,EAAA,CACN;AAED,QAAM,gBAAgB,UAAU,MAAM,YAAY,KAAK;AACvD,QAAM,WAAW,SAAS,KAAK,QAAQ;AAAA,IACrC,OAAO;AAAA,IACP,KAAK;AAAA,EAAA,CACN;AAED,QAAM,KAAK,IAAI;AAAA,IACb,UAAU,OAAO,WAAW,MAAM;AAAA,EAAA;AAGpC,QAAM,gBAAgB,YAAY,QAC9B,YAAY,MAAM,MAAM,YAAY,OAAO,aAAa,CAAC,KACzD;AACJ,QAAM,kBAAkB,QAAQ,MAAM,YAAY,SAAS,aAAa;AAExE,SAAO,MAAM,SAAS,IAAI,EAAE,YAAY,QAAQ,SAAS,UAAU,KAAK,QAAQ,aAAa,CAAC,IAAI,aAAa,IAAI,eAAe;AACpI;AAEO,SAAS,eACd,MACA,cACA,gBACiC;AACjC,SAAO,CAAC,eAAsB;AAC5B,UAAM,cAAc,eAAe,IAAI,CAAA,cAAa;AAAA,MAClD,OAAO;AAAA,MACP,KAAK;AAAA,IAAA,EACL;AACF,WAAO,IAAI;AAAA,MACT,IAAI,cAAc,WAAW,EAAE;AAAA,QAC7B,CAAC,CAAC,cAAc,WAAW,MACzB,MAAM,SAAS,KAAK,QAAQ,YAAY,CAAC,MAAM;AAAA,UAC7C,KAAK;AAAA,UACL;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,MAEL;AAAA,IAAA;AAAA,EAEJ;AACF;AAEO,SAAS,OACd,MACA,WACA,OACU;AACV,UAAQ,UAAU,IAAA;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,MAAM;AAAA,QACX;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MAAA,CACD,IAAI,IAAI,sBAAsB,UAAU,EAAE,CAAC,IAAI;AAAA,QAC9C;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MAAA,CACD;AAAA,IACH,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,MAAM,WAAW,KAAK;AAAA,IACnC,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,MAAM,WAAW,KAAK;AAAA,EAAA;AAEhD;AAEO,SAAS,IACd,MACA,WACA,OACU;AACV,SAAO,MAAM,UAAU,OAAO,WAAW,WAAW,KAAK;AAAA;AAAA,QAEnD,gBAAgB,MAAM,UAAU,MAAM,OAAO,UAAU,OAAO,KAAK,CAAC;AAAA,SACnE,gBAAgB,MAAM,UAAU,OAAO,OAAO,UAAU,MAAM,IAAI,CAAC;AAAA;AAE5E;AAEO,SAAS,aACd,MACA,WACA,OACU;AACV,SAAO,MAAM,gBAAgB,MAAM,UAAU,MAAM,OAAO,UAAU,OAAO,KAAK,CAAC,IAC/E,UAAU,OAAO,OAAO,4BAA4B,qBACtD,IAAI,gBAAgB,MAAM,UAAU,OAAO,OAAO,UAAU,MAAM,KAAK,CAAC;AAC1E;AAEA,SAAS,gBACP,MACA,UACA,OACA,eACA,QACU;AACV,QAAM,eAAe,SAAS;AAC9B,UAAQ,cAAA;AAAA,IACN,KAAK,UAAU;AACb,YAAM,qBAAqB;AAAA,QACzB,KAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,MAAA;AAEX,YAAM,YAA6B;AAAA,QACjC;AAAA,QACA,KAAK,SAAS;AAAA,MAAA;AAEhB,UAAI,mBAAmB,SAAS,UAAU,mBAAmB,QAAQ;AACnE,eAAO,MAAM,SAAS,KAAK,QAAQ,SAAS,CAAC;AAAA,MAC/C;AACA,aAAO,SAAS,KAAK,QAAQ,SAAS;AAAA,IACxC;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AACE,kBAAwB;AACxB;AAAA,EAAA;AAEN;AAEA,SAAS,uBACP,MACA,UACA,OACA,eACA,QACU;AACV,QAAM,YAAY,cAAc;AAChC,UAAQ,WAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,QACL,gBAAgB,KAAK,QAAQ,OAAO,cAAc,IAAI;AAAA,QACtD,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ,KAAK,WAAW;AACd,aAAO,WAAW,MAAM,QAAQ,SAAS,KAAK,CAAC;AAC/C,UAAI,MAAM,QAAQ,SAAS,KAAK,GAAG;AACjC,YAAI,SAAS,MAAM,SAAS,GAAG;AAG7B,iBAAO;AAAA,YACL,OAAO,SAAS,MAAM,CAAC;AAAA,YACvB,SAAS;AAAA,UAAA;AAAA,QAEb;AAIA,YAAI,cAAc,UAAU,MAAM;AAChC,iBAAO;AAAA,YACL,OAAO,cAAc;AAAA,YACrB,CAAA;AAAA,UAAC;AAAA,QAEL;AAGA,eAAO,2BAA2B,UAAU,EAAE;AAAA,MAChD;AACA,UACE,OAAO,SAAS,UAAU,YAC1B,OAAO,SAAS,UAAU,YAC1B,OAAO,SAAS,UAAU,WAC1B;AACA,eAAO,6BAA6B,SAAS,KAAK;AAAA,MACpD;AACA,YAAM,IAAI;AAAA,QACR,+BAA+B,SAAS,KAAK,YAAY,OAAO,SAAS,KAAK;AAAA,MAAA;AAAA,IAElF;AAAA,IACA,KAAK;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AACE,kBAAqB;AAAA,EAAA;AAE3B;AAEO,SAAS,iBACd,MACA,cAIA;AACA,QAAM,sBAAsB,sBAAsB,MAAM,YAAY;AACpE,QAAM,QAAoB,CAAA;AAE1B,aAAW,EAAC,MAAA,KAAU,qBAAqB;AACzC,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,KAAK,UAAU,KAAK,QAAQ,KAAK,CAAC;AACxC;AAAA,IACF;AACA,UAAM;AAAA,MACJ,YAAY,UAAU,KAAK,QAAQ,KAAK,CAAC,OAAO;AAAA,QAC9C;AAAA,QACA,oBAAoB,MAAM,MAAM,EAAE,YAAY,YAAY,IAAI,CAAA,OAAM;AAAA,UAClE,OAAO,oBAAoB,MAAM,SAAS,CAAC,EAAE;AAAA,UAC7C,KAAK;AAAA,QAAA,EACL;AAAA,QACF,oBAAoB,MAAM,MAAM,EAAE,YAAY;AAAA,MAAA,EAC9C,oBAAoB,MAAM,MAAM,EAAE,KAAK,CAAC;AAAA,IAAA;AAAA,EAE9C;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,IAAI,KAAK,OAAO,EAAE,CAAC;AAAA,IAC/B;AAAA;AAAA;AAAA,EAAA;AAIJ;AAEO,SAAS,sBACd,MACA,cAQA;AACA;AAAA,IACE,aAAa,SAAS,SAAS,WAAW;AAAA,IAC1C;AAAA,EAAA;AAEF,QAAM,oBAAoB,aAAa,SAAS,QAAQ,CAAC;AACzD,SAAO,CAAC,kBAAkB,MAAM;AAChC,SAAO;AAAA,IACL;AAAA,MACE,OAAO,UAAU,MAAM,aAAa,SAAS,KAAK;AAAA,MAClD,aAAa,aAAa;AAAA,MAC1B,OAAO,aAAa,SAAS;AAAA,IAAA;AAAA,IAE/B;AAAA,MACE,OAAO,UAAU,MAAM,kBAAkB,SAAS,KAAK;AAAA,MACvD,aAAa,kBAAkB;AAAA,MAC/B,OAAO,kBAAkB,SAAS;AAAA,IAAA;AAAA,EACpC;AAEJ;AAEA,SAAS,OAAO,OAAe,WAAW,OAAiB;AACzD,SAAO,MACL,WAAW,QAAQ,sBACrB,gBAAgB,IAAI,MAAM,KAAK,CAAC,KAAK,WAAW,QAAQ,kBAAkB;AAC5E;AAEA,SAAS,YAAY,QAAoB,QAAmC;AAC1E,QAAM,qBACJ,OAAO,OAAO,OAAO,OAAO,UAAU,OAAO,MAAM,GAAG,CAAC,EACrD,OAAO,OAAO,WAAW,OAAO,MAAM,KAAK,OAAO,GAAG,CACvD;AACF,QAAM,aAAa,mBAAmB;AACtC,MACE,CAAC,mBAAmB,WACnB,eAAe,UACd,eAAe,eACf,eAAe,iCACf,eAAe,iBACf,eAAe,6BACjB;AACA,QAAI,mBAAmB,SAAS;AAE9B,aAAO,6CAA6C,SAAS,QAAQ,MAAM,CAAC,iBAAiB,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,IACpH;AACA,WAAO,yBAAyB,SAAS,QAAQ,MAAM,CAAC,eAAe,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,EAC9F;AACA,SAAO,MAAM,SAAS,QAAQ,MAAM,CAAC,OAAO,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE;AAEA,SAAS,SAAS,QAAoB,QAAyB;AAC7D,SAAO,IAAI;AAAA,IACT,OAAO,MAAM;AAAA,IACb,OAAO,OAAO,WAAW,OAAO,MAAM,KAAK,OAAO,GAAG;AAAA,EAAA;AAEzD;AAEA,SAAS,UAAU,QAAoB,OAAc;AACnD,SAAO,MAAM,IAAI,MAAM,OAAO,OAAO,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI,MAAM,MAAM,KAAK,CAAC;AACzF;AAEA,SAAS,gBAAgB,MAAkB,OAAc,WAAmB;AAC1E,SAAO,KAAK,OAAO,KAAK,OAAO,UAAU,MAAM,GAAG,CAAC,EACjD,KAAK,OAAO,WAAW,MAAM,KAAK,SAAS,CAC7C;AACF;AAGO,SAAS,iBAAiB,UAAiC;AAChE,QAAM,aAA8BC;AAAAA,IAClC,SAAS,CAAC,EAAE,cAAc;AAAA,EAAA;AAE5B,kBAAgB,UAAU;AAC1B,SAAO;AACT;AAEA,SAAS,gBAAgB,GAA4C;AACnE,QAAM,OAAO,iBAAiB,CAAC;AAC/B,MAAI,MAAM;AACR,UAAM,IAAI,MAAM,oCAAoC,IAAI,EAAE;AAAA,EAC5D;AACF;AAEA,SAAS,iBAAiB,GAAwC;AAChE,QAAM,UAAU,OAAO;AACvB,UAAQ,SAAA;AAAA,IACN,KAAK;AACH,aAAO,MAAM,CAAC;AAAA,IAChB,KAAK,UAAU;AACb,UAAI,MAAM,MAAM;AACd;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,iBAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,gBAAM,OAAO,iBAAiB,EAAE,CAAC,CAAC;AAClC,cAAI,MAAM;AACR,mBAAO,IAAI,CAAC,IAAI,IAAI;AAAA,UACtB;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAEA,YAAM,IAAI;AACV,iBAAW,KAAK,GAAG;AACjB,YAAI,OAAO,GAAG,CAAC,GAAG;AAChB,gBAAM,OAAO,iBAAiB,EAAE,CAAC,CAAC;AAClC,cAAI,MAAM;AACR,mBAAO,KAAK,CAAC,KAAK,IAAI;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;"}
@@ -1,4 +1,4 @@
1
- const version = "0.26.0-canary.7";
1
+ const version = "0.26.0";
2
2
  const packageJson = {
3
3
  version
4
4
  };
@@ -1,7 +1,6 @@
1
1
  import { useConnectionState } from "../../zero-react/src/use-connection-state.js";
2
2
  import { useQuery, useSuspenseQuery } from "../../zero-react/src/use-query.js";
3
3
  import { useZeroOnline } from "../../zero-react/src/use-zero-online.js";
4
- import { useZeroVirtualizer } from "../../zero-react/src/use-zero-virtualizer.js";
5
4
  import { ZeroContext, ZeroProvider, createUseZero, useZero } from "../../zero-react/src/zero-provider.js";
6
5
  export {
7
6
  ZeroContext,
@@ -11,7 +10,6 @@ export {
11
10
  useQuery,
12
11
  useSuspenseQuery,
13
12
  useZero,
14
- useZeroOnline,
15
- useZeroVirtualizer
13
+ useZeroOnline
16
14
  };
17
15
  //# sourceMappingURL=react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"react.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -83,13 +83,6 @@ function transformCondition(lc, cond, auth) {
83
83
  }
84
84
  };
85
85
  }
86
- case "scalarSubquery": {
87
- const query = transformQueryInternal(lc, cond.subquery, auth);
88
- return {
89
- ...cond,
90
- subquery: query
91
- };
92
- }
93
86
  }
94
87
  }
95
88
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"read-authorizer.js","sources":["../../../../../zero-cache/src/auth/read-authorizer.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {JSONValue} from '../../../shared/src/json.ts';\nimport type {AST, Condition} from '../../../zero-protocol/src/ast.ts';\nimport {hashOfAST} from '../../../zero-protocol/src/query-hash.ts';\nimport type {PermissionsConfig} from '../../../zero-schema/src/compiled-permissions.ts';\nimport {bindStaticParameters} from '../../../zql/src/builder/builder.ts';\nimport {simplifyCondition} from '../../../zql/src/query/expression.ts';\nimport type {JWTAuth} from './auth.ts';\n\nexport type TransformedAndHashed = {\n id: string;\n transformedAst: AST;\n transformationHash: string;\n};\n/**\n * Adds permission rules to the given query so it only returns rows that the\n * user is allowed to read.\n *\n * If the returned query is `undefined` that means that user cannot run\n * the query at all. This is only the case if we can infer that all rows\n * would be excluded without running the query.\n * E.g., the user is trying to query a table that is not readable.\n */\nexport function transformAndHashQuery(\n lc: LogContext,\n id: string,\n query: AST,\n permissionRules: PermissionsConfig,\n auth: JWTAuth | undefined,\n internalQuery: boolean | null | undefined,\n): TransformedAndHashed {\n const transformed = internalQuery\n ? query // application permissions do not apply to internal queries\n : transformQuery(lc, query, permissionRules, auth);\n return {\n id,\n transformedAst: transformed,\n transformationHash: hashOfAST(transformed),\n };\n}\n\n/**\n * For a given AST, apply the read-auth rules and bind static auth data.\n */\nexport function transformQuery(\n lc: LogContext,\n query: AST,\n permissionRules: PermissionsConfig,\n auth: JWTAuth | undefined,\n): AST {\n const queryWithPermissions = transformQueryInternal(\n lc,\n query,\n permissionRules,\n );\n return bindStaticParameters(queryWithPermissions, {\n authData: auth ? (auth.decoded as Record<string, JSONValue>) : {},\n });\n}\n\nfunction transformQueryInternal(\n lc: LogContext,\n query: AST,\n permissionRules: PermissionsConfig,\n): AST {\n let rowSelectRules = permissionRules?.tables?.[query.table]?.row?.select;\n\n if (!rowSelectRules || rowSelectRules.length === 0) {\n // If there are no rules, we default to not allowing any rows to be selected.\n lc.warn?.(\n \"No permission rules found for table '\" +\n query.table +\n \"'. No rows will be returned. Use ANYONE_CAN to allow all users to access all rows.\",\n );\n rowSelectRules = [\n [\n 'allow',\n {\n type: 'or',\n conditions: [],\n },\n ],\n ];\n }\n\n const updatedWhere = addRulesToWhere(\n query.where\n ? transformCondition(lc, query.where, permissionRules)\n : undefined,\n rowSelectRules,\n );\n return {\n ...query,\n where: simplifyCondition(updatedWhere),\n related: query.related?.map(sq => {\n const subquery = transformQueryInternal(lc, sq.subquery, permissionRules);\n return {\n ...sq,\n subquery,\n };\n }),\n };\n}\n\nfunction addRulesToWhere(\n where: Condition | undefined,\n rowSelectRules: ['allow', Condition][],\n): Condition {\n return {\n type: 'and',\n conditions: [\n ...(where ? [where] : []),\n {\n type: 'or',\n conditions: rowSelectRules.map(([_, condition]) => condition),\n },\n ],\n };\n}\n\n// We must augment conditions so we do not provide an oracle to users.\n// E.g.,\n// `issue.whereExists('secret', s => s.where('value', 'sdf'))`\n// Not applying read policies to subqueries in the where position\n// would allow users to infer the existence of rows, and their contents,\n// that they cannot read.\nfunction transformCondition(\n lc: LogContext,\n cond: Condition,\n auth: PermissionsConfig,\n): Condition {\n switch (cond.type) {\n case 'simple':\n return cond;\n case 'and':\n case 'or':\n return {\n ...cond,\n conditions: cond.conditions.map(c => transformCondition(lc, c, auth)),\n };\n case 'correlatedSubquery': {\n const query = transformQueryInternal(lc, cond.related.subquery, auth);\n return {\n ...cond,\n related: {\n ...cond.related,\n subquery: query,\n },\n };\n }\n case 'scalarSubquery': {\n const query = transformQueryInternal(lc, cond.subquery, auth);\n return {\n ...cond,\n subquery: query,\n };\n }\n }\n}\n"],"names":[],"mappings":";;;AAuBO,SAAS,sBACd,IACA,IACA,OACA,iBACA,MACA,eACsB;AACtB,QAAM,cAAc,gBAChB,QACA,eAAe,IAAI,OAAO,iBAAiB,IAAI;AACnD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB,oBAAoB,UAAU,WAAW;AAAA,EAAA;AAE7C;AAKO,SAAS,eACd,IACA,OACA,iBACA,MACK;AACL,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,SAAO,qBAAqB,sBAAsB;AAAA,IAChD,UAAU,OAAQ,KAAK,UAAwC,CAAA;AAAA,EAAC,CACjE;AACH;AAEA,SAAS,uBACP,IACA,OACA,iBACK;AACL,MAAI,iBAAiB,iBAAiB,SAAS,MAAM,KAAK,GAAG,KAAK;AAElE,MAAI,CAAC,kBAAkB,eAAe,WAAW,GAAG;AAElD,OAAG;AAAA,MACD,0CACE,MAAM,QACN;AAAA,IAAA;AAEJ,qBAAiB;AAAA,MACf;AAAA,QACE;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,YAAY,CAAA;AAAA,QAAC;AAAA,MACf;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,eAAe;AAAA,IACnB,MAAM,QACF,mBAAmB,IAAI,MAAM,OAAO,eAAe,IACnD;AAAA,IACJ;AAAA,EAAA;AAEF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,kBAAkB,YAAY;AAAA,IACrC,SAAS,MAAM,SAAS,IAAI,CAAA,OAAM;AAChC,YAAM,WAAW,uBAAuB,IAAI,GAAG,UAAU,eAAe;AACxE,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EAAA;AAEL;AAEA,SAAS,gBACP,OACA,gBACW;AACX,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,MACV,GAAI,QAAQ,CAAC,KAAK,IAAI,CAAA;AAAA,MACtB;AAAA,QACE,MAAM;AAAA,QACN,YAAY,eAAe,IAAI,CAAC,CAAC,GAAG,SAAS,MAAM,SAAS;AAAA,MAAA;AAAA,IAC9D;AAAA,EACF;AAEJ;AAQA,SAAS,mBACP,IACA,MACA,MACW;AACX,UAAQ,KAAK,MAAA;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,KAAK,WAAW,IAAI,OAAK,mBAAmB,IAAI,GAAG,IAAI,CAAC;AAAA,MAAA;AAAA,IAExE,KAAK,sBAAsB;AACzB,YAAM,QAAQ,uBAAuB,IAAI,KAAK,QAAQ,UAAU,IAAI;AACpE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,UACP,GAAG,KAAK;AAAA,UACR,UAAU;AAAA,QAAA;AAAA,MACZ;AAAA,IAEJ;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,QAAQ,uBAAuB,IAAI,KAAK,UAAU,IAAI;AAC5D,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,MAAA;AAAA,IAEd;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"read-authorizer.js","sources":["../../../../../zero-cache/src/auth/read-authorizer.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport type {JSONValue} from '../../../shared/src/json.ts';\nimport type {AST, Condition} from '../../../zero-protocol/src/ast.ts';\nimport {hashOfAST} from '../../../zero-protocol/src/query-hash.ts';\nimport type {PermissionsConfig} from '../../../zero-schema/src/compiled-permissions.ts';\nimport {bindStaticParameters} from '../../../zql/src/builder/builder.ts';\nimport {simplifyCondition} from '../../../zql/src/query/expression.ts';\nimport type {JWTAuth} from './auth.ts';\n\nexport type TransformedAndHashed = {\n id: string;\n transformedAst: AST;\n transformationHash: string;\n};\n/**\n * Adds permission rules to the given query so it only returns rows that the\n * user is allowed to read.\n *\n * If the returned query is `undefined` that means that user cannot run\n * the query at all. This is only the case if we can infer that all rows\n * would be excluded without running the query.\n * E.g., the user is trying to query a table that is not readable.\n */\nexport function transformAndHashQuery(\n lc: LogContext,\n id: string,\n query: AST,\n permissionRules: PermissionsConfig,\n auth: JWTAuth | undefined,\n internalQuery: boolean | null | undefined,\n): TransformedAndHashed {\n const transformed = internalQuery\n ? query // application permissions do not apply to internal queries\n : transformQuery(lc, query, permissionRules, auth);\n return {\n id,\n transformedAst: transformed,\n transformationHash: hashOfAST(transformed),\n };\n}\n\n/**\n * For a given AST, apply the read-auth rules and bind static auth data.\n */\nexport function transformQuery(\n lc: LogContext,\n query: AST,\n permissionRules: PermissionsConfig,\n auth: JWTAuth | undefined,\n): AST {\n const queryWithPermissions = transformQueryInternal(\n lc,\n query,\n permissionRules,\n );\n return bindStaticParameters(queryWithPermissions, {\n authData: auth ? (auth.decoded as Record<string, JSONValue>) : {},\n });\n}\n\nfunction transformQueryInternal(\n lc: LogContext,\n query: AST,\n permissionRules: PermissionsConfig,\n): AST {\n let rowSelectRules = permissionRules?.tables?.[query.table]?.row?.select;\n\n if (!rowSelectRules || rowSelectRules.length === 0) {\n // If there are no rules, we default to not allowing any rows to be selected.\n lc.warn?.(\n \"No permission rules found for table '\" +\n query.table +\n \"'. No rows will be returned. Use ANYONE_CAN to allow all users to access all rows.\",\n );\n rowSelectRules = [\n [\n 'allow',\n {\n type: 'or',\n conditions: [],\n },\n ],\n ];\n }\n\n const updatedWhere = addRulesToWhere(\n query.where\n ? transformCondition(lc, query.where, permissionRules)\n : undefined,\n rowSelectRules,\n );\n return {\n ...query,\n where: simplifyCondition(updatedWhere),\n related: query.related?.map(sq => {\n const subquery = transformQueryInternal(lc, sq.subquery, permissionRules);\n return {\n ...sq,\n subquery,\n };\n }),\n };\n}\n\nfunction addRulesToWhere(\n where: Condition | undefined,\n rowSelectRules: ['allow', Condition][],\n): Condition {\n return {\n type: 'and',\n conditions: [\n ...(where ? [where] : []),\n {\n type: 'or',\n conditions: rowSelectRules.map(([_, condition]) => condition),\n },\n ],\n };\n}\n\n// We must augment conditions so we do not provide an oracle to users.\n// E.g.,\n// `issue.whereExists('secret', s => s.where('value', 'sdf'))`\n// Not applying read policies to subqueries in the where position\n// would allow users to infer the existence of rows, and their contents,\n// that they cannot read.\nfunction transformCondition(\n lc: LogContext,\n cond: Condition,\n auth: PermissionsConfig,\n): Condition {\n switch (cond.type) {\n case 'simple':\n return cond;\n case 'and':\n case 'or':\n return {\n ...cond,\n conditions: cond.conditions.map(c => transformCondition(lc, c, auth)),\n };\n case 'correlatedSubquery': {\n const query = transformQueryInternal(lc, cond.related.subquery, auth);\n return {\n ...cond,\n related: {\n ...cond.related,\n subquery: query,\n },\n };\n }\n }\n}\n"],"names":[],"mappings":";;;AAuBO,SAAS,sBACd,IACA,IACA,OACA,iBACA,MACA,eACsB;AACtB,QAAM,cAAc,gBAChB,QACA,eAAe,IAAI,OAAO,iBAAiB,IAAI;AACnD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB,oBAAoB,UAAU,WAAW;AAAA,EAAA;AAE7C;AAKO,SAAS,eACd,IACA,OACA,iBACA,MACK;AACL,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,SAAO,qBAAqB,sBAAsB;AAAA,IAChD,UAAU,OAAQ,KAAK,UAAwC,CAAA;AAAA,EAAC,CACjE;AACH;AAEA,SAAS,uBACP,IACA,OACA,iBACK;AACL,MAAI,iBAAiB,iBAAiB,SAAS,MAAM,KAAK,GAAG,KAAK;AAElE,MAAI,CAAC,kBAAkB,eAAe,WAAW,GAAG;AAElD,OAAG;AAAA,MACD,0CACE,MAAM,QACN;AAAA,IAAA;AAEJ,qBAAiB;AAAA,MACf;AAAA,QACE;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,YAAY,CAAA;AAAA,QAAC;AAAA,MACf;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,eAAe;AAAA,IACnB,MAAM,QACF,mBAAmB,IAAI,MAAM,OAAO,eAAe,IACnD;AAAA,IACJ;AAAA,EAAA;AAEF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,kBAAkB,YAAY;AAAA,IACrC,SAAS,MAAM,SAAS,IAAI,CAAA,OAAM;AAChC,YAAM,WAAW,uBAAuB,IAAI,GAAG,UAAU,eAAe;AACxE,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EAAA;AAEL;AAEA,SAAS,gBACP,OACA,gBACW;AACX,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,MACV,GAAI,QAAQ,CAAC,KAAK,IAAI,CAAA;AAAA,MACtB;AAAA,QACE,MAAM;AAAA,QACN,YAAY,eAAe,IAAI,CAAC,CAAC,GAAG,SAAS,MAAM,SAAS;AAAA,MAAA;AAAA,IAC9D;AAAA,EACF;AAEJ;AAQA,SAAS,mBACP,IACA,MACA,MACW;AACX,UAAQ,KAAK,MAAA;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,KAAK,WAAW,IAAI,OAAK,mBAAmB,IAAI,GAAG,IAAI,CAAC;AAAA,MAAA;AAAA,IAExE,KAAK,sBAAsB;AACzB,YAAM,QAAQ,uBAAuB,IAAI,KAAK,QAAQ,UAAU,IAAI;AACpE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,UACP,GAAG,KAAK;AAAA,UACR,UAAU;AAAA,QAAA;AAAA,MACZ;AAAA,IAEJ;AAAA,EAAA;AAEJ;"}
@@ -1,5 +1,6 @@
1
1
  import type { LogContext } from '@rocicorp/logger';
2
2
  import { type NetworkInterfaceInfo } from 'os';
3
- export declare function getHostIp(lc: LogContext, preferredPrefixes: string[]): string;
4
- export declare function getPreferredIp(interfaces: NodeJS.Dict<NetworkInterfaceInfo[]>, preferredPrefixes: string[]): string;
3
+ export declare const DEFAULT_PREFERRED_PREFIXES: readonly ["eth", "en"];
4
+ export declare function getHostIp(lc?: LogContext, preferredPrefixes?: readonly string[]): string;
5
+ export declare function getPreferredIp(interfaces: NodeJS.Dict<NetworkInterfaceInfo[]>, preferredPrefixes: readonly string[]): string;
5
6
  //# sourceMappingURL=network.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAoB,KAAK,oBAAoB,EAAC,MAAM,IAAI,CAAC;AAEhE,wBAAgB,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAKpE;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,EAC/C,iBAAiB,EAAE,MAAM,EAAE,UA2C5B"}
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAoB,KAAK,oBAAoB,EAAC,MAAM,IAAI,CAAC;AAEhE,eAAO,MAAM,0BAA0B,wBAG7B,CAAC;AAEX,wBAAgB,SAAS,CACvB,EAAE,CAAC,EAAE,UAAU,EACf,iBAAiB,GAAE,SAAS,MAAM,EAA+B,UAMlE;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,EAC/C,iBAAiB,EAAE,SAAS,MAAM,EAAE,UA2CrC"}
@@ -1,9 +1,15 @@
1
1
  import { isIPv6, isPrivate, isReserved } from "is-in-subnet";
2
2
  import { networkInterfaces } from "os";
3
- function getHostIp(lc, preferredPrefixes) {
3
+ const DEFAULT_PREFERRED_PREFIXES = [
4
+ "eth",
5
+ // linux
6
+ "en"
7
+ // macbooks
8
+ ];
9
+ function getHostIp(lc, preferredPrefixes = DEFAULT_PREFERRED_PREFIXES) {
4
10
  const interfaces = networkInterfaces();
5
11
  const preferred = getPreferredIp(interfaces, preferredPrefixes);
6
- lc.info?.(`network interfaces`, { preferred, interfaces });
12
+ lc?.info?.(`network interfaces`, { preferred, interfaces });
7
13
  return preferred;
8
14
  }
9
15
  function getPreferredIp(interfaces, preferredPrefixes) {
@@ -38,6 +44,7 @@ function getPreferredIp(interfaces, preferredPrefixes) {
38
44
  return preferred;
39
45
  }
40
46
  export {
47
+ DEFAULT_PREFERRED_PREFIXES,
41
48
  getHostIp,
42
49
  getPreferredIp
43
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","sources":["../../../../../zero-cache/src/config/network.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {isIPv6, isPrivate, isReserved} from 'is-in-subnet';\nimport {networkInterfaces, type NetworkInterfaceInfo} from 'os';\n\nexport function getHostIp(lc: LogContext, preferredPrefixes: string[]) {\n const interfaces = networkInterfaces();\n const preferred = getPreferredIp(interfaces, preferredPrefixes);\n lc.info?.(`network interfaces`, {preferred, interfaces});\n return preferred;\n}\n\nexport function getPreferredIp(\n interfaces: NodeJS.Dict<NetworkInterfaceInfo[]>,\n preferredPrefixes: string[],\n) {\n const rank = ({name}: {name: string}) => {\n for (let i = 0; i < preferredPrefixes.length; i++) {\n if (name.startsWith(preferredPrefixes[i])) {\n return i;\n }\n }\n return Number.MAX_SAFE_INTEGER;\n };\n\n const sorted = Object.entries(interfaces)\n .flatMap(([name, infos]) => (infos ?? []).map(info => ({...info, name})))\n .sort((a, b) => {\n const ap =\n (isIPv6(a.address) && isPrivate(a.address)) || isReserved(a.address);\n const bp =\n (isIPv6(b.address) && isPrivate(b.address)) || isReserved(b.address);\n if (ap !== bp) {\n // Avoid link-local, site-local, or otherwise private addresses\n return ap ? 1 : -1;\n }\n if (a.internal !== b.internal) {\n // Prefer non-internal addresses.\n return a.internal ? 1 : -1;\n }\n if (a.family !== b.family) {\n // Prefer IPv4.\n return a.family === 'IPv4' ? -1 : 1;\n }\n const rankA = rank(a);\n const rankB = rank(b);\n if (rankA !== rankB) {\n return rankA - rankB;\n }\n // arbitrary\n return a.address.localeCompare(b.address);\n });\n\n // Enclose IPv6 addresses in square brackets for use in a URL.\n const preferred =\n sorted[0].family === 'IPv4' ? sorted[0].address : `[${sorted[0].address}]`;\n return preferred;\n}\n"],"names":[],"mappings":";;AAIO,SAAS,UAAU,IAAgB,mBAA6B;AACrE,QAAM,aAAa,kBAAA;AACnB,QAAM,YAAY,eAAe,YAAY,iBAAiB;AAC9D,KAAG,OAAO,sBAAsB,EAAC,WAAW,YAAW;AACvD,SAAO;AACT;AAEO,SAAS,eACd,YACA,mBACA;AACA,QAAM,OAAO,CAAC,EAAC,WAA0B;AACvC,aAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AACjD,UAAI,KAAK,WAAW,kBAAkB,CAAC,CAAC,GAAG;AACzC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,SAAS,OAAO,QAAQ,UAAU,EACrC,QAAQ,CAAC,CAAC,MAAM,KAAK,OAAO,SAAS,IAAI,IAAI,CAAA,UAAS,EAAC,GAAG,MAAM,OAAM,CAAC,EACvE,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,KACH,OAAO,EAAE,OAAO,KAAK,UAAU,EAAE,OAAO,KAAM,WAAW,EAAE,OAAO;AACrE,UAAM,KACH,OAAO,EAAE,OAAO,KAAK,UAAU,EAAE,OAAO,KAAM,WAAW,EAAE,OAAO;AACrE,QAAI,OAAO,IAAI;AAEb,aAAO,KAAK,IAAI;AAAA,IAClB;AACA,QAAI,EAAE,aAAa,EAAE,UAAU;AAE7B,aAAO,EAAE,WAAW,IAAI;AAAA,IAC1B;AACA,QAAI,EAAE,WAAW,EAAE,QAAQ;AAEzB,aAAO,EAAE,WAAW,SAAS,KAAK;AAAA,IACpC;AACA,UAAM,QAAQ,KAAK,CAAC;AACpB,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,OAAO;AACnB,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,EAC1C,CAAC;AAGH,QAAM,YACJ,OAAO,CAAC,EAAE,WAAW,SAAS,OAAO,CAAC,EAAE,UAAU,IAAI,OAAO,CAAC,EAAE,OAAO;AACzE,SAAO;AACT;"}
1
+ {"version":3,"file":"network.js","sources":["../../../../../zero-cache/src/config/network.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {isIPv6, isPrivate, isReserved} from 'is-in-subnet';\nimport {networkInterfaces, type NetworkInterfaceInfo} from 'os';\n\nexport const DEFAULT_PREFERRED_PREFIXES = [\n 'eth', // linux\n 'en', // macbooks\n] as const;\n\nexport function getHostIp(\n lc?: LogContext,\n preferredPrefixes: readonly string[] = DEFAULT_PREFERRED_PREFIXES,\n) {\n const interfaces = networkInterfaces();\n const preferred = getPreferredIp(interfaces, preferredPrefixes);\n lc?.info?.(`network interfaces`, {preferred, interfaces});\n return preferred;\n}\n\nexport function getPreferredIp(\n interfaces: NodeJS.Dict<NetworkInterfaceInfo[]>,\n preferredPrefixes: readonly string[],\n) {\n const rank = ({name}: {name: string}) => {\n for (let i = 0; i < preferredPrefixes.length; i++) {\n if (name.startsWith(preferredPrefixes[i])) {\n return i;\n }\n }\n return Number.MAX_SAFE_INTEGER;\n };\n\n const sorted = Object.entries(interfaces)\n .flatMap(([name, infos]) => (infos ?? []).map(info => ({...info, name})))\n .sort((a, b) => {\n const ap =\n (isIPv6(a.address) && isPrivate(a.address)) || isReserved(a.address);\n const bp =\n (isIPv6(b.address) && isPrivate(b.address)) || isReserved(b.address);\n if (ap !== bp) {\n // Avoid link-local, site-local, or otherwise private addresses\n return ap ? 1 : -1;\n }\n if (a.internal !== b.internal) {\n // Prefer non-internal addresses.\n return a.internal ? 1 : -1;\n }\n if (a.family !== b.family) {\n // Prefer IPv4.\n return a.family === 'IPv4' ? -1 : 1;\n }\n const rankA = rank(a);\n const rankB = rank(b);\n if (rankA !== rankB) {\n return rankA - rankB;\n }\n // arbitrary\n return a.address.localeCompare(b.address);\n });\n\n // Enclose IPv6 addresses in square brackets for use in a URL.\n const preferred =\n sorted[0].family === 'IPv4' ? sorted[0].address : `[${sorted[0].address}]`;\n return preferred;\n}\n"],"names":[],"mappings":";;AAIO,MAAM,6BAA6B;AAAA,EACxC;AAAA;AAAA,EACA;AAAA;AACF;AAEO,SAAS,UACd,IACA,oBAAuC,4BACvC;AACA,QAAM,aAAa,kBAAA;AACnB,QAAM,YAAY,eAAe,YAAY,iBAAiB;AAC9D,MAAI,OAAO,sBAAsB,EAAC,WAAW,YAAW;AACxD,SAAO;AACT;AAEO,SAAS,eACd,YACA,mBACA;AACA,QAAM,OAAO,CAAC,EAAC,WAA0B;AACvC,aAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AACjD,UAAI,KAAK,WAAW,kBAAkB,CAAC,CAAC,GAAG;AACzC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,SAAS,OAAO,QAAQ,UAAU,EACrC,QAAQ,CAAC,CAAC,MAAM,KAAK,OAAO,SAAS,IAAI,IAAI,CAAA,UAAS,EAAC,GAAG,MAAM,OAAM,CAAC,EACvE,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,KACH,OAAO,EAAE,OAAO,KAAK,UAAU,EAAE,OAAO,KAAM,WAAW,EAAE,OAAO;AACrE,UAAM,KACH,OAAO,EAAE,OAAO,KAAK,UAAU,EAAE,OAAO,KAAM,WAAW,EAAE,OAAO;AACrE,QAAI,OAAO,IAAI;AAEb,aAAO,KAAK,IAAI;AAAA,IAClB;AACA,QAAI,EAAE,aAAa,EAAE,UAAU;AAE7B,aAAO,EAAE,WAAW,IAAI;AAAA,IAC1B;AACA,QAAI,EAAE,WAAW,EAAE,QAAQ;AAEzB,aAAO,EAAE,WAAW,SAAS,KAAK;AAAA,IACpC;AACA,UAAM,QAAQ,KAAK,CAAC;AACpB,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,UAAU,OAAO;AACnB,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,EAC1C,CAAC;AAGH,QAAM,YACJ,OAAO,CAAC,EAAE,WAAW,SAAS,OAAO,CAAC,EAAE,UAAU,IAAI,OAAO,CAAC,EAAE,OAAO;AACzE,SAAO;AACT;"}
@@ -0,0 +1,16 @@
1
+ import type { NormalizedZeroConfig } from './normalize.ts';
2
+ export type ServerContext = {
3
+ appID: string;
4
+ taskID: string;
5
+ hostIP: string;
6
+ hostname: string;
7
+ timestamp: string;
8
+ [platformVar: string]: string | undefined;
9
+ };
10
+ /**
11
+ * Runtime and environment information useful for recording and identifying
12
+ * the origin of certain actions such as initial sync and logical replication
13
+ * takeovers.
14
+ */
15
+ export declare function getServerContext(config: NormalizedZeroConfig): ServerContext;
16
+ //# sourceMappingURL=server-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-context.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/server-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,gBAAgB,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAmC5E"}
@@ -0,0 +1,32 @@
1
+ import { hostname } from "node:os";
2
+ import { getHostIp } from "./network.js";
3
+ function getServerContext(config) {
4
+ const context = {
5
+ appID: config.app.id,
6
+ taskID: config.taskID,
7
+ hostIP: getHostIp(),
8
+ hostname: hostname(),
9
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
10
+ // Platform-specific environment variables
11
+ flyAppName: process.env.FLY_APP_NAME,
12
+ flyMachineID: process.env.FLY_MACHINE_ID,
13
+ railwayProjectID: process.env.RAILWAY_PROJECT_ID,
14
+ railwayProjectName: process.env.RAILWAY_PROJECT_NAME,
15
+ railwayEnvironmentID: process.env.RAILWAY_ENVIRONMENT_ID,
16
+ railwayEnvironmentName: process.env.RAILWAY_ENVIRONMENT_NAME,
17
+ railwayServiceID: process.env.RAILWAY_SERVICE_ID,
18
+ railwayServiceName: process.env.RAILWAY_SERVICE_NAME,
19
+ railwayDeploymentID: process.env.RAILWAY_DEPLOYMENT_ID,
20
+ gcpProject: process.env.GOOGLE_CLOUD_PROJECT ?? process.env.GCP_PROJECT ?? process.env.GCLOUD_PROJECT,
21
+ coolifyDomainName: process.env.COOLIFY_FQDN,
22
+ coolifyContainerName: process.env.COOLIFY_CONTAINER_NAME,
23
+ azureEnvName: process.env.AZURE_ENV_NAME
24
+ };
25
+ return Object.fromEntries(
26
+ Object.entries(context).filter(([_, v]) => v !== void 0)
27
+ );
28
+ }
29
+ export {
30
+ getServerContext
31
+ };
32
+ //# sourceMappingURL=server-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-context.js","sources":["../../../../../zero-cache/src/config/server-context.ts"],"sourcesContent":["import {hostname} from 'node:os';\nimport {getHostIp} from './network.ts';\nimport type {NormalizedZeroConfig} from './normalize.ts';\n\nexport type ServerContext = {\n appID: string;\n taskID: string;\n hostIP: string;\n hostname: string;\n timestamp: string;\n\n [platformVar: string]: string | undefined;\n};\n\n/**\n * Runtime and environment information useful for recording and identifying\n * the origin of certain actions such as initial sync and logical replication\n * takeovers.\n */\nexport function getServerContext(config: NormalizedZeroConfig): ServerContext {\n const context: ServerContext = {\n appID: config.app.id,\n taskID: config.taskID,\n hostIP: getHostIp(),\n hostname: hostname(),\n timestamp: new Date().toISOString(),\n\n // Platform-specific environment variables\n flyAppName: process.env.FLY_APP_NAME,\n flyMachineID: process.env.FLY_MACHINE_ID,\n\n railwayProjectID: process.env.RAILWAY_PROJECT_ID,\n railwayProjectName: process.env.RAILWAY_PROJECT_NAME,\n railwayEnvironmentID: process.env.RAILWAY_ENVIRONMENT_ID,\n railwayEnvironmentName: process.env.RAILWAY_ENVIRONMENT_NAME,\n railwayServiceID: process.env.RAILWAY_SERVICE_ID,\n railwayServiceName: process.env.RAILWAY_SERVICE_NAME,\n railwayDeploymentID: process.env.RAILWAY_DEPLOYMENT_ID,\n\n gcpProject:\n process.env.GOOGLE_CLOUD_PROJECT ??\n process.env.GCP_PROJECT ??\n process.env.GCLOUD_PROJECT,\n\n coolifyDomainName: process.env.COOLIFY_FQDN,\n coolifyContainerName: process.env.COOLIFY_CONTAINER_NAME,\n\n azureEnvName: process.env.AZURE_ENV_NAME,\n };\n\n // Remove keys with undefined values\n return Object.fromEntries(\n Object.entries(context).filter(([_, v]) => v !== undefined),\n ) as ServerContext;\n}\n"],"names":[],"mappings":";;AAmBO,SAAS,iBAAiB,QAA6C;AAC5E,QAAM,UAAyB;AAAA,IAC7B,OAAO,OAAO,IAAI;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,QAAQ,UAAA;AAAA,IACR,UAAU,SAAA;AAAA,IACV,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA;AAAA,IAGtB,YAAY,QAAQ,IAAI;AAAA,IACxB,cAAc,QAAQ,IAAI;AAAA,IAE1B,kBAAkB,QAAQ,IAAI;AAAA,IAC9B,oBAAoB,QAAQ,IAAI;AAAA,IAChC,sBAAsB,QAAQ,IAAI;AAAA,IAClC,wBAAwB,QAAQ,IAAI;AAAA,IACpC,kBAAkB,QAAQ,IAAI;AAAA,IAC9B,oBAAoB,QAAQ,IAAI;AAAA,IAChC,qBAAqB,QAAQ,IAAI;AAAA,IAEjC,YACE,QAAQ,IAAI,wBACZ,QAAQ,IAAI,eACZ,QAAQ,IAAI;AAAA,IAEd,mBAAmB,QAAQ,IAAI;AAAA,IAC/B,sBAAsB,QAAQ,IAAI;AAAA,IAElC,cAAc,QAAQ,IAAI;AAAA,EAAA;AAI5B,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,MAAS;AAAA,EAAA;AAE9D;"}
@@ -248,7 +248,7 @@ export declare const zeroOptions: {
248
248
  };
249
249
  };
250
250
  log: {
251
- level: v.Type<"error" | "debug" | "info" | "warn">;
251
+ level: v.Type<"info" | "error" | "debug" | "warn">;
252
252
  format: {
253
253
  type: v.Type<"text" | "json">;
254
254
  desc: string[];
@@ -345,7 +345,7 @@ export declare const zeroOptions: {
345
345
  hidden: boolean;
346
346
  };
347
347
  discoveryInterfacePreferences: {
348
- type: v.Type<string[]>;
348
+ type: v.Type<string[] | ("eth" | "en")[]>;
349
349
  desc: string[];
350
350
  hidden: boolean;
351
351
  };
@@ -406,7 +406,7 @@ export declare const zeroOptions: {
406
406
  desc: string[];
407
407
  };
408
408
  logLevel: {
409
- type: v.Type<"error" | "debug" | "info" | "warn">;
409
+ type: v.Type<"info" | "error" | "debug" | "warn">;
410
410
  };
411
411
  backupURL: {
412
412
  type: v.Optional<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"zero-config.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/zero-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AASnD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAC,SAAS,EAAC,MAAM,kCAAkC,CAAC;AAEhE,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAE3C,eAAO,MAAM,UAAU;;;;;;;;;CA+CtB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;CAwBxB,CAAC;AAEF,QAAA,MAAM,cAAc;;;;;;;;;CAmBnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,QAAA,MAAM,oBAAoB;;;;;;;;;CAczB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE5D,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDhB,CAAC;AAuGF,kBAAkB;AAClB,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAKpD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;IAwCtB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAGlB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuHlB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6ChB,kBAAkB;;;;;;QASlB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8SpB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAIpD,wBAAgB,aAAa,CAC3B,IAAI,GAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAM,GAC7C,UAAU,CAaZ;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,GAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAM,GAC7C,oBAAoB,CAItB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,GAAG,SAAS,GACpD,MAAM,CAER;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC,EACnD,QAAQ,EAAE,MAAM,GAAG,SAAS,WAwC7B;AAYD,wBAAgB,kBAAkB,SAEjC"}
1
+ {"version":3,"file":"zero-config.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/config/zero-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,CAAC,MAAM,+BAA+B,CAAC;AAUnD,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAC,SAAS,EAAC,MAAM,kCAAkC,CAAC;AAEhE,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAE3C,eAAO,MAAM,UAAU;;;;;;;;;CA+CtB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;CAwBxB,CAAC;AAEF,QAAA,MAAM,cAAc;;;;;;;;;CAmBnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,QAAA,MAAM,oBAAoB;;;;;;;;;CAczB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE5D,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDhB,CAAC;AAuGF,kBAAkB;AAClB,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAKpD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;IAwCtB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAGlB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuHlB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6ChB,kBAAkB;;;;;;QASlB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2SpB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAIpD,wBAAgB,aAAa,CAC3B,IAAI,GAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAM,GAC7C,UAAU,CAaZ;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,GAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAM,GAC7C,oBAAoB,CAItB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,GAAG,SAAS,GACpD,MAAM,CAER;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC,EACnD,QAAQ,EAAE,MAAM,GAAG,SAAS,WAwC7B;AAYD,wBAAgB,kBAAkB,SAEjC"}
@@ -6,6 +6,7 @@ import packageJson from "../../../zero/package.json.js";
6
6
  import { runtimeDebugFlags } from "../../../zql/src/builder/debug-delegate.js";
7
7
  import { singleProcessMode } from "../types/processes.js";
8
8
  import { ALLOWED_APP_ID_CHARACTERS, INVALID_APP_ID_MESSAGE } from "../types/shards.js";
9
+ import { DEFAULT_PREFERRED_PREFIXES } from "./network.js";
9
10
  import { assertNormalized, isDevelopmentMode } from "./normalize.js";
10
11
  import { array, string, number, boolean } from "@badrap/valita";
11
12
  const ZERO_ENV_VAR_PREFIX = "ZERO_";
@@ -446,12 +447,7 @@ const zeroOptions = {
446
447
  hidden: true
447
448
  },
448
449
  discoveryInterfacePreferences: {
449
- type: array(string()).default([
450
- "eth",
451
- // linux
452
- "en"
453
- // macbooks
454
- ]),
450
+ type: array(string()).default([...DEFAULT_PREFERRED_PREFIXES]),
455
451
  desc: [
456
452
  `The name prefixes to prefer when introspecting the network interfaces to determine`,
457
453
  `the externally reachable IP address for change-streamer discovery. This defaults`,