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