@rocicorp/zero 1.3.0-canary.3 → 1.3.1-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/out/analyze-query/src/bin-analyze.js +7 -7
  2. package/out/analyze-query/src/bin-transform.js +3 -3
  3. package/out/ast-to-zql/src/bin.js +2 -2
  4. package/out/shared/src/logging.d.ts.map +1 -1
  5. package/out/shared/src/logging.js +1 -1
  6. package/out/shared/src/logging.js.map +1 -1
  7. package/out/shared/src/options.d.ts.map +1 -1
  8. package/out/shared/src/options.js +1 -1
  9. package/out/shared/src/options.js.map +1 -1
  10. package/out/zero/package.js +89 -91
  11. package/out/zero/package.js.map +1 -1
  12. package/out/zero/src/zero-cache-dev.js +1 -1
  13. package/out/zero/src/zero-cache-dev.js.map +1 -1
  14. package/out/zero/src/zero-out.js +1 -1
  15. package/out/zero-cache/src/auth/auth.d.ts.map +1 -1
  16. package/out/zero-cache/src/auth/auth.js.map +1 -1
  17. package/out/zero-cache/src/auth/load-permissions.js +2 -2
  18. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  19. package/out/zero-cache/src/auth/write-authorizer.js +14 -5
  20. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  21. package/out/zero-cache/src/config/network.d.ts +1 -1
  22. package/out/zero-cache/src/config/network.d.ts.map +1 -1
  23. package/out/zero-cache/src/config/network.js +1 -1
  24. package/out/zero-cache/src/config/network.js.map +1 -1
  25. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  26. package/out/zero-cache/src/config/normalize.js.map +1 -1
  27. package/out/zero-cache/src/config/zero-config.d.ts +0 -5
  28. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  29. package/out/zero-cache/src/config/zero-config.js +3 -16
  30. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  31. package/out/zero-cache/src/db/lite-tables.d.ts.map +1 -1
  32. package/out/zero-cache/src/db/lite-tables.js +3 -3
  33. package/out/zero-cache/src/db/lite-tables.js.map +1 -1
  34. package/out/zero-cache/src/db/pg-to-lite.d.ts +1 -1
  35. package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -1
  36. package/out/zero-cache/src/db/pg-to-lite.js +13 -13
  37. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  38. package/out/zero-cache/src/db/transaction-pool.d.ts +40 -43
  39. package/out/zero-cache/src/db/transaction-pool.d.ts.map +1 -1
  40. package/out/zero-cache/src/db/transaction-pool.js +56 -76
  41. package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
  42. package/out/zero-cache/src/observability/events.d.ts.map +1 -1
  43. package/out/zero-cache/src/observability/events.js +1 -1
  44. package/out/zero-cache/src/observability/events.js.map +1 -1
  45. package/out/zero-cache/src/scripts/decommission.js +1 -1
  46. package/out/zero-cache/src/scripts/deploy-permissions.js +2 -2
  47. package/out/zero-cache/src/scripts/permissions.js +1 -1
  48. package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +1 -1
  49. package/out/zero-cache/src/server/anonymous-otel-start.js +3 -3
  50. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  51. package/out/zero-cache/src/server/change-streamer.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 +11 -26
  54. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  55. package/out/zero-cache/src/server/logging.d.ts +3 -1
  56. package/out/zero-cache/src/server/logging.d.ts.map +1 -1
  57. package/out/zero-cache/src/server/logging.js +3 -6
  58. package/out/zero-cache/src/server/logging.js.map +1 -1
  59. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  60. package/out/zero-cache/src/server/main.js +26 -26
  61. package/out/zero-cache/src/server/main.js.map +1 -1
  62. package/out/zero-cache/src/server/mutator.js +2 -4
  63. package/out/zero-cache/src/server/mutator.js.map +1 -1
  64. package/out/zero-cache/src/server/otel-log-sink.d.ts.map +1 -1
  65. package/out/zero-cache/src/server/otel-log-sink.js +2 -0
  66. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  67. package/out/zero-cache/src/server/otel-start.d.ts +1 -1
  68. package/out/zero-cache/src/server/otel-start.d.ts.map +1 -1
  69. package/out/zero-cache/src/server/otel-start.js +3 -7
  70. package/out/zero-cache/src/server/otel-start.js.map +1 -1
  71. package/out/zero-cache/src/server/reaper.js +6 -6
  72. package/out/zero-cache/src/server/reaper.js.map +1 -1
  73. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  74. package/out/zero-cache/src/server/replicator.js +3 -5
  75. package/out/zero-cache/src/server/replicator.js.map +1 -1
  76. package/out/zero-cache/src/server/runner/run-worker.js +2 -2
  77. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  78. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  79. package/out/zero-cache/src/server/syncer.js +12 -13
  80. package/out/zero-cache/src/server/syncer.js.map +1 -1
  81. package/out/zero-cache/src/server/worker-dispatcher.js +1 -1
  82. package/out/zero-cache/src/services/change-source/common/backfill-manager.js +1 -1
  83. package/out/zero-cache/src/services/change-source/common/replica-schema.js +1 -1
  84. package/out/zero-cache/src/services/change-source/custom/change-source.js +2 -2
  85. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js +1 -4
  86. package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
  87. package/out/zero-cache/src/services/change-source/pg/change-source.js +2 -2
  88. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +3 -58
  89. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  90. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +51 -208
  91. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  92. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +1 -1
  93. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +1 -1
  94. package/out/zero-cache/src/services/change-source/pg/schema/init.js +1 -1
  95. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +1 -1
  96. package/out/zero-cache/src/services/change-streamer/backup-monitor.js +1 -1
  97. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +1 -1
  98. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  99. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +1 -1
  100. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  101. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +1 -5
  102. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  103. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +7 -10
  104. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  105. package/out/zero-cache/src/services/change-streamer/replica-monitor.js +2 -2
  106. package/out/zero-cache/src/services/change-streamer/storer.d.ts +2 -19
  107. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  108. package/out/zero-cache/src/services/change-streamer/storer.js +5 -69
  109. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  110. package/out/zero-cache/src/services/heapz.d.ts.map +1 -1
  111. package/out/zero-cache/src/services/heapz.js +1 -1
  112. package/out/zero-cache/src/services/heapz.js.map +1 -1
  113. package/out/zero-cache/src/services/life-cycle.d.ts +1 -2
  114. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  115. package/out/zero-cache/src/services/life-cycle.js +7 -10
  116. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  117. package/out/zero-cache/src/services/litestream/commands.d.ts +4 -15
  118. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  119. package/out/zero-cache/src/services/litestream/commands.js +31 -31
  120. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  121. package/out/zero-cache/src/services/mutagen/mutagen.js +1 -1
  122. package/out/zero-cache/src/services/mutagen/pusher.d.ts +28 -28
  123. package/out/zero-cache/src/services/replicator/change-processor.js +2 -2
  124. package/out/zero-cache/src/services/replicator/incremental-sync.js +1 -1
  125. package/out/zero-cache/src/services/replicator/schema/replication-state.js +1 -1
  126. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  127. package/out/zero-cache/src/services/replicator/write-worker.js +3 -3
  128. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  129. package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
  130. package/out/zero-cache/src/services/run-ast.js +2 -2
  131. package/out/zero-cache/src/services/run-ast.js.map +1 -1
  132. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  133. package/out/zero-cache/src/services/statz.js +2 -2
  134. package/out/zero-cache/src/services/statz.js.map +1 -1
  135. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +1 -1
  136. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +2 -2
  137. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +1 -1
  138. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  139. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +1 -1
  140. package/out/zero-cache/src/services/view-syncer/cvr-store.js +2 -2
  141. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  142. package/out/zero-cache/src/services/view-syncer/inspect-handler.js +1 -1
  143. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +16 -6
  144. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  145. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +37 -29
  146. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  147. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
  148. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +3 -3
  149. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  150. package/out/zero-cache/src/services/view-syncer/snapshotter.js +2 -2
  151. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  152. package/out/zero-cache/src/services/view-syncer/view-syncer.js +6 -6
  153. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  154. package/out/zero-cache/src/types/profiler.d.ts.map +1 -1
  155. package/out/zero-cache/src/types/profiler.js.map +1 -1
  156. package/out/zero-cache/src/types/row-key.d.ts.map +1 -1
  157. package/out/zero-cache/src/types/row-key.js.map +1 -1
  158. package/out/zero-cache/src/types/streams.d.ts +1 -1
  159. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  160. package/out/zero-cache/src/types/streams.js.map +1 -1
  161. package/out/zero-cache/src/types/websocket-handoff.d.ts +1 -1
  162. package/out/zero-cache/src/types/websocket-handoff.d.ts.map +1 -1
  163. package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
  164. package/out/zero-cache/src/workers/connection.d.ts +1 -1
  165. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  166. package/out/zero-cache/src/workers/connection.js.map +1 -1
  167. package/out/zero-cache/src/workers/mutator.js.map +1 -1
  168. package/out/zero-cache/src/workers/syncer.d.ts +1 -1
  169. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  170. package/out/zero-cache/src/workers/syncer.js +2 -2
  171. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  172. package/out/zero-client/src/client/crud-impl.d.ts.map +1 -1
  173. package/out/zero-client/src/client/crud-impl.js +13 -4
  174. package/out/zero-client/src/client/crud-impl.js.map +1 -1
  175. package/out/zero-client/src/client/ivm-branch.d.ts.map +1 -1
  176. package/out/zero-client/src/client/ivm-branch.js +13 -4
  177. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  178. package/out/zero-client/src/client/version.js +1 -1
  179. package/out/zero-protocol/src/error.d.ts.map +1 -1
  180. package/out/zero-protocol/src/error.js +1 -1
  181. package/out/zero-protocol/src/error.js.map +1 -1
  182. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  183. package/out/zero-solid/src/solid-view.js +13 -13
  184. package/out/zero-solid/src/solid-view.js.map +1 -1
  185. package/out/zql/src/builder/builder.d.ts.map +1 -1
  186. package/out/zql/src/builder/builder.js.map +1 -1
  187. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  188. package/out/zql/src/ivm/array-view.js +1 -26
  189. package/out/zql/src/ivm/array-view.js.map +1 -1
  190. package/out/zql/src/ivm/change.d.ts +22 -20
  191. package/out/zql/src/ivm/change.d.ts.map +1 -1
  192. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  193. package/out/zql/src/ivm/exists.js +38 -27
  194. package/out/zql/src/ivm/exists.js.map +1 -1
  195. package/out/zql/src/ivm/fan-in.d.ts +2 -3
  196. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  197. package/out/zql/src/ivm/fan-in.js.map +1 -1
  198. package/out/zql/src/ivm/fan-out.d.ts +1 -1
  199. package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
  200. package/out/zql/src/ivm/fan-out.js +1 -1
  201. package/out/zql/src/ivm/fan-out.js.map +1 -1
  202. package/out/zql/src/ivm/filter-operators.d.ts +3 -3
  203. package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
  204. package/out/zql/src/ivm/filter-operators.js.map +1 -1
  205. package/out/zql/src/ivm/filter-push.d.ts.map +1 -1
  206. package/out/zql/src/ivm/filter-push.js +7 -7
  207. package/out/zql/src/ivm/filter-push.js.map +1 -1
  208. package/out/zql/src/ivm/filter.d.ts +1 -1
  209. package/out/zql/src/ivm/filter.d.ts.map +1 -1
  210. package/out/zql/src/ivm/filter.js.map +1 -1
  211. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
  212. package/out/zql/src/ivm/flipped-join.js +58 -49
  213. package/out/zql/src/ivm/flipped-join.js.map +1 -1
  214. package/out/zql/src/ivm/join-utils.d.ts +6 -2
  215. package/out/zql/src/ivm/join-utils.d.ts.map +1 -1
  216. package/out/zql/src/ivm/join-utils.js +25 -25
  217. package/out/zql/src/ivm/join-utils.js.map +1 -1
  218. package/out/zql/src/ivm/join.d.ts.map +1 -1
  219. package/out/zql/src/ivm/join.js +51 -32
  220. package/out/zql/src/ivm/join.js.map +1 -1
  221. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
  222. package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
  223. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +10 -5
  224. package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
  225. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  226. package/out/zql/src/ivm/memory-source.js +59 -51
  227. package/out/zql/src/ivm/memory-source.js.map +1 -1
  228. package/out/zql/src/ivm/push-accumulated.d.ts +2 -3
  229. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -1
  230. package/out/zql/src/ivm/push-accumulated.js +122 -98
  231. package/out/zql/src/ivm/push-accumulated.js.map +1 -1
  232. package/out/zql/src/ivm/skip.d.ts +1 -1
  233. package/out/zql/src/ivm/skip.d.ts.map +1 -1
  234. package/out/zql/src/ivm/skip.js +2 -2
  235. package/out/zql/src/ivm/skip.js.map +1 -1
  236. package/out/zql/src/ivm/source.d.ts +13 -11
  237. package/out/zql/src/ivm/source.d.ts.map +1 -1
  238. package/out/zql/src/ivm/take.d.ts.map +1 -1
  239. package/out/zql/src/ivm/take.js +50 -27
  240. package/out/zql/src/ivm/take.js.map +1 -1
  241. package/out/zql/src/ivm/union-fan-in.d.ts +1 -2
  242. package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
  243. package/out/zql/src/ivm/union-fan-in.js +3 -3
  244. package/out/zql/src/ivm/union-fan-in.js.map +1 -1
  245. package/out/zql/src/ivm/union-fan-out.d.ts.map +1 -1
  246. package/out/zql/src/ivm/union-fan-out.js +1 -1
  247. package/out/zql/src/ivm/union-fan-out.js.map +1 -1
  248. package/out/zql/src/planner/planner-debug.d.ts +2 -2
  249. package/out/zql/src/planner/planner-debug.d.ts.map +1 -1
  250. package/out/zql/src/planner/planner-debug.js.map +1 -1
  251. package/out/zql/src/planner/planner-graph.d.ts +1 -1
  252. package/out/zql/src/planner/planner-graph.d.ts.map +1 -1
  253. package/out/zql/src/planner/planner-graph.js.map +1 -1
  254. package/out/zqlite/src/internal/sql-inline.d.ts.map +1 -1
  255. package/out/zqlite/src/internal/sql-inline.js.map +1 -1
  256. package/out/zqlite/src/query-builder.d.ts.map +1 -1
  257. package/out/zqlite/src/query-builder.js.map +1 -1
  258. package/out/zqlite/src/table-source.d.ts.map +1 -1
  259. package/out/zqlite/src/table-source.js +11 -11
  260. package/out/zqlite/src/table-source.js.map +1 -1
  261. package/package.json +93 -95
  262. package/out/zql/src/ivm/change-index-enum.d.ts +0 -9
  263. package/out/zql/src/ivm/change-index-enum.d.ts.map +0 -1
  264. package/out/zql/src/ivm/change-index.d.ts +0 -5
  265. package/out/zql/src/ivm/change-index.d.ts.map +0 -1
  266. package/out/zql/src/ivm/change-type-enum.d.ts +0 -9
  267. package/out/zql/src/ivm/change-type-enum.d.ts.map +0 -1
  268. package/out/zql/src/ivm/change-type.d.ts +0 -5
  269. package/out/zql/src/ivm/change-type.d.ts.map +0 -1
  270. package/out/zql/src/ivm/change.js +0 -33
  271. package/out/zql/src/ivm/change.js.map +0 -1
  272. package/out/zql/src/ivm/source-change-index-enum.d.ts +0 -7
  273. package/out/zql/src/ivm/source-change-index-enum.d.ts.map +0 -1
  274. package/out/zql/src/ivm/source-change-index.d.ts +0 -5
  275. package/out/zql/src/ivm/source-change-index.d.ts.map +0 -1
  276. package/out/zql/src/ivm/source.js +0 -26
  277. package/out/zql/src/ivm/source.js.map +0 -1
