@rocicorp/zero 1.6.0-canary.11 → 1.6.0-canary.13
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.
- package/README.md +3 -28
- package/out/_virtual/{_@oxc-project_runtime@0.130.0 → _@oxc-project_runtime@0.122.0}/helpers/usingCtx.js +1 -1
- package/out/_virtual/_rolldown/runtime.js +1 -12
- package/out/analyze-query/src/analyze-cli.js.map +1 -1
- package/out/analyze-query/src/bin-analyze.js +1 -6
- package/out/analyze-query/src/bin-analyze.js.map +1 -1
- package/out/analyze-query/src/bin-transform.js.map +1 -1
- package/out/ast-to-zql/src/ast-to-zql.js.map +1 -1
- package/out/ast-to-zql/src/bin.js.map +1 -1
- package/out/ast-to-zql/src/format.js.map +1 -1
- package/out/datadog/src/datadog-log-sink.js.map +1 -1
- package/out/otel/src/enabled.js.map +1 -1
- package/out/otel/src/log-options.js.map +1 -1
- package/out/otel/src/maybe-time.js.map +1 -1
- package/out/otel/src/span.js.map +1 -1
- package/out/replicache/src/async-iterable-to-array.js.map +1 -1
- package/out/replicache/src/bg-interval.js.map +1 -1
- package/out/replicache/src/btree/diff.js.map +1 -1
- package/out/replicache/src/btree/node.js.map +1 -1
- package/out/replicache/src/btree/read.js.map +1 -1
- package/out/replicache/src/btree/splice.js.map +1 -1
- package/out/replicache/src/btree/write.js +3 -6
- package/out/replicache/src/btree/write.js.map +1 -1
- package/out/replicache/src/call-default-fetch.js.map +1 -1
- package/out/replicache/src/connection-loop-delegates.js.map +1 -1
- package/out/replicache/src/connection-loop.js.map +1 -1
- package/out/replicache/src/cookies.js.map +1 -1
- package/out/replicache/src/dag/chunk.js.map +1 -1
- package/out/replicache/src/dag/gc.js.map +1 -1
- package/out/replicache/src/dag/key.js.map +1 -1
- package/out/replicache/src/dag/lazy-store.js.map +1 -1
- package/out/replicache/src/dag/store-impl.js.map +1 -1
- package/out/replicache/src/dag/store.js.map +1 -1
- package/out/replicache/src/dag/visitor.js.map +1 -1
- package/out/replicache/src/db/commit.js.map +1 -1
- package/out/replicache/src/db/index.js.map +1 -1
- package/out/replicache/src/db/read.js.map +1 -1
- package/out/replicache/src/db/rebase.js.map +1 -1
- package/out/replicache/src/db/write.js.map +1 -1
- package/out/replicache/src/deleted-clients.js.map +1 -1
- package/out/replicache/src/error-responses.js.map +1 -1
- package/out/replicache/src/frozen-json.js.map +1 -1
- package/out/replicache/src/get-default-puller.js.map +1 -1
- package/out/replicache/src/get-default-pusher.js.map +1 -1
- package/out/replicache/src/get-kv-store-provider.js.map +1 -1
- package/out/replicache/src/hash.js.map +1 -1
- package/out/replicache/src/http-request-info.js.map +1 -1
- package/out/replicache/src/index-defs.js.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -1
- package/out/replicache/src/kv/idb-store.js.map +1 -1
- package/out/replicache/src/kv/mem-store.js.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/read-impl.js.map +1 -1
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/kv/sqlite-store.js +1 -4
- package/out/replicache/src/kv/sqlite-store.js.map +1 -1
- package/out/replicache/src/kv/throw-if-closed.js.map +1 -1
- package/out/replicache/src/kv/write-impl-base.js.map +1 -1
- package/out/replicache/src/kv/write-impl.js.map +1 -1
- package/out/replicache/src/lazy.js.map +1 -1
- package/out/replicache/src/log-options.js.map +1 -1
- package/out/replicache/src/make-idb-name.js.map +1 -1
- package/out/replicache/src/new-client-channel.js.map +1 -1
- package/out/replicache/src/on-persist-channel.js.map +1 -1
- package/out/replicache/src/patch-operation.js.map +1 -1
- package/out/replicache/src/pending-mutations.js.map +1 -1
- package/out/replicache/src/persist/client-gc.js.map +1 -1
- package/out/replicache/src/persist/client-group-gc.js.map +1 -1
- package/out/replicache/src/persist/client-groups.js +0 -40
- package/out/replicache/src/persist/client-groups.js.map +1 -1
- package/out/replicache/src/persist/clients.js +0 -28
- package/out/replicache/src/persist/clients.js.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
- package/out/replicache/src/persist/gather-mem-only-visitor.js.map +1 -1
- package/out/replicache/src/persist/gather-not-cached-visitor.js.map +1 -1
- package/out/replicache/src/persist/heartbeat.js.map +1 -1
- package/out/replicache/src/persist/idb-databases-store-db-name.js.map +1 -1
- package/out/replicache/src/persist/idb-databases-store.js.map +1 -1
- package/out/replicache/src/persist/make-client-id.js.map +1 -1
- package/out/replicache/src/persist/persist.js.map +1 -1
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/process-scheduler.js.map +1 -1
- package/out/replicache/src/pusher.js.map +1 -1
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/report-error.js.map +1 -1
- package/out/replicache/src/request-idle.js.map +1 -1
- package/out/replicache/src/scan-iterator.js.map +1 -1
- package/out/replicache/src/scan-options.js.map +1 -1
- package/out/replicache/src/set-interval-with-signal.js.map +1 -1
- package/out/replicache/src/subscriptions.js.map +1 -1
- package/out/replicache/src/sync/diff.js.map +1 -1
- package/out/replicache/src/sync/ids.js.map +1 -1
- package/out/replicache/src/sync/patch.js.map +1 -1
- package/out/replicache/src/sync/pull-error.js.map +1 -1
- package/out/replicache/src/sync/pull.js.map +1 -1
- package/out/replicache/src/sync/push.js.map +1 -1
- package/out/replicache/src/sync/request-id.js.map +1 -1
- package/out/replicache/src/to-error.js.map +1 -1
- package/out/replicache/src/transaction-closed-error.js.map +1 -1
- package/out/replicache/src/transactions.js.map +1 -1
- package/out/replicache/src/with-transactions.js.map +1 -1
- package/out/shared/src/abort-error.js.map +1 -1
- package/out/shared/src/arrays.js.map +1 -1
- package/out/shared/src/asserts.js.map +1 -1
- package/out/shared/src/bigint-json.js.map +1 -1
- package/out/shared/src/binary-search.js.map +1 -1
- package/out/shared/src/broadcast-channel.js.map +1 -1
- package/out/shared/src/browser-env.js.map +1 -1
- package/out/shared/src/btree-set.js.map +1 -1
- package/out/shared/src/cache.js.map +1 -1
- package/out/shared/src/centroid.js.map +1 -1
- package/out/shared/src/custom-key-map.js.map +1 -1
- package/out/shared/src/custom-key-set.js.map +1 -1
- package/out/shared/src/deep-clone.js.map +1 -1
- package/out/shared/src/deep-merge.js.map +1 -1
- package/out/shared/src/document-visible.js.map +1 -1
- package/out/shared/src/dotenv.js.map +1 -1
- package/out/shared/src/error.js.map +1 -1
- package/out/shared/src/hash.js.map +1 -1
- package/out/shared/src/iterables.js.map +1 -1
- package/out/shared/src/json-schema.js.map +1 -1
- package/out/shared/src/json.js.map +1 -1
- package/out/shared/src/logging-test-utils.js.map +1 -1
- package/out/shared/src/logging.js.map +1 -1
- package/out/shared/src/map.js.map +1 -1
- package/out/shared/src/must.js.map +1 -1
- package/out/shared/src/object-traversal.js.map +1 -1
- package/out/shared/src/objects.js.map +1 -1
- package/out/shared/src/options.js.map +1 -1
- package/out/shared/src/parse-big-int.js.map +1 -1
- package/out/shared/src/promise-race.js.map +1 -1
- package/out/shared/src/queue.d.ts.map +1 -1
- package/out/shared/src/queue.js +21 -15
- package/out/shared/src/queue.js.map +1 -1
- package/out/shared/src/rand.js.map +1 -1
- package/out/shared/src/random-uint64.js.map +1 -1
- package/out/shared/src/random-values.js.map +1 -1
- package/out/shared/src/record-proxy.js.map +1 -1
- package/out/shared/src/resolved-promises.js.map +1 -1
- package/out/shared/src/sentinels.js.map +1 -1
- package/out/shared/src/set-utils.js.map +1 -1
- package/out/shared/src/size-of-value.js.map +1 -1
- package/out/shared/src/sleep.js.map +1 -1
- package/out/shared/src/sorted-entries.js.map +1 -1
- package/out/shared/src/string-compare.js.map +1 -1
- package/out/shared/src/subscribable.js.map +1 -1
- package/out/shared/src/tdigest-schema.js.map +1 -1
- package/out/shared/src/tdigest.js.map +1 -1
- package/out/shared/src/valita.js.map +1 -1
- package/out/z2s/src/compiler.js.map +1 -1
- package/out/z2s/src/sql.js.map +1 -1
- package/out/zero/package.js +23 -23
- package/out/zero/package.js.map +1 -1
- package/out/zero/src/build-schema.js.map +1 -1
- package/out/zero/src/zero-cache-dev.js.map +1 -1
- package/out/zero/src/zero-out.js.map +1 -1
- package/out/zero-cache/src/auth/auth.js.map +1 -1
- package/out/zero-cache/src/auth/jwt.js.map +1 -1
- package/out/zero-cache/src/auth/load-permissions.js.map +1 -1
- package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/network.js.map +1 -1
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/server-context.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +0 -5
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom/fetch.js.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
- package/out/zero-cache/src/db/create.js.map +1 -1
- package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
- package/out/zero-cache/src/db/lite-tables.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +0 -19
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/db/migration.js +0 -19
- package/out/zero-cache/src/db/migration.js.map +1 -1
- package/out/zero-cache/src/db/pg-copy-binary.js.map +1 -1
- package/out/zero-cache/src/db/pg-copy.js.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
- package/out/zero-cache/src/db/pg-type-parser.js.map +1 -1
- package/out/zero-cache/src/db/run-transaction.js.map +1 -1
- package/out/zero-cache/src/db/specs.js.map +1 -1
- package/out/zero-cache/src/db/statements.js.map +1 -1
- package/out/zero-cache/src/db/transaction-pool.js.map +1 -1
- package/out/zero-cache/src/db/warmup.js.map +1 -1
- package/out/zero-cache/src/observability/events.js.map +1 -1
- package/out/zero-cache/src/observability/metrics.js.map +1 -1
- package/out/zero-cache/src/scripts/decommission.js.map +1 -1
- package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
- package/out/zero-cache/src/scripts/permissions.js.map +1 -1
- package/out/zero-cache/src/server/anonymous-otel-start.js +10 -11
- package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/server/logging.js.map +1 -1
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/mutator.js.map +1 -1
- package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -1
- package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
- package/out/zero-cache/src/server/otel-start.js +1 -1
- package/out/zero-cache/src/server/otel-start.js.map +1 -1
- package/out/zero-cache/src/server/priority-op.js.map +1 -1
- package/out/zero-cache/src/server/reaper.js.map +1 -1
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/runner/main.js.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
- package/out/zero-cache/src/server/runner/runtime.js.map +1 -1
- package/out/zero-cache/src/server/runner/zero-dispatcher.js.map +1 -1
- package/out/zero-cache/src/server/shadow-syncer.js.map +1 -1
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/server/worker-dispatcher.js.map +1 -1
- package/out/zero-cache/src/server/worker-urls.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
- package/out/zero-cache/src/services/analyze.js +2 -5
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/backfill-manager.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/change-stream-multiplexer.js.map +1 -1
- package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-metadata.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/backfill-stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/binary-reader.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/pgoutput-parser.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/lsn.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/validation.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/data.js +0 -2
- package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/status.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/upstream.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/backup-monitor.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/broadcast.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/forwarder.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/replica-monitor.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.js +25 -21
- package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/snapshot.js +0 -15
- package/out/zero-cache/src/services/change-streamer/snapshot.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/subscriber.js.map +1 -1
- package/out/zero-cache/src/services/heapz.js.map +1 -1
- package/out/zero-cache/src/services/http-service.js.map +1 -1
- package/out/zero-cache/src/services/life-cycle.js.map +1 -1
- package/out/zero-cache/src/services/limiter/sliding-window-limiter.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/error.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
- package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
- package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
- package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
- package/out/zero-cache/src/services/replicator/reporter/report-schema.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/change-log.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/column-metadata.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/table-metadata.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
- package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
- package/out/zero-cache/src/services/run-ast.d.ts.map +1 -1
- package/out/zero-cache/src/services/run-ast.js +0 -1
- package/out/zero-cache/src/services/run-ast.js.map +1 -1
- package/out/zero-cache/src/services/runner.js.map +1 -1
- package/out/zero-cache/src/services/running-state.js.map +1 -1
- package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -1
- package/out/zero-cache/src/services/statz.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js +1 -2
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/drain-coordinator.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts +14 -0
- package/out/zero-cache/src/services/view-syncer/inspect-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js +25 -2
- package/out/zero-cache/src/services/view-syncer/inspect-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-set-signature.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.js +113 -97
- package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.js +1 -103
- package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/tracer.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/ttl-clock.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +1 -4
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/configuration-error.js.map +1 -1
- package/out/zero-cache/src/types/error-with-level.js.map +1 -1
- package/out/zero-cache/src/types/http.js.map +1 -1
- package/out/zero-cache/src/types/lexi-version.js.map +1 -1
- package/out/zero-cache/src/types/lite.js.map +1 -1
- package/out/zero-cache/src/types/names.js.map +1 -1
- package/out/zero-cache/src/types/pg-data-type.js.map +1 -1
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/types/processes.js.map +1 -1
- package/out/zero-cache/src/types/profiler.js.map +1 -1
- package/out/zero-cache/src/types/row-key.js.map +1 -1
- package/out/zero-cache/src/types/shards.js.map +1 -1
- package/out/zero-cache/src/types/sql.js.map +1 -1
- package/out/zero-cache/src/types/state-version.js.map +1 -1
- package/out/zero-cache/src/types/streams.js.map +1 -1
- package/out/zero-cache/src/types/strings.js.map +1 -1
- package/out/zero-cache/src/types/subscription.js.map +1 -1
- package/out/zero-cache/src/types/timeout.js.map +1 -1
- package/out/zero-cache/src/types/url-params.js.map +1 -1
- package/out/zero-cache/src/types/websocket-handoff.js.map +1 -1
- package/out/zero-cache/src/types/ws.js.map +1 -1
- package/out/zero-cache/src/workers/connect-params.js.map +1 -1
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/mutator.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.js.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/active-clients-manager.js.map +1 -1
- package/out/zero-client/src/client/connection-manager.js +1 -2
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/connection.js.map +1 -1
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/crud-impl.js.map +1 -1
- package/out/zero-client/src/client/crud.js.map +1 -1
- package/out/zero-client/src/client/custom.js +1 -2
- package/out/zero-client/src/client/custom.js.map +1 -1
- package/out/zero-client/src/client/delete-clients-manager.js.map +1 -1
- package/out/zero-client/src/client/enable-analytics.js.map +1 -1
- package/out/zero-client/src/client/error.js.map +1 -1
- package/out/zero-client/src/client/http-string.js.map +1 -1
- package/out/zero-client/src/client/inspector/client-group.js.map +1 -1
- package/out/zero-client/src/client/inspector/client.js.map +1 -1
- package/out/zero-client/src/client/inspector/html-dialog-prompt.js.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.js.map +1 -1
- package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
- package/out/zero-client/src/client/inspector/query.js.map +1 -1
- package/out/zero-client/src/client/ivm-branch.js.map +1 -1
- package/out/zero-client/src/client/keys.js.map +1 -1
- package/out/zero-client/src/client/log-options.js.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
- package/out/zero-client/src/client/metrics.js.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/reload-error-handler.js.map +1 -1
- package/out/zero-client/src/client/server-option.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero-poke-handler.js.map +1 -1
- package/out/zero-client/src/client/zero-rep.js.map +1 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +32 -58
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/util/nanoid.js.map +1 -1
- package/out/zero-client/src/util/socket.d.ts +3 -0
- package/out/zero-client/src/util/socket.d.ts.map +1 -0
- package/out/zero-client/src/util/socket.js +8 -0
- package/out/zero-client/src/util/socket.js.map +1 -0
- package/out/zero-protocol/src/analyze-query-result.js +0 -3
- package/out/zero-protocol/src/analyze-query-result.js.map +1 -1
- package/out/zero-protocol/src/application-error.js.map +1 -1
- package/out/zero-protocol/src/ast.js.map +1 -1
- package/out/zero-protocol/src/change-desired-queries.js +0 -1
- package/out/zero-protocol/src/change-desired-queries.js.map +1 -1
- package/out/zero-protocol/src/client-schema.js.map +1 -1
- package/out/zero-protocol/src/close-connection.js.map +1 -1
- package/out/zero-protocol/src/connect.js +0 -7
- package/out/zero-protocol/src/connect.js.map +1 -1
- package/out/zero-protocol/src/custom-queries.js.map +1 -1
- package/out/zero-protocol/src/data.js.map +1 -1
- package/out/zero-protocol/src/delete-clients.js.map +1 -1
- package/out/zero-protocol/src/down.js.map +1 -1
- package/out/zero-protocol/src/error.js +0 -7
- package/out/zero-protocol/src/error.js.map +1 -1
- package/out/zero-protocol/src/inspect-down.js.map +1 -1
- package/out/zero-protocol/src/inspect-up.js +0 -1
- package/out/zero-protocol/src/inspect-up.js.map +1 -1
- package/out/zero-protocol/src/mutate-server.js.map +1 -1
- package/out/zero-protocol/src/mutation-id.js.map +1 -1
- package/out/zero-protocol/src/mutation.js.map +1 -1
- package/out/zero-protocol/src/mutations-patch.js.map +1 -1
- package/out/zero-protocol/src/ping.js.map +1 -1
- package/out/zero-protocol/src/poke.js +0 -4
- package/out/zero-protocol/src/poke.js.map +1 -1
- package/out/zero-protocol/src/pong.js.map +1 -1
- package/out/zero-protocol/src/primary-key.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-protocol/src/pull.js.map +1 -1
- package/out/zero-protocol/src/push.js +0 -16
- package/out/zero-protocol/src/push.js.map +1 -1
- package/out/zero-protocol/src/queries-patch.js.map +1 -1
- package/out/zero-protocol/src/query-hash.js.map +1 -1
- package/out/zero-protocol/src/query-server.js.map +1 -1
- package/out/zero-protocol/src/row-patch.js.map +1 -1
- package/out/zero-protocol/src/up.js.map +1 -1
- package/out/zero-protocol/src/update-auth.js.map +1 -1
- package/out/zero-protocol/src/version.js.map +1 -1
- package/out/zero-react/src/use-connection-state.js +2 -4
- package/out/zero-react/src/use-connection-state.js.map +1 -1
- package/out/zero-react/src/use-query.js +4 -6
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-react/src/use-zero-online.js +2 -4
- package/out/zero-react/src/use-zero-online.js.map +1 -1
- package/out/zero-react/src/zero-provider.js +12 -15
- package/out/zero-react/src/zero-provider.js.map +1 -1
- package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
- package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
- package/out/zero-schema/src/builder/table-builder.js.map +1 -1
- package/out/zero-schema/src/compiled-permissions.js.map +1 -1
- package/out/zero-schema/src/name-mapper.js.map +1 -1
- package/out/zero-schema/src/permissions.js.map +1 -1
- package/out/zero-schema/src/schema-config.js.map +1 -1
- package/out/zero-server/src/adapters/drizzle.js.map +1 -1
- package/out/zero-server/src/adapters/kysely.js.map +1 -1
- package/out/zero-server/src/adapters/pg.js +1 -1
- package/out/zero-server/src/adapters/pg.js.map +1 -1
- package/out/zero-server/src/adapters/postgresjs.js.map +1 -1
- package/out/zero-server/src/adapters/prisma.js.map +1 -1
- package/out/zero-server/src/custom.js +1 -2
- package/out/zero-server/src/custom.js.map +1 -1
- package/out/zero-server/src/logging.js.map +1 -1
- package/out/zero-server/src/pg-query-executor.js.map +1 -1
- package/out/zero-server/src/process-mutations.js.map +1 -1
- package/out/zero-server/src/push-processor.js.map +1 -1
- package/out/zero-server/src/queries/process-queries.js.map +1 -1
- package/out/zero-server/src/schema.js.map +1 -1
- package/out/zero-server/src/zql-database.js.map +1 -1
- package/out/zero-solid/src/solid-view.js +1 -1
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zero-solid/src/use-connection-state.js +1 -1
- package/out/zero-solid/src/use-connection-state.js.map +1 -1
- package/out/zero-solid/src/use-query.js +2 -2
- package/out/zero-solid/src/use-query.js.map +1 -1
- package/out/zero-solid/src/use-zero-online.js +1 -1
- package/out/zero-solid/src/use-zero-online.js.map +1 -1
- package/out/zero-solid/src/use-zero.js +1 -1
- package/out/zero-solid/src/use-zero.js.map +1 -1
- package/out/zero-types/src/format.js.map +1 -1
- package/out/zero-types/src/name-mapper.js.map +1 -1
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/builder/debug-delegate.d.ts +0 -5
- package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
- package/out/zql/src/builder/debug-delegate.js +1 -10
- package/out/zql/src/builder/debug-delegate.js.map +1 -1
- package/out/zql/src/builder/filter.js.map +1 -1
- package/out/zql/src/builder/like.js.map +1 -1
- package/out/zql/src/error.js.map +1 -1
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/cap.js.map +1 -1
- package/out/zql/src/ivm/change.js.map +1 -1
- package/out/zql/src/ivm/constraint.js +1 -1
- package/out/zql/src/ivm/constraint.js.map +1 -1
- package/out/zql/src/ivm/data.js.map +1 -1
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/filter-push.js.map +1 -1
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.d.ts +8 -4
- package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +63 -59
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/join-utils.js.map +1 -1
- package/out/zql/src/ivm/join.js.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/memory-storage.js.map +1 -1
- package/out/zql/src/ivm/operator.d.ts +1 -1
- package/out/zql/src/ivm/operator.js.map +1 -1
- package/out/zql/src/ivm/push-accumulated.js.map +1 -1
- package/out/zql/src/ivm/schema.d.ts +8 -0
- package/out/zql/src/ivm/schema.d.ts.map +1 -1
- package/out/zql/src/ivm/skip-yields.js.map +1 -1
- package/out/zql/src/ivm/skip.js.map +1 -1
- package/out/zql/src/ivm/source.js.map +1 -1
- package/out/zql/src/ivm/stream.js.map +1 -1
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/union-fan-out.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/mutate/crud.js.map +1 -1
- package/out/zql/src/mutate/custom.js.map +1 -1
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/mutate/mutator.js.map +1 -1
- package/out/zql/src/planner/planner-builder.js.map +1 -1
- package/out/zql/src/planner/planner-connection.js.map +1 -1
- package/out/zql/src/planner/planner-constraint.js.map +1 -1
- package/out/zql/src/planner/planner-debug.js.map +1 -1
- package/out/zql/src/planner/planner-fan-in.js.map +1 -1
- package/out/zql/src/planner/planner-fan-out.js.map +1 -1
- package/out/zql/src/planner/planner-graph.js.map +1 -1
- package/out/zql/src/planner/planner-join.d.ts.map +1 -1
- package/out/zql/src/planner/planner-join.js +1 -2
- package/out/zql/src/planner/planner-join.js.map +1 -1
- package/out/zql/src/planner/planner-node.js.map +1 -1
- package/out/zql/src/planner/planner-source.js.map +1 -1
- package/out/zql/src/planner/planner-terminus.js.map +1 -1
- package/out/zql/src/query/complete-ordering.js.map +1 -1
- package/out/zql/src/query/create-builder.js.map +1 -1
- package/out/zql/src/query/error.js.map +1 -1
- package/out/zql/src/query/escape-like.js.map +1 -1
- package/out/zql/src/query/expression.js.map +1 -1
- package/out/zql/src/query/measure-push-operator.js.map +1 -1
- package/out/zql/src/query/metrics-delegate.js.map +1 -1
- package/out/zql/src/query/named.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-impl.js +1 -1
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query-internals.js.map +1 -1
- package/out/zql/src/query/query-registry.js.map +1 -1
- package/out/zql/src/query/runnable-query-impl.js.map +1 -1
- package/out/zql/src/query/static-query.js.map +1 -1
- package/out/zql/src/query/ttl.js.map +1 -1
- package/out/zql/src/query/validate-input.js.map +1 -1
- package/out/zqlite/src/database-storage.js.map +1 -1
- package/out/zqlite/src/db.js.map +1 -1
- package/out/zqlite/src/explain-queries.js.map +1 -1
- package/out/zqlite/src/internal/sql-inline.js.map +1 -1
- package/out/zqlite/src/internal/sql.js.map +1 -1
- package/out/zqlite/src/internal/statement-cache.js.map +1 -1
- package/out/zqlite/src/query-builder.js.map +1 -1
- package/out/zqlite/src/query-delegate.js.map +1 -1
- package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
- package/out/zqlite/src/sqlite-cost-model.js.map +1 -1
- package/out/zqlite/src/sqlite-stat-fanout.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +6 -6
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +23 -23
- package/out/_virtual/__vite-optional-peer-dep_pg-native_pg.js +0 -13
- package/out/_virtual/__vite-optional-peer-dep_pg-native_pg.js.map +0 -1
- package/out/node_modules/.pnpm/@opentelemetry_semantic-conventions@1.41.1/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js +0 -12
- package/out/node_modules/.pnpm/@opentelemetry_semantic-conventions@1.41.1/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js.map +0 -1
- package/out/node_modules/.pnpm/pg-cloudflare@1.3.0/node_modules/pg-cloudflare/dist/empty.js +0 -11
- package/out/node_modules/.pnpm/pg-cloudflare@1.3.0/node_modules/pg-cloudflare/dist/empty.js.map +0 -1
- package/out/node_modules/.pnpm/pg-connection-string@2.12.0/node_modules/pg-connection-string/index.js +0 -130
- package/out/node_modules/.pnpm/pg-connection-string@2.12.0/node_modules/pg-connection-string/index.js.map +0 -1
- package/out/node_modules/.pnpm/pg-int8@1.0.1/node_modules/pg-int8/index.js +0 -62
- package/out/node_modules/.pnpm/pg-int8@1.0.1/node_modules/pg-int8/index.js.map +0 -1
- package/out/node_modules/.pnpm/pg-pool@3.13.0_pg@8.20.0/node_modules/pg-pool/index.js +0 -353
- package/out/node_modules/.pnpm/pg-pool@3.13.0_pg@8.20.0/node_modules/pg-pool/index.js.map +0 -1
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-reader.js +0 -60
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-reader.js.map +0 -1
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-writer.js +0 -81
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/buffer-writer.js.map +0 -1
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/index.js +0 -35
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/index.js.map +0 -1
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/messages.js +0 -167
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/messages.js.map +0 -1
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/parser.js +0 -288
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/parser.js.map +0 -1
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/serializer.js +0 -177
- package/out/node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/serializer.js.map +0 -1
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/index.js +0 -46
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/index.js.map +0 -1
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/arrayParser.js +0 -16
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/arrayParser.js.map +0 -1
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/binaryParsers.js +0 -165
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/binaryParsers.js.map +0 -1
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/builtins.js +0 -81
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/builtins.js.map +0 -1
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/textParsers.js +0 -167
- package/out/node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/lib/textParsers.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/esm/index.js +0 -19
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/esm/index.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/client.js +0 -508
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/client.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection-parameters.js +0 -104
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection-parameters.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection.js +0 -160
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/connection.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/cert-signatures.js +0 -97
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/cert-signatures.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/sasl.js +0 -131
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/sasl.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-legacy.js +0 -39
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-legacy.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-webcrypto.js +0 -89
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils-webcrypto.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils.js +0 -13
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/crypto/utils.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/defaults.js +0 -46
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/defaults.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/index.js +0 -71
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/index.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/client.js +0 -226
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/client.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/index.js +0 -11
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/index.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/query.js +0 -117
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/native/query.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/query.js +0 -151
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/query.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/result.js +0 -76
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/result.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/stream.js +0 -73
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/stream.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/type-overrides.js +0 -35
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/type-overrides.js.map +0 -1
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/utils.js +0 -118
- package/out/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/utils.js.map +0 -1
- package/out/node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/helper.js +0 -147
- package/out/node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/helper.js.map +0 -1
- package/out/node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/index.js +0 -21
- package/out/node_modules/.pnpm/pgpass@1.0.5/node_modules/pgpass/lib/index.js.map +0 -1
- package/out/node_modules/.pnpm/postgres-array@2.0.0/node_modules/postgres-array/index.js +0 -84
- package/out/node_modules/.pnpm/postgres-array@2.0.0/node_modules/postgres-array/index.js.map +0 -1
- package/out/node_modules/.pnpm/postgres-bytea@1.0.1/node_modules/postgres-bytea/index.js +0 -28
- package/out/node_modules/.pnpm/postgres-bytea@1.0.1/node_modules/postgres-bytea/index.js.map +0 -1
- package/out/node_modules/.pnpm/postgres-date@1.0.7/node_modules/postgres-date/index.js +0 -65
- package/out/node_modules/.pnpm/postgres-date@1.0.7/node_modules/postgres-date/index.js.map +0 -1
- package/out/node_modules/.pnpm/postgres-interval@1.2.0/node_modules/postgres-interval/index.js +0 -107
- package/out/node_modules/.pnpm/postgres-interval@1.2.0/node_modules/postgres-interval/index.js.map +0 -1
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.development.js +0 -696
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.development.js.map +0 -1
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.production.min.js +0 -44
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.production.min.js.map +0 -1
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js +0 -1585
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.development.js.map +0 -1
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js +0 -329
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js.map +0 -1
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/index.js +0 -13
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/index.js.map +0 -1
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime.js +0 -13
- package/out/node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime.js.map +0 -1
- package/out/node_modules/.pnpm/solid-js@1.9.13/node_modules/solid-js/dist/server.js +0 -131
- package/out/node_modules/.pnpm/solid-js@1.9.13/node_modules/solid-js/dist/server.js.map +0 -1
- package/out/node_modules/.pnpm/solid-js@1.9.13/node_modules/solid-js/store/dist/server.js +0 -96
- package/out/node_modules/.pnpm/solid-js@1.9.13/node_modules/solid-js/store/dist/server.js.map +0 -1
- package/out/node_modules/.pnpm/split2@4.2.0/node_modules/split2/index.js +0 -95
- package/out/node_modules/.pnpm/split2@4.2.0/node_modules/split2/index.js.map +0 -1
- package/out/node_modules/.pnpm/xtend@4.0.2/node_modules/xtend/mutable.js +0 -18
- package/out/node_modules/.pnpm/xtend@4.0.2/node_modules/xtend/mutable.js.map +0 -1
- package/out/shared/src/ring-buffer.d.ts +0 -32
- package/out/shared/src/ring-buffer.d.ts.map +0 -1
- package/out/shared/src/ring-buffer.js +0 -109
- package/out/shared/src/ring-buffer.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tdigest.js","names":["#maxProcessed","#maxUnprocessed","#processed","#unprocessed","#cumulative","#processedWeight","#unprocessedWeight","#min","#max","#process","#integratedQ","#integratedLocation","#updateCumulative"],"sources":["../../../../shared/src/tdigest.ts"],"sourcesContent":["// Apache License 2.0\n// https://github.com/influxdata/tdigest\n\nimport {binarySearch} from './binary-search.ts';\nimport {Centroid, sortCentroidList, type CentroidList} from './centroid.ts';\nimport type {TDigestJSON} from './tdigest-schema.ts';\n\nexport interface ReadonlyTDigest {\n readonly count: () => number;\n readonly quantile: (q: number) => number;\n readonly cdf: (x: number) => number;\n}\n\n// TDigest is a data structure for accurate on-line accumulation of\n// rank-based statistics such as quantiles and trimmed means.\nexport class TDigest {\n readonly compression: number;\n\n #maxProcessed: number;\n #maxUnprocessed: number;\n #processed!: CentroidList;\n #unprocessed!: CentroidList;\n #cumulative!: number[];\n #processedWeight!: number;\n #unprocessedWeight!: number;\n #min!: number;\n #max!: number;\n\n constructor(compression: number = 1000) {\n this.compression = compression;\n this.#maxProcessed = processedSize(0, this.compression);\n this.#maxUnprocessed = unprocessedSize(0, this.compression);\n this.reset();\n }\n\n /**\n * fromJSON creates a TDigest from a JSON-serializable representation.\n * The data should be an object with compression and centroids array.\n */\n static fromJSON(data: Readonly<TDigestJSON>): TDigest {\n const digest = new TDigest(data[0]);\n if (data.length % 2 !== 1) {\n throw new Error('Invalid centroids array');\n }\n for (let i = 1; i < data.length; i += 2) {\n digest.add(data[i], data[i + 1]);\n }\n return digest;\n }\n\n reset(): void {\n this.#processed = [];\n this.#unprocessed = [];\n this.#cumulative = [];\n this.#processedWeight = 0;\n this.#unprocessedWeight = 0;\n this.#min = Number.MAX_VALUE;\n this.#max = -Number.MAX_VALUE;\n }\n\n add(mean: number, weight: number = 1) {\n this.addCentroid(new Centroid(mean, weight));\n }\n\n /** AddCentroidList can quickly add multiple centroids. */\n addCentroidList(centroidList: CentroidList) {\n for (const c of centroidList) {\n this.addCentroid(c);\n }\n }\n\n /**\n * AddCentroid adds a single centroid.\n * Weights which are not a number or are <= 0 are ignored, as are NaN means.\n */\n addCentroid(c: Centroid): void {\n if (\n Number.isNaN(c.mean) ||\n c.weight <= 0 ||\n Number.isNaN(c.weight) ||\n !Number.isFinite(c.weight)\n ) {\n return;\n }\n\n this.#unprocessed.push(new Centroid(c.mean, c.weight));\n this.#unprocessedWeight += c.weight;\n\n if (\n this.#processed.length > this.#maxProcessed ||\n this.#unprocessed.length > this.#maxUnprocessed\n ) {\n this.#process();\n }\n }\n\n /**\n * Merges the supplied digest into this digest. Functionally equivalent to\n * calling t.AddCentroidList(t2.Centroids(nil)), but avoids making an extra\n * copy of the CentroidList.\n **/\n merge(t2: TDigest) {\n t2.#process();\n this.addCentroidList(t2.#processed);\n }\n\n #process() {\n if (\n this.#unprocessed.length > 0 ||\n this.#processed.length > this.#maxProcessed\n ) {\n // Append all processed centroids to the unprocessed list and sort\n this.#unprocessed.push(...this.#processed);\n sortCentroidList(this.#unprocessed);\n\n // Reset processed list with first centroid\n this.#processed.length = 0;\n this.#processed.push(this.#unprocessed[0]);\n\n this.#processedWeight += this.#unprocessedWeight;\n this.#unprocessedWeight = 0;\n let soFar = this.#unprocessed[0].weight;\n let limit = this.#processedWeight * this.#integratedQ(1);\n for (let i = 1; i < this.#unprocessed.length; i++) {\n const centroid = this.#unprocessed[i];\n const projected = soFar + centroid.weight;\n if (projected <= limit) {\n soFar = projected;\n // oxlint-disable-next-line typescript/no-non-null-assertion\n this.#processed.at(-1)!.add(centroid);\n } else {\n const k1 = this.#integratedLocation(soFar / this.#processedWeight);\n limit = this.#processedWeight * this.#integratedQ(k1 + 1);\n soFar += centroid.weight;\n this.#processed.push(centroid);\n }\n }\n this.#min = Math.min(this.#min, this.#processed[0].mean);\n // oxlint-disable-next-line typescript/no-non-null-assertion\n this.#max = Math.max(this.#max, this.#processed.at(-1)!.mean);\n this.#unprocessed.length = 0;\n }\n }\n\n /**\n * Centroids returns a copy of processed centroids.\n * Useful when aggregating multiple t-digests.\n *\n * Centroids are appended to the passed CentroidList; if you're re-using a\n * buffer, be sure to pass cl[:0].\n */\n centroids(cl: CentroidList = []): CentroidList {\n this.#process();\n return [...cl, ...this.#processed];\n }\n\n count(): number {\n this.#process();\n\n // this.process always updates this.processedWeight to the total count of all\n // centroids, so we don't need to re-count here.\n return this.#processedWeight;\n }\n\n /**\n * toJSON returns a JSON-serializable representation of the digest.\n * This processes the digest and returns an object with compression and centroid data.\n */\n toJSON(): TDigestJSON {\n this.#process();\n const data: TDigestJSON = [this.compression];\n for (const centroid of this.#processed) {\n data.push(centroid.mean, centroid.weight);\n }\n return data;\n }\n\n #updateCumulative() {\n // Weight can only increase, so the final cumulative value will always be\n // either equal to, or less than, the total weight. If they are the same,\n // then nothing has changed since the last update.\n if (\n this.#cumulative.length > 0 &&\n this.#cumulative.at(-1) === this.#processedWeight\n ) {\n return;\n }\n const n = this.#processed.length + 1;\n if (this.#cumulative.length > n) {\n this.#cumulative.length = n;\n }\n\n let prev = 0;\n for (let i = 0; i < this.#processed.length; i++) {\n const centroid = this.#processed[i];\n const cur = centroid.weight;\n this.#cumulative[i] = prev + cur / 2;\n prev += cur;\n }\n this.#cumulative[this.#processed.length] = prev;\n }\n\n // Quantile returns the (approximate) quantile of\n // the distribution. Accepted values for q are between 0 and 1.\n // Returns NaN if Count is zero or bad inputs.\n quantile(q: number): number {\n this.#process();\n this.#updateCumulative();\n if (q < 0 || q > 1 || this.#processed.length === 0) {\n return NaN;\n }\n if (this.#processed.length === 1) {\n return this.#processed[0].mean;\n }\n const index = q * this.#processedWeight;\n if (index <= this.#processed[0].weight / 2) {\n return (\n this.#min +\n ((2 * index) / this.#processed[0].weight) *\n (this.#processed[0].mean - this.#min)\n );\n }\n\n const lower = binarySearch(\n this.#cumulative.length,\n (i: number) => -this.#cumulative[i] + index,\n );\n\n if (lower + 1 !== this.#cumulative.length) {\n const z1 = index - this.#cumulative[lower - 1];\n const z2 = this.#cumulative[lower] - index;\n return weightedAverage(\n this.#processed[lower - 1].mean,\n z2,\n this.#processed[lower].mean,\n z1,\n );\n }\n\n const z1 =\n index - this.#processedWeight - this.#processed[lower - 1].weight / 2;\n const z2 = this.#processed[lower - 1].weight / 2 - z1;\n // oxlint-disable-next-line typescript/no-non-null-assertion\n return weightedAverage(this.#processed.at(-1)!.mean, z1, this.#max, z2);\n }\n\n /**\n * CDF returns the cumulative distribution function for a given value x.\n */\n cdf(x: number): number {\n this.#process();\n this.#updateCumulative();\n switch (this.#processed.length) {\n case 0:\n return 0;\n case 1: {\n const width = this.#max - this.#min;\n if (x <= this.#min) {\n return 0;\n }\n if (x >= this.#max) {\n return 1;\n }\n if (x - this.#min <= width) {\n // min and max are too close together to do any viable interpolation\n return 0.5;\n }\n return (x - this.#min) / width;\n }\n }\n\n if (x <= this.#min) {\n return 0;\n }\n if (x >= this.#max) {\n return 1;\n }\n const m0 = this.#processed[0].mean;\n // Left Tail\n if (x <= m0) {\n if (m0 - this.#min > 0) {\n return (\n (((x - this.#min) / (m0 - this.#min)) * this.#processed[0].weight) /\n this.#processedWeight /\n 2\n );\n }\n return 0;\n }\n // Right Tail\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const mn = this.#processed.at(-1)!.mean;\n if (x >= mn) {\n if (this.#max - mn > 0) {\n return (\n 1 -\n (((this.#max - x) / (this.#max - mn)) *\n // oxlint-disable-next-line typescript/no-non-null-assertion\n this.#processed.at(-1)!.weight) /\n this.#processedWeight /\n 2\n );\n }\n return 1;\n }\n\n const upper = binarySearch(\n this.#processed.length,\n // Treat equals as greater than, so we can use the upper index\n // This is equivalent to:\n // i => this.#processed[i].mean > x ? -1 : 1,\n i => x - this.#processed[i].mean || 1,\n );\n\n const z1 = x - this.#processed[upper - 1].mean;\n const z2 = this.#processed[upper].mean - x;\n return (\n weightedAverage(\n this.#cumulative[upper - 1],\n z2,\n this.#cumulative[upper],\n z1,\n ) / this.#processedWeight\n );\n }\n\n #integratedQ(k: number): number {\n return (\n (Math.sin(\n (Math.min(k, this.compression) * Math.PI) / this.compression -\n Math.PI / 2,\n ) +\n 1) /\n 2\n );\n }\n\n #integratedLocation(q: number): number {\n return (this.compression * (Math.asin(2 * q - 1) + Math.PI / 2)) / Math.PI;\n }\n}\n\n// Calculate number of bytes needed for a tdigest of size c,\n// where c is the compression value\nexport function byteSizeForCompression(comp: number): number {\n const c = comp | 0;\n // // A centroid is 2 float64s, so we need 16 bytes for each centroid\n // float_size := 8\n // centroid_size := 2 * float_size\n\n // // Unprocessed and processed can grow up to length c\n // unprocessed_size := centroid_size * c\n // processed_size := unprocessed_size\n\n // // the cumulative field can also be of length c, but each item is a single float64\n // cumulative_size := float_size * c // <- this could also be unprocessed_size / 2\n\n // return unprocessed_size + processed_size + cumulative_size\n\n // // or, more succinctly:\n // return float_size * c * 5\n\n // or even more succinctly\n return c * 40;\n}\n\nfunction weightedAverage(\n x1: number,\n w1: number,\n x2: number,\n w2: number,\n): number {\n if (x1 <= x2) {\n return weightedAverageSorted(x1, w1, x2, w2);\n }\n return weightedAverageSorted(x2, w2, x1, w1);\n}\n\nfunction weightedAverageSorted(\n x1: number,\n w1: number,\n x2: number,\n w2: number,\n): number {\n const x = (x1 * w1 + x2 * w2) / (w1 + w2);\n return Math.max(x1, Math.min(x, x2));\n}\n\nfunction processedSize(size: number, compression: number): number {\n if (size === 0) {\n return Math.ceil(compression) * 2;\n }\n return size;\n}\n\nfunction unprocessedSize(size: number, compression: number): number {\n if (size === 0) {\n return Math.ceil(compression) * 8;\n }\n return size;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tdigest.js","names":["#maxProcessed","#maxUnprocessed","#processed","#unprocessed","#cumulative","#processedWeight","#unprocessedWeight","#min","#max","#process","#integratedQ","#integratedLocation","#updateCumulative"],"sources":["../../../../shared/src/tdigest.ts"],"sourcesContent":["// Apache License 2.0\n// https://github.com/influxdata/tdigest\n\nimport {binarySearch} from './binary-search.ts';\nimport {Centroid, sortCentroidList, type CentroidList} from './centroid.ts';\nimport type {TDigestJSON} from './tdigest-schema.ts';\n\nexport interface ReadonlyTDigest {\n readonly count: () => number;\n readonly quantile: (q: number) => number;\n readonly cdf: (x: number) => number;\n}\n\n// TDigest is a data structure for accurate on-line accumulation of\n// rank-based statistics such as quantiles and trimmed means.\nexport class TDigest {\n readonly compression: number;\n\n #maxProcessed: number;\n #maxUnprocessed: number;\n #processed!: CentroidList;\n #unprocessed!: CentroidList;\n #cumulative!: number[];\n #processedWeight!: number;\n #unprocessedWeight!: number;\n #min!: number;\n #max!: number;\n\n constructor(compression: number = 1000) {\n this.compression = compression;\n this.#maxProcessed = processedSize(0, this.compression);\n this.#maxUnprocessed = unprocessedSize(0, this.compression);\n this.reset();\n }\n\n /**\n * fromJSON creates a TDigest from a JSON-serializable representation.\n * The data should be an object with compression and centroids array.\n */\n static fromJSON(data: Readonly<TDigestJSON>): TDigest {\n const digest = new TDigest(data[0]);\n if (data.length % 2 !== 1) {\n throw new Error('Invalid centroids array');\n }\n for (let i = 1; i < data.length; i += 2) {\n digest.add(data[i], data[i + 1]);\n }\n return digest;\n }\n\n reset(): void {\n this.#processed = [];\n this.#unprocessed = [];\n this.#cumulative = [];\n this.#processedWeight = 0;\n this.#unprocessedWeight = 0;\n this.#min = Number.MAX_VALUE;\n this.#max = -Number.MAX_VALUE;\n }\n\n add(mean: number, weight: number = 1) {\n this.addCentroid(new Centroid(mean, weight));\n }\n\n /** AddCentroidList can quickly add multiple centroids. */\n addCentroidList(centroidList: CentroidList) {\n for (const c of centroidList) {\n this.addCentroid(c);\n }\n }\n\n /**\n * AddCentroid adds a single centroid.\n * Weights which are not a number or are <= 0 are ignored, as are NaN means.\n */\n addCentroid(c: Centroid): void {\n if (\n Number.isNaN(c.mean) ||\n c.weight <= 0 ||\n Number.isNaN(c.weight) ||\n !Number.isFinite(c.weight)\n ) {\n return;\n }\n\n this.#unprocessed.push(new Centroid(c.mean, c.weight));\n this.#unprocessedWeight += c.weight;\n\n if (\n this.#processed.length > this.#maxProcessed ||\n this.#unprocessed.length > this.#maxUnprocessed\n ) {\n this.#process();\n }\n }\n\n /**\n * Merges the supplied digest into this digest. Functionally equivalent to\n * calling t.AddCentroidList(t2.Centroids(nil)), but avoids making an extra\n * copy of the CentroidList.\n **/\n merge(t2: TDigest) {\n t2.#process();\n this.addCentroidList(t2.#processed);\n }\n\n #process() {\n if (\n this.#unprocessed.length > 0 ||\n this.#processed.length > this.#maxProcessed\n ) {\n // Append all processed centroids to the unprocessed list and sort\n this.#unprocessed.push(...this.#processed);\n sortCentroidList(this.#unprocessed);\n\n // Reset processed list with first centroid\n this.#processed.length = 0;\n this.#processed.push(this.#unprocessed[0]);\n\n this.#processedWeight += this.#unprocessedWeight;\n this.#unprocessedWeight = 0;\n let soFar = this.#unprocessed[0].weight;\n let limit = this.#processedWeight * this.#integratedQ(1);\n for (let i = 1; i < this.#unprocessed.length; i++) {\n const centroid = this.#unprocessed[i];\n const projected = soFar + centroid.weight;\n if (projected <= limit) {\n soFar = projected;\n // oxlint-disable-next-line typescript/no-non-null-assertion\n this.#processed.at(-1)!.add(centroid);\n } else {\n const k1 = this.#integratedLocation(soFar / this.#processedWeight);\n limit = this.#processedWeight * this.#integratedQ(k1 + 1);\n soFar += centroid.weight;\n this.#processed.push(centroid);\n }\n }\n this.#min = Math.min(this.#min, this.#processed[0].mean);\n // oxlint-disable-next-line typescript/no-non-null-assertion\n this.#max = Math.max(this.#max, this.#processed.at(-1)!.mean);\n this.#unprocessed.length = 0;\n }\n }\n\n /**\n * Centroids returns a copy of processed centroids.\n * Useful when aggregating multiple t-digests.\n *\n * Centroids are appended to the passed CentroidList; if you're re-using a\n * buffer, be sure to pass cl[:0].\n */\n centroids(cl: CentroidList = []): CentroidList {\n this.#process();\n return [...cl, ...this.#processed];\n }\n\n count(): number {\n this.#process();\n\n // this.process always updates this.processedWeight to the total count of all\n // centroids, so we don't need to re-count here.\n return this.#processedWeight;\n }\n\n /**\n * toJSON returns a JSON-serializable representation of the digest.\n * This processes the digest and returns an object with compression and centroid data.\n */\n toJSON(): TDigestJSON {\n this.#process();\n const data: TDigestJSON = [this.compression];\n for (const centroid of this.#processed) {\n data.push(centroid.mean, centroid.weight);\n }\n return data;\n }\n\n #updateCumulative() {\n // Weight can only increase, so the final cumulative value will always be\n // either equal to, or less than, the total weight. If they are the same,\n // then nothing has changed since the last update.\n if (\n this.#cumulative.length > 0 &&\n this.#cumulative.at(-1) === this.#processedWeight\n ) {\n return;\n }\n const n = this.#processed.length + 1;\n if (this.#cumulative.length > n) {\n this.#cumulative.length = n;\n }\n\n let prev = 0;\n for (let i = 0; i < this.#processed.length; i++) {\n const centroid = this.#processed[i];\n const cur = centroid.weight;\n this.#cumulative[i] = prev + cur / 2;\n prev += cur;\n }\n this.#cumulative[this.#processed.length] = prev;\n }\n\n // Quantile returns the (approximate) quantile of\n // the distribution. Accepted values for q are between 0 and 1.\n // Returns NaN if Count is zero or bad inputs.\n quantile(q: number): number {\n this.#process();\n this.#updateCumulative();\n if (q < 0 || q > 1 || this.#processed.length === 0) {\n return NaN;\n }\n if (this.#processed.length === 1) {\n return this.#processed[0].mean;\n }\n const index = q * this.#processedWeight;\n if (index <= this.#processed[0].weight / 2) {\n return (\n this.#min +\n ((2 * index) / this.#processed[0].weight) *\n (this.#processed[0].mean - this.#min)\n );\n }\n\n const lower = binarySearch(\n this.#cumulative.length,\n (i: number) => -this.#cumulative[i] + index,\n );\n\n if (lower + 1 !== this.#cumulative.length) {\n const z1 = index - this.#cumulative[lower - 1];\n const z2 = this.#cumulative[lower] - index;\n return weightedAverage(\n this.#processed[lower - 1].mean,\n z2,\n this.#processed[lower].mean,\n z1,\n );\n }\n\n const z1 =\n index - this.#processedWeight - this.#processed[lower - 1].weight / 2;\n const z2 = this.#processed[lower - 1].weight / 2 - z1;\n // oxlint-disable-next-line typescript/no-non-null-assertion\n return weightedAverage(this.#processed.at(-1)!.mean, z1, this.#max, z2);\n }\n\n /**\n * CDF returns the cumulative distribution function for a given value x.\n */\n cdf(x: number): number {\n this.#process();\n this.#updateCumulative();\n switch (this.#processed.length) {\n case 0:\n return 0;\n case 1: {\n const width = this.#max - this.#min;\n if (x <= this.#min) {\n return 0;\n }\n if (x >= this.#max) {\n return 1;\n }\n if (x - this.#min <= width) {\n // min and max are too close together to do any viable interpolation\n return 0.5;\n }\n return (x - this.#min) / width;\n }\n }\n\n if (x <= this.#min) {\n return 0;\n }\n if (x >= this.#max) {\n return 1;\n }\n const m0 = this.#processed[0].mean;\n // Left Tail\n if (x <= m0) {\n if (m0 - this.#min > 0) {\n return (\n (((x - this.#min) / (m0 - this.#min)) * this.#processed[0].weight) /\n this.#processedWeight /\n 2\n );\n }\n return 0;\n }\n // Right Tail\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const mn = this.#processed.at(-1)!.mean;\n if (x >= mn) {\n if (this.#max - mn > 0) {\n return (\n 1 -\n (((this.#max - x) / (this.#max - mn)) *\n // oxlint-disable-next-line typescript/no-non-null-assertion\n this.#processed.at(-1)!.weight) /\n this.#processedWeight /\n 2\n );\n }\n return 1;\n }\n\n const upper = binarySearch(\n this.#processed.length,\n // Treat equals as greater than, so we can use the upper index\n // This is equivalent to:\n // i => this.#processed[i].mean > x ? -1 : 1,\n i => x - this.#processed[i].mean || 1,\n );\n\n const z1 = x - this.#processed[upper - 1].mean;\n const z2 = this.#processed[upper].mean - x;\n return (\n weightedAverage(\n this.#cumulative[upper - 1],\n z2,\n this.#cumulative[upper],\n z1,\n ) / this.#processedWeight\n );\n }\n\n #integratedQ(k: number): number {\n return (\n (Math.sin(\n (Math.min(k, this.compression) * Math.PI) / this.compression -\n Math.PI / 2,\n ) +\n 1) /\n 2\n );\n }\n\n #integratedLocation(q: number): number {\n return (this.compression * (Math.asin(2 * q - 1) + Math.PI / 2)) / Math.PI;\n }\n}\n\n// Calculate number of bytes needed for a tdigest of size c,\n// where c is the compression value\nexport function byteSizeForCompression(comp: number): number {\n const c = comp | 0;\n // // A centroid is 2 float64s, so we need 16 bytes for each centroid\n // float_size := 8\n // centroid_size := 2 * float_size\n\n // // Unprocessed and processed can grow up to length c\n // unprocessed_size := centroid_size * c\n // processed_size := unprocessed_size\n\n // // the cumulative field can also be of length c, but each item is a single float64\n // cumulative_size := float_size * c // <- this could also be unprocessed_size / 2\n\n // return unprocessed_size + processed_size + cumulative_size\n\n // // or, more succinctly:\n // return float_size * c * 5\n\n // or even more succinctly\n return c * 40;\n}\n\nfunction weightedAverage(\n x1: number,\n w1: number,\n x2: number,\n w2: number,\n): number {\n if (x1 <= x2) {\n return weightedAverageSorted(x1, w1, x2, w2);\n }\n return weightedAverageSorted(x2, w2, x1, w1);\n}\n\nfunction weightedAverageSorted(\n x1: number,\n w1: number,\n x2: number,\n w2: number,\n): number {\n const x = (x1 * w1 + x2 * w2) / (w1 + w2);\n return Math.max(x1, Math.min(x, x2));\n}\n\nfunction processedSize(size: number, compression: number): number {\n if (size === 0) {\n return Math.ceil(compression) * 2;\n }\n return size;\n}\n\nfunction unprocessedSize(size: number, compression: number): number {\n if (size === 0) {\n return Math.ceil(compression) * 8;\n }\n return size;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"valita.js","names":[],"sources":["../../../../shared/src/valita.ts"],"sourcesContent":["import * as v from '@badrap/valita';\n\nexport * from '@badrap/valita';\n\nfunction toDisplay(value: unknown): string {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return JSON.stringify(value);\n case 'undefined':\n return 'undefined';\n case 'bigint':\n return value.toString() + 'n';\n default:\n if (value === null) {\n return 'null';\n }\n if (Array.isArray(value)) {\n return 'array';\n }\n return typeof value;\n }\n}\n\ntype Key = string | number;\n\nfunction toDisplayAtPath(v: unknown, path: Key[] | undefined): string {\n if (!path?.length) {\n return toDisplay(v);\n }\n\n let cur = v;\n for (const p of path) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n cur = (cur as any)[p];\n }\n return toDisplay(cur);\n}\n\nfunction displayList<T>(\n word: string,\n expected: T[],\n toDisplay: (x: T) => string | number = x => String(x),\n): string | number {\n if (expected.length === 1) {\n return toDisplay(expected[0]);\n }\n\n const suffix = `${toDisplay(\n expected[expected.length - 2],\n // oxlint-disable-next-line typescript/no-non-null-assertion\n )} ${word} ${toDisplay(expected.at(-1)!)}`;\n if (expected.length === 2) {\n return suffix;\n }\n return `${expected.slice(0, -2).map(toDisplay).join(', ')}, ${suffix}`;\n}\n\nfunction getMessage(\n err: v.Err | v.ValitaError,\n v: unknown,\n schema: v.Type | v.Optional,\n mode: ParseOptionsMode | undefined,\n): string {\n const firstIssue = err.issues[0];\n const {path} = firstIssue;\n const atPath = path?.length ? ` at ${path.join('.')}` : '';\n\n switch (firstIssue.code) {\n case 'invalid_type':\n return `Expected ${displayList(\n 'or',\n firstIssue.expected,\n )}${atPath}. Got ${toDisplayAtPath(v, path)}`;\n case 'missing_value': {\n const atPath =\n path && path.length > 1 ? ` at ${path.slice(0, -1).join('.')}` : '';\n\n if (firstIssue.path?.length) {\n return `Missing property ${firstIssue.path.at(-1)}${atPath}`;\n }\n return `TODO Unknown missing property${atPath}`;\n }\n\n case 'invalid_literal':\n return `Expected literal value ${displayList(\n 'or',\n firstIssue.expected,\n toDisplay,\n )}${atPath} Got ${toDisplayAtPath(v, path)}`;\n\n case 'invalid_length': {\n return `Expected array with length ${\n firstIssue.minLength === firstIssue.maxLength\n ? firstIssue.minLength\n : `between ${firstIssue.minLength} and ${firstIssue.maxLength}`\n }${atPath}. Got array with length ${(v as {length: number}).length}`;\n }\n\n case 'unrecognized_keys':\n if (firstIssue.keys.length === 1) {\n return `Unexpected property ${firstIssue.keys[0]}${atPath}`;\n }\n return `Unexpected properties ${displayList(\n 'and',\n firstIssue.keys,\n )}${atPath}`;\n\n case 'invalid_union':\n return schema.name === 'union'\n ? getDeepestUnionParseError(v, schema as v.UnionType, mode ?? 'strict')\n : `Invalid union value${atPath}`;\n\n case 'custom_error': {\n const {error} = firstIssue;\n const message = !error\n ? 'unknown'\n : typeof error === 'string'\n ? error\n : (error.message ?? 'unknown');\n return `${message}${atPath}. Got ${toDisplayAtPath(v, path)}`;\n }\n }\n}\n\ntype FailedType = {type: v.Type; err: v.Err};\n\nfunction getDeepestUnionParseError(\n value: unknown,\n schema: v.UnionType,\n mode: ParseOptionsMode,\n): string {\n const failures: FailedType[] = [];\n for (const type of schema.options) {\n const r = type.try(value, {mode});\n if (!r.ok) {\n failures.push({type, err: r});\n }\n }\n if (failures.length) {\n // compare the first and second longest-path errors\n failures.sort(pathCmp);\n if (failures.length === 1 || pathCmp(failures[0], failures[1]) < 0) {\n return getMessage(failures[0].err, value, failures[0].type, mode);\n }\n }\n // paths are equivalent\n try {\n const str = JSON.stringify(value);\n return `Invalid union value: ${str}`;\n } catch {\n // fallback if the value could not be stringified\n return `Invalid union value`;\n }\n}\n\n// Descending-order comparison of Issue paths.\n// * [1, 'a'] sorts before [1]\n// * [1] sorts before [0] (i.e. errors later in the tuple sort before earlier errors)\nfunction pathCmp(a: FailedType, b: FailedType) {\n const aPath = a.err.issues[0].path;\n const bPath = b.err.issues[0].path;\n if (aPath.length !== bPath.length) {\n return bPath.length - aPath.length;\n }\n for (let i = 0; i < aPath.length; i++) {\n if (bPath[i] > aPath[i]) {\n return -1;\n }\n if (bPath[i] < aPath[i]) {\n return 1;\n }\n }\n return 0;\n}\n\n/**\n * 'strip' allows unknown properties and removes unknown properties.\n * 'strict' errors if there are unknown properties.\n * 'passthrough' allows unknown properties.\n */\nexport type ParseOptionsMode = 'passthrough' | 'strict' | 'strip';\n\nexport function parse<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): T {\n const res = test(value, schema, mode);\n if (!res.ok) {\n throw new TypeError(res.error);\n }\n return res.value;\n}\n\nexport function is<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): value is T {\n return test(value, schema, mode).ok;\n}\n\nexport function assert<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): asserts value is T {\n parse(value, schema, mode);\n}\n\ntype Result<T> = {ok: true; value: T} | {ok: false; error: string};\n\nexport function test<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): Result<T> {\n const res = schema.try(value, mode ? {mode} : undefined);\n if (!res.ok) {\n return {\n ok: false,\n error: getMessage(res, value, schema, mode),\n };\n }\n return res;\n}\n\n/**\n * Similar to {@link test} but works for AbstractTypes such as Optional.\n * This is for advanced usage. Prefer {@link test} unless you really need\n * to operate directly on an Optional field.\n */\nexport function testOptional<T>(\n value: unknown,\n schema: v.Type<T> | v.Optional<T>,\n mode?: ParseOptionsMode,\n): Result<T | undefined> {\n let flags = 0x1; // FLAG_FORBID_EXTRA_KEYS;\n if (mode === 'passthrough') {\n flags = 0;\n } else if (mode === 'strip') {\n flags = 0x2; // FLAG_STRIP_EXTRA_KEYS;\n }\n const res = schema.func(value, flags);\n if (res === undefined) {\n return {ok: true, value} as Result<T>;\n } else if (res.ok) {\n return res;\n }\n const err = new v.ValitaError(res);\n return {ok: false, error: getMessage(err, value, schema, mode)};\n}\n\n/**\n * Shallowly marks the schema as readonly.\n */\nexport function readonly<T extends v.Type>(t: T): v.Type<Readonly<v.Infer<T>>> {\n return t as v.Type<Readonly<v.Infer<T>>>;\n}\n\nexport function readonlyObject<T extends Record<string, v.Type | v.Optional>>(\n t: T,\n): v.ObjectType<Readonly<T>, undefined> {\n return v.object(t);\n}\n\nexport function readonlyArray<T extends v.Type>(\n t: T,\n): v.Type<readonly v.Infer<T>[]> {\n return v.array(t);\n}\n\nexport function readonlyRecord<T extends v.Type>(\n t: T,\n): v.Type<Readonly<Record<string, v.Infer<T>>>> {\n return v.record(t);\n}\n\nconst AbstractType = Object.getPrototypeOf(\n Object.getPrototypeOf(v.string().optional()),\n).constructor;\n\nexport function instanceOfAbstractType<T = unknown>(\n obj: unknown,\n): obj is v.Type<T> | v.Optional<T> {\n return obj instanceof AbstractType;\n}\n\ntype ObjectShape = Record<string, typeof AbstractType>;\n\n/**\n * Similar to `ObjectType.partial()` except it recurses into nested objects.\n * Rest types are not supported.\n */\nexport function deepPartial<Shape extends ObjectShape>(\n s: v.ObjectType<Shape, undefined>,\n) {\n const shape = {} as Record<string, unknown>;\n for (const [key, type] of Object.entries(s.shape)) {\n if (type.name === 'object') {\n shape[key] = deepPartial(type as v.ObjectType).optional();\n } else {\n shape[key] = type.optional();\n }\n }\n return v.object(shape as {[K in keyof Shape]: v.Optional<v.Infer<Shape[K]>>});\n}\n\ntype Literal = string | number | bigint | boolean;\n\nexport function literalUnion<T extends [...Literal[]]>(\n ...literals: T\n): v.Type<T[number]> {\n return v.union(...literals.map(v.literal));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"valita.js","names":[],"sources":["../../../../shared/src/valita.ts"],"sourcesContent":["import * as v from '@badrap/valita';\n\nexport * from '@badrap/valita';\n\nfunction toDisplay(value: unknown): string {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return JSON.stringify(value);\n case 'undefined':\n return 'undefined';\n case 'bigint':\n return value.toString() + 'n';\n default:\n if (value === null) {\n return 'null';\n }\n if (Array.isArray(value)) {\n return 'array';\n }\n return typeof value;\n }\n}\n\ntype Key = string | number;\n\nfunction toDisplayAtPath(v: unknown, path: Key[] | undefined): string {\n if (!path?.length) {\n return toDisplay(v);\n }\n\n let cur = v;\n for (const p of path) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n cur = (cur as any)[p];\n }\n return toDisplay(cur);\n}\n\nfunction displayList<T>(\n word: string,\n expected: T[],\n toDisplay: (x: T) => string | number = x => String(x),\n): string | number {\n if (expected.length === 1) {\n return toDisplay(expected[0]);\n }\n\n const suffix = `${toDisplay(\n expected[expected.length - 2],\n // oxlint-disable-next-line typescript/no-non-null-assertion\n )} ${word} ${toDisplay(expected.at(-1)!)}`;\n if (expected.length === 2) {\n return suffix;\n }\n return `${expected.slice(0, -2).map(toDisplay).join(', ')}, ${suffix}`;\n}\n\nfunction getMessage(\n err: v.Err | v.ValitaError,\n v: unknown,\n schema: v.Type | v.Optional,\n mode: ParseOptionsMode | undefined,\n): string {\n const firstIssue = err.issues[0];\n const {path} = firstIssue;\n const atPath = path?.length ? ` at ${path.join('.')}` : '';\n\n switch (firstIssue.code) {\n case 'invalid_type':\n return `Expected ${displayList(\n 'or',\n firstIssue.expected,\n )}${atPath}. Got ${toDisplayAtPath(v, path)}`;\n case 'missing_value': {\n const atPath =\n path && path.length > 1 ? ` at ${path.slice(0, -1).join('.')}` : '';\n\n if (firstIssue.path?.length) {\n return `Missing property ${firstIssue.path.at(-1)}${atPath}`;\n }\n return `TODO Unknown missing property${atPath}`;\n }\n\n case 'invalid_literal':\n return `Expected literal value ${displayList(\n 'or',\n firstIssue.expected,\n toDisplay,\n )}${atPath} Got ${toDisplayAtPath(v, path)}`;\n\n case 'invalid_length': {\n return `Expected array with length ${\n firstIssue.minLength === firstIssue.maxLength\n ? firstIssue.minLength\n : `between ${firstIssue.minLength} and ${firstIssue.maxLength}`\n }${atPath}. Got array with length ${(v as {length: number}).length}`;\n }\n\n case 'unrecognized_keys':\n if (firstIssue.keys.length === 1) {\n return `Unexpected property ${firstIssue.keys[0]}${atPath}`;\n }\n return `Unexpected properties ${displayList(\n 'and',\n firstIssue.keys,\n )}${atPath}`;\n\n case 'invalid_union':\n return schema.name === 'union'\n ? getDeepestUnionParseError(v, schema as v.UnionType, mode ?? 'strict')\n : `Invalid union value${atPath}`;\n\n case 'custom_error': {\n const {error} = firstIssue;\n const message = !error\n ? 'unknown'\n : typeof error === 'string'\n ? error\n : (error.message ?? 'unknown');\n return `${message}${atPath}. Got ${toDisplayAtPath(v, path)}`;\n }\n }\n}\n\ntype FailedType = {type: v.Type; err: v.Err};\n\nfunction getDeepestUnionParseError(\n value: unknown,\n schema: v.UnionType,\n mode: ParseOptionsMode,\n): string {\n const failures: FailedType[] = [];\n for (const type of schema.options) {\n const r = type.try(value, {mode});\n if (!r.ok) {\n failures.push({type, err: r});\n }\n }\n if (failures.length) {\n // compare the first and second longest-path errors\n failures.sort(pathCmp);\n if (failures.length === 1 || pathCmp(failures[0], failures[1]) < 0) {\n return getMessage(failures[0].err, value, failures[0].type, mode);\n }\n }\n // paths are equivalent\n try {\n const str = JSON.stringify(value);\n return `Invalid union value: ${str}`;\n } catch {\n // fallback if the value could not be stringified\n return `Invalid union value`;\n }\n}\n\n// Descending-order comparison of Issue paths.\n// * [1, 'a'] sorts before [1]\n// * [1] sorts before [0] (i.e. errors later in the tuple sort before earlier errors)\nfunction pathCmp(a: FailedType, b: FailedType) {\n const aPath = a.err.issues[0].path;\n const bPath = b.err.issues[0].path;\n if (aPath.length !== bPath.length) {\n return bPath.length - aPath.length;\n }\n for (let i = 0; i < aPath.length; i++) {\n if (bPath[i] > aPath[i]) {\n return -1;\n }\n if (bPath[i] < aPath[i]) {\n return 1;\n }\n }\n return 0;\n}\n\n/**\n * 'strip' allows unknown properties and removes unknown properties.\n * 'strict' errors if there are unknown properties.\n * 'passthrough' allows unknown properties.\n */\nexport type ParseOptionsMode = 'passthrough' | 'strict' | 'strip';\n\nexport function parse<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): T {\n const res = test(value, schema, mode);\n if (!res.ok) {\n throw new TypeError(res.error);\n }\n return res.value;\n}\n\nexport function is<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): value is T {\n return test(value, schema, mode).ok;\n}\n\nexport function assert<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): asserts value is T {\n parse(value, schema, mode);\n}\n\ntype Result<T> = {ok: true; value: T} | {ok: false; error: string};\n\nexport function test<T>(\n value: unknown,\n schema: v.Type<T>,\n mode?: ParseOptionsMode,\n): Result<T> {\n const res = schema.try(value, mode ? {mode} : undefined);\n if (!res.ok) {\n return {\n ok: false,\n error: getMessage(res, value, schema, mode),\n };\n }\n return res;\n}\n\n/**\n * Similar to {@link test} but works for AbstractTypes such as Optional.\n * This is for advanced usage. Prefer {@link test} unless you really need\n * to operate directly on an Optional field.\n */\nexport function testOptional<T>(\n value: unknown,\n schema: v.Type<T> | v.Optional<T>,\n mode?: ParseOptionsMode,\n): Result<T | undefined> {\n let flags = 0x1; // FLAG_FORBID_EXTRA_KEYS;\n if (mode === 'passthrough') {\n flags = 0;\n } else if (mode === 'strip') {\n flags = 0x2; // FLAG_STRIP_EXTRA_KEYS;\n }\n const res = schema.func(value, flags);\n if (res === undefined) {\n return {ok: true, value} as Result<T>;\n } else if (res.ok) {\n return res;\n }\n const err = new v.ValitaError(res);\n return {ok: false, error: getMessage(err, value, schema, mode)};\n}\n\n/**\n * Shallowly marks the schema as readonly.\n */\nexport function readonly<T extends v.Type>(t: T): v.Type<Readonly<v.Infer<T>>> {\n return t as v.Type<Readonly<v.Infer<T>>>;\n}\n\nexport function readonlyObject<T extends Record<string, v.Type | v.Optional>>(\n t: T,\n): v.ObjectType<Readonly<T>, undefined> {\n return v.object(t);\n}\n\nexport function readonlyArray<T extends v.Type>(\n t: T,\n): v.Type<readonly v.Infer<T>[]> {\n return v.array(t);\n}\n\nexport function readonlyRecord<T extends v.Type>(\n t: T,\n): v.Type<Readonly<Record<string, v.Infer<T>>>> {\n return v.record(t);\n}\n\nconst AbstractType = Object.getPrototypeOf(\n Object.getPrototypeOf(v.string().optional()),\n).constructor;\n\nexport function instanceOfAbstractType<T = unknown>(\n obj: unknown,\n): obj is v.Type<T> | v.Optional<T> {\n return obj instanceof AbstractType;\n}\n\ntype ObjectShape = Record<string, typeof AbstractType>;\n\n/**\n * Similar to `ObjectType.partial()` except it recurses into nested objects.\n * Rest types are not supported.\n */\nexport function deepPartial<Shape extends ObjectShape>(\n s: v.ObjectType<Shape, undefined>,\n) {\n const shape = {} as Record<string, unknown>;\n for (const [key, type] of Object.entries(s.shape)) {\n if (type.name === 'object') {\n shape[key] = deepPartial(type as v.ObjectType).optional();\n } else {\n shape[key] = type.optional();\n }\n }\n return v.object(shape as {[K in keyof Shape]: v.Optional<v.Infer<Shape[K]>>});\n}\n\ntype Literal = string | number | bigint | boolean;\n\nexport function literalUnion<T extends [...Literal[]]>(\n ...literals: T\n): v.Type<T[number]> {\n return v.union(...literals.map(v.literal));\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","names":[],"sources":["../../../../z2s/src/compiler.ts"],"sourcesContent":["import type {SQLQuery} from '@databases/sql';\nimport {last, zip} from '../../shared/src/arrays.ts';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {\n parse as parseBigIntJson,\n type JSONValue as BigIntJSONValue,\n} from '../../shared/src/bigint-json.ts';\nimport {hasOwn} from '../../shared/src/has-own.ts';\nimport {type JSONValue} from '../../shared/src/json.ts';\nimport {must} from '../../shared/src/must.ts';\nimport type {\n AST,\n Condition,\n CorrelatedSubquery,\n CorrelatedSubqueryCondition,\n Correlation,\n LiteralReference,\n Ordering,\n SimpleCondition,\n ValuePosition,\n} from '../../zero-protocol/src/ast.ts';\nimport {\n clientToServer,\n type NameMapper,\n} from '../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../zero-types/src/server-schema.ts';\nimport type {Format} from '../../zql/src/ivm/view.ts';\nimport {completeOrdering} from '../../zql/src/query/complete-ordering.ts';\nimport {\n sql,\n sqlConvertColumnArg,\n sqlConvertPluralLiteralArg,\n sqlConvertSingularLiteralArg,\n type PluralLiteralType,\n} from './sql.ts';\n\ntype Table = {\n zql: string;\n alias: string;\n};\n\ntype QualifiedColumn = {\n table: Table;\n zql: string;\n};\n\ntype ServerSpec = {\n schema: ServerSchema;\n // maps zql names to server names\n mapper: NameMapper;\n};\n\nexport type Spec = {\n server: ServerSpec;\n zql: Schema['tables'];\n aliasCount: number;\n};\n\nconst ZQL_RESULT_KEY = 'zql_result';\nconst ZQL_RESULT_KEY_IDENT = sql.ident(ZQL_RESULT_KEY);\n\nconst ZQL_RESULT_TABLE_KEY = 'zql_root';\nconst ZQL_RESULT_TABLE_IDENT = sql.ident(ZQL_RESULT_TABLE_KEY);\n\nexport function compile(\n serverSchema: ServerSchema,\n zqlSchema: Schema,\n ast: AST,\n format?: Format,\n): SQLQuery {\n ast = completeOrdering(\n ast,\n tableName => zqlSchema.tables[tableName].primaryKey,\n );\n const spec: Spec = {\n aliasCount: 0,\n server: {\n schema: serverSchema,\n mapper: clientToServer(zqlSchema.tables),\n },\n zql: zqlSchema.tables,\n };\n return sql`SELECT \n ${toJSON(ZQL_RESULT_TABLE_KEY, format?.singular)}::text AS ${ZQL_RESULT_KEY_IDENT}\n FROM (${select(spec, ast, format)}) ${ZQL_RESULT_TABLE_IDENT}`;\n}\n\nfunction select(\n spec: Spec,\n ast: AST,\n format: Format | undefined,\n correlate?: (childTable: Table) => SQLQuery,\n): SQLQuery {\n const table = makeTable(spec, ast.table);\n const selectionSet = related(spec, ast.related ?? [], format, table);\n const tableSchema = spec.zql[ast.table];\n const usedAliases = new Set<string>(\n ast.related?.map(r => r.subquery.alias ?? ''),\n );\n for (const column of Object.keys(tableSchema.columns)) {\n if (!usedAliases.has(column)) {\n selectionSet.push(\n selectIdent(spec.server, {\n table,\n zql: column,\n }),\n );\n }\n }\n\n let appliedWhere = false;\n function maybeWhere(test: unknown | undefined) {\n if (!test) {\n return sql``;\n }\n\n const ret = appliedWhere ? sql`AND` : sql`WHERE`;\n appliedWhere = true;\n return ret;\n }\n\n return sql`SELECT ${sql.join(selectionSet, ',')}\n FROM ${fromIdent(spec.server, table)}\n ${maybeWhere(ast.where)} ${where(spec, ast.where, table)}\n ${maybeWhere(correlate)} ${correlate ? correlate(table) : sql``}\n ${orderBy(spec, ast.orderBy, table)}\n ${limit(ast.limit, format?.singular)}`;\n}\n\nexport function limit(\n limit: number | undefined,\n singular: boolean | undefined,\n): SQLQuery {\n if (limit === 0) {\n return sql`LIMIT 0`;\n }\n if (singular) {\n return sql`LIMIT 1`;\n }\n if (limit === undefined) {\n return sql``;\n }\n return sql`LIMIT ${sqlConvertSingularLiteralArg(limit)}`;\n}\n\nfunction makeTable(spec: Spec, zql: string, alias?: string): Table {\n alias = alias ?? zql + '_' + spec.aliasCount++;\n return {\n zql,\n alias,\n };\n}\n\nexport function orderBy(\n spec: Spec,\n orderBy: Ordering | undefined,\n table: Table,\n): SQLQuery {\n if (!orderBy) {\n return sql``;\n }\n return sql`ORDER BY ${sql.join(\n orderBy.map(([col, dir]) =>\n dir === 'asc'\n ? // Oh postgres. The table must be referred to by client name but the column by server name.\n // E.g., `SELECT server_col as client_col FROM server_table as client_table ORDER BY client_Table.server_col`\n sql`${colIdent(spec.server, {\n table,\n zql: col,\n })} ASC NULLS FIRST`\n : sql`${colIdent(spec.server, {\n table,\n zql: col,\n })} DESC NULLS LAST`,\n ),\n ', ',\n )}`;\n}\n\nfunction related(\n spec: Spec,\n relationships: readonly CorrelatedSubquery[],\n format: Format | undefined,\n parentTable: Table,\n): SQLQuery[] {\n return relationships.map(relationship =>\n relationshipSubquery(\n spec,\n relationship,\n format?.relationships[must(relationship.subquery.alias)],\n parentTable,\n ),\n );\n}\n\nfunction relationshipSubquery(\n spec: Spec,\n relationship: CorrelatedSubquery,\n format: Format | undefined,\n parentTable: Table,\n): SQLQuery {\n const innerAlias = `inner_${relationship.subquery.alias}`;\n if (relationship.hidden) {\n const {join, participatingTables} = makeJunctionJoin(spec, relationship);\n const lastTable = must(last(participatingTables)).table;\n\n assert(\n relationship.subquery.related,\n 'hidden relationship must be a junction',\n );\n const nestedAst = relationship.subquery.related[0].subquery;\n const selectionSet = related(\n spec,\n nestedAst.related ?? [],\n format,\n lastTable,\n );\n const tableSchema = spec.zql[nestedAst.table];\n for (const column of Object.keys(tableSchema.columns)) {\n selectionSet.push(\n selectIdent(spec.server, {\n table: lastTable,\n zql: column,\n }),\n );\n }\n\n return sql`(\n SELECT ${toJSON(innerAlias, format?.singular)} FROM (SELECT ${sql.join(\n selectionSet,\n ',',\n )} FROM ${join} WHERE (${makeCorrelator(\n spec,\n relationship.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n relationship.correlation.childField,\n )(participatingTables[0].table)}) ${\n nestedAst.where\n ? sql`AND ${where(spec, nestedAst.where, lastTable)}`\n : sql``\n } ${orderBy(spec, nestedAst.orderBy, lastTable)} ${limit(\n last(participatingTables)?.limit,\n format?.singular,\n )} ) ${sql.ident(innerAlias)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n }\n\n return sql`(\n SELECT ${toJSON(innerAlias, format?.singular)} FROM (${select(\n spec,\n relationship.subquery,\n format,\n makeCorrelator(\n spec,\n relationship.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n relationship.correlation.childField,\n ),\n )}) ${sql.ident(innerAlias)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n}\n\nfunction where(\n spec: Spec,\n condition: Condition | undefined,\n table: Table,\n): SQLQuery {\n if (!condition) {\n return sql``;\n }\n\n switch (condition.type) {\n case 'and':\n return sql`(${sql.join(\n condition.conditions.map(c => where(spec, c, table)),\n ' AND ',\n )})`;\n case 'or':\n return sql`(${sql.join(\n condition.conditions.map(c => where(spec, c, table)),\n ' OR ',\n )})`;\n case 'correlatedSubquery':\n if (condition.scalar) {\n return scalarSubquery(spec, condition, table);\n }\n return exists(spec, condition, table);\n case 'simple':\n return simple(spec, condition, table);\n }\n}\n\nfunction exists(\n spec: Spec,\n condition: CorrelatedSubqueryCondition,\n parentTable: Table,\n): SQLQuery {\n switch (condition.op) {\n case 'EXISTS':\n return sql`EXISTS (${select(\n spec,\n condition.related.subquery,\n undefined,\n makeCorrelator(\n spec,\n condition.related.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n condition.related.correlation.childField,\n ),\n )})`;\n case 'NOT EXISTS':\n return sql`NOT EXISTS (${select(\n spec,\n condition.related.subquery,\n undefined,\n makeCorrelator(\n spec,\n condition.related.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n condition.related.correlation.childField,\n ),\n )})`;\n }\n}\n\nfunction scalarSubquery(\n spec: Spec,\n condition: CorrelatedSubqueryCondition,\n parentTable: Table,\n): SQLQuery {\n const parentField = condition.related.correlation.parentField[0];\n const childField = condition.related.correlation.childField[0];\n const subqueryAST = condition.related.subquery;\n\n const parentCol = colIdent(spec.server, {\n table: parentTable,\n zql: parentField,\n });\n\n const subqueryTable = makeTable(spec, subqueryAST.table);\n const childCol = colIdent(spec.server, {\n table: subqueryTable,\n zql: childField,\n });\n\n const op = sql.__dangerous__rawValue(\n condition.op === 'EXISTS' ? '=' : 'IS NOT',\n );\n\n const subqueryWhere = subqueryAST.where\n ? sql`WHERE ${where(spec, subqueryAST.where, subqueryTable)}`\n : sql``;\n const subqueryOrderBy = orderBy(spec, subqueryAST.orderBy, subqueryTable);\n\n return sql`${parentCol} ${op} (SELECT ${childCol} FROM ${fromIdent(spec.server, subqueryTable)} ${subqueryWhere} ${subqueryOrderBy} LIMIT 1)`;\n}\n\nexport function makeCorrelator(\n spec: Spec,\n parentFields: readonly QualifiedColumn[],\n childZqlFields: readonly string[],\n): (childTable: Table) => SQLQuery {\n return (childTable: Table) => {\n const childFields = childZqlFields.map(zqlField => ({\n table: childTable,\n zql: zqlField,\n }));\n return sql.join(\n zip(parentFields, childFields).map(\n ([parentColumn, childColumn]) =>\n sql`${colIdent(spec.server, parentColumn)} = ${colIdent(\n spec.server,\n childColumn,\n )}`,\n ),\n ' AND ',\n );\n };\n}\n\nexport function simple(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n switch (condition.op) {\n case '!=':\n case '<':\n case '<=':\n case '=':\n case '>':\n case '>=':\n case 'ILIKE':\n case 'LIKE':\n case 'NOT ILIKE':\n case 'NOT LIKE':\n return sql`${valueComparison(\n spec,\n condition.left,\n table,\n condition.right,\n false,\n )} ${sql.__dangerous__rawValue(condition.op)} ${valueComparison(\n spec,\n condition.right,\n table,\n condition.left,\n false,\n )}`;\n case 'NOT IN':\n case 'IN':\n return any(spec, condition, table);\n case 'IS':\n case 'IS NOT':\n return distinctFrom(spec, condition, table);\n }\n}\n\nexport function any(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n return sql`${condition.op === 'NOT IN' ? sql`NOT` : sql``}\n (\n ${valueComparison(spec, condition.left, table, condition.right, false)} = ANY \n (${valueComparison(spec, condition.right, table, condition.left, true)})\n )`;\n}\n\nexport function distinctFrom(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n return sql`${valueComparison(spec, condition.left, table, condition.right, false)} ${\n condition.op === 'IS' ? sql`IS NOT DISTINCT FROM` : sql`IS DISTINCT FROM`\n } ${valueComparison(spec, condition.right, table, condition.left, false)}`;\n}\n\nfunction valueComparison(\n spec: Spec,\n valuePos: ValuePosition,\n table: Table,\n otherValuePos: ValuePosition,\n plural: boolean,\n): SQLQuery {\n const valuePosType = valuePos.type;\n switch (valuePosType) {\n case 'column': {\n const qualified: QualifiedColumn = {\n table,\n zql: valuePos.name,\n };\n return colIdent(spec.server, qualified);\n }\n case 'literal':\n return literalValueComparison(\n spec,\n valuePos,\n table,\n otherValuePos,\n plural,\n );\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n default:\n unreachable(valuePosType);\n break;\n }\n}\n\nfunction literalValueComparison(\n spec: Spec,\n valuePos: LiteralReference,\n table: Table,\n otherValuePos: ValuePosition,\n plural: boolean,\n): SQLQuery {\n const otherType = otherValuePos.type;\n switch (otherType) {\n case 'column':\n return sqlConvertColumnArg(\n getServerColumn(spec.server, table, otherValuePos.name),\n valuePos.value,\n plural,\n true,\n );\n case 'literal': {\n assert(\n plural === Array.isArray(valuePos.value),\n 'Expected plural flag to match whether value is an array',\n );\n if (Array.isArray(valuePos.value)) {\n if (valuePos.value.length > 0) {\n // If the array is non-empty base its type on its first\n // element\n return sqlConvertPluralLiteralArg(\n typeof valuePos.value[0] as PluralLiteralType,\n valuePos.value as PluralLiteralType[],\n );\n }\n // If the array is empty, base its type on the other value\n // position's type (as long as the other value position is non-null,\n // cannot have a null[]).\n if (otherValuePos.value !== null) {\n return sqlConvertPluralLiteralArg(\n typeof otherValuePos.value as PluralLiteralType,\n [],\n );\n }\n // If the other value position is null, it can be compared to any\n // type of empty array, chose 'string' arbitrarily.\n return sqlConvertPluralLiteralArg('string', []);\n }\n if (\n typeof valuePos.value === 'string' ||\n typeof valuePos.value === 'number' ||\n typeof valuePos.value === 'boolean'\n ) {\n return sqlConvertSingularLiteralArg(valuePos.value);\n }\n throw new Error(\n `Literal of unexpected type. ${valuePos.value} of type ${typeof valuePos.value}`,\n );\n }\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n default:\n unreachable(otherType);\n }\n}\n\nexport function makeJunctionJoin(\n spec: Spec,\n relationship: CorrelatedSubquery,\n): {\n join: SQLQuery;\n participatingTables: ReturnType<typeof pullTablesForJunction>;\n} {\n const participatingTables = pullTablesForJunction(spec, relationship);\n const joins: SQLQuery[] = [];\n\n for (const {table} of participatingTables) {\n if (joins.length === 0) {\n joins.push(fromIdent(spec.server, table));\n continue;\n }\n joins.push(\n sql` JOIN ${fromIdent(spec.server, table)} ON ${makeCorrelator(\n spec,\n participatingTables[joins.length].correlation.parentField.map(f => ({\n table: participatingTables[joins.length - 1].table,\n zql: f,\n })),\n participatingTables[joins.length].correlation.childField,\n )(participatingTables[joins.length].table)}`,\n );\n }\n\n return {\n join: sql`${sql.join(joins, '')}`,\n participatingTables,\n // lastTable: participatingTables[participatingTables.length - 1].table,\n // lastLimit: participatingTables[participatingTables.length - 1].limit,\n };\n}\n\nexport function pullTablesForJunction(\n spec: Spec,\n relationship: CorrelatedSubquery,\n): [\n {\n table: Table;\n correlation: Correlation;\n limit: number | undefined;\n },\n {table: Table; correlation: Correlation; limit: number | undefined},\n] {\n assert(\n relationship.subquery.related?.length === 1,\n 'Too many related tables for a junction edge',\n );\n const otherRelationship = relationship.subquery.related[0];\n assert(\n !otherRelationship.hidden,\n 'Expected junction edge relationship to not be hidden',\n );\n return [\n {\n table: makeTable(spec, relationship.subquery.table),\n correlation: relationship.correlation,\n limit: relationship.subquery.limit,\n },\n {\n table: makeTable(spec, otherRelationship.subquery.table),\n correlation: otherRelationship.correlation,\n limit: otherRelationship.subquery.limit,\n },\n ];\n}\n\nfunction toJSON(table: string, singular = false): SQLQuery {\n return sql`${\n singular ? sql`` : sql`COALESCE(json_agg`\n }(row_to_json(${sql.ident(table)}))${singular ? sql`` : sql`, '[]'::json)`}`;\n}\n\nfunction selectIdent(server: ServerSpec, column: QualifiedColumn): SQLQuery {\n const serverColumnSchema =\n server.schema[server.mapper.tableName(column.table.zql)][\n server.mapper.columnName(column.table.zql, column.zql)\n ];\n const serverType = serverColumnSchema.type;\n if (!serverColumnSchema.isEnum) {\n let needsNormalization = false;\n switch (serverType) {\n case 'timestamptz':\n // @ts-expect-error Fallthrough intended\n case 'timetz':\n needsNormalization = true;\n // fallthrough\n\n case 'date':\n case 'time':\n case 'time without time zone':\n case 'time with time zone':\n case 'timestamp':\n case 'timestamp without time zone':\n case 'timestamp with time zone': {\n // EXTRACT(EPOCH FROM timetz) can be negative when the UTC offset is\n // positive (e.g. 01:00+02 = 23:00 UTC prev day = -3600s). Wrap with\n // modular arithmetic to normalize to 0..86400000.\n const toMs = (epochExpr: SQLQuery): SQLQuery =>\n needsNormalization\n ? sql`((${epochExpr})::bigint + 86400000) % 86400000`\n : epochExpr;\n\n if (serverColumnSchema.isArray) {\n const col = colIdent(server, column);\n return sql`CASE WHEN ${col} IS NULL THEN NULL ELSE ARRAY(SELECT ${toMs(\n sql`EXTRACT(EPOCH FROM unnest(${col})) * 1000`,\n )}) END as ${sql.ident(column.zql)}`;\n }\n\n return sql`${toMs(\n sql`EXTRACT(EPOCH FROM ${colIdent(server, column)}) * 1000`,\n )} as ${sql.ident(column.zql)}`;\n }\n }\n }\n\n return sql`${colIdent(server, column)} as ${sql.ident(column.zql)}`;\n}\n\nfunction colIdent(server: ServerSpec, column: QualifiedColumn) {\n return sql.ident(\n column.table.alias,\n server.mapper.columnName(column.table.zql, column.zql),\n );\n}\n\nfunction fromIdent(server: ServerSpec, table: Table) {\n return sql`${sql.ident(server.mapper.tableName(table.zql))} AS ${sql.ident(table.alias)}`;\n}\n\nfunction getServerColumn(spec: ServerSpec, table: Table, zqlColumn: string) {\n return spec.schema[spec.mapper.tableName(table.zql)][\n spec.mapper.columnName(table.zql, zqlColumn)\n ];\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function extractZqlResult(pgResult: Array<any>): JSONValue {\n const bigIntJson: BigIntJSONValue = parseBigIntJson(\n pgResult[0][ZQL_RESULT_KEY],\n );\n assertJSONValue(bigIntJson);\n return bigIntJson;\n}\n\nfunction assertJSONValue(v: BigIntJSONValue): asserts v is JSONValue {\n const path = findPathToBigInt(v);\n if (path) {\n throw new Error(`Value exceeds safe Number range. ${path}`);\n }\n}\n\nfunction findPathToBigInt(v: BigIntJSONValue): string | undefined {\n const typeOfV = typeof v;\n switch (typeOfV) {\n case 'bigint':\n return ` = ${v}`;\n case 'object': {\n if (v === null) {\n return;\n }\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) {\n const path = findPathToBigInt(v[i]);\n if (path) {\n return `[${i}]${path}`;\n }\n }\n return undefined;\n }\n\n const o = v as Record<string, BigIntJSONValue>;\n for (const k in o) {\n if (hasOwn(o, k)) {\n const path = findPathToBigInt(o[k]);\n if (path) {\n return `['${k}']${path}`;\n }\n }\n }\n return undefined;\n }\n case 'number':\n return undefined;\n case 'boolean':\n return undefined;\n default:\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compiler.js","names":[],"sources":["../../../../z2s/src/compiler.ts"],"sourcesContent":["import type {SQLQuery} from '@databases/sql';\nimport {last, zip} from '../../shared/src/arrays.ts';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {\n parse as parseBigIntJson,\n type JSONValue as BigIntJSONValue,\n} from '../../shared/src/bigint-json.ts';\nimport {hasOwn} from '../../shared/src/has-own.ts';\nimport {type JSONValue} from '../../shared/src/json.ts';\nimport {must} from '../../shared/src/must.ts';\nimport type {\n AST,\n Condition,\n CorrelatedSubquery,\n CorrelatedSubqueryCondition,\n Correlation,\n LiteralReference,\n Ordering,\n SimpleCondition,\n ValuePosition,\n} from '../../zero-protocol/src/ast.ts';\nimport {\n clientToServer,\n type NameMapper,\n} from '../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {ServerSchema} from '../../zero-types/src/server-schema.ts';\nimport type {Format} from '../../zql/src/ivm/view.ts';\nimport {completeOrdering} from '../../zql/src/query/complete-ordering.ts';\nimport {\n sql,\n sqlConvertColumnArg,\n sqlConvertPluralLiteralArg,\n sqlConvertSingularLiteralArg,\n type PluralLiteralType,\n} from './sql.ts';\n\ntype Table = {\n zql: string;\n alias: string;\n};\n\ntype QualifiedColumn = {\n table: Table;\n zql: string;\n};\n\ntype ServerSpec = {\n schema: ServerSchema;\n // maps zql names to server names\n mapper: NameMapper;\n};\n\nexport type Spec = {\n server: ServerSpec;\n zql: Schema['tables'];\n aliasCount: number;\n};\n\nconst ZQL_RESULT_KEY = 'zql_result';\nconst ZQL_RESULT_KEY_IDENT = sql.ident(ZQL_RESULT_KEY);\n\nconst ZQL_RESULT_TABLE_KEY = 'zql_root';\nconst ZQL_RESULT_TABLE_IDENT = sql.ident(ZQL_RESULT_TABLE_KEY);\n\nexport function compile(\n serverSchema: ServerSchema,\n zqlSchema: Schema,\n ast: AST,\n format?: Format,\n): SQLQuery {\n ast = completeOrdering(\n ast,\n tableName => zqlSchema.tables[tableName].primaryKey,\n );\n const spec: Spec = {\n aliasCount: 0,\n server: {\n schema: serverSchema,\n mapper: clientToServer(zqlSchema.tables),\n },\n zql: zqlSchema.tables,\n };\n return sql`SELECT \n ${toJSON(ZQL_RESULT_TABLE_KEY, format?.singular)}::text AS ${ZQL_RESULT_KEY_IDENT}\n FROM (${select(spec, ast, format)}) ${ZQL_RESULT_TABLE_IDENT}`;\n}\n\nfunction select(\n spec: Spec,\n ast: AST,\n format: Format | undefined,\n correlate?: (childTable: Table) => SQLQuery,\n): SQLQuery {\n const table = makeTable(spec, ast.table);\n const selectionSet = related(spec, ast.related ?? [], format, table);\n const tableSchema = spec.zql[ast.table];\n const usedAliases = new Set<string>(\n ast.related?.map(r => r.subquery.alias ?? ''),\n );\n for (const column of Object.keys(tableSchema.columns)) {\n if (!usedAliases.has(column)) {\n selectionSet.push(\n selectIdent(spec.server, {\n table,\n zql: column,\n }),\n );\n }\n }\n\n let appliedWhere = false;\n function maybeWhere(test: unknown | undefined) {\n if (!test) {\n return sql``;\n }\n\n const ret = appliedWhere ? sql`AND` : sql`WHERE`;\n appliedWhere = true;\n return ret;\n }\n\n return sql`SELECT ${sql.join(selectionSet, ',')}\n FROM ${fromIdent(spec.server, table)}\n ${maybeWhere(ast.where)} ${where(spec, ast.where, table)}\n ${maybeWhere(correlate)} ${correlate ? correlate(table) : sql``}\n ${orderBy(spec, ast.orderBy, table)}\n ${limit(ast.limit, format?.singular)}`;\n}\n\nexport function limit(\n limit: number | undefined,\n singular: boolean | undefined,\n): SQLQuery {\n if (limit === 0) {\n return sql`LIMIT 0`;\n }\n if (singular) {\n return sql`LIMIT 1`;\n }\n if (limit === undefined) {\n return sql``;\n }\n return sql`LIMIT ${sqlConvertSingularLiteralArg(limit)}`;\n}\n\nfunction makeTable(spec: Spec, zql: string, alias?: string): Table {\n alias = alias ?? zql + '_' + spec.aliasCount++;\n return {\n zql,\n alias,\n };\n}\n\nexport function orderBy(\n spec: Spec,\n orderBy: Ordering | undefined,\n table: Table,\n): SQLQuery {\n if (!orderBy) {\n return sql``;\n }\n return sql`ORDER BY ${sql.join(\n orderBy.map(([col, dir]) =>\n dir === 'asc'\n ? // Oh postgres. The table must be referred to by client name but the column by server name.\n // E.g., `SELECT server_col as client_col FROM server_table as client_table ORDER BY client_Table.server_col`\n sql`${colIdent(spec.server, {\n table,\n zql: col,\n })} ASC NULLS FIRST`\n : sql`${colIdent(spec.server, {\n table,\n zql: col,\n })} DESC NULLS LAST`,\n ),\n ', ',\n )}`;\n}\n\nfunction related(\n spec: Spec,\n relationships: readonly CorrelatedSubquery[],\n format: Format | undefined,\n parentTable: Table,\n): SQLQuery[] {\n return relationships.map(relationship =>\n relationshipSubquery(\n spec,\n relationship,\n format?.relationships[must(relationship.subquery.alias)],\n parentTable,\n ),\n );\n}\n\nfunction relationshipSubquery(\n spec: Spec,\n relationship: CorrelatedSubquery,\n format: Format | undefined,\n parentTable: Table,\n): SQLQuery {\n const innerAlias = `inner_${relationship.subquery.alias}`;\n if (relationship.hidden) {\n const {join, participatingTables} = makeJunctionJoin(spec, relationship);\n const lastTable = must(last(participatingTables)).table;\n\n assert(\n relationship.subquery.related,\n 'hidden relationship must be a junction',\n );\n const nestedAst = relationship.subquery.related[0].subquery;\n const selectionSet = related(\n spec,\n nestedAst.related ?? [],\n format,\n lastTable,\n );\n const tableSchema = spec.zql[nestedAst.table];\n for (const column of Object.keys(tableSchema.columns)) {\n selectionSet.push(\n selectIdent(spec.server, {\n table: lastTable,\n zql: column,\n }),\n );\n }\n\n return sql`(\n SELECT ${toJSON(innerAlias, format?.singular)} FROM (SELECT ${sql.join(\n selectionSet,\n ',',\n )} FROM ${join} WHERE (${makeCorrelator(\n spec,\n relationship.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n relationship.correlation.childField,\n )(participatingTables[0].table)}) ${\n nestedAst.where\n ? sql`AND ${where(spec, nestedAst.where, lastTable)}`\n : sql``\n } ${orderBy(spec, nestedAst.orderBy, lastTable)} ${limit(\n last(participatingTables)?.limit,\n format?.singular,\n )} ) ${sql.ident(innerAlias)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n }\n\n return sql`(\n SELECT ${toJSON(innerAlias, format?.singular)} FROM (${select(\n spec,\n relationship.subquery,\n format,\n makeCorrelator(\n spec,\n relationship.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n relationship.correlation.childField,\n ),\n )}) ${sql.ident(innerAlias)}\n ) as ${sql.ident(relationship.subquery.alias)}`;\n}\n\nfunction where(\n spec: Spec,\n condition: Condition | undefined,\n table: Table,\n): SQLQuery {\n if (!condition) {\n return sql``;\n }\n\n switch (condition.type) {\n case 'and':\n return sql`(${sql.join(\n condition.conditions.map(c => where(spec, c, table)),\n ' AND ',\n )})`;\n case 'or':\n return sql`(${sql.join(\n condition.conditions.map(c => where(spec, c, table)),\n ' OR ',\n )})`;\n case 'correlatedSubquery':\n if (condition.scalar) {\n return scalarSubquery(spec, condition, table);\n }\n return exists(spec, condition, table);\n case 'simple':\n return simple(spec, condition, table);\n }\n}\n\nfunction exists(\n spec: Spec,\n condition: CorrelatedSubqueryCondition,\n parentTable: Table,\n): SQLQuery {\n switch (condition.op) {\n case 'EXISTS':\n return sql`EXISTS (${select(\n spec,\n condition.related.subquery,\n undefined,\n makeCorrelator(\n spec,\n condition.related.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n condition.related.correlation.childField,\n ),\n )})`;\n case 'NOT EXISTS':\n return sql`NOT EXISTS (${select(\n spec,\n condition.related.subquery,\n undefined,\n makeCorrelator(\n spec,\n condition.related.correlation.parentField.map(f => ({\n table: parentTable,\n zql: f,\n })),\n condition.related.correlation.childField,\n ),\n )})`;\n }\n}\n\nfunction scalarSubquery(\n spec: Spec,\n condition: CorrelatedSubqueryCondition,\n parentTable: Table,\n): SQLQuery {\n const parentField = condition.related.correlation.parentField[0];\n const childField = condition.related.correlation.childField[0];\n const subqueryAST = condition.related.subquery;\n\n const parentCol = colIdent(spec.server, {\n table: parentTable,\n zql: parentField,\n });\n\n const subqueryTable = makeTable(spec, subqueryAST.table);\n const childCol = colIdent(spec.server, {\n table: subqueryTable,\n zql: childField,\n });\n\n const op = sql.__dangerous__rawValue(\n condition.op === 'EXISTS' ? '=' : 'IS NOT',\n );\n\n const subqueryWhere = subqueryAST.where\n ? sql`WHERE ${where(spec, subqueryAST.where, subqueryTable)}`\n : sql``;\n const subqueryOrderBy = orderBy(spec, subqueryAST.orderBy, subqueryTable);\n\n return sql`${parentCol} ${op} (SELECT ${childCol} FROM ${fromIdent(spec.server, subqueryTable)} ${subqueryWhere} ${subqueryOrderBy} LIMIT 1)`;\n}\n\nexport function makeCorrelator(\n spec: Spec,\n parentFields: readonly QualifiedColumn[],\n childZqlFields: readonly string[],\n): (childTable: Table) => SQLQuery {\n return (childTable: Table) => {\n const childFields = childZqlFields.map(zqlField => ({\n table: childTable,\n zql: zqlField,\n }));\n return sql.join(\n zip(parentFields, childFields).map(\n ([parentColumn, childColumn]) =>\n sql`${colIdent(spec.server, parentColumn)} = ${colIdent(\n spec.server,\n childColumn,\n )}`,\n ),\n ' AND ',\n );\n };\n}\n\nexport function simple(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n switch (condition.op) {\n case '!=':\n case '<':\n case '<=':\n case '=':\n case '>':\n case '>=':\n case 'ILIKE':\n case 'LIKE':\n case 'NOT ILIKE':\n case 'NOT LIKE':\n return sql`${valueComparison(\n spec,\n condition.left,\n table,\n condition.right,\n false,\n )} ${sql.__dangerous__rawValue(condition.op)} ${valueComparison(\n spec,\n condition.right,\n table,\n condition.left,\n false,\n )}`;\n case 'NOT IN':\n case 'IN':\n return any(spec, condition, table);\n case 'IS':\n case 'IS NOT':\n return distinctFrom(spec, condition, table);\n }\n}\n\nexport function any(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n return sql`${condition.op === 'NOT IN' ? sql`NOT` : sql``}\n (\n ${valueComparison(spec, condition.left, table, condition.right, false)} = ANY \n (${valueComparison(spec, condition.right, table, condition.left, true)})\n )`;\n}\n\nexport function distinctFrom(\n spec: Spec,\n condition: SimpleCondition,\n table: Table,\n): SQLQuery {\n return sql`${valueComparison(spec, condition.left, table, condition.right, false)} ${\n condition.op === 'IS' ? sql`IS NOT DISTINCT FROM` : sql`IS DISTINCT FROM`\n } ${valueComparison(spec, condition.right, table, condition.left, false)}`;\n}\n\nfunction valueComparison(\n spec: Spec,\n valuePos: ValuePosition,\n table: Table,\n otherValuePos: ValuePosition,\n plural: boolean,\n): SQLQuery {\n const valuePosType = valuePos.type;\n switch (valuePosType) {\n case 'column': {\n const qualified: QualifiedColumn = {\n table,\n zql: valuePos.name,\n };\n return colIdent(spec.server, qualified);\n }\n case 'literal':\n return literalValueComparison(\n spec,\n valuePos,\n table,\n otherValuePos,\n plural,\n );\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n default:\n unreachable(valuePosType);\n break;\n }\n}\n\nfunction literalValueComparison(\n spec: Spec,\n valuePos: LiteralReference,\n table: Table,\n otherValuePos: ValuePosition,\n plural: boolean,\n): SQLQuery {\n const otherType = otherValuePos.type;\n switch (otherType) {\n case 'column':\n return sqlConvertColumnArg(\n getServerColumn(spec.server, table, otherValuePos.name),\n valuePos.value,\n plural,\n true,\n );\n case 'literal': {\n assert(\n plural === Array.isArray(valuePos.value),\n 'Expected plural flag to match whether value is an array',\n );\n if (Array.isArray(valuePos.value)) {\n if (valuePos.value.length > 0) {\n // If the array is non-empty base its type on its first\n // element\n return sqlConvertPluralLiteralArg(\n typeof valuePos.value[0] as PluralLiteralType,\n valuePos.value as PluralLiteralType[],\n );\n }\n // If the array is empty, base its type on the other value\n // position's type (as long as the other value position is non-null,\n // cannot have a null[]).\n if (otherValuePos.value !== null) {\n return sqlConvertPluralLiteralArg(\n typeof otherValuePos.value as PluralLiteralType,\n [],\n );\n }\n // If the other value position is null, it can be compared to any\n // type of empty array, chose 'string' arbitrarily.\n return sqlConvertPluralLiteralArg('string', []);\n }\n if (\n typeof valuePos.value === 'string' ||\n typeof valuePos.value === 'number' ||\n typeof valuePos.value === 'boolean'\n ) {\n return sqlConvertSingularLiteralArg(valuePos.value);\n }\n throw new Error(\n `Literal of unexpected type. ${valuePos.value} of type ${typeof valuePos.value}`,\n );\n }\n case 'static':\n throw new Error(\n 'Static parameters must be bound to a value before compiling to SQL',\n );\n default:\n unreachable(otherType);\n }\n}\n\nexport function makeJunctionJoin(\n spec: Spec,\n relationship: CorrelatedSubquery,\n): {\n join: SQLQuery;\n participatingTables: ReturnType<typeof pullTablesForJunction>;\n} {\n const participatingTables = pullTablesForJunction(spec, relationship);\n const joins: SQLQuery[] = [];\n\n for (const {table} of participatingTables) {\n if (joins.length === 0) {\n joins.push(fromIdent(spec.server, table));\n continue;\n }\n joins.push(\n sql` JOIN ${fromIdent(spec.server, table)} ON ${makeCorrelator(\n spec,\n participatingTables[joins.length].correlation.parentField.map(f => ({\n table: participatingTables[joins.length - 1].table,\n zql: f,\n })),\n participatingTables[joins.length].correlation.childField,\n )(participatingTables[joins.length].table)}`,\n );\n }\n\n return {\n join: sql`${sql.join(joins, '')}`,\n participatingTables,\n // lastTable: participatingTables[participatingTables.length - 1].table,\n // lastLimit: participatingTables[participatingTables.length - 1].limit,\n };\n}\n\nexport function pullTablesForJunction(\n spec: Spec,\n relationship: CorrelatedSubquery,\n): [\n {\n table: Table;\n correlation: Correlation;\n limit: number | undefined;\n },\n {table: Table; correlation: Correlation; limit: number | undefined},\n] {\n assert(\n relationship.subquery.related?.length === 1,\n 'Too many related tables for a junction edge',\n );\n const otherRelationship = relationship.subquery.related[0];\n assert(\n !otherRelationship.hidden,\n 'Expected junction edge relationship to not be hidden',\n );\n return [\n {\n table: makeTable(spec, relationship.subquery.table),\n correlation: relationship.correlation,\n limit: relationship.subquery.limit,\n },\n {\n table: makeTable(spec, otherRelationship.subquery.table),\n correlation: otherRelationship.correlation,\n limit: otherRelationship.subquery.limit,\n },\n ];\n}\n\nfunction toJSON(table: string, singular = false): SQLQuery {\n return sql`${\n singular ? sql`` : sql`COALESCE(json_agg`\n }(row_to_json(${sql.ident(table)}))${singular ? sql`` : sql`, '[]'::json)`}`;\n}\n\nfunction selectIdent(server: ServerSpec, column: QualifiedColumn): SQLQuery {\n const serverColumnSchema =\n server.schema[server.mapper.tableName(column.table.zql)][\n server.mapper.columnName(column.table.zql, column.zql)\n ];\n const serverType = serverColumnSchema.type;\n if (!serverColumnSchema.isEnum) {\n let needsNormalization = false;\n switch (serverType) {\n case 'timestamptz':\n // @ts-expect-error Fallthrough intended\n case 'timetz':\n needsNormalization = true;\n // fallthrough\n\n case 'date':\n case 'time':\n case 'time without time zone':\n case 'time with time zone':\n case 'timestamp':\n case 'timestamp without time zone':\n case 'timestamp with time zone': {\n // EXTRACT(EPOCH FROM timetz) can be negative when the UTC offset is\n // positive (e.g. 01:00+02 = 23:00 UTC prev day = -3600s). Wrap with\n // modular arithmetic to normalize to 0..86400000.\n const toMs = (epochExpr: SQLQuery): SQLQuery =>\n needsNormalization\n ? sql`((${epochExpr})::bigint + 86400000) % 86400000`\n : epochExpr;\n\n if (serverColumnSchema.isArray) {\n const col = colIdent(server, column);\n return sql`CASE WHEN ${col} IS NULL THEN NULL ELSE ARRAY(SELECT ${toMs(\n sql`EXTRACT(EPOCH FROM unnest(${col})) * 1000`,\n )}) END as ${sql.ident(column.zql)}`;\n }\n\n return sql`${toMs(\n sql`EXTRACT(EPOCH FROM ${colIdent(server, column)}) * 1000`,\n )} as ${sql.ident(column.zql)}`;\n }\n }\n }\n\n return sql`${colIdent(server, column)} as ${sql.ident(column.zql)}`;\n}\n\nfunction colIdent(server: ServerSpec, column: QualifiedColumn) {\n return sql.ident(\n column.table.alias,\n server.mapper.columnName(column.table.zql, column.zql),\n );\n}\n\nfunction fromIdent(server: ServerSpec, table: Table) {\n return sql`${sql.ident(server.mapper.tableName(table.zql))} AS ${sql.ident(table.alias)}`;\n}\n\nfunction getServerColumn(spec: ServerSpec, table: Table, zqlColumn: string) {\n return spec.schema[spec.mapper.tableName(table.zql)][\n spec.mapper.columnName(table.zql, zqlColumn)\n ];\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport function extractZqlResult(pgResult: Array<any>): JSONValue {\n const bigIntJson: BigIntJSONValue = parseBigIntJson(\n pgResult[0][ZQL_RESULT_KEY],\n );\n assertJSONValue(bigIntJson);\n return bigIntJson;\n}\n\nfunction assertJSONValue(v: BigIntJSONValue): asserts v is JSONValue {\n const path = findPathToBigInt(v);\n if (path) {\n throw new Error(`Value exceeds safe Number range. ${path}`);\n }\n}\n\nfunction findPathToBigInt(v: BigIntJSONValue): string | undefined {\n const typeOfV = typeof v;\n switch (typeOfV) {\n case 'bigint':\n return ` = ${v}`;\n case 'object': {\n if (v === null) {\n return;\n }\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) {\n const path = findPathToBigInt(v[i]);\n if (path) {\n return `[${i}]${path}`;\n }\n }\n return undefined;\n }\n\n const o = v as Record<string, BigIntJSONValue>;\n for (const k in o) {\n if (hasOwn(o, k)) {\n const path = findPathToBigInt(o[k]);\n if (path) {\n return `['${k}']${path}`;\n }\n }\n }\n return undefined;\n }\n case 'number':\n return undefined;\n case 'boolean':\n return undefined;\n default:\n return undefined;\n }\n}\n"],"mappings":"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"}
|
package/out/z2s/src/sql.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.js","names":["#seen","#size"],"sources":["../../../../z2s/src/sql.ts"],"sourcesContent":["import {\n escapePostgresIdentifier,\n escapeSQLiteIdentifier,\n} from '@databases/escape-identifier';\nimport type {FormatConfig, SQLItem, SQLQuery} from '@databases/sql';\nimport sql, {SQLItemType} from '@databases/sql';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {\n isPgNumberType,\n isPgStringType,\n} from '../../zero-cache/src/types/pg-data-type.ts';\nimport type {LiteralValue} from '../../zero-protocol/src/ast.ts';\nimport type {ServerColumnSchema} from '../../zero-types/src/server-schema.ts';\n\nexport function formatPg(sql: SQLQuery) {\n const format = new ReusingFormat(escapePostgresIdentifier);\n return sql.format((items: readonly SQLItem[]) => formatFn(items, format));\n}\n\nexport function formatPgInternalConvert(sql: SQLQuery) {\n const format = new SQLConvertFormat(escapePostgresIdentifier);\n return sql.format((items: readonly SQLItem[]) => formatFn(items, format));\n}\n\nexport function formatSqlite(sql: SQLQuery) {\n const format = new ReusingFormat(escapeSQLiteIdentifier);\n return sql.format((items: readonly SQLItem[]) => formatFn(items, format));\n}\n\nconst sqlConvert = Symbol('fromJson');\n\nexport type LiteralType = 'boolean' | 'number' | 'string' | 'null';\nexport type PluralLiteralType = Exclude<LiteralType, 'null'>;\n\ntype ColumnSqlConvertArg = {\n [sqlConvert]: 'column';\n type: string;\n value: unknown;\n plural: boolean;\n isEnum: boolean;\n isComparison: boolean;\n};\n\ntype SqlConvertArg =\n | ColumnSqlConvertArg\n | {\n [sqlConvert]: 'literal';\n type: LiteralType;\n value: LiteralValue;\n plural: boolean;\n };\n\nfunction isSqlConvert(value: unknown): value is SqlConvertArg {\n return value !== null && typeof value === 'object' && sqlConvert in value;\n}\n\nexport function sqlConvertSingularLiteralArg(\n value: string | boolean | number | null,\n): SQLQuery {\n const arg: SqlConvertArg = {\n [sqlConvert]: 'literal',\n type: value === null ? 'null' : (typeof value as LiteralType),\n value,\n plural: false,\n };\n return sql.value(arg);\n}\n\nexport function sqlConvertPluralLiteralArg(\n type: PluralLiteralType,\n value: PluralLiteralType[],\n): SQLQuery {\n const arg: SqlConvertArg = {\n [sqlConvert]: 'literal',\n type,\n value,\n plural: true,\n };\n return sql.value(arg);\n}\n\nexport function sqlConvertColumnArg(\n serverColumnSchema: ServerColumnSchema,\n value: unknown,\n plural: boolean,\n isComparison: boolean,\n): SQLQuery {\n return sql.value({\n [sqlConvert]: 'column',\n type: serverColumnSchema.type,\n isEnum: serverColumnSchema.isEnum,\n value,\n plural: plural || serverColumnSchema.isArray,\n isComparison,\n });\n}\n\nclass ReusingFormat implements FormatConfig {\n readonly #seen: Map<unknown, number> = new Map();\n readonly escapeIdentifier: (str: string) => string;\n\n constructor(escapeIdentifier: (str: string) => string) {\n this.escapeIdentifier = escapeIdentifier;\n }\n\n formatValue = (value: unknown) => {\n if (this.#seen.has(value)) {\n return {\n placeholder: `$${this.#seen.get(value)}`,\n value: PREVIOUSLY_SEEN_VALUE,\n };\n }\n this.#seen.set(value, this.#seen.size + 1);\n return {placeholder: `$${this.#seen.size}`, value};\n };\n}\n\nfunction stringify(arg: SqlConvertArg): string | null {\n if (arg.value === null) {\n return null;\n }\n if (arg.plural) {\n return JSON.stringify(arg.value);\n }\n if (arg[sqlConvert] === 'literal' && arg.type === 'string') {\n return arg.value as unknown as string;\n }\n if (\n arg[sqlConvert] === 'column' &&\n (arg.isEnum || isPgStringType(arg.type))\n ) {\n return arg.value as string;\n }\n return JSON.stringify(arg.value);\n}\n\nclass SQLConvertFormat implements FormatConfig {\n readonly #seen: Map<unknown, Map<string, number>> = new Map();\n #size = 0;\n readonly escapeIdentifier: (str: string) => string;\n\n constructor(escapeIdentifier: (str: string) => string) {\n this.escapeIdentifier = escapeIdentifier;\n }\n\n formatValue = (value: unknown) => {\n assert(isSqlConvert(value), 'JsonPackedFormat can only take JsonPackArgs.');\n const byType = this.#seen.get(value.value);\n if (byType?.has(value.type)) {\n return {\n placeholder: createPlaceholder(byType.get(value.type)!, value),\n value: PREVIOUSLY_SEEN_VALUE,\n };\n }\n this.#size++;\n if (byType) {\n byType.set(value.type, this.#size);\n } else {\n this.#seen.set(value.value, new Map([[value.type, this.#size]]));\n }\n return {\n placeholder: createPlaceholder(this.#size, value),\n value: stringify(value),\n };\n };\n}\n\nfunction createPlaceholder(index: number, arg: SqlConvertArg) {\n if (arg.type === 'null') {\n assert(arg.value === null, \"Args of type 'null' must have value null\");\n assert(!arg.plural, \"Args of type 'null' must not be plural\");\n return `$${index}`;\n }\n\n if (arg.value === null && arg.plural) {\n return `$${index}`;\n }\n\n if (arg[sqlConvert] === 'literal') {\n const {value} = arg;\n if (Array.isArray(value)) {\n const elType = pgTypeForLiteralType(arg.type);\n return formatPlural(index, `value::${elType}`);\n }\n return `$${index}::text::${pgTypeForLiteralType(arg.type)}`;\n }\n\n const common = formatCommonToSingularAndPlural(index, arg);\n return arg.plural ? formatPlural(index, common) : common;\n}\n\nfunction formatCommonToSingularAndPlural(\n index: number,\n arg: ColumnSqlConvertArg,\n) {\n // Ok, so what is with all the `::text` casts\n // before the final cast?\n // This is to force the statement to describe its arguments\n // as being text. Without the text cast the args are described as\n // being bool/json/numeric/whatever and the bindings try to coerce\n // the inputs to those types.\n const valuePlaceholder = arg.plural ? 'value' : `$${index}`;\n let atTimeZone = ` AT TIME ZONE 'UTC'`;\n switch (arg.type) {\n case 'timestamptz':\n // @ts-expect-error Fallthrough intended\n case 'timestamp with time zone':\n atTimeZone = '';\n // fallthrough\n\n case 'date':\n case 'timestamp':\n case 'timestamp without time zone':\n return `to_timestamp(${valuePlaceholder}::text::numeric / 1000.0)${atTimeZone}`;\n\n case 'timetz':\n // @ts-expect-error Fallthrough intended\n case 'time with time zone':\n atTimeZone = '';\n // fallthrough\n\n case 'time':\n case 'time without time zone':\n return `(${valuePlaceholder}::text::int * interval'1ms')::time${atTimeZone}`;\n\n // uuid: cast to native uuid type for proper comparison and index usage\n case 'uuid':\n return `${valuePlaceholder}::text::uuid`;\n }\n if (arg.isEnum) {\n return `${valuePlaceholder}::text::\"${arg.type}\"`;\n }\n if (isPgStringType(arg.type)) {\n // For comparison cast to the general `text` type, not the\n // specific column type (i.e. `arg.type`), because we don't want to\n // force the value being compared to the size/max-size of the column\n // type before comparison.\n return arg.isComparison\n ? `${valuePlaceholder}::text`\n : `${valuePlaceholder}::text::${arg.type}`;\n }\n if (isPgNumberType(arg.type)) {\n // For comparison cast to `double precision` which uses IEEE 754 (the same\n // representation as JavaScript numbers which will accurately\n // represent any number value from zql) not the specific column type\n // (i.e. `arg.type`), because we don't want to force the value being\n // compared to the range and precision of the column type before comparison.\n return arg.isComparison\n ? `${valuePlaceholder}::text::double precision`\n : `${valuePlaceholder}::text::${arg.type}`;\n }\n return `${valuePlaceholder}::text::${arg.type}`;\n}\n\nfunction formatPlural(index: number, select: string) {\n return `ARRAY(\n SELECT ${select} FROM jsonb_array_elements_text($${index}::text::jsonb)\n )`;\n}\n\nfunction pgTypeForLiteralType(type: Exclude<LiteralType, 'null'>) {\n switch (type) {\n case 'boolean':\n return 'boolean';\n case 'number':\n // `double precision` uses IEEE 754, the same representation as JavaScript\n // numbers, and so this will accurately represent any number value\n // from zql\n return 'double precision';\n case 'string':\n return 'text';\n default:\n unreachable(type);\n }\n}\n\nexport {sql};\n\nconst PREVIOUSLY_SEEN_VALUE = Symbol('PREVIOUSLY_SEEN_VALUE');\n\nconst whitespacePrefixRe = /^\\s*/;\n\nfunction formatFn(\n items: readonly SQLItem[],\n {escapeIdentifier, formatValue}: FormatConfig,\n): {\n text: string;\n values: unknown[];\n} {\n // Create an empty query object.\n let text = '';\n const values = [];\n\n const localIdentifiers = new Map<unknown, string>();\n\n for (const item of items) {\n switch (item.type) {\n // If this is just raw text, we add it directly to the query text.\n case SQLItemType.RAW: {\n text += item.text;\n break;\n }\n\n // If we got a value SQL item, add a placeholder and add the value to our\n // placeholder values array.\n case SQLItemType.VALUE: {\n const {placeholder, value} = formatValue(item.value, values.length);\n text += placeholder;\n if (value !== PREVIOUSLY_SEEN_VALUE) {\n values.push(value);\n }\n\n break;\n }\n\n // If we got an identifier type, escape the strings and get a local\n // identifier for non-string identifiers.\n case SQLItemType.IDENTIFIER: {\n // This is a specific addition for Zero as Zero\n // does not support dots in identifiers.\n // If a dot is found, we assume it is a namespace\n // and split the identifier into its parts.\n const names =\n item.names.length === 1 &&\n typeof item.names[0] === 'string' &&\n item.names[0].includes('.')\n ? item.names[0].split('.')\n : item.names;\n\n text += names\n .map((name): string => {\n if (typeof name === 'string') return escapeIdentifier(name);\n\n if (!localIdentifiers.has(name)) {\n localIdentifiers.set(name, `__local_${localIdentifiers.size}__`);\n }\n\n return escapeIdentifier(localIdentifiers.get(name)!);\n })\n .join('.');\n break;\n }\n }\n }\n\n if (text.trim()) {\n const lines = text.split('\\n');\n const min = Math.min(\n ...lines\n .filter(l => l.trim() !== '')\n .map(l => whitespacePrefixRe.exec(l)![0].length),\n );\n if (min) {\n text = lines.map(line => line.substr(min)).join('\\n');\n }\n }\n return {\n text: text.trim(),\n values,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sql.js","names":["#seen","#size"],"sources":["../../../../z2s/src/sql.ts"],"sourcesContent":["import {\n escapePostgresIdentifier,\n escapeSQLiteIdentifier,\n} from '@databases/escape-identifier';\nimport type {FormatConfig, SQLItem, SQLQuery} from '@databases/sql';\nimport sql, {SQLItemType} from '@databases/sql';\nimport {assert, unreachable} from '../../shared/src/asserts.ts';\nimport {\n isPgNumberType,\n isPgStringType,\n} from '../../zero-cache/src/types/pg-data-type.ts';\nimport type {LiteralValue} from '../../zero-protocol/src/ast.ts';\nimport type {ServerColumnSchema} from '../../zero-types/src/server-schema.ts';\n\nexport function formatPg(sql: SQLQuery) {\n const format = new ReusingFormat(escapePostgresIdentifier);\n return sql.format((items: readonly SQLItem[]) => formatFn(items, format));\n}\n\nexport function formatPgInternalConvert(sql: SQLQuery) {\n const format = new SQLConvertFormat(escapePostgresIdentifier);\n return sql.format((items: readonly SQLItem[]) => formatFn(items, format));\n}\n\nexport function formatSqlite(sql: SQLQuery) {\n const format = new ReusingFormat(escapeSQLiteIdentifier);\n return sql.format((items: readonly SQLItem[]) => formatFn(items, format));\n}\n\nconst sqlConvert = Symbol('fromJson');\n\nexport type LiteralType = 'boolean' | 'number' | 'string' | 'null';\nexport type PluralLiteralType = Exclude<LiteralType, 'null'>;\n\ntype ColumnSqlConvertArg = {\n [sqlConvert]: 'column';\n type: string;\n value: unknown;\n plural: boolean;\n isEnum: boolean;\n isComparison: boolean;\n};\n\ntype SqlConvertArg =\n | ColumnSqlConvertArg\n | {\n [sqlConvert]: 'literal';\n type: LiteralType;\n value: LiteralValue;\n plural: boolean;\n };\n\nfunction isSqlConvert(value: unknown): value is SqlConvertArg {\n return value !== null && typeof value === 'object' && sqlConvert in value;\n}\n\nexport function sqlConvertSingularLiteralArg(\n value: string | boolean | number | null,\n): SQLQuery {\n const arg: SqlConvertArg = {\n [sqlConvert]: 'literal',\n type: value === null ? 'null' : (typeof value as LiteralType),\n value,\n plural: false,\n };\n return sql.value(arg);\n}\n\nexport function sqlConvertPluralLiteralArg(\n type: PluralLiteralType,\n value: PluralLiteralType[],\n): SQLQuery {\n const arg: SqlConvertArg = {\n [sqlConvert]: 'literal',\n type,\n value,\n plural: true,\n };\n return sql.value(arg);\n}\n\nexport function sqlConvertColumnArg(\n serverColumnSchema: ServerColumnSchema,\n value: unknown,\n plural: boolean,\n isComparison: boolean,\n): SQLQuery {\n return sql.value({\n [sqlConvert]: 'column',\n type: serverColumnSchema.type,\n isEnum: serverColumnSchema.isEnum,\n value,\n plural: plural || serverColumnSchema.isArray,\n isComparison,\n });\n}\n\nclass ReusingFormat implements FormatConfig {\n readonly #seen: Map<unknown, number> = new Map();\n readonly escapeIdentifier: (str: string) => string;\n\n constructor(escapeIdentifier: (str: string) => string) {\n this.escapeIdentifier = escapeIdentifier;\n }\n\n formatValue = (value: unknown) => {\n if (this.#seen.has(value)) {\n return {\n placeholder: `$${this.#seen.get(value)}`,\n value: PREVIOUSLY_SEEN_VALUE,\n };\n }\n this.#seen.set(value, this.#seen.size + 1);\n return {placeholder: `$${this.#seen.size}`, value};\n };\n}\n\nfunction stringify(arg: SqlConvertArg): string | null {\n if (arg.value === null) {\n return null;\n }\n if (arg.plural) {\n return JSON.stringify(arg.value);\n }\n if (arg[sqlConvert] === 'literal' && arg.type === 'string') {\n return arg.value as unknown as string;\n }\n if (\n arg[sqlConvert] === 'column' &&\n (arg.isEnum || isPgStringType(arg.type))\n ) {\n return arg.value as string;\n }\n return JSON.stringify(arg.value);\n}\n\nclass SQLConvertFormat implements FormatConfig {\n readonly #seen: Map<unknown, Map<string, number>> = new Map();\n #size = 0;\n readonly escapeIdentifier: (str: string) => string;\n\n constructor(escapeIdentifier: (str: string) => string) {\n this.escapeIdentifier = escapeIdentifier;\n }\n\n formatValue = (value: unknown) => {\n assert(isSqlConvert(value), 'JsonPackedFormat can only take JsonPackArgs.');\n const byType = this.#seen.get(value.value);\n if (byType?.has(value.type)) {\n return {\n placeholder: createPlaceholder(byType.get(value.type)!, value),\n value: PREVIOUSLY_SEEN_VALUE,\n };\n }\n this.#size++;\n if (byType) {\n byType.set(value.type, this.#size);\n } else {\n this.#seen.set(value.value, new Map([[value.type, this.#size]]));\n }\n return {\n placeholder: createPlaceholder(this.#size, value),\n value: stringify(value),\n };\n };\n}\n\nfunction createPlaceholder(index: number, arg: SqlConvertArg) {\n if (arg.type === 'null') {\n assert(arg.value === null, \"Args of type 'null' must have value null\");\n assert(!arg.plural, \"Args of type 'null' must not be plural\");\n return `$${index}`;\n }\n\n if (arg.value === null && arg.plural) {\n return `$${index}`;\n }\n\n if (arg[sqlConvert] === 'literal') {\n const {value} = arg;\n if (Array.isArray(value)) {\n const elType = pgTypeForLiteralType(arg.type);\n return formatPlural(index, `value::${elType}`);\n }\n return `$${index}::text::${pgTypeForLiteralType(arg.type)}`;\n }\n\n const common = formatCommonToSingularAndPlural(index, arg);\n return arg.plural ? formatPlural(index, common) : common;\n}\n\nfunction formatCommonToSingularAndPlural(\n index: number,\n arg: ColumnSqlConvertArg,\n) {\n // Ok, so what is with all the `::text` casts\n // before the final cast?\n // This is to force the statement to describe its arguments\n // as being text. Without the text cast the args are described as\n // being bool/json/numeric/whatever and the bindings try to coerce\n // the inputs to those types.\n const valuePlaceholder = arg.plural ? 'value' : `$${index}`;\n let atTimeZone = ` AT TIME ZONE 'UTC'`;\n switch (arg.type) {\n case 'timestamptz':\n // @ts-expect-error Fallthrough intended\n case 'timestamp with time zone':\n atTimeZone = '';\n // fallthrough\n\n case 'date':\n case 'timestamp':\n case 'timestamp without time zone':\n return `to_timestamp(${valuePlaceholder}::text::numeric / 1000.0)${atTimeZone}`;\n\n case 'timetz':\n // @ts-expect-error Fallthrough intended\n case 'time with time zone':\n atTimeZone = '';\n // fallthrough\n\n case 'time':\n case 'time without time zone':\n return `(${valuePlaceholder}::text::int * interval'1ms')::time${atTimeZone}`;\n\n // uuid: cast to native uuid type for proper comparison and index usage\n case 'uuid':\n return `${valuePlaceholder}::text::uuid`;\n }\n if (arg.isEnum) {\n return `${valuePlaceholder}::text::\"${arg.type}\"`;\n }\n if (isPgStringType(arg.type)) {\n // For comparison cast to the general `text` type, not the\n // specific column type (i.e. `arg.type`), because we don't want to\n // force the value being compared to the size/max-size of the column\n // type before comparison.\n return arg.isComparison\n ? `${valuePlaceholder}::text`\n : `${valuePlaceholder}::text::${arg.type}`;\n }\n if (isPgNumberType(arg.type)) {\n // For comparison cast to `double precision` which uses IEEE 754 (the same\n // representation as JavaScript numbers which will accurately\n // represent any number value from zql) not the specific column type\n // (i.e. `arg.type`), because we don't want to force the value being\n // compared to the range and precision of the column type before comparison.\n return arg.isComparison\n ? `${valuePlaceholder}::text::double precision`\n : `${valuePlaceholder}::text::${arg.type}`;\n }\n return `${valuePlaceholder}::text::${arg.type}`;\n}\n\nfunction formatPlural(index: number, select: string) {\n return `ARRAY(\n SELECT ${select} FROM jsonb_array_elements_text($${index}::text::jsonb)\n )`;\n}\n\nfunction pgTypeForLiteralType(type: Exclude<LiteralType, 'null'>) {\n switch (type) {\n case 'boolean':\n return 'boolean';\n case 'number':\n // `double precision` uses IEEE 754, the same representation as JavaScript\n // numbers, and so this will accurately represent any number value\n // from zql\n return 'double precision';\n case 'string':\n return 'text';\n default:\n unreachable(type);\n }\n}\n\nexport {sql};\n\nconst PREVIOUSLY_SEEN_VALUE = Symbol('PREVIOUSLY_SEEN_VALUE');\n\nconst whitespacePrefixRe = /^\\s*/;\n\nfunction formatFn(\n items: readonly SQLItem[],\n {escapeIdentifier, formatValue}: FormatConfig,\n): {\n text: string;\n values: unknown[];\n} {\n // Create an empty query object.\n let text = '';\n const values = [];\n\n const localIdentifiers = new Map<unknown, string>();\n\n for (const item of items) {\n switch (item.type) {\n // If this is just raw text, we add it directly to the query text.\n case SQLItemType.RAW: {\n text += item.text;\n break;\n }\n\n // If we got a value SQL item, add a placeholder and add the value to our\n // placeholder values array.\n case SQLItemType.VALUE: {\n const {placeholder, value} = formatValue(item.value, values.length);\n text += placeholder;\n if (value !== PREVIOUSLY_SEEN_VALUE) {\n values.push(value);\n }\n\n break;\n }\n\n // If we got an identifier type, escape the strings and get a local\n // identifier for non-string identifiers.\n case SQLItemType.IDENTIFIER: {\n // This is a specific addition for Zero as Zero\n // does not support dots in identifiers.\n // If a dot is found, we assume it is a namespace\n // and split the identifier into its parts.\n const names =\n item.names.length === 1 &&\n typeof item.names[0] === 'string' &&\n item.names[0].includes('.')\n ? item.names[0].split('.')\n : item.names;\n\n text += names\n .map((name): string => {\n if (typeof name === 'string') return escapeIdentifier(name);\n\n if (!localIdentifiers.has(name)) {\n localIdentifiers.set(name, `__local_${localIdentifiers.size}__`);\n }\n\n return escapeIdentifier(localIdentifiers.get(name)!);\n })\n .join('.');\n break;\n }\n }\n }\n\n if (text.trim()) {\n const lines = text.split('\\n');\n const min = Math.min(\n ...lines\n .filter(l => l.trim() !== '')\n .map(l => whitespacePrefixRe.exec(l)![0].length),\n );\n if (min) {\n text = lines.map(line => line.substr(min)).join('\\n');\n }\n }\n return {\n text: text.trim(),\n values,\n };\n}\n"],"mappings":"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"}
|
package/out/zero/package.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var package_default = {
|
|
2
2
|
name: "@rocicorp/zero",
|
|
3
|
-
version: "1.6.0-canary.
|
|
3
|
+
version: "1.6.0-canary.13",
|
|
4
4
|
description: "Zero is a web framework for serverless web development.",
|
|
5
5
|
homepage: "https://zero.rocicorp.dev",
|
|
6
6
|
bugs: { "url": "https://bugs.rocicorp.dev" },
|
|
@@ -124,13 +124,13 @@ var package_default = {
|
|
|
124
124
|
"@fastify/websocket": "^11.0.0",
|
|
125
125
|
"@google-cloud/precise-date": "^4.0.0",
|
|
126
126
|
"@opentelemetry/api": "^1.9.0",
|
|
127
|
-
"@opentelemetry/api-logs": "^0.
|
|
128
|
-
"@opentelemetry/auto-instrumentations-node": "^0.
|
|
129
|
-
"@opentelemetry/exporter-metrics-otlp-http": "^0.
|
|
130
|
-
"@opentelemetry/resources": "^2.
|
|
131
|
-
"@opentelemetry/sdk-metrics": "^2.
|
|
132
|
-
"@opentelemetry/sdk-node": "^0.
|
|
133
|
-
"@opentelemetry/sdk-trace-node": "^2.
|
|
127
|
+
"@opentelemetry/api-logs": "^0.203.0",
|
|
128
|
+
"@opentelemetry/auto-instrumentations-node": "^0.62.0",
|
|
129
|
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.203.0",
|
|
130
|
+
"@opentelemetry/resources": "^2.0.1",
|
|
131
|
+
"@opentelemetry/sdk-metrics": "^2.0.1",
|
|
132
|
+
"@opentelemetry/sdk-node": "^0.203.0",
|
|
133
|
+
"@opentelemetry/sdk-trace-node": "^2.0.1",
|
|
134
134
|
"@postgresql-typed/oids": "^0.2.0",
|
|
135
135
|
"@rocicorp/lock": "^1.0.4",
|
|
136
136
|
"@rocicorp/logger": "^5.4.0",
|
|
@@ -167,30 +167,30 @@ var package_default = {
|
|
|
167
167
|
},
|
|
168
168
|
devDependencies: {
|
|
169
169
|
"@op-engineering/op-sqlite": ">=15",
|
|
170
|
-
"@vitest/runner": "^4.1.
|
|
171
|
-
"analyze-query": "
|
|
172
|
-
"ast-to-zql": "
|
|
170
|
+
"@vitest/runner": "^4.1.5",
|
|
171
|
+
"analyze-query": "0.0.0",
|
|
172
|
+
"ast-to-zql": "0.0.0",
|
|
173
173
|
"expo-sqlite": ">=15",
|
|
174
|
-
"replicache": "
|
|
175
|
-
"shared": "
|
|
174
|
+
"replicache": "15.2.1",
|
|
175
|
+
"shared": "0.0.0",
|
|
176
176
|
"syncpack": "^14.3.0",
|
|
177
177
|
"typedoc": "^0.28.17",
|
|
178
178
|
"typedoc-plugin-markdown": "^4.10.0",
|
|
179
179
|
"typescript": "~6.0.2",
|
|
180
|
-
"vite": "
|
|
181
|
-
"vitest": "^4.1.
|
|
182
|
-
"zero-cache": "
|
|
183
|
-
"zero-client": "
|
|
184
|
-
"zero-pg": "
|
|
185
|
-
"zero-react": "
|
|
186
|
-
"zero-server": "
|
|
187
|
-
"zero-solid": "
|
|
188
|
-
"zqlite": "
|
|
180
|
+
"vite": "8.0.3",
|
|
181
|
+
"vitest": "^4.1.5",
|
|
182
|
+
"zero-cache": "0.0.0",
|
|
183
|
+
"zero-client": "0.0.0",
|
|
184
|
+
"zero-pg": "0.0.0",
|
|
185
|
+
"zero-react": "0.0.0",
|
|
186
|
+
"zero-server": "0.0.0",
|
|
187
|
+
"zero-solid": "0.0.0",
|
|
188
|
+
"zqlite": "0.0.0"
|
|
189
189
|
},
|
|
190
190
|
peerDependencies: {
|
|
191
191
|
"@op-engineering/op-sqlite": ">=15",
|
|
192
192
|
"expo-sqlite": ">=15",
|
|
193
|
-
"kysely": "^0.28.
|
|
193
|
+
"kysely": "^0.28.16"
|
|
194
194
|
},
|
|
195
195
|
peerDependenciesMeta: {
|
|
196
196
|
"kysely": { "optional": true },
|
package/out/zero/package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","names":[],"sources":["../../package.json"],"sourcesContent":["{\n \"name\": \"@rocicorp/zero\",\n \"version\": \"1.6.0-canary.
|
|
1
|
+
{"version":3,"file":"package.js","names":[],"sources":["../../package.json"],"sourcesContent":["{\n \"name\": \"@rocicorp/zero\",\n \"version\": \"1.6.0-canary.13\",\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 \"./analyze\": {\n \"types\": \"./out/zero/src/analyze.d.ts\",\n \"default\": \"./out/zero/src/analyze.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/kysely\": {\n \"types\": \"./out/zero/src/adapters/kysely.d.ts\",\n \"default\": \"./out/zero/src/adapters/kysely.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 --quiet --config ../../oxlint.config.ts 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.18\",\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.5\",\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.5\",\n \"zero-cache\": \"0.0.0\",\n \"zero-client\": \"0.0.0\",\n \"zero-pg\": \"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 \"kysely\": \"^0.28.16\"\n },\n \"peerDependenciesMeta\": {\n \"kysely\": {\n \"optional\": true\n },\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-schema.js","names":[],"sources":["../../../src/build-schema.ts"],"sourcesContent":["#!/usr/bin/env node\n/* oxlint-disable no-console */\nconsole.warn('zero-build-schema is deprecated.\\n');\nconsole.info('Run `npx zero-deploy-permissions` to deploy permissions.\\n');\nprocess.exit(-1);\n"],"mappings":";;AAEA,QAAQ,KAAK,
|
|
1
|
+
{"version":3,"file":"build-schema.js","names":[],"sources":["../../../src/build-schema.ts"],"sourcesContent":["#!/usr/bin/env node\n/* oxlint-disable no-console */\nconsole.warn('zero-build-schema is deprecated.\\n');\nconsole.info('Run `npx zero-deploy-permissions` to deploy permissions.\\n');\nprocess.exit(-1);\n"],"mappings":";;AAEA,QAAQ,KAAK,qCAAqC;AAClD,QAAQ,KAAK,6DAA6D;AAC1E,QAAQ,KAAK,GAAG"}
|
|
@@ -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';\nconst startupMessageEnv = 'ZERO_ENABLE_STARTUP_MESSAGE';\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 // Print the dev-only startup message after the server is listening.\n [startupMessageEnv]: '1',\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":";;;;;;;;;;;AAgBA,IAAM,0BAA0B;AAChC,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAE1B,SAAS,YAAY,cAAwC;
|
|
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';\nconst startupMessageEnv = 'ZERO_ENABLE_STARTUP_MESSAGE';\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 // Print the dev-only startup message after the server is listening.\n [startupMessageEnv]: '1',\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zero-out.js","names":[],"sources":["../../../src/zero-out.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport '../../shared/src/dotenv.ts';\n\nimport {createLogContext} from '../../shared/src/logging.ts';\nimport {parseOptions} from '../../shared/src/options.ts';\nimport {ZERO_ENV_VAR_PREFIX as envNamePrefix} from '../../zero-cache/src/config/zero-config.ts';\nimport {\n decommissionOptions,\n decommissionZero,\n} from '../../zero-cache/src/scripts/decommission.ts';\n\nasync function main() {\n const config = parseOptions(decommissionOptions, {envNamePrefix});\n const lc = createLogContext(config);\n await decommissionZero(lc, config);\n}\n\nvoid main();\n"],"mappings":";;;;;;;AAYA,eAAe,OAAO;CACpB,MAAM,SAAS,aAAa,qBAAqB,EAAC,eAAA,
|
|
1
|
+
{"version":3,"file":"zero-out.js","names":[],"sources":["../../../src/zero-out.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport '../../shared/src/dotenv.ts';\n\nimport {createLogContext} from '../../shared/src/logging.ts';\nimport {parseOptions} from '../../shared/src/options.ts';\nimport {ZERO_ENV_VAR_PREFIX as envNamePrefix} from '../../zero-cache/src/config/zero-config.ts';\nimport {\n decommissionOptions,\n decommissionZero,\n} from '../../zero-cache/src/scripts/decommission.ts';\n\nasync function main() {\n const config = parseOptions(decommissionOptions, {envNamePrefix});\n const lc = createLogContext(config);\n await decommissionZero(lc, config);\n}\n\nvoid main();\n"],"mappings":";;;;;;;AAYA,eAAe,OAAO;CACpB,MAAM,SAAS,aAAa,qBAAqB,EAAC,eAAA,qBAAc,CAAC;AAEjE,OAAM,iBADK,iBAAiB,OAAO,EACR,OAAO;;AAG/B,MAAM"}
|