@@ -9,22 +9,22 @@ import { QueryDelegateBase } from "../../zql/src/query/query-delegate-base.js";
9
9
  import { Database } from "../../zqlite/src/db.js";
10
10
  import { TableSource } from "../../zqlite/src/table-source.js";
11
11
  import "../../shared/src/dotenv.js";
12
- import { astToZQL } from "../../ast-to-zql/src/ast-to-zql.js";
13
- import { formatOutput } from "../../ast-to-zql/src/format.js";
14
12
  import { logLevel, logOptions } from "../../otel/src/log-options.js";
15
- import { testLogConfig } from "../../otel/src/test-log-config.js";
16
- import { colorConsole, createLogContext } from "../../shared/src/logging.js";
17
13
  import { parseOptions } from "../../shared/src/options.js";
18
14
  import { Debug, runtimeDebugFlags } from "../../zql/src/builder/debug-delegate.js";
19
15
  import { getShardID, upstreamSchema } from "../../zero-cache/src/types/shards.js";
20
16
  import { ZERO_ENV_VAR_PREFIX, appOptions, shardOptions, zeroOptions } from "../../zero-cache/src/config/zero-config.js";
21
- import { computeZqlSpecs, mustGetTableSpec } from "../../zero-cache/src/db/lite-tables.js";
17
+ import { colorConsole, createLogContext } from "../../shared/src/logging.js";
18
+ import { pgClient } from "../../zero-cache/src/types/pg.js";
22
19
  import { deployPermissionsOptions, loadSchemaAndPermissions } from "../../zero-cache/src/scripts/permissions.js";
20
+ import { computeZqlSpecs, mustGetTableSpec } from "../../zero-cache/src/db/lite-tables.js";
21
+ import { astToZQL } from "../../ast-to-zql/src/ast-to-zql.js";
22
+ import { formatOutput } from "../../ast-to-zql/src/format.js";
23
+ import { testLogConfig } from "../../otel/src/test-log-config.js";
23
24
  import { runAst } from "../../zero-cache/src/services/run-ast.js";
24
- import { pgClient } from "../../zero-cache/src/types/pg.js";
25
25
  import { explainQueries } from "./explain-queries.js";
26
- import fs from "node:fs";
27
26
  import { styleText } from "node:util";
27
+ import fs from "node:fs";
28
28
  //#region ../analyze-query/src/bin-analyze.ts
29
29
  var cfg = parseOptions({
30
30
  schema: deployPermissionsOptions.schema,
@@ -1,14 +1,14 @@
1
1
  import { valita_exports } from "../../shared/src/valita.js";
2
2
  import { must } from "../../shared/src/must.js";
3
3
  import "../../shared/src/dotenv.js";
4
- import { astToZQL } from "../../ast-to-zql/src/ast-to-zql.js";
5
- import { formatOutput } from "../../ast-to-zql/src/format.js";
6
4
  import { parseOptions } from "../../shared/src/options.js";
7
5
  import { getShardID, upstreamSchema } from "../../zero-cache/src/types/shards.js";
8
6
  import { ZERO_ENV_VAR_PREFIX, appOptions, shardOptions } from "../../zero-cache/src/config/zero-config.js";
7
+ import { pgClient } from "../../zero-cache/src/types/pg.js";
9
8
  import { loadSchemaAndPermissions } from "../../zero-cache/src/scripts/permissions.js";
9
+ import { astToZQL } from "../../ast-to-zql/src/ast-to-zql.js";
10
+ import { formatOutput } from "../../ast-to-zql/src/format.js";
10
11
  import { transformAndHashQuery } from "../../zero-cache/src/auth/read-authorizer.js";
11
- import { pgClient } from "../../zero-cache/src/types/pg.js";
12
12
  import { LogContext, consoleLogSink } from "@rocicorp/logger";
13
13
  //#region ../analyze-query/src/bin-transform.ts
14
14
  var config = parseOptions({
@@ -1,10 +1,10 @@
1
1
  import { valita_exports } from "../../shared/src/valita.js";
2
2
  import { mapAST } from "../../zero-protocol/src/ast.js";
3
3
  import { serverToClient } from "../../zero-schema/src/name-mapper.js";
4
- import { astToZQL } from "./ast-to-zql.js";
5
- import { formatOutput } from "./format.js";
6
4
  import { parseOptions } from "../../shared/src/options.js";
7
5
  import { loadSchemaAndPermissions } from "../../zero-cache/src/scripts/permissions.js";
6
+ import { astToZQL } from "./ast-to-zql.js";
7
+ import { formatOutput } from "./format.js";
8
8
  import process from "node:process";
9
9
  import { readFile } from "node:fs/promises";
10
10
  import { createInterface } from "node:readline";
@@ -1 +1 @@
1
- {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../../shared/src/logging.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,OAAO,EACb,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB,CAAC;AAUF;;;GAGG;AACH,eAAO,MAAM,YAAY;mBACR,OAAO,EAAE;qBAGP,OAAO,EAAE;oBAGV,OAAO,EAAE;oBAGT,OAAO,EAAE;qBAGR,OAAO,EAAE;CAG3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAQzB,CAAC;AA4BF,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAErD;AAED,wBAAgB,gBAAgB,CAC9B,EAAC,GAAG,EAAC,EAAE;IAAC,GAAG,EAAE,SAAS,CAAA;CAAC,EACvB,OAAO,KAAK,EACZ,IAAI,sDAAkB,GACrB,UAAU,CAOZ;AA0BD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQ5D"}
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../../shared/src/logging.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,OAAO,EACb,MAAM,kBAAkB,CAAC;AAK1B,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB,CAAC;AAUF;;;GAGG;AACH,eAAO,MAAM,YAAY;mBACR,OAAO,EAAE;qBAGP,OAAO,EAAE;oBAGV,OAAO,EAAE;oBAGT,OAAO,EAAE;qBAGR,OAAO,EAAE;CAG3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAQzB,CAAC;AA4BF,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAErD;AAED,wBAAgB,gBAAgB,CAC9B,EAAC,GAAG,EAAC,EAAE;IAAC,GAAG,EAAE,SAAS,CAAA;CAAC,EACvB,OAAO,KAAK,EACZ,IAAI,sDAAkB,GACrB,UAAU,CAOZ;AA0BD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQ5D"}
@@ -1,7 +1,7 @@
1
1
  import { stringify } from "./bigint-json.js";
2
2
  import { LogContext } from "@rocicorp/logger";
3
- import { styleText } from "node:util";
4
3
  import { pid } from "node:process";
4
+ import { styleText } from "node:util";
5
5
  //#region ../shared/src/logging.ts
6
6
  function style(color, args) {
7
7
  return styleText(color, args.join(" "));
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","names":[],"sources":["../../../../shared/src/logging.ts"],"sourcesContent":["import {pid} from 'node:process';\nimport {styleText} from 'node:util';\n/* oxlint-disable no-console */\nimport {\n type Context,\n LogContext,\n type LogLevel,\n type LogSink,\n} from '@rocicorp/logger';\nimport {stringify} from './bigint-json.ts';\n\nexport type LogConfig = {\n level: LogLevel;\n format: 'text' | 'json';\n};\n\nfunction style(color: 'gray' | 'yellow' | 'red', args: unknown[]) {\n return styleText(color, args.join(' '));\n}\n\nconst COLOR_DEBUG = 'gray';\nconst COLOR_WARN = 'yellow';\nconst COLOR_ERROR = 'red';\n\n/**\n * Returns an object for writing colorized output to a provided console.\n * Note this should only be used when console is a TTY (i.e., Node).\n */\nexport const colorConsole = {\n log: (...args: unknown[]) => {\n console.log(...args);\n },\n debug: (...args: unknown[]) => {\n console.debug(style(COLOR_DEBUG, args));\n },\n info: (...args: unknown[]) => {\n console.info(...args);\n },\n warn: (...args: unknown[]) => {\n console.warn(style(COLOR_WARN, args));\n },\n error: (...args: unknown[]) => {\n console.error(style(COLOR_ERROR, args));\n },\n};\n\nexport const consoleSink: LogSink = {\n log(level, context, ...args) {\n colorConsole[level](\n toLocalIsoString(),\n stringifyContext(context),\n ...args.map(stringifyValue),\n );\n },\n};\n\nfunction toLocalIsoString(date = new Date()) {\n const tzo = -date.getTimezoneOffset();\n const sign = tzo >= 0 ? '+' : '-';\n const pad = (n: number, len = 2) => String(Math.abs(n)).padStart(len, '0');\n\n return (\n date.getFullYear() +\n '-' +\n pad(date.getMonth() + 1) +\n '-' +\n pad(date.getDate()) +\n 'T' +\n pad(date.getHours()) +\n ':' +\n pad(date.getMinutes()) +\n ':' +\n pad(date.getSeconds()) +\n '.' +\n pad(date.getMilliseconds(), 3) +\n sign +\n pad(tzo / 60) +\n ':' +\n pad(tzo % 60)\n );\n}\n\nexport function getLogSink(config: LogConfig): LogSink {\n return config.format === 'json' ? consoleJsonLogSink : consoleSink;\n}\n\nexport function createLogContext(\n {log}: {log: LogConfig},\n context = {},\n sink = getLogSink(log),\n): LogContext {\n const ctx = {pid, ...context};\n const lc = new LogContext(log.level, ctx, sink);\n // Emit a blank line to absorb random ANSI control code garbage that\n // for some reason gets prepended to the first log line in CloudWatch.\n lc.info?.('');\n return lc;\n}\n\nconst consoleJsonLogSink: LogSink = {\n log(level: LogLevel, context: Context | undefined, ...args: unknown[]): void {\n // If the last arg is an object or an Error, combine those fields into the message.\n const lastObj = errorOrObject(args.at(-1));\n if (lastObj) {\n args.pop();\n }\n const message = args.length\n ? {\n message: args.map(stringifyValue).join(' '),\n }\n : undefined;\n\n console[level](\n stringify({\n level: level.toUpperCase(),\n ...context,\n ...lastObj,\n ...message,\n }),\n );\n },\n};\n\nexport function errorOrObject(v: unknown): object | undefined {\n if (v instanceof Error) {\n return toErrorLogObject(v);\n }\n if (v && typeof v === 'object') {\n return v;\n }\n return undefined;\n}\n\nfunction toErrorLogObject(v: Error) {\n return {\n ...v, // some properties of Error subclasses may be enumerable\n name: v.name,\n errorMsg: v.message,\n stack: v.stack,\n ...('cause' in v ? {cause: errorOrObject(v.cause)} : null),\n };\n}\n\nfunction stringifyContext(context: Context | undefined): unknown[] {\n const args = [];\n for (const [k, v] of Object.entries(context ?? {})) {\n const arg = v === undefined ? k : `${k}=${v}`;\n args.push(arg);\n }\n return args;\n}\n\nfunction stringifyValue(v: unknown) {\n if (typeof v === 'string') {\n return v;\n }\n if (v instanceof Error) {\n return stringify(toErrorLogObject(v));\n }\n return stringify(v);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"logging.js","names":[],"sources":["../../../../shared/src/logging.ts"],"sourcesContent":["/* oxlint-disable no-console */\nimport {\n type Context,\n LogContext,\n type LogLevel,\n type LogSink,\n} from '@rocicorp/logger';\nimport {pid} from 'node:process';\nimport {styleText} from 'node:util';\nimport {stringify} from './bigint-json.ts';\n\nexport type LogConfig = {\n level: LogLevel;\n format: 'text' | 'json';\n};\n\nfunction style(color: 'gray' | 'yellow' | 'red', args: unknown[]) {\n return styleText(color, args.join(' '));\n}\n\nconst COLOR_DEBUG = 'gray';\nconst COLOR_WARN = 'yellow';\nconst COLOR_ERROR = 'red';\n\n/**\n * Returns an object for writing colorized output to a provided console.\n * Note this should only be used when console is a TTY (i.e., Node).\n */\nexport const colorConsole = {\n log: (...args: unknown[]) => {\n console.log(...args);\n },\n debug: (...args: unknown[]) => {\n console.debug(style(COLOR_DEBUG, args));\n },\n info: (...args: unknown[]) => {\n console.info(...args);\n },\n warn: (...args: unknown[]) => {\n console.warn(style(COLOR_WARN, args));\n },\n error: (...args: unknown[]) => {\n console.error(style(COLOR_ERROR, args));\n },\n};\n\nexport const consoleSink: LogSink = {\n log(level, context, ...args) {\n colorConsole[level](\n toLocalIsoString(),\n stringifyContext(context),\n ...args.map(stringifyValue),\n );\n },\n};\n\nfunction toLocalIsoString(date = new Date()) {\n const tzo = -date.getTimezoneOffset();\n const sign = tzo >= 0 ? '+' : '-';\n const pad = (n: number, len = 2) => String(Math.abs(n)).padStart(len, '0');\n\n return (\n date.getFullYear() +\n '-' +\n pad(date.getMonth() + 1) +\n '-' +\n pad(date.getDate()) +\n 'T' +\n pad(date.getHours()) +\n ':' +\n pad(date.getMinutes()) +\n ':' +\n pad(date.getSeconds()) +\n '.' +\n pad(date.getMilliseconds(), 3) +\n sign +\n pad(tzo / 60) +\n ':' +\n pad(tzo % 60)\n );\n}\n\nexport function getLogSink(config: LogConfig): LogSink {\n return config.format === 'json' ? consoleJsonLogSink : consoleSink;\n}\n\nexport function createLogContext(\n {log}: {log: LogConfig},\n context = {},\n sink = getLogSink(log),\n): LogContext {\n const ctx = {pid, ...context};\n const lc = new LogContext(log.level, ctx, sink);\n // Emit a blank line to absorb random ANSI control code garbage that\n // for some reason gets prepended to the first log line in CloudWatch.\n lc.info?.('');\n return lc;\n}\n\nconst consoleJsonLogSink: LogSink = {\n log(level: LogLevel, context: Context | undefined, ...args: unknown[]): void {\n // If the last arg is an object or an Error, combine those fields into the message.\n const lastObj = errorOrObject(args.at(-1));\n if (lastObj) {\n args.pop();\n }\n const message = args.length\n ? {\n message: args.map(stringifyValue).join(' '),\n }\n : undefined;\n\n console[level](\n stringify({\n level: level.toUpperCase(),\n ...context,\n ...lastObj,\n ...message,\n }),\n );\n },\n};\n\nexport function errorOrObject(v: unknown): object | undefined {\n if (v instanceof Error) {\n return toErrorLogObject(v);\n }\n if (v && typeof v === 'object') {\n return v;\n }\n return undefined;\n}\n\nfunction toErrorLogObject(v: Error) {\n return {\n ...v, // some properties of Error subclasses may be enumerable\n name: v.name,\n errorMsg: v.message,\n stack: v.stack,\n ...('cause' in v ? {cause: errorOrObject(v.cause)} : null),\n };\n}\n\nfunction stringifyContext(context: Context | undefined): unknown[] {\n const args = [];\n for (const [k, v] of Object.entries(context ?? {})) {\n const arg = v === undefined ? k : `${k}=${v}`;\n args.push(arg);\n }\n return args;\n}\n\nfunction stringifyValue(v: unknown) {\n if (typeof v === 'string') {\n return v;\n }\n if (v instanceof Error) {\n return stringify(toErrorLogObject(v));\n }\n return stringify(v);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../shared/src/options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AASrD,OAAO,KAAK,EACV,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC,YAAY,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAC,CAAC;AAiFhE;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,SAAK;;cAgC1E;AAeD,MAAM,MAAM,YAAY,GAAG;IACzB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,WAAW,CAAC,EAAE;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAElD,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAExB,0BAA0B;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,sGAAsG;IACtG,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,cAAc,CAAC;IAExB,iCAAiC;IACjC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,KAAK,KAAK,CAAC;CACjD,CAAC;AAEF,wBAAgB,YAAY,CAAC,CAAC,SAAS,OAAO,EAC5C,UAAU,EAAE,CAAC,EACb,IAAI,GAAE,YAAiB,GACtB,MAAM,CAAC,CAAC,CAAC,CAEX;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,OAAO,EACpD,UAAU,EAAE,CAAC,EACb,IAAI,GAAE,YAAiB,GACtB;IAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,CA0KtE;AA6FD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAQ7D"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../shared/src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAUrD,OAAO,KAAK,EACV,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC,YAAY,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAC,CAAC;AAiFhE;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,SAAK;;cAgC1E;AAeD,MAAM,MAAM,YAAY,GAAG;IACzB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,WAAW,CAAC,EAAE;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAElD,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAExB,0BAA0B;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,sGAAsG;IACtG,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,cAAc,CAAC;IAExB,iCAAiC;IACjC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,KAAK,KAAK,CAAC;CACjD,CAAC;AAEF,wBAAgB,YAAY,CAAC,CAAC,SAAS,OAAO,EAC5C,UAAU,EAAE,CAAC,EACb,IAAI,GAAE,YAAiB,GACtB,MAAM,CAAC,CAAC,CAAC,CAEX;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,OAAO,EACpD,UAAU,EAAE,CAAC,EACb,IAAI,GAAE,YAAiB,GACtB;IAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,CA0KtE;AA6FD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAQ7D"}
@@ -1,12 +1,12 @@
1
1
  import { assert } from "./asserts.js";
2
2
  import { deepPartial, instanceOfAbstractType, parse, testOptional, valita_exports } from "./valita.js";
3
3
  import { must } from "./must.js";
4
- import { stripVTControlCharacters } from "node:util";
5
4
  import { template } from "chalk-template";
6
5
  import commandLineArgs from "command-line-args";
7
6
  import commandLineUsage from "command-line-usage";
8
7
  import { createDefu } from "defu";
9
8
  import { toKebabCase, toSnakeCase } from "kasi";
9
+ import { stripVTControlCharacters } from "node:util";
10
10
  //#region ../shared/src/options.ts
11
11
  /**
12
12
  * Creates a defu instance that overrides arrays instead of merging them.
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","names":[],"sources":["../../../../shared/src/options.ts"],"sourcesContent":["import {stripVTControlCharacters as stripAnsi} from 'node:util';\nimport type {OptionalLogger} from '@rocicorp/logger';\nimport {template} from 'chalk-template';\nimport type {OptionDefinition} from 'command-line-args';\nimport commandLineArgs from 'command-line-args';\nimport commandLineUsage, {type Section} from 'command-line-usage';\nimport {createDefu} from 'defu';\nimport {toKebabCase, toSnakeCase} from 'kasi';\nimport {assert} from './asserts.ts';\nimport {must} from './must.ts';\nimport type {\n Config,\n Group,\n Option,\n Options,\n WrappedOptionType,\n} from './options-types.ts';\nimport * as v from './valita.ts';\n\nexport type {Config, Group, Option, Options, WrappedOptionType};\n\ntype Primitive = number | string | boolean;\ntype Value = Primitive | Array<Primitive>;\n\ntype RequiredOptionType =\n | v.Type<string>\n | v.Type<number>\n | v.Type<boolean>\n | v.Type<string[]>\n | v.Type<number[]>\n | v.Type<boolean[]>;\n\ntype OptionalOptionType =\n | v.Optional<string>\n | v.Optional<number>\n | v.Optional<boolean>\n | v.Optional<string[]>\n | v.Optional<number[]>\n | v.Optional<boolean[]>;\n\ntype OptionType = RequiredOptionType | OptionalOptionType;\n\n/**\n * Creates a defu instance that overrides arrays instead of merging them.\n */\nconst defu = createDefu((obj, key, value) => {\n if (!Array.isArray(value)) return;\n\n obj[key] = value;\n return true;\n});\n\n/**\n * Converts an Options instance into its corresponding {@link Config} schema.\n */\nfunction configSchema<T extends Options>(\n options: T,\n envNamePrefix: string,\n): v.Type<Config<T>> {\n function makeObjectType(options: Options | Group, group?: string) {\n return v.object(\n Object.fromEntries(\n Object.entries(options).map(\n ([name, value]): [string, OptionType | v.Type] => {\n const addErrorMessage = (t: OptionType) => {\n const {required} = getRequiredOrDefault(t);\n if (required) {\n // Adds an error message for required options that includes the\n // actual name of the option.\n const optionName = toSnakeCase(\n `${envNamePrefix}${group ? group + '_' : ''}${name}`,\n ).toUpperCase();\n return (t as v.Type<string>)\n .optional()\n .assert(\n val => val !== undefined,\n `Missing required option ${optionName}`,\n );\n }\n return t;\n };\n // OptionType\n if (v.instanceOfAbstractType(value)) {\n return [name, addErrorMessage(value)];\n }\n // WrappedOptionType\n const {type} = value;\n if (v.instanceOfAbstractType(type)) {\n return [name, addErrorMessage(type)];\n }\n // OptionGroup\n return [name, makeObjectType(value as Group, name)];\n },\n ),\n ),\n );\n }\n return makeObjectType(options) as v.Type<Config<T>>;\n}\n\n/**\n * Converts an Options instance into an \"env schema\", which is an object with\n * ENV names as its keys, mapped to optional or required string values\n * (corresponding to the optionality of the corresponding options).\n *\n * This is used as a format for encoding options for a multi-tenant version\n * of an app, with an envSchema for each tenant.\n */\nexport function envSchema<T extends Options>(options: T, envNamePrefix = '') {\n const fields: [string, v.Type<string> | v.Optional<string>][] = [];\n\n function addField(name: string, type: OptionType, group?: string) {\n const flag = group ? `${group}_${name}` : name;\n const env = toSnakeCase(`${envNamePrefix}${flag}`).toUpperCase();\n\n const {required} = getRequiredOrDefault(type);\n fields.push([env, required ? v.string() : v.string().optional()]);\n }\n\n function addFields(o: Options | Group, group?: string) {\n Object.entries(o).forEach(([name, value]) => {\n // OptionType\n if (v.instanceOfAbstractType(value)) {\n addField(name, value, group);\n return;\n }\n // WrappedOptionType\n const {type} = value;\n if (v.instanceOfAbstractType(type)) {\n addField(name, type, group);\n return;\n }\n // OptionGroup\n addFields(value as Group, name);\n });\n }\n\n addFields(options);\n\n return v.object(Object.fromEntries(fields));\n}\n\n// type TerminalType is not exported from badrap/valita\ntype TerminalType = Parameters<\n Parameters<v.Type<unknown>['toTerminals']>[0]\n>[0];\n\nfunction getRequiredOrDefault(type: OptionType) {\n const defaultResult = v.testOptional<Value>(undefined, type);\n return {\n required: !defaultResult.ok,\n defaultValue: defaultResult.ok ? defaultResult.value : undefined,\n };\n}\n\nexport type ParseOptions = {\n /** Defaults to process.argv.slice(2) */\n argv?: string[];\n\n envNamePrefix?: string;\n\n description?: {header: string; content: string}[];\n\n /** Defaults to `false` */\n allowUnknown?: boolean;\n\n /** Defaults to `false` */\n allowPartial?: boolean;\n\n /** Defaults to `process.env`. */\n env?: NodeJS.ProcessEnv;\n\n /** Defaults to `true`. */\n emitDeprecationWarnings?: boolean;\n\n /** Defaults to `true`. When false, excludes default values from both config and env return values. */\n includeDefaults?: boolean;\n\n /** Defaults to `console` */\n logger?: OptionalLogger;\n\n /** Defaults to `process.exit` */\n exit?: (code?: number | string | null) => never;\n};\n\nexport function parseOptions<T extends Options>(\n appOptions: T,\n opts: ParseOptions = {},\n): Config<T> {\n return parseOptionsAdvanced(appOptions, opts).config;\n}\n\nexport function parseOptionsAdvanced<T extends Options>(\n appOptions: T,\n opts: ParseOptions = {},\n): {config: Config<T>; env: Record<string, string>; unknown?: string[]} {\n const {\n argv = process.argv.slice(2),\n envNamePrefix = '',\n description = [],\n allowUnknown = false,\n allowPartial = false,\n env: processEnv = process.env,\n emitDeprecationWarnings = true,\n includeDefaults = true,\n logger = console,\n exit = process.exit,\n } = opts;\n // The main logic for converting a valita Type spec to an Option (i.e. flag) spec.\n function addOption(field: string, option: WrappedOptionType, group?: string) {\n const {type, desc = [], deprecated, alias, hidden} = option;\n\n // The group name is prepended to the flag name.\n const flag = group ? toKebabCase(`${group}-${field}`) : toKebabCase(field);\n\n const {required, defaultValue} = getRequiredOrDefault(type);\n let multiple = type.name === 'array';\n const literals = new Set<string>();\n const terminalTypes = new Set<string>();\n\n type.toTerminals(getTerminalTypes);\n\n function getTerminalTypes(t: TerminalType) {\n switch (t.name) {\n case 'undefined':\n case 'optional':\n break;\n case 'array': {\n multiple = true;\n t.prefix.forEach(t => t.toTerminals(getTerminalTypes));\n t.rest?.toTerminals(getTerminalTypes);\n t.suffix.forEach(t => t.toTerminals(getTerminalTypes));\n break;\n }\n case 'literal':\n literals.add(String(t.value));\n terminalTypes.add(typeof t.value);\n break;\n default:\n terminalTypes.add(t.name);\n break;\n }\n }\n const env = toSnakeCase(`${envNamePrefix}${flag}`).toUpperCase();\n if (terminalTypes.size > 1) {\n throw new TypeError(`${env} has mixed types ${[...terminalTypes]}`);\n }\n assert(terminalTypes.size === 1, 'Expected exactly one terminal type');\n const terminalType = [...terminalTypes][0];\n\n if (processEnv[env]) {\n if (multiple) {\n // Technically not water-tight; assumes values for the string[] flag don't contain commas.\n envArgv.push(`--${flag}`, ...processEnv[env].split(','));\n } else {\n envArgv.push(`--${flag}`, processEnv[env]);\n }\n }\n names.set(flag, {field, env});\n\n const spec = [\n (required\n ? '{italic required}'\n : defaultValue !== undefined\n ? `default: ${JSON.stringify(defaultValue)}`\n : 'optional') + '\\n',\n ];\n if (desc) {\n spec.push(...desc);\n }\n\n const typeLabel = [\n literals.size\n ? String(Array.from(literals, l => `{underline ${l}}`))\n : multiple\n ? `{underline ${terminalType}[]}`\n : `{underline ${terminalType}}`,\n ` ${env} env`,\n ];\n\n const opt = {\n name: flag,\n alias,\n type: valueParser(\n env,\n terminalType,\n logger,\n emitDeprecationWarnings ? deprecated : undefined,\n ),\n multiple,\n group,\n description: spec.join('\\n') + '\\n',\n typeLabel: typeLabel.join('\\n') + '\\n',\n hidden: hidden === undefined ? deprecated !== undefined : hidden,\n };\n optsWithoutDefaults.push(opt);\n optsWithDefaults.push({...opt, defaultValue});\n }\n\n const names = new Map<string, {field: string; env: string}>();\n const optsWithDefaults: DescribedOptionDefinition[] = [];\n const optsWithoutDefaults: DescribedOptionDefinition[] = [];\n const envArgv: string[] = [];\n\n try {\n for (const [name, val] of Object.entries(appOptions)) {\n const {type} = val as {type: unknown};\n if (v.instanceOfAbstractType(val)) {\n addOption(name, {type: val});\n } else if (v.instanceOfAbstractType(type)) {\n addOption(name, val as WrappedOptionType);\n } else {\n const group = name;\n for (const [name, option] of Object.entries(val as Group)) {\n const wrapped = v.instanceOfAbstractType(option)\n ? {type: option}\n : option;\n addOption(name, wrapped, group);\n }\n }\n }\n\n const [defaults, env1, unknown] = parseArgs(optsWithDefaults, argv, names);\n const [fromEnv, env2] = parseArgs(optsWithoutDefaults, envArgv, names);\n const [withoutDefaults, env3] = parseArgs(optsWithoutDefaults, argv, names);\n\n switch (unknown?.[0]) {\n case undefined:\n break;\n case '--help':\n case '-h':\n showUsage(optsWithDefaults, description, logger);\n exit(0);\n break;\n default:\n if (!allowUnknown) {\n logger.error?.('Invalid arguments:', unknown);\n showUsage(optsWithDefaults, description, logger);\n exit(0);\n }\n break;\n }\n\n const parsedArgs = includeDefaults\n ? defu(withoutDefaults, fromEnv, defaults)\n : defu(withoutDefaults, fromEnv);\n const env = includeDefaults\n ? {...env1, ...env2, ...env3}\n : {...env2, ...env3};\n\n let schema = configSchema(appOptions, envNamePrefix);\n if (allowPartial || !includeDefaults) {\n // TODO: Type configSchema() to return a v.ObjectType<...>\n schema = v.deepPartial(schema as v.ObjectType) as v.Type<Config<T>>;\n }\n return {\n config: v.parse(parsedArgs, schema),\n env,\n ...(unknown ? {unknown} : {}),\n };\n } catch (e) {\n logger.error?.(String(e));\n showUsage(optsWithDefaults, description, logger);\n throw e;\n }\n}\n\nfunction valueParser(\n optionName: string,\n typeName: string,\n logger: OptionalLogger,\n deprecated: string[] | undefined,\n) {\n return (input: string) => {\n if (deprecated) {\n logger.warn?.(\n template(\n `\\n${optionName} is deprecated:\\n` + deprecated.join('\\n') + '\\n',\n ),\n );\n }\n switch (typeName) {\n case 'string':\n return input;\n case 'boolean':\n return parseBoolean(optionName, input);\n case 'number': {\n const val = Number(input);\n if (Number.isNaN(val)) {\n throw new TypeError(`Invalid input for ${optionName}: \"${input}\"`);\n }\n return val;\n }\n default:\n // Should be impossible given the constraints of `Option`\n throw new TypeError(\n `${optionName} option has unsupported type ${typeName}`,\n );\n }\n };\n}\n\nfunction parseArgs(\n optionDefs: DescribedOptionDefinition[],\n argv: string[],\n names: Map<string, {field: string; env: string}>,\n) {\n function normalizeFlagValue(value: unknown) {\n // A --flag without value is parsed by commandLineArgs() to `null`,\n // but this is a common convention to set a boolean flag to true.\n return value === null ? true : value;\n }\n\n const {\n _all,\n _none: ungrouped,\n _unknown: unknown,\n ...config\n } = commandLineArgs(optionDefs, {\n argv,\n partial: true,\n });\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n const envObj: Record<string, string> = {};\n\n function addFlag(flagName: string, value: unknown, group?: string) {\n const {field, env} = must(names.get(flagName));\n const normalized = normalizeFlagValue(value);\n if (group) {\n result[group][field] = normalized;\n } else {\n result[field] = normalized;\n }\n envObj[env] = String(normalized);\n }\n\n for (const [flagName, value] of Object.entries(ungrouped ?? {})) {\n addFlag(flagName, value);\n }\n\n // Then handle (potentially) grouped flags\n for (const [name, value] of Object.entries(config)) {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n addFlag(name, value); // Flag, not a group\n } else {\n const group = name;\n result[group] = {};\n for (const [flagName, flagValue] of Object.entries(value)) {\n addFlag(flagName, flagValue, group);\n }\n }\n }\n\n return [result, envObj, unknown] as const;\n}\n\nexport function flagToEnv(prefix: string, flag: string): string {\n return toSnakeCase(prefix + flag).toUpperCase();\n}\n\nexport function parseBoolean(optionName: string, input: string) {\n const bool = input.toLowerCase();\n if (['true', '1'].includes(bool)) {\n return true;\n } else if (['false', '0'].includes(bool)) {\n return false;\n }\n throw new TypeError(`Invalid input for ${optionName}: \"${input}\"`);\n}\n\nfunction showUsage(\n optionList: DescribedOptionDefinition[],\n description: {header: string; content: string}[] = [],\n logger: OptionalLogger = console,\n) {\n const hide: string[] = [];\n let leftWidth = 35;\n let rightWidth = 70;\n optionList.forEach(({name, typeLabel, description, hidden}) => {\n if (hidden) {\n hide.push(name);\n }\n const text = template(`${name} ${typeLabel ?? ''}`);\n const lines = stripAnsi(text).split('\\n');\n for (const l of lines) {\n leftWidth = Math.max(leftWidth, l.length + 2);\n }\n const desc = stripAnsi(template(description ?? '')).split('\\n');\n for (const l of desc) {\n rightWidth = Math.max(rightWidth, l.length + 2);\n }\n });\n\n const sections: Section[] = [\n {\n optionList,\n reverseNameOrder: true, // Display --flag-name before -alias\n hide,\n tableOptions: {\n columns: [\n {name: 'option', width: leftWidth},\n {name: 'description', width: rightWidth},\n ],\n noTrim: true,\n },\n },\n ];\n\n if (description) {\n sections.unshift(...description);\n }\n\n logger.info?.(commandLineUsage(sections));\n}\n\ntype DescribedOptionDefinition = OptionDefinition & {\n // Additional fields recognized by command-line-usage\n description?: string;\n typeLabel?: string | undefined;\n hidden?: boolean | undefined;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../../../shared/src/options.ts"],"sourcesContent":["import type {OptionalLogger} from '@rocicorp/logger';\nimport {template} from 'chalk-template';\nimport type {OptionDefinition} from 'command-line-args';\nimport commandLineArgs from 'command-line-args';\nimport commandLineUsage, {type Section} from 'command-line-usage';\nimport {createDefu} from 'defu';\nimport {toKebabCase, toSnakeCase} from 'kasi';\nimport {stripVTControlCharacters as stripAnsi} from 'node:util';\nimport {assert} from './asserts.ts';\nimport {must} from './must.ts';\nimport type {\n Config,\n Group,\n Option,\n Options,\n WrappedOptionType,\n} from './options-types.ts';\nimport * as v from './valita.ts';\n\nexport type {Config, Group, Option, Options, WrappedOptionType};\n\ntype Primitive = number | string | boolean;\ntype Value = Primitive | Array<Primitive>;\n\ntype RequiredOptionType =\n | v.Type<string>\n | v.Type<number>\n | v.Type<boolean>\n | v.Type<string[]>\n | v.Type<number[]>\n | v.Type<boolean[]>;\n\ntype OptionalOptionType =\n | v.Optional<string>\n | v.Optional<number>\n | v.Optional<boolean>\n | v.Optional<string[]>\n | v.Optional<number[]>\n | v.Optional<boolean[]>;\n\ntype OptionType = RequiredOptionType | OptionalOptionType;\n\n/**\n * Creates a defu instance that overrides arrays instead of merging them.\n */\nconst defu = createDefu((obj, key, value) => {\n if (!Array.isArray(value)) return;\n\n obj[key] = value;\n return true;\n});\n\n/**\n * Converts an Options instance into its corresponding {@link Config} schema.\n */\nfunction configSchema<T extends Options>(\n options: T,\n envNamePrefix: string,\n): v.Type<Config<T>> {\n function makeObjectType(options: Options | Group, group?: string) {\n return v.object(\n Object.fromEntries(\n Object.entries(options).map(\n ([name, value]): [string, OptionType | v.Type] => {\n const addErrorMessage = (t: OptionType) => {\n const {required} = getRequiredOrDefault(t);\n if (required) {\n // Adds an error message for required options that includes the\n // actual name of the option.\n const optionName = toSnakeCase(\n `${envNamePrefix}${group ? group + '_' : ''}${name}`,\n ).toUpperCase();\n return (t as v.Type<string>)\n .optional()\n .assert(\n val => val !== undefined,\n `Missing required option ${optionName}`,\n );\n }\n return t;\n };\n // OptionType\n if (v.instanceOfAbstractType(value)) {\n return [name, addErrorMessage(value)];\n }\n // WrappedOptionType\n const {type} = value;\n if (v.instanceOfAbstractType(type)) {\n return [name, addErrorMessage(type)];\n }\n // OptionGroup\n return [name, makeObjectType(value as Group, name)];\n },\n ),\n ),\n );\n }\n return makeObjectType(options) as v.Type<Config<T>>;\n}\n\n/**\n * Converts an Options instance into an \"env schema\", which is an object with\n * ENV names as its keys, mapped to optional or required string values\n * (corresponding to the optionality of the corresponding options).\n *\n * This is used as a format for encoding options for a multi-tenant version\n * of an app, with an envSchema for each tenant.\n */\nexport function envSchema<T extends Options>(options: T, envNamePrefix = '') {\n const fields: [string, v.Type<string> | v.Optional<string>][] = [];\n\n function addField(name: string, type: OptionType, group?: string) {\n const flag = group ? `${group}_${name}` : name;\n const env = toSnakeCase(`${envNamePrefix}${flag}`).toUpperCase();\n\n const {required} = getRequiredOrDefault(type);\n fields.push([env, required ? v.string() : v.string().optional()]);\n }\n\n function addFields(o: Options | Group, group?: string) {\n Object.entries(o).forEach(([name, value]) => {\n // OptionType\n if (v.instanceOfAbstractType(value)) {\n addField(name, value, group);\n return;\n }\n // WrappedOptionType\n const {type} = value;\n if (v.instanceOfAbstractType(type)) {\n addField(name, type, group);\n return;\n }\n // OptionGroup\n addFields(value as Group, name);\n });\n }\n\n addFields(options);\n\n return v.object(Object.fromEntries(fields));\n}\n\n// type TerminalType is not exported from badrap/valita\ntype TerminalType = Parameters<\n Parameters<v.Type<unknown>['toTerminals']>[0]\n>[0];\n\nfunction getRequiredOrDefault(type: OptionType) {\n const defaultResult = v.testOptional<Value>(undefined, type);\n return {\n required: !defaultResult.ok,\n defaultValue: defaultResult.ok ? defaultResult.value : undefined,\n };\n}\n\nexport type ParseOptions = {\n /** Defaults to process.argv.slice(2) */\n argv?: string[];\n\n envNamePrefix?: string;\n\n description?: {header: string; content: string}[];\n\n /** Defaults to `false` */\n allowUnknown?: boolean;\n\n /** Defaults to `false` */\n allowPartial?: boolean;\n\n /** Defaults to `process.env`. */\n env?: NodeJS.ProcessEnv;\n\n /** Defaults to `true`. */\n emitDeprecationWarnings?: boolean;\n\n /** Defaults to `true`. When false, excludes default values from both config and env return values. */\n includeDefaults?: boolean;\n\n /** Defaults to `console` */\n logger?: OptionalLogger;\n\n /** Defaults to `process.exit` */\n exit?: (code?: number | string | null) => never;\n};\n\nexport function parseOptions<T extends Options>(\n appOptions: T,\n opts: ParseOptions = {},\n): Config<T> {\n return parseOptionsAdvanced(appOptions, opts).config;\n}\n\nexport function parseOptionsAdvanced<T extends Options>(\n appOptions: T,\n opts: ParseOptions = {},\n): {config: Config<T>; env: Record<string, string>; unknown?: string[]} {\n const {\n argv = process.argv.slice(2),\n envNamePrefix = '',\n description = [],\n allowUnknown = false,\n allowPartial = false,\n env: processEnv = process.env,\n emitDeprecationWarnings = true,\n includeDefaults = true,\n logger = console,\n exit = process.exit,\n } = opts;\n // The main logic for converting a valita Type spec to an Option (i.e. flag) spec.\n function addOption(field: string, option: WrappedOptionType, group?: string) {\n const {type, desc = [], deprecated, alias, hidden} = option;\n\n // The group name is prepended to the flag name.\n const flag = group ? toKebabCase(`${group}-${field}`) : toKebabCase(field);\n\n const {required, defaultValue} = getRequiredOrDefault(type);\n let multiple = type.name === 'array';\n const literals = new Set<string>();\n const terminalTypes = new Set<string>();\n\n type.toTerminals(getTerminalTypes);\n\n function getTerminalTypes(t: TerminalType) {\n switch (t.name) {\n case 'undefined':\n case 'optional':\n break;\n case 'array': {\n multiple = true;\n t.prefix.forEach(t => t.toTerminals(getTerminalTypes));\n t.rest?.toTerminals(getTerminalTypes);\n t.suffix.forEach(t => t.toTerminals(getTerminalTypes));\n break;\n }\n case 'literal':\n literals.add(String(t.value));\n terminalTypes.add(typeof t.value);\n break;\n default:\n terminalTypes.add(t.name);\n break;\n }\n }\n const env = toSnakeCase(`${envNamePrefix}${flag}`).toUpperCase();\n if (terminalTypes.size > 1) {\n throw new TypeError(`${env} has mixed types ${[...terminalTypes]}`);\n }\n assert(terminalTypes.size === 1, 'Expected exactly one terminal type');\n const terminalType = [...terminalTypes][0];\n\n if (processEnv[env]) {\n if (multiple) {\n // Technically not water-tight; assumes values for the string[] flag don't contain commas.\n envArgv.push(`--${flag}`, ...processEnv[env].split(','));\n } else {\n envArgv.push(`--${flag}`, processEnv[env]);\n }\n }\n names.set(flag, {field, env});\n\n const spec = [\n (required\n ? '{italic required}'\n : defaultValue !== undefined\n ? `default: ${JSON.stringify(defaultValue)}`\n : 'optional') + '\\n',\n ];\n if (desc) {\n spec.push(...desc);\n }\n\n const typeLabel = [\n literals.size\n ? String(Array.from(literals, l => `{underline ${l}}`))\n : multiple\n ? `{underline ${terminalType}[]}`\n : `{underline ${terminalType}}`,\n ` ${env} env`,\n ];\n\n const opt = {\n name: flag,\n alias,\n type: valueParser(\n env,\n terminalType,\n logger,\n emitDeprecationWarnings ? deprecated : undefined,\n ),\n multiple,\n group,\n description: spec.join('\\n') + '\\n',\n typeLabel: typeLabel.join('\\n') + '\\n',\n hidden: hidden === undefined ? deprecated !== undefined : hidden,\n };\n optsWithoutDefaults.push(opt);\n optsWithDefaults.push({...opt, defaultValue});\n }\n\n const names = new Map<string, {field: string; env: string}>();\n const optsWithDefaults: DescribedOptionDefinition[] = [];\n const optsWithoutDefaults: DescribedOptionDefinition[] = [];\n const envArgv: string[] = [];\n\n try {\n for (const [name, val] of Object.entries(appOptions)) {\n const {type} = val as {type: unknown};\n if (v.instanceOfAbstractType(val)) {\n addOption(name, {type: val});\n } else if (v.instanceOfAbstractType(type)) {\n addOption(name, val as WrappedOptionType);\n } else {\n const group = name;\n for (const [name, option] of Object.entries(val as Group)) {\n const wrapped = v.instanceOfAbstractType(option)\n ? {type: option}\n : option;\n addOption(name, wrapped, group);\n }\n }\n }\n\n const [defaults, env1, unknown] = parseArgs(optsWithDefaults, argv, names);\n const [fromEnv, env2] = parseArgs(optsWithoutDefaults, envArgv, names);\n const [withoutDefaults, env3] = parseArgs(optsWithoutDefaults, argv, names);\n\n switch (unknown?.[0]) {\n case undefined:\n break;\n case '--help':\n case '-h':\n showUsage(optsWithDefaults, description, logger);\n exit(0);\n break;\n default:\n if (!allowUnknown) {\n logger.error?.('Invalid arguments:', unknown);\n showUsage(optsWithDefaults, description, logger);\n exit(0);\n }\n break;\n }\n\n const parsedArgs = includeDefaults\n ? defu(withoutDefaults, fromEnv, defaults)\n : defu(withoutDefaults, fromEnv);\n const env = includeDefaults\n ? {...env1, ...env2, ...env3}\n : {...env2, ...env3};\n\n let schema = configSchema(appOptions, envNamePrefix);\n if (allowPartial || !includeDefaults) {\n // TODO: Type configSchema() to return a v.ObjectType<...>\n schema = v.deepPartial(schema as v.ObjectType) as v.Type<Config<T>>;\n }\n return {\n config: v.parse(parsedArgs, schema),\n env,\n ...(unknown ? {unknown} : {}),\n };\n } catch (e) {\n logger.error?.(String(e));\n showUsage(optsWithDefaults, description, logger);\n throw e;\n }\n}\n\nfunction valueParser(\n optionName: string,\n typeName: string,\n logger: OptionalLogger,\n deprecated: string[] | undefined,\n) {\n return (input: string) => {\n if (deprecated) {\n logger.warn?.(\n template(\n `\\n${optionName} is deprecated:\\n` + deprecated.join('\\n') + '\\n',\n ),\n );\n }\n switch (typeName) {\n case 'string':\n return input;\n case 'boolean':\n return parseBoolean(optionName, input);\n case 'number': {\n const val = Number(input);\n if (Number.isNaN(val)) {\n throw new TypeError(`Invalid input for ${optionName}: \"${input}\"`);\n }\n return val;\n }\n default:\n // Should be impossible given the constraints of `Option`\n throw new TypeError(\n `${optionName} option has unsupported type ${typeName}`,\n );\n }\n };\n}\n\nfunction parseArgs(\n optionDefs: DescribedOptionDefinition[],\n argv: string[],\n names: Map<string, {field: string; env: string}>,\n) {\n function normalizeFlagValue(value: unknown) {\n // A --flag without value is parsed by commandLineArgs() to `null`,\n // but this is a common convention to set a boolean flag to true.\n return value === null ? true : value;\n }\n\n const {\n _all,\n _none: ungrouped,\n _unknown: unknown,\n ...config\n } = commandLineArgs(optionDefs, {\n argv,\n partial: true,\n });\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n const envObj: Record<string, string> = {};\n\n function addFlag(flagName: string, value: unknown, group?: string) {\n const {field, env} = must(names.get(flagName));\n const normalized = normalizeFlagValue(value);\n if (group) {\n result[group][field] = normalized;\n } else {\n result[field] = normalized;\n }\n envObj[env] = String(normalized);\n }\n\n for (const [flagName, value] of Object.entries(ungrouped ?? {})) {\n addFlag(flagName, value);\n }\n\n // Then handle (potentially) grouped flags\n for (const [name, value] of Object.entries(config)) {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n addFlag(name, value); // Flag, not a group\n } else {\n const group = name;\n result[group] = {};\n for (const [flagName, flagValue] of Object.entries(value)) {\n addFlag(flagName, flagValue, group);\n }\n }\n }\n\n return [result, envObj, unknown] as const;\n}\n\nexport function flagToEnv(prefix: string, flag: string): string {\n return toSnakeCase(prefix + flag).toUpperCase();\n}\n\nexport function parseBoolean(optionName: string, input: string) {\n const bool = input.toLowerCase();\n if (['true', '1'].includes(bool)) {\n return true;\n } else if (['false', '0'].includes(bool)) {\n return false;\n }\n throw new TypeError(`Invalid input for ${optionName}: \"${input}\"`);\n}\n\nfunction showUsage(\n optionList: DescribedOptionDefinition[],\n description: {header: string; content: string}[] = [],\n logger: OptionalLogger = console,\n) {\n const hide: string[] = [];\n let leftWidth = 35;\n let rightWidth = 70;\n optionList.forEach(({name, typeLabel, description, hidden}) => {\n if (hidden) {\n hide.push(name);\n }\n const text = template(`${name} ${typeLabel ?? ''}`);\n const lines = stripAnsi(text).split('\\n');\n for (const l of lines) {\n leftWidth = Math.max(leftWidth, l.length + 2);\n }\n const desc = stripAnsi(template(description ?? '')).split('\\n');\n for (const l of desc) {\n rightWidth = Math.max(rightWidth, l.length + 2);\n }\n });\n\n const sections: Section[] = [\n {\n optionList,\n reverseNameOrder: true, // Display --flag-name before -alias\n hide,\n tableOptions: {\n columns: [\n {name: 'option', width: leftWidth},\n {name: 'description', width: rightWidth},\n ],\n noTrim: true,\n },\n },\n ];\n\n if (description) {\n sections.unshift(...description);\n }\n\n logger.info?.(commandLineUsage(sections));\n}\n\ntype DescribedOptionDefinition = OptionDefinition & {\n // Additional fields recognized by command-line-usage\n description?: string;\n typeLabel?: string | undefined;\n hidden?: boolean | undefined;\n};\n"],"mappings":"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"}
@@ -1,97 +1,16 @@
1
1
  var package_default = {
2
2
  name: "@rocicorp/zero",
3
- version: "1.3.0-canary.3",
3
+ version: "1.3.1-canary.1",
4
4
  description: "Zero is a web framework for serverless web development.",
5
- homepage: "https://zero.rocicorp.dev",
6
- bugs: { "url": "https://bugs.rocicorp.dev" },
7
- license: "Apache-2.0",
8
5
  author: "Rocicorp, Inc.",
9
6
  repository: {
10
7
  "type": "git",
11
8
  "url": "git+https://github.com/rocicorp/mono.git",
12
9
  "directory": "packages/zero"
13
10
  },
14
- bin: {
15
- "analyze-query": "./out/zero/src/analyze-query.js",
16
- "ast-to-zql": "./out/zero/src/ast-to-zql.js",
17
- "transform-query": "./out/zero/src/transform-query.js",
18
- "zero-build-schema": "./out/zero/src/build-schema.js",
19
- "zero-cache": "./out/zero/src/cli.js",
20
- "zero-cache-dev": "./out/zero/src/zero-cache-dev.js",
21
- "zero-deploy-permissions": "./out/zero/src/deploy-permissions.js",
22
- "zero-out": "./out/zero/src/zero-out.js"
23
- },
24
- files: ["out", "!*.tsbuildinfo"],
25
- type: "module",
26
- main: "out/zero/src/zero.js",
27
- module: "out/zero/src/zero.js",
28
- types: "out/zero/src/zero.d.ts",
29
- exports: {
30
- ".": {
31
- "types": "./out/zero/src/zero.d.ts",
32
- "default": "./out/zero/src/zero.js"
33
- },
34
- "./bindings": {
35
- "types": "./out/zero/src/bindings.d.ts",
36
- "default": "./out/zero/src/bindings.js"
37
- },
38
- "./change-protocol/v0": {
39
- "types": "./out/zero/src/change-protocol/v0.d.ts",
40
- "default": "./out/zero/src/change-protocol/v0.js"
41
- },
42
- "./expo-sqlite": {
43
- "types": "./out/zero/src/expo-sqlite.d.ts",
44
- "default": "./out/zero/src/expo-sqlite.js"
45
- },
46
- "./op-sqlite": {
47
- "types": "./out/zero/src/op-sqlite.d.ts",
48
- "default": "./out/zero/src/op-sqlite.js"
49
- },
50
- "./pg": {
51
- "types": "./out/zero/src/pg.d.ts",
52
- "default": "./out/zero/src/pg.js"
53
- },
54
- "./react": {
55
- "types": "./out/zero/src/react.d.ts",
56
- "default": "./out/zero/src/react.js"
57
- },
58
- "./react-native": {
59
- "types": "./out/zero/src/react-native.d.ts",
60
- "default": "./out/zero/src/react-native.js"
61
- },
62
- "./server": {
63
- "types": "./out/zero/src/server.d.ts",
64
- "default": "./out/zero/src/server.js"
65
- },
66
- "./server/adapters/drizzle": {
67
- "types": "./out/zero/src/adapters/drizzle.d.ts",
68
- "default": "./out/zero/src/adapters/drizzle.js"
69
- },
70
- "./server/adapters/prisma": {
71
- "types": "./out/zero/src/adapters/prisma.d.ts",
72
- "default": "./out/zero/src/adapters/prisma.js"
73
- },
74
- "./server/adapters/pg": {
75
- "types": "./out/zero/src/adapters/pg.d.ts",
76
- "default": "./out/zero/src/adapters/pg.js"
77
- },
78
- "./server/adapters/postgresjs": {
79
- "types": "./out/zero/src/adapters/postgresjs.d.ts",
80
- "default": "./out/zero/src/adapters/postgresjs.js"
81
- },
82
- "./solid": {
83
- "types": "./out/zero/src/solid.d.ts",
84
- "default": "./out/zero/src/solid.js"
85
- },
86
- "./sqlite": {
87
- "types": "./out/zero/src/sqlite.d.ts",
88
- "default": "./out/zero/src/sqlite.js"
89
- },
90
- "./zqlite": {
91
- "types": "./out/zero/src/zqlite.d.ts",
92
- "default": "./out/zero/src/zqlite.js"
93
- }
94
- },
11
+ license: "Apache-2.0",
12
+ homepage: "https://zero.rocicorp.dev",
13
+ bugs: { "url": "https://bugs.rocicorp.dev" },
95
14
  scripts: {
96
15
  "build": "node --experimental-strip-types --no-warnings tool/build.ts",
97
16
  "build:watch": "node --experimental-strip-types --no-warnings tool/build.ts --watch",
@@ -102,9 +21,7 @@ var package_default = {
102
21
  "check-format": "oxfmt --check .",
103
22
  "lint": "oxlint --type-aware src/",
104
23
  "docs": "node --experimental-strip-types --no-warnings tool/generate-docs.ts",
105
- "docs:server": "node --watch --experimental-strip-types --no-warnings tool/generate-docs.ts --server",
106
- "fmt": "oxfmt .",
107
- "check-fmt": "oxfmt --check ."
24
+ "docs:server": "node --watch --experimental-strip-types --no-warnings tool/generate-docs.ts --server"
108
25
  },
109
26
  dependencies: {
110
27
  "@badrap/valita": "0.3.11",
@@ -127,7 +44,7 @@ var package_default = {
127
44
  "@rocicorp/lock": "^1.0.4",
128
45
  "@rocicorp/logger": "^5.4.0",
129
46
  "@rocicorp/resolver": "^1.0.2",
130
- "@rocicorp/zero-sqlite3": "^1.0.17",
47
+ "@rocicorp/zero-sqlite3": "^1.0.15",
131
48
  "@standard-schema/spec": "^1.0.0",
132
49
  "@types/basic-auth": "^1.1.8",
133
50
  "@types/ws": "^8.5.12",
@@ -147,7 +64,7 @@ var package_default = {
147
64
  "json-custom-numbers": "^3.1.1",
148
65
  "kasi": "^1.1.0",
149
66
  "nanoid": "^5.1.2",
150
- "oxfmt": "^0.45.0",
67
+ "oxfmt": "^0.44.0",
151
68
  "parse-prometheus-text-format": "^1.1.1",
152
69
  "pg-format": "npm:pg-format-fix@^1.0.5",
153
70
  "postgres": "3.4.7",
@@ -188,7 +105,88 @@ var package_default = {
188
105
  "expo-sqlite": { "optional": true },
189
106
  "@op-engineering/op-sqlite": { "optional": true }
190
107
  },
191
- engines: { "node": ">=22" }
108
+ type: "module",
109
+ main: "out/zero/src/zero.js",
110
+ module: "out/zero/src/zero.js",
111
+ types: "out/zero/src/zero.d.ts",
112
+ exports: {
113
+ ".": {
114
+ "types": "./out/zero/src/zero.d.ts",
115
+ "default": "./out/zero/src/zero.js"
116
+ },
117
+ "./bindings": {
118
+ "types": "./out/zero/src/bindings.d.ts",
119
+ "default": "./out/zero/src/bindings.js"
120
+ },
121
+ "./change-protocol/v0": {
122
+ "types": "./out/zero/src/change-protocol/v0.d.ts",
123
+ "default": "./out/zero/src/change-protocol/v0.js"
124
+ },
125
+ "./expo-sqlite": {
126
+ "types": "./out/zero/src/expo-sqlite.d.ts",
127
+ "default": "./out/zero/src/expo-sqlite.js"
128
+ },
129
+ "./op-sqlite": {
130
+ "types": "./out/zero/src/op-sqlite.d.ts",
131
+ "default": "./out/zero/src/op-sqlite.js"
132
+ },
133
+ "./pg": {
134
+ "types": "./out/zero/src/pg.d.ts",
135
+ "default": "./out/zero/src/pg.js"
136
+ },
137
+ "./react": {
138
+ "types": "./out/zero/src/react.d.ts",
139
+ "default": "./out/zero/src/react.js"
140
+ },
141
+ "./react-native": {
142
+ "types": "./out/zero/src/react-native.d.ts",
143
+ "default": "./out/zero/src/react-native.js"
144
+ },
145
+ "./server": {
146
+ "types": "./out/zero/src/server.d.ts",
147
+ "default": "./out/zero/src/server.js"
148
+ },
149
+ "./server/adapters/drizzle": {
150
+ "types": "./out/zero/src/adapters/drizzle.d.ts",
151
+ "default": "./out/zero/src/adapters/drizzle.js"
152
+ },
153
+ "./server/adapters/prisma": {
154
+ "types": "./out/zero/src/adapters/prisma.d.ts",
155
+ "default": "./out/zero/src/adapters/prisma.js"
156
+ },
157
+ "./server/adapters/pg": {
158
+ "types": "./out/zero/src/adapters/pg.d.ts",
159
+ "default": "./out/zero/src/adapters/pg.js"
160
+ },
161
+ "./server/adapters/postgresjs": {
162
+ "types": "./out/zero/src/adapters/postgresjs.d.ts",
163
+ "default": "./out/zero/src/adapters/postgresjs.js"
164
+ },
165
+ "./solid": {
166
+ "types": "./out/zero/src/solid.d.ts",
167
+ "default": "./out/zero/src/solid.js"
168
+ },
169
+ "./sqlite": {
170
+ "types": "./out/zero/src/sqlite.d.ts",
171
+ "default": "./out/zero/src/sqlite.js"
172
+ },
173
+ "./zqlite": {
174
+ "types": "./out/zero/src/zqlite.d.ts",
175
+ "default": "./out/zero/src/zqlite.js"
176
+ }
177
+ },
178
+ bin: {
179
+ "zero-build-schema": "./out/zero/src/build-schema.js",
180
+ "zero-cache": "./out/zero/src/cli.js",
181
+ "zero-cache-dev": "./out/zero/src/zero-cache-dev.js",
182
+ "zero-deploy-permissions": "./out/zero/src/deploy-permissions.js",
183
+ "zero-out": "./out/zero/src/zero-out.js",
184
+ "ast-to-zql": "./out/zero/src/ast-to-zql.js",
185
+ "analyze-query": "./out/zero/src/analyze-query.js",
186
+ "transform-query": "./out/zero/src/transform-query.js"
187
+ },
188
+ engines: { "node": ">=22" },
189
+ files: ["out", "!*.tsbuildinfo"]
192
190
  };
193
191
  //#endregion
194
192
  export { package_default as default };
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","names":[],"sources":["../../package.json"],"sourcesContent":["{\n \"name\": \"@rocicorp/zero\",\n \"version\": \"1.3.0-canary.3\",\n \"description\": \"Zero is a web framework for serverless web development.\",\n \"homepage\": \"https://zero.rocicorp.dev\",\n \"bugs\": {\n \"url\": \"https://bugs.rocicorp.dev\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"Rocicorp, Inc.\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/rocicorp/mono.git\",\n \"directory\": \"packages/zero\"\n },\n \"bin\": {\n \"analyze-query\": \"./out/zero/src/analyze-query.js\",\n \"ast-to-zql\": \"./out/zero/src/ast-to-zql.js\",\n \"transform-query\": \"./out/zero/src/transform-query.js\",\n \"zero-build-schema\": \"./out/zero/src/build-schema.js\",\n \"zero-cache\": \"./out/zero/src/cli.js\",\n \"zero-cache-dev\": \"./out/zero/src/zero-cache-dev.js\",\n \"zero-deploy-permissions\": \"./out/zero/src/deploy-permissions.js\",\n \"zero-out\": \"./out/zero/src/zero-out.js\"\n },\n \"files\": [\n \"out\",\n \"!*.tsbuildinfo\"\n ],\n \"type\": \"module\",\n \"main\": \"out/zero/src/zero.js\",\n \"module\": \"out/zero/src/zero.js\",\n \"types\": \"out/zero/src/zero.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./out/zero/src/zero.d.ts\",\n \"default\": \"./out/zero/src/zero.js\"\n },\n \"./bindings\": {\n \"types\": \"./out/zero/src/bindings.d.ts\",\n \"default\": \"./out/zero/src/bindings.js\"\n },\n \"./change-protocol/v0\": {\n \"types\": \"./out/zero/src/change-protocol/v0.d.ts\",\n \"default\": \"./out/zero/src/change-protocol/v0.js\"\n },\n \"./expo-sqlite\": {\n \"types\": \"./out/zero/src/expo-sqlite.d.ts\",\n \"default\": \"./out/zero/src/expo-sqlite.js\"\n },\n \"./op-sqlite\": {\n \"types\": \"./out/zero/src/op-sqlite.d.ts\",\n \"default\": \"./out/zero/src/op-sqlite.js\"\n },\n \"./pg\": {\n \"types\": \"./out/zero/src/pg.d.ts\",\n \"default\": \"./out/zero/src/pg.js\"\n },\n \"./react\": {\n \"types\": \"./out/zero/src/react.d.ts\",\n \"default\": \"./out/zero/src/react.js\"\n },\n \"./react-native\": {\n \"types\": \"./out/zero/src/react-native.d.ts\",\n \"default\": \"./out/zero/src/react-native.js\"\n },\n \"./server\": {\n \"types\": \"./out/zero/src/server.d.ts\",\n \"default\": \"./out/zero/src/server.js\"\n },\n \"./server/adapters/drizzle\": {\n \"types\": \"./out/zero/src/adapters/drizzle.d.ts\",\n \"default\": \"./out/zero/src/adapters/drizzle.js\"\n },\n \"./server/adapters/prisma\": {\n \"types\": \"./out/zero/src/adapters/prisma.d.ts\",\n \"default\": \"./out/zero/src/adapters/prisma.js\"\n },\n \"./server/adapters/pg\": {\n \"types\": \"./out/zero/src/adapters/pg.d.ts\",\n \"default\": \"./out/zero/src/adapters/pg.js\"\n },\n \"./server/adapters/postgresjs\": {\n \"types\": \"./out/zero/src/adapters/postgresjs.d.ts\",\n \"default\": \"./out/zero/src/adapters/postgresjs.js\"\n },\n \"./solid\": {\n \"types\": \"./out/zero/src/solid.d.ts\",\n \"default\": \"./out/zero/src/solid.js\"\n },\n \"./sqlite\": {\n \"types\": \"./out/zero/src/sqlite.d.ts\",\n \"default\": \"./out/zero/src/sqlite.js\"\n },\n \"./zqlite\": {\n \"types\": \"./out/zero/src/zqlite.d.ts\",\n \"default\": \"./out/zero/src/zqlite.js\"\n }\n },\n \"scripts\": {\n \"build\": \"node --experimental-strip-types --no-warnings tool/build.ts\",\n \"build:watch\": \"node --experimental-strip-types --no-warnings tool/build.ts --watch\",\n \"check-types\": \"tsc -p tsconfig.client.json && tsc -p tsconfig.server.json\",\n \"check-types:client:watch\": \"tsc -p tsconfig.client.json --watch\",\n \"check-types:server:watch\": \"tsc -p tsconfig.server.json --watch\",\n \"format\": \"oxfmt .\",\n \"check-format\": \"oxfmt --check .\",\n \"lint\": \"oxlint --type-aware src/\",\n \"docs\": \"node --experimental-strip-types --no-warnings tool/generate-docs.ts\",\n \"docs:server\": \"node --watch --experimental-strip-types --no-warnings tool/generate-docs.ts --server\",\n \"fmt\": \"oxfmt .\",\n \"check-fmt\": \"oxfmt --check .\"\n },\n \"dependencies\": {\n \"@badrap/valita\": \"0.3.11\",\n \"@databases/escape-identifier\": \"^1.0.3\",\n \"@databases/sql\": \"^3.3.0\",\n \"@dotenvx/dotenvx\": \"^1.39.0\",\n \"@drdgvhbh/postgres-error-codes\": \"^0.0.6\",\n \"@fastify/cors\": \"^10.0.0\",\n \"@fastify/websocket\": \"^11.0.0\",\n \"@google-cloud/precise-date\": \"^4.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.203.0\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.62.0\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-metrics\": \"^2.0.1\",\n \"@opentelemetry/sdk-node\": \"^0.203.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@postgresql-typed/oids\": \"^0.2.0\",\n \"@rocicorp/lock\": \"^1.0.4\",\n \"@rocicorp/logger\": \"^5.4.0\",\n \"@rocicorp/resolver\": \"^1.0.2\",\n \"@rocicorp/zero-sqlite3\": \"^1.0.17\",\n \"@standard-schema/spec\": \"^1.0.0\",\n \"@types/basic-auth\": \"^1.1.8\",\n \"@types/ws\": \"^8.5.12\",\n \"basic-auth\": \"^2.0.1\",\n \"chalk-template\": \"^1.1.0\",\n \"chokidar\": \"^4.0.1\",\n \"cloudevents\": \"^10.0.0\",\n \"command-line-args\": \"^6.0.1\",\n \"command-line-usage\": \"^7.0.3\",\n \"compare-utf8\": \"^0.2.0\",\n \"defu\": \"^6.1.4\",\n \"eventemitter3\": \"^5.0.1\",\n \"fastify\": \"^5.0.0\",\n \"is-in-subnet\": \"^4.0.1\",\n \"jose\": \"^5.9.3\",\n \"js-xxhash\": \"^4.0.0\",\n \"json-custom-numbers\": \"^3.1.1\",\n \"kasi\": \"^1.1.0\",\n \"nanoid\": \"^5.1.2\",\n \"oxfmt\": \"^0.45.0\",\n \"parse-prometheus-text-format\": \"^1.1.1\",\n \"pg-format\": \"npm:pg-format-fix@^1.0.5\",\n \"postgres\": \"3.4.7\",\n \"semver\": \"^7.5.4\",\n \"tsx\": \"^4.21.0\",\n \"url-pattern\": \"^1.0.3\",\n \"urlpattern-polyfill\": \"^10.1.0\",\n \"ws\": \"^8.18.1\"\n },\n \"devDependencies\": {\n \"@op-engineering/op-sqlite\": \">=15\",\n \"@vitest/runner\": \"4.1.3\",\n \"analyze-query\": \"0.0.0\",\n \"ast-to-zql\": \"0.0.0\",\n \"expo-sqlite\": \">=15\",\n \"replicache\": \"15.2.1\",\n \"shared\": \"0.0.0\",\n \"syncpack\": \"^14.3.0\",\n \"typedoc\": \"^0.28.17\",\n \"typedoc-plugin-markdown\": \"^4.10.0\",\n \"typescript\": \"~6.0.2\",\n \"vite\": \"8.0.3\",\n \"vitest\": \"4.1.3\",\n \"zero-cache\": \"0.0.0\",\n \"zero-client\": \"0.0.0\",\n \"zero-pg\": \"0.0.0\",\n \"zero-protocol\": \"0.0.0\",\n \"zero-react\": \"0.0.0\",\n \"zero-server\": \"0.0.0\",\n \"zero-solid\": \"0.0.0\",\n \"zqlite\": \"0.0.0\"\n },\n \"peerDependencies\": {\n \"@op-engineering/op-sqlite\": \">=15\",\n \"expo-sqlite\": \">=15\"\n },\n \"peerDependenciesMeta\": {\n \"expo-sqlite\": {\n \"optional\": true\n },\n \"@op-engineering/op-sqlite\": {\n \"optional\": true\n }\n },\n \"engines\": {\n \"node\": \">=22\"\n }\n}"],"mappings":""}
1
+ {"version":3,"file":"package.js","names":[],"sources":["../../package.json"],"sourcesContent":["{\n \"name\": \"@rocicorp/zero\",\n \"version\": \"1.3.1-canary.1\",\n \"description\": \"Zero is a web framework for serverless web development.\",\n \"author\": \"Rocicorp, Inc.\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/rocicorp/mono.git\",\n \"directory\": \"packages/zero\"\n },\n \"license\": \"Apache-2.0\",\n \"homepage\": \"https://zero.rocicorp.dev\",\n \"bugs\": {\n \"url\": \"https://bugs.rocicorp.dev\"\n },\n \"scripts\": {\n \"build\": \"node --experimental-strip-types --no-warnings tool/build.ts\",\n \"build:watch\": \"node --experimental-strip-types --no-warnings tool/build.ts --watch\",\n \"check-types\": \"tsc -p tsconfig.client.json && tsc -p tsconfig.server.json\",\n \"check-types:client:watch\": \"tsc -p tsconfig.client.json --watch\",\n \"check-types:server:watch\": \"tsc -p tsconfig.server.json --watch\",\n \"format\": \"oxfmt .\",\n \"check-format\": \"oxfmt --check .\",\n \"lint\": \"oxlint --type-aware src/\",\n \"docs\": \"node --experimental-strip-types --no-warnings tool/generate-docs.ts\",\n \"docs:server\": \"node --watch --experimental-strip-types --no-warnings tool/generate-docs.ts --server\"\n },\n \"dependencies\": {\n \"@badrap/valita\": \"0.3.11\",\n \"@databases/escape-identifier\": \"^1.0.3\",\n \"@databases/sql\": \"^3.3.0\",\n \"@dotenvx/dotenvx\": \"^1.39.0\",\n \"@drdgvhbh/postgres-error-codes\": \"^0.0.6\",\n \"@fastify/cors\": \"^10.0.0\",\n \"@fastify/websocket\": \"^11.0.0\",\n \"@google-cloud/precise-date\": \"^4.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.203.0\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.62.0\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/resources\": \"^2.0.1\",\n \"@opentelemetry/sdk-metrics\": \"^2.0.1\",\n \"@opentelemetry/sdk-node\": \"^0.203.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.0.1\",\n \"@postgresql-typed/oids\": \"^0.2.0\",\n \"@rocicorp/lock\": \"^1.0.4\",\n \"@rocicorp/logger\": \"^5.4.0\",\n \"@rocicorp/resolver\": \"^1.0.2\",\n \"@rocicorp/zero-sqlite3\": \"^1.0.15\",\n \"@standard-schema/spec\": \"^1.0.0\",\n \"@types/basic-auth\": \"^1.1.8\",\n \"@types/ws\": \"^8.5.12\",\n \"basic-auth\": \"^2.0.1\",\n \"chalk-template\": \"^1.1.0\",\n \"chokidar\": \"^4.0.1\",\n \"cloudevents\": \"^10.0.0\",\n \"command-line-args\": \"^6.0.1\",\n \"command-line-usage\": \"^7.0.3\",\n \"compare-utf8\": \"^0.2.0\",\n \"defu\": \"^6.1.4\",\n \"eventemitter3\": \"^5.0.1\",\n \"fastify\": \"^5.0.0\",\n \"is-in-subnet\": \"^4.0.1\",\n \"jose\": \"^5.9.3\",\n \"js-xxhash\": \"^4.0.0\",\n \"json-custom-numbers\": \"^3.1.1\",\n \"kasi\": \"^1.1.0\",\n \"nanoid\": \"^5.1.2\",\n \"oxfmt\": \"^0.44.0\",\n \"parse-prometheus-text-format\": \"^1.1.1\",\n \"pg-format\": \"npm:pg-format-fix@^1.0.5\",\n \"postgres\": \"3.4.7\",\n \"semver\": \"^7.5.4\",\n \"tsx\": \"^4.21.0\",\n \"url-pattern\": \"^1.0.3\",\n \"urlpattern-polyfill\": \"^10.1.0\",\n \"ws\": \"^8.18.1\"\n },\n \"devDependencies\": {\n \"@op-engineering/op-sqlite\": \">=15\",\n \"@vitest/runner\": \"4.1.3\",\n \"analyze-query\": \"0.0.0\",\n \"ast-to-zql\": \"0.0.0\",\n \"expo-sqlite\": \">=15\",\n \"replicache\": \"15.2.1\",\n \"shared\": \"0.0.0\",\n \"syncpack\": \"^14.3.0\",\n \"typedoc\": \"^0.28.17\",\n \"typedoc-plugin-markdown\": \"^4.10.0\",\n \"typescript\": \"~6.0.2\",\n \"vite\": \"8.0.3\",\n \"vitest\": \"4.1.3\",\n \"zero-cache\": \"0.0.0\",\n \"zero-client\": \"0.0.0\",\n \"zero-pg\": \"0.0.0\",\n \"zero-protocol\": \"0.0.0\",\n \"zero-react\": \"0.0.0\",\n \"zero-server\": \"0.0.0\",\n \"zero-solid\": \"0.0.0\",\n \"zqlite\": \"0.0.0\"\n },\n \"peerDependencies\": {\n \"@op-engineering/op-sqlite\": \">=15\",\n \"expo-sqlite\": \">=15\"\n },\n \"peerDependenciesMeta\": {\n \"expo-sqlite\": {\n \"optional\": true\n },\n \"@op-engineering/op-sqlite\": {\n \"optional\": true\n }\n },\n \"type\": \"module\",\n \"main\": \"out/zero/src/zero.js\",\n \"module\": \"out/zero/src/zero.js\",\n \"types\": \"out/zero/src/zero.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./out/zero/src/zero.d.ts\",\n \"default\": \"./out/zero/src/zero.js\"\n },\n \"./bindings\": {\n \"types\": \"./out/zero/src/bindings.d.ts\",\n \"default\": \"./out/zero/src/bindings.js\"\n },\n \"./change-protocol/v0\": {\n \"types\": \"./out/zero/src/change-protocol/v0.d.ts\",\n \"default\": \"./out/zero/src/change-protocol/v0.js\"\n },\n \"./expo-sqlite\": {\n \"types\": \"./out/zero/src/expo-sqlite.d.ts\",\n \"default\": \"./out/zero/src/expo-sqlite.js\"\n },\n \"./op-sqlite\": {\n \"types\": \"./out/zero/src/op-sqlite.d.ts\",\n \"default\": \"./out/zero/src/op-sqlite.js\"\n },\n \"./pg\": {\n \"types\": \"./out/zero/src/pg.d.ts\",\n \"default\": \"./out/zero/src/pg.js\"\n },\n \"./react\": {\n \"types\": \"./out/zero/src/react.d.ts\",\n \"default\": \"./out/zero/src/react.js\"\n },\n \"./react-native\": {\n \"types\": \"./out/zero/src/react-native.d.ts\",\n \"default\": \"./out/zero/src/react-native.js\"\n },\n \"./server\": {\n \"types\": \"./out/zero/src/server.d.ts\",\n \"default\": \"./out/zero/src/server.js\"\n },\n \"./server/adapters/drizzle\": {\n \"types\": \"./out/zero/src/adapters/drizzle.d.ts\",\n \"default\": \"./out/zero/src/adapters/drizzle.js\"\n },\n \"./server/adapters/prisma\": {\n \"types\": \"./out/zero/src/adapters/prisma.d.ts\",\n \"default\": \"./out/zero/src/adapters/prisma.js\"\n },\n \"./server/adapters/pg\": {\n \"types\": \"./out/zero/src/adapters/pg.d.ts\",\n \"default\": \"./out/zero/src/adapters/pg.js\"\n },\n \"./server/adapters/postgresjs\": {\n \"types\": \"./out/zero/src/adapters/postgresjs.d.ts\",\n \"default\": \"./out/zero/src/adapters/postgresjs.js\"\n },\n \"./solid\": {\n \"types\": \"./out/zero/src/solid.d.ts\",\n \"default\": \"./out/zero/src/solid.js\"\n },\n \"./sqlite\": {\n \"types\": \"./out/zero/src/sqlite.d.ts\",\n \"default\": \"./out/zero/src/sqlite.js\"\n },\n \"./zqlite\": {\n \"types\": \"./out/zero/src/zqlite.d.ts\",\n \"default\": \"./out/zero/src/zqlite.js\"\n }\n },\n \"bin\": {\n \"zero-build-schema\": \"./out/zero/src/build-schema.js\",\n \"zero-cache\": \"./out/zero/src/cli.js\",\n \"zero-cache-dev\": \"./out/zero/src/zero-cache-dev.js\",\n \"zero-deploy-permissions\": \"./out/zero/src/deploy-permissions.js\",\n \"zero-out\": \"./out/zero/src/zero-out.js\",\n \"ast-to-zql\": \"./out/zero/src/ast-to-zql.js\",\n \"analyze-query\": \"./out/zero/src/analyze-query.js\",\n \"transform-query\": \"./out/zero/src/transform-query.js\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"files\": [\n \"out\",\n \"!*.tsbuildinfo\"\n ]\n}"],"mappings":""}
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { valita_exports } from "../../shared/src/valita.js";
3
3
  import "../../shared/src/dotenv.js";
4
- import { createLogContext } from "../../shared/src/logging.js";
5
4
  import { parseOptionsAdvanced } from "../../shared/src/options.js";
6
5
  import { ZERO_ENV_VAR_PREFIX, zeroOptions } from "../../zero-cache/src/config/zero-config.js";
6
+ import { createLogContext } from "../../shared/src/logging.js";
7
7
  import { deployPermissionsOptions } from "../../zero-cache/src/scripts/permissions.js";
8
8
  import { resolver } from "@rocicorp/resolver";
9
9
  import { spawn } from "node:child_process";
@@ -1 +1 @@
1
- {"version":3,"file":"zero-cache-dev.js","names":[],"sources":["../../../src/zero-cache-dev.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport '../../shared/src/dotenv.ts';\n\nimport {spawn, type ChildProcess} from 'node:child_process';\nimport {resolver} from '@rocicorp/resolver';\nimport {watch} from 'chokidar';\nimport {createLogContext} from '../../shared/src/logging.ts';\nimport {parseOptionsAdvanced} from '../../shared/src/options.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {\n ZERO_ENV_VAR_PREFIX,\n zeroOptions,\n} from '../../zero-cache/src/config/zero-config.ts';\nimport {deployPermissionsOptions} from '../../zero-cache/src/scripts/permissions.ts';\n\nconst deployPermissionsScript = 'zero-deploy-permissions';\nconst zeroCacheScript = 'zero-cache';\n\nfunction killProcess(childProcess: ChildProcess | undefined) {\n if (!childProcess || childProcess.exitCode !== null) {\n return Promise.resolve();\n }\n const {resolve, promise} = resolver();\n childProcess.on('exit', resolve);\n // Use SIGQUIT in particular since this will cause\n // a fast zero-cache shutdown instead of a graceful drain.\n childProcess.kill('SIGQUIT');\n return promise;\n}\n\nasync function main() {\n const {config} = parseOptionsAdvanced(\n {\n schema: {\n path: {\n type: v.string().optional(),\n desc: ['Relative path to the file containing permissions.'],\n alias: 'p',\n deprecated: [\n 'Permissions are deprecated and will be removed in an upcoming release. See: https://zero.rocicorp.dev/docs/auth.',\n ],\n },\n },\n ...zeroOptions,\n },\n {\n envNamePrefix: ZERO_ENV_VAR_PREFIX,\n // TODO: This may no longer be necessary since multi-tenant was removed.\n allowPartial: true, // required by server/runner/config.ts\n // Let the spawned zero-cache process emit deprecation warnings\n emitDeprecationWarnings: false,\n },\n );\n\n const lc = createLogContext(config);\n\n process.on('unhandledRejection', reason => {\n lc.error?.('Unexpected unhandled rejection.', reason);\n lc.error?.('Exiting');\n process.exit(-1);\n });\n\n // Parse options for each subprocess to get environment variables\n const {env: deployPermissionsEnv} = parseOptionsAdvanced(\n deployPermissionsOptions,\n {\n envNamePrefix: ZERO_ENV_VAR_PREFIX,\n allowUnknown: true,\n includeDefaults: false,\n emitDeprecationWarnings: false,\n },\n );\n const {env: zeroCacheEnv} = parseOptionsAdvanced(zeroOptions, {\n envNamePrefix: ZERO_ENV_VAR_PREFIX,\n allowUnknown: true,\n includeDefaults: false,\n emitDeprecationWarnings: false,\n });\n\n let permissionsProcess: ChildProcess | undefined;\n let zeroCacheProcess: ChildProcess | undefined;\n\n // Ensure child processes are killed when the main process exits\n process.on('exit', () => {\n permissionsProcess?.kill('SIGQUIT');\n zeroCacheProcess?.kill('SIGQUIT');\n });\n\n async function deployPermissions(): Promise<boolean> {\n if (config.upstream.type !== 'pg') {\n lc.warn?.(\n `Skipping permissions deployment for ${config.upstream.type} upstream`,\n );\n return true;\n }\n permissionsProcess?.removeAllListeners('exit');\n await killProcess(permissionsProcess);\n permissionsProcess = undefined;\n\n lc.info?.(`Running ${deployPermissionsScript}.`);\n permissionsProcess = spawn(deployPermissionsScript, [], {\n env: {...process.env, ...deployPermissionsEnv},\n stdio: 'inherit',\n shell: true,\n });\n\n const {promise: code, resolve} = resolver<number>();\n permissionsProcess.on('exit', resolve);\n if ((await code) === 0) {\n lc.info?.(`${deployPermissionsScript} completed successfully.`);\n return true;\n }\n lc.error?.(`Failed to deploy permissions from ${config.schema.path}.`);\n return false;\n }\n\n async function startZeroCache() {\n zeroCacheProcess?.removeAllListeners('exit');\n await killProcess(zeroCacheProcess);\n zeroCacheProcess = undefined;\n\n lc.info?.(\n `Running ${zeroCacheScript} at\\n\\n\\thttp://localhost:${config.port}\\n`,\n );\n const env: NodeJS.ProcessEnv = {\n // Set some low defaults so as to use fewer resources and not trip up,\n // e.g. developers sharing a database.\n ['ZERO_NUM_SYNC_WORKERS']: '3',\n ['ZERO_CVR_MAX_CONNS']: '6',\n ['ZERO_UPSTREAM_MAX_CONNS']: '6',\n\n // Default NODE_ENV to development mode.\n // @ts-ignore NODE_ENV is not always set. Please ignore error.\n ['NODE_ENV']: 'development',\n\n // But let the developer override any of these dev defaults.\n ...process.env,\n ...zeroCacheEnv,\n };\n zeroCacheProcess = spawn(zeroCacheScript, [], {\n env,\n stdio: 'inherit',\n shell: true,\n });\n zeroCacheProcess.on('exit', () => {\n lc.error?.(`${zeroCacheScript} exited. Exiting.`);\n process.exit(-1);\n });\n }\n\n async function deployPermissionsAndStartZeroCache() {\n if (await deployPermissions()) {\n await startZeroCache();\n }\n }\n\n if (config.schema.path) {\n if (config.query.url && config.mutate.url) {\n lc.warn?.(\n 'Using -p/--path/ZERO_SCHEMA_PATH with ZERO_MUTATE_URL and ZERO_QUERY_URL. ' +\n 'Continuing in hybrid mode: legacy permissions will still be deployed/watched, ' +\n 'and custom queries/mutations will use the API endpoints.',\n );\n }\n\n await deployPermissionsAndStartZeroCache();\n\n // Watch for file changes\n const watcher = watch(config.schema.path, {\n ignoreInitial: true,\n awaitWriteFinish: {stabilityThreshold: 500, pollInterval: 100},\n });\n const onFileChange = async () => {\n lc.info?.(`Detected ${config.schema.path} change.`);\n await deployPermissions();\n };\n watcher.on('add', onFileChange);\n watcher.on('change', onFileChange);\n watcher.on('unlink', onFileChange);\n } else {\n await startZeroCache();\n }\n}\n\nvoid main();\n"],"mappings":"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"}
1
+ {"version":3,"file":"zero-cache-dev.js","names":[],"sources":["../../../src/zero-cache-dev.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport '../../shared/src/dotenv.ts';\n\nimport {resolver} from '@rocicorp/resolver';\nimport {watch} from 'chokidar';\nimport {spawn, type ChildProcess} from 'node:child_process';\nimport {createLogContext} from '../../shared/src/logging.ts';\nimport {parseOptionsAdvanced} from '../../shared/src/options.ts';\nimport * as v from '../../shared/src/valita.ts';\nimport {\n ZERO_ENV_VAR_PREFIX,\n zeroOptions,\n} from '../../zero-cache/src/config/zero-config.ts';\nimport {deployPermissionsOptions} from '../../zero-cache/src/scripts/permissions.ts';\n\nconst deployPermissionsScript = 'zero-deploy-permissions';\nconst zeroCacheScript = 'zero-cache';\n\nfunction killProcess(childProcess: ChildProcess | undefined) {\n if (!childProcess || childProcess.exitCode !== null) {\n return Promise.resolve();\n }\n const {resolve, promise} = resolver();\n childProcess.on('exit', resolve);\n // Use SIGQUIT in particular since this will cause\n // a fast zero-cache shutdown instead of a graceful drain.\n childProcess.kill('SIGQUIT');\n return promise;\n}\n\nasync function main() {\n const {config} = parseOptionsAdvanced(\n {\n schema: {\n path: {\n type: v.string().optional(),\n desc: ['Relative path to the file containing permissions.'],\n alias: 'p',\n deprecated: [\n 'Permissions are deprecated and will be removed in an upcoming release. See: https://zero.rocicorp.dev/docs/auth.',\n ],\n },\n },\n ...zeroOptions,\n },\n {\n envNamePrefix: ZERO_ENV_VAR_PREFIX,\n // TODO: This may no longer be necessary since multi-tenant was removed.\n allowPartial: true, // required by server/runner/config.ts\n // Let the spawned zero-cache process emit deprecation warnings\n emitDeprecationWarnings: false,\n },\n );\n\n const lc = createLogContext(config);\n\n process.on('unhandledRejection', reason => {\n lc.error?.('Unexpected unhandled rejection.', reason);\n lc.error?.('Exiting');\n process.exit(-1);\n });\n\n // Parse options for each subprocess to get environment variables\n const {env: deployPermissionsEnv} = parseOptionsAdvanced(\n deployPermissionsOptions,\n {\n envNamePrefix: ZERO_ENV_VAR_PREFIX,\n allowUnknown: true,\n includeDefaults: false,\n emitDeprecationWarnings: false,\n },\n );\n const {env: zeroCacheEnv} = parseOptionsAdvanced(zeroOptions, {\n envNamePrefix: ZERO_ENV_VAR_PREFIX,\n allowUnknown: true,\n includeDefaults: false,\n emitDeprecationWarnings: false,\n });\n\n let permissionsProcess: ChildProcess | undefined;\n let zeroCacheProcess: ChildProcess | undefined;\n\n // Ensure child processes are killed when the main process exits\n process.on('exit', () => {\n permissionsProcess?.kill('SIGQUIT');\n zeroCacheProcess?.kill('SIGQUIT');\n });\n\n async function deployPermissions(): Promise<boolean> {\n if (config.upstream.type !== 'pg') {\n lc.warn?.(\n `Skipping permissions deployment for ${config.upstream.type} upstream`,\n );\n return true;\n }\n permissionsProcess?.removeAllListeners('exit');\n await killProcess(permissionsProcess);\n permissionsProcess = undefined;\n\n lc.info?.(`Running ${deployPermissionsScript}.`);\n permissionsProcess = spawn(deployPermissionsScript, [], {\n env: {...process.env, ...deployPermissionsEnv},\n stdio: 'inherit',\n shell: true,\n });\n\n const {promise: code, resolve} = resolver<number>();\n permissionsProcess.on('exit', resolve);\n if ((await code) === 0) {\n lc.info?.(`${deployPermissionsScript} completed successfully.`);\n return true;\n }\n lc.error?.(`Failed to deploy permissions from ${config.schema.path}.`);\n return false;\n }\n\n async function startZeroCache() {\n zeroCacheProcess?.removeAllListeners('exit');\n await killProcess(zeroCacheProcess);\n zeroCacheProcess = undefined;\n\n lc.info?.(\n `Running ${zeroCacheScript} at\\n\\n\\thttp://localhost:${config.port}\\n`,\n );\n const env: NodeJS.ProcessEnv = {\n // Set some low defaults so as to use fewer resources and not trip up,\n // e.g. developers sharing a database.\n ['ZERO_NUM_SYNC_WORKERS']: '3',\n ['ZERO_CVR_MAX_CONNS']: '6',\n ['ZERO_UPSTREAM_MAX_CONNS']: '6',\n\n // Default NODE_ENV to development mode.\n // @ts-ignore NODE_ENV is not always set. Please ignore error.\n ['NODE_ENV']: 'development',\n\n // But let the developer override any of these dev defaults.\n ...process.env,\n ...zeroCacheEnv,\n };\n zeroCacheProcess = spawn(zeroCacheScript, [], {\n env,\n stdio: 'inherit',\n shell: true,\n });\n zeroCacheProcess.on('exit', () => {\n lc.error?.(`${zeroCacheScript} exited. Exiting.`);\n process.exit(-1);\n });\n }\n\n async function deployPermissionsAndStartZeroCache() {\n if (await deployPermissions()) {\n await startZeroCache();\n }\n }\n\n if (config.schema.path) {\n if (config.query.url && config.mutate.url) {\n lc.warn?.(\n 'Using -p/--path/ZERO_SCHEMA_PATH with ZERO_MUTATE_URL and ZERO_QUERY_URL. ' +\n 'Continuing in hybrid mode: legacy permissions will still be deployed/watched, ' +\n 'and custom queries/mutations will use the API endpoints.',\n );\n }\n\n await deployPermissionsAndStartZeroCache();\n\n // Watch for file changes\n const watcher = watch(config.schema.path, {\n ignoreInitial: true,\n awaitWriteFinish: {stabilityThreshold: 500, pollInterval: 100},\n });\n const onFileChange = async () => {\n lc.info?.(`Detected ${config.schema.path} change.`);\n await deployPermissions();\n };\n watcher.on('add', onFileChange);\n watcher.on('change', onFileChange);\n watcher.on('unlink', onFileChange);\n } else {\n await startZeroCache();\n }\n}\n\nvoid main();\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import "../../shared/src/dotenv.js";
3
- import { createLogContext } from "../../shared/src/logging.js";
4
3
  import { parseOptions } from "../../shared/src/options.js";
5
4
  import { ZERO_ENV_VAR_PREFIX } from "../../zero-cache/src/config/zero-config.js";
5
+ import { createLogContext } from "../../shared/src/logging.js";
6
6
  import { decommissionOptions, decommissionZero } from "../../zero-cache/src/scripts/decommission.js";
7
7
  //#region src/zero-out.ts
8
8
  async function main() {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AAIrC,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oCAAoC,CAAC;AAElE,yCAAyC;AACzC,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,OAAO,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,KACvC,OAAO,CAAC,OAAO,CAAC,CAAC;AAMtB,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,CAAC,EAAE,IAAI,GAAG,SAAS,WAQlE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,UAAU,EACd,YAAY,EAAE,IAAI,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,GAC/C,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAoE3B;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CACvB,EAAE,EAAE,UAAU,EACd,aAAa,EAAE,IAAI,GAAG,SAAS,EAC/B,QAAQ,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,oBAgFlC;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,SAAS,GAAG,SAAS,CAgCxE"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,MAAM,CAAC;AAGrC,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oCAAoC,CAAC;AAElE,yCAAyC;AACzC,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,OAAO,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,KACvC,OAAO,CAAC,OAAO,CAAC,CAAC;AAMtB,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,CAAC,EAAE,IAAI,GAAG,SAAS,WAQlE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,UAAU,EACd,YAAY,EAAE,IAAI,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,GAC/C,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAoE3B;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CACvB,EAAE,EAAE,UAAU,EACd,aAAa,EAAE,IAAI,GAAG,SAAS,EAC/B,QAAQ,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,oBAgFlC;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,SAAS,GAAG,SAAS,CAgCxE"}