@rocicorp/zero 1.4.0 → 1.5.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/analyze-query/src/analyze-cli.js +2 -2
- package/out/analyze-query/src/analyze-cli.js.map +1 -1
- package/out/zero/package.js +1 -1
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/auth/auth.d.ts +1 -1
- package/out/zero-cache/src/auth/auth.d.ts.map +1 -1
- package/out/zero-cache/src/auth/auth.js +1 -1
- package/out/zero-cache/src/auth/auth.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts +1 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +8 -0
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +8 -4
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +28 -6
- 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 +2 -2
- package/out/zero-cache/src/custom/fetch.js.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.d.ts +21 -7
- package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js +26 -9
- package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +2 -1
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.d.ts.map +1 -1
- package/out/zero-cache/src/server/runner/run-worker.js +5 -2
- package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
- package/out/zero-cache/src/server/syncer.js +3 -3
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +2 -2
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +24 -20
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +258 -45
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +119 -83
- 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.d.ts.map +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/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +2 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +1 -0
- 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 +3 -3
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/http-service.d.ts +1 -0
- package/out/zero-cache/src/services/http-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/http-service.js +5 -4
- package/out/zero-cache/src/services/http-service.js.map +1 -1
- package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
- package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
- package/out/zero-cache/src/services/life-cycle.js +1 -2
- package/out/zero-cache/src/services/life-cycle.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.d.ts +4 -3
- package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.js +57 -38
- package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
- package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js +2 -1
- package/out/zero-cache/src/services/shadow-sync/shadow-sync-service.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +41 -27
- 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 +147 -104
- package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +6 -0
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +8 -0
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +3 -3
- 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 +119 -86
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/workers/connection.js +2 -2
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js +7 -7
- package/out/zero-cache/src/workers/syncer-ws-message-handler.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 +11 -10
- package/out/zero-cache/src/workers/syncer.js.map +1 -1
- package/out/zero-client/src/client/connection.d.ts +15 -7
- package/out/zero-client/src/client/connection.d.ts.map +1 -1
- package/out/zero-client/src/client/connection.js.map +1 -1
- package/out/zero-client/src/client/crud-impl.d.ts +1 -1
- package/out/zero-client/src/client/crud-impl.d.ts.map +1 -1
- package/out/zero-client/src/client/crud-impl.js +1 -1
- package/out/zero-client/src/client/crud-impl.js.map +1 -1
- package/out/zero-client/src/client/crud.d.ts +1 -1
- package/out/zero-client/src/client/crud.d.ts.map +1 -1
- package/out/zero-client/src/client/crud.js +1 -1
- package/out/zero-client/src/client/crud.js.map +1 -1
- package/out/zero-client/src/client/keys.d.ts +1 -1
- package/out/zero-client/src/client/keys.d.ts.map +1 -1
- package/out/zero-client/src/client/keys.js.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.d.ts +2 -1
- package/out/zero-client/src/client/mutation-tracker.d.ts.map +1 -1
- package/out/zero-client/src/client/mutation-tracker.js +3 -3
- package/out/zero-client/src/client/mutation-tracker.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +2 -2
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/types/client-state.d.ts +1 -1
- package/out/zero-client/src/types/client-state.d.ts.map +1 -1
- package/out/zero-protocol/src/custom-queries.js +1 -1
- package/out/zero-protocol/src/down.js +1 -1
- package/out/zero-protocol/src/error-kind-enum.d.ts +1 -2
- package/out/zero-protocol/src/error-kind-enum.d.ts.map +1 -1
- package/out/zero-protocol/src/error-kind-enum.js.map +1 -1
- package/out/zero-protocol/src/mutate-server.d.ts +165 -0
- package/out/zero-protocol/src/mutate-server.d.ts.map +1 -0
- package/out/zero-protocol/src/mutate-server.js +24 -0
- package/out/zero-protocol/src/mutate-server.js.map +1 -0
- package/out/zero-protocol/src/mutation.d.ts +229 -0
- package/out/zero-protocol/src/mutation.d.ts.map +1 -0
- package/out/zero-protocol/src/mutation.js +112 -0
- package/out/zero-protocol/src/mutation.js.map +1 -0
- package/out/zero-protocol/src/mutations-patch.js +1 -1
- package/out/zero-protocol/src/mutations-patch.js.map +1 -1
- package/out/zero-protocol/src/push.d.ts +3 -234
- package/out/zero-protocol/src/push.d.ts.map +1 -1
- package/out/zero-protocol/src/push.js +3 -114
- package/out/zero-protocol/src/push.js.map +1 -1
- package/out/zero-protocol/src/query-server.d.ts +150 -0
- package/out/zero-protocol/src/query-server.d.ts.map +1 -0
- package/out/zero-protocol/src/query-server.js +16 -0
- package/out/zero-protocol/src/query-server.js.map +1 -0
- package/out/zero-protocol/src/up.js +1 -1
- package/out/zero-server/src/mod.d.ts +4 -2
- package/out/zero-server/src/mod.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.d.ts +50 -4
- package/out/zero-server/src/process-mutations.d.ts.map +1 -1
- package/out/zero-server/src/process-mutations.js +73 -36
- package/out/zero-server/src/process-mutations.js.map +1 -1
- package/out/zero-server/src/push-processor.d.ts +3 -3
- package/out/zero-server/src/push-processor.d.ts.map +1 -1
- package/out/zero-server/src/push-processor.js.map +1 -1
- package/out/zero-server/src/queries/process-queries.d.ts +45 -53
- package/out/zero-server/src/queries/process-queries.d.ts.map +1 -1
- package/out/zero-server/src/queries/process-queries.js +72 -53
- package/out/zero-server/src/queries/process-queries.js.map +1 -1
- package/out/zero-server/src/zql-database.js.map +1 -1
- package/out/zero-types/src/default-types.d.ts +1 -0
- package/out/zero-types/src/default-types.d.ts.map +1 -1
- package/out/zql/src/builder/builder.d.ts.map +1 -1
- package/out/zql/src/builder/builder.js +17 -7
- package/out/zql/src/builder/builder.js.map +1 -1
- package/out/zql/src/ivm/cap.d.ts +32 -0
- package/out/zql/src/ivm/cap.d.ts.map +1 -0
- package/out/zql/src/ivm/cap.js +205 -0
- package/out/zql/src/ivm/cap.js.map +1 -0
- package/out/zql/src/ivm/constraint.js +1 -1
- package/out/zql/src/ivm/flipped-join.d.ts.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +61 -15
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +3 -4
- package/out/zql/src/ivm/memory-source.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/take.js +2 -2
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/mutate/mutator.d.ts +11 -2
- package/out/zql/src/mutate/mutator.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator.js.map +1 -1
- package/out/zql/src/query/query-registry.d.ts +9 -2
- package/out/zql/src/query/query-registry.d.ts.map +1 -1
- package/out/zql/src/query/query-registry.js.map +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +4 -1
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { LogLevel } from '@rocicorp/logger';
|
|
2
2
|
import type { ReadonlyJSONValue } from '../../../shared/src/json.ts';
|
|
3
3
|
import type { MaybePromise } from '../../../shared/src/types.ts';
|
|
4
|
-
import {
|
|
4
|
+
import type { QueryResponse } from '../../../zero-protocol/src/query-server.ts';
|
|
5
5
|
import type { Schema } from '../../../zero-types/src/schema.ts';
|
|
6
6
|
import type { AnyQuery } from '../../../zql/src/query/query.ts';
|
|
7
7
|
/**
|
|
@@ -15,7 +15,7 @@ import type { AnyQuery } from '../../../zql/src/query/query.ts';
|
|
|
15
15
|
*/
|
|
16
16
|
export declare function handleGetQueriesRequest<S extends Schema>(cb: (name: string, args: readonly ReadonlyJSONValue[]) => MaybePromise<{
|
|
17
17
|
query: AnyQuery;
|
|
18
|
-
} | AnyQuery>, schema: S, requestOrJsonBody: Request | ReadonlyJSONValue, logLevel?: LogLevel): Promise<
|
|
18
|
+
} | AnyQuery>, schema: S, requestOrJsonBody: Request | ReadonlyJSONValue, logLevel?: LogLevel): Promise<QueryResponse>;
|
|
19
19
|
/**
|
|
20
20
|
* Invokes the callback `cb` for each query in the request or JSON body.
|
|
21
21
|
* The callback should return a Query or Promise<Query> that is the transformed result.
|
|
@@ -27,59 +27,46 @@ export declare function handleGetQueriesRequest<S extends Schema>(cb: (name: str
|
|
|
27
27
|
*/
|
|
28
28
|
export declare function handleTransformRequest<S extends Schema>(cb: (name: string, args: readonly ReadonlyJSONValue[]) => MaybePromise<{
|
|
29
29
|
query: AnyQuery;
|
|
30
|
-
} | AnyQuery>, schema: S, requestOrJsonBody: Request | ReadonlyJSONValue, logLevel?: LogLevel): Promise<
|
|
30
|
+
} | AnyQuery>, schema: S, requestOrJsonBody: Request | ReadonlyJSONValue, logLevel?: LogLevel): Promise<QueryResponse>;
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* This function will call `transformQuery` in parallel for each query found in the request.
|
|
36
|
-
*
|
|
37
|
-
* @param transformQuery - Callback function that takes a query name and args, and returns a Query
|
|
38
|
-
* @param schema - The Zero schema
|
|
39
|
-
* @param requestOrJsonBody - Either a Request object or the JSON body directly
|
|
40
|
-
* @param logLevel - Logging level (defaults to 'info')
|
|
41
|
-
* @returns A Promise that resolves to a TransformResponseMessage
|
|
32
|
+
* Parsed query params accepted by {@linkcode handleQueryRequest} when the
|
|
33
|
+
* incoming request URL has already been handled by your framework.
|
|
42
34
|
*/
|
|
43
|
-
export
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
35
|
+
export type QuerySearchParams = URLSearchParams | Record<string, string>;
|
|
36
|
+
export type HandleQueryRequestArgs<S extends Schema> = {
|
|
37
|
+
/** Callback that transforms each requested query into a `Query`. */
|
|
38
|
+
handler: QueryRequestHandler;
|
|
39
|
+
/** Schema used when building the returned ASTs. */
|
|
40
|
+
schema: S;
|
|
41
|
+
/**
|
|
42
|
+
* Authenticated user ID. Null or undefined means the user is logged out.
|
|
43
|
+
*/
|
|
44
|
+
userID: string | null | undefined;
|
|
45
|
+
/** Optional log level for request parsing and execution. */
|
|
46
|
+
logLevel?: LogLevel | undefined;
|
|
47
|
+
} & ({
|
|
48
|
+
/** Fetch request containing the `/query` JSON body. */
|
|
49
|
+
request: Request;
|
|
55
50
|
} | {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
} | {
|
|
76
|
-
details?: ReadonlyJSONValue | undefined;
|
|
77
|
-
message: string;
|
|
78
|
-
kind: "TransformFailed";
|
|
79
|
-
queryIDs: string[];
|
|
80
|
-
origin: "zeroCache";
|
|
81
|
-
reason: "parse" | "internal" | "timeout";
|
|
82
|
-
}]>;
|
|
51
|
+
/** Parsed query params from the `/query` request URL. */
|
|
52
|
+
query: QuerySearchParams;
|
|
53
|
+
/** Parsed JSON body from the `/query` request. */
|
|
54
|
+
body: ReadonlyJSONValue;
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Process a `/query` request from a Fetch `Request`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function handleQueryRequest<S extends Schema>(input: HandleQueryRequestArgs<S>): Promise<QueryResponse>;
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated Pass a single object instead:
|
|
62
|
+
* `handleQueryRequest({handler, schema, request, userID, logLevel})`.
|
|
63
|
+
*/
|
|
64
|
+
export declare function handleQueryRequest<S extends Schema>(transformQuery: QueryRequestHandler, schema: S, request: Request, logLevel?: LogLevel): Promise<QueryResponse>;
|
|
65
|
+
/**
|
|
66
|
+
* @deprecated Pass a single object instead:
|
|
67
|
+
* `handleQueryRequest({handler, schema, body, userID, logLevel})`.
|
|
68
|
+
*/
|
|
69
|
+
export declare function handleQueryRequest<S extends Schema>(transformQuery: QueryRequestHandler, schema: S, jsonBody: ReadonlyJSONValue, logLevel?: LogLevel): Promise<QueryResponse>;
|
|
83
70
|
/**
|
|
84
71
|
* A function that transforms a query by name and arguments into a Query object.
|
|
85
72
|
*
|
|
@@ -87,5 +74,10 @@ export declare function handleQueryRequest<S extends Schema>(transformQuery: Tra
|
|
|
87
74
|
* @param args - The arguments to pass to the query (can be undefined)
|
|
88
75
|
* @returns A Query object
|
|
89
76
|
*/
|
|
90
|
-
export type
|
|
77
|
+
export type QueryRequestHandler = (name: string, args: ReadonlyJSONValue | undefined) => AnyQuery;
|
|
78
|
+
/** @deprecated Use `QueryRequestHandler` instead. */
|
|
79
|
+
export type TransformQueryFunction = QueryRequestHandler;
|
|
80
|
+
export type LegacyQueryRequestHandler = (name: string, args: readonly ReadonlyJSONValue[]) => MaybePromise<{
|
|
81
|
+
query: AnyQuery;
|
|
82
|
+
} | AnyQuery>;
|
|
91
83
|
//# sourceMappingURL=process-queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-queries.d.ts","sourceRoot":"","sources":["../../../../../zero-server/src/queries/process-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"process-queries.d.ts","sourceRoot":"","sources":["../../../../../zero-server/src/queries/process-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAG/C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,8BAA8B,CAAC;AAW/D,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,4CAA4C,CAAC;AAE9E,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAG9D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,iCAAiC,CAAC;AAG9D;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EACtD,EAAE,EAAE,CACF,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,iBAAiB,EAAE,KAC/B,YAAY,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAC,GAAG,QAAQ,CAAC,EAC/C,MAAM,EAAE,CAAC,EACT,iBAAiB,EAAE,OAAO,GAAG,iBAAiB,EAC9C,QAAQ,GAAE,QAAiB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACrD,EAAE,EAAE,CACF,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,iBAAiB,EAAE,KAC/B,YAAY,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAC,GAAG,QAAQ,CAAC,EAC/C,MAAM,EAAE,CAAC,EACT,iBAAiB,EAAE,OAAO,GAAG,iBAAiB,EAC9C,QAAQ,GAAE,QAAiB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEzE,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,MAAM,IAAI;IACrD,oEAAoE;IACpE,OAAO,EAAE,mBAAmB,CAAC;IAC7B,mDAAmD;IACnD,MAAM,EAAE,CAAC,CAAC;IACV;;OAEG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACjC,GAAG,CACA;IACE,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;CAClB,GACD;IACE,yDAAyD;IACzD,KAAK,EAAE,iBAAiB,CAAC;IACzB,kDAAkD;IAClD,IAAI,EAAE,iBAAiB,CAAC;CACzB,CACJ,CAAC;AAuBF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,aAAa,CAAC,CAAC;AAE1B;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,cAAc,EAAE,mBAAmB,EACnC,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE1B;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,cAAc,EAAE,mBAAmB,EACnC,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,aAAa,CAAC,CAAC;AA4K1B;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,GAAG,SAAS,KAChC,QAAQ,CAAC;AAEd,qDAAqD;AACrD,MAAM,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAEzD,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,iBAAiB,EAAE,KAC/B,YAAY,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAC,GAAG,QAAQ,CAAC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assert } from "../../../shared/src/asserts.js";
|
|
1
2
|
import { parse } from "../../../shared/src/valita.js";
|
|
2
3
|
import { getErrorDetails, getErrorMessage } from "../../../shared/src/error.js";
|
|
3
4
|
import { mapAST } from "../../../zero-protocol/src/ast.js";
|
|
@@ -20,7 +21,7 @@ import { createLogContext } from "../logging.js";
|
|
|
20
21
|
* @deprecated Use {@linkcode handleQueryRequest} instead.
|
|
21
22
|
*/
|
|
22
23
|
function handleGetQueriesRequest(cb, schema, requestOrJsonBody, logLevel = "info") {
|
|
23
|
-
return transform(cb, schema, requestOrJsonBody, "getQueries"
|
|
24
|
+
return transform(normalizeLegacyQueryRequestArgs(cb, schema, requestOrJsonBody, logLevel), "getQueries");
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
26
27
|
* Invokes the callback `cb` for each query in the request or JSON body.
|
|
@@ -32,89 +33,107 @@ function handleGetQueriesRequest(cb, schema, requestOrJsonBody, logLevel = "info
|
|
|
32
33
|
* @deprecated Use {@linkcode handleQueryRequest} instead.
|
|
33
34
|
*/
|
|
34
35
|
function handleTransformRequest(cb, schema, requestOrJsonBody, logLevel = "info") {
|
|
35
|
-
return transform(cb, schema, requestOrJsonBody, "transform"
|
|
36
|
+
return transform(normalizeLegacyQueryRequestArgs(cb, schema, requestOrJsonBody, logLevel), "transform");
|
|
36
37
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
* The callback should return a Query that is the transformed result.
|
|
40
|
-
*
|
|
41
|
-
* This function will call `transformQuery` in parallel for each query found in the request.
|
|
42
|
-
*
|
|
43
|
-
* @param transformQuery - Callback function that takes a query name and args, and returns a Query
|
|
44
|
-
* @param schema - The Zero schema
|
|
45
|
-
* @param requestOrJsonBody - Either a Request object or the JSON body directly
|
|
46
|
-
* @param logLevel - Logging level (defaults to 'info')
|
|
47
|
-
* @returns A Promise that resolves to a TransformResponseMessage
|
|
48
|
-
*/
|
|
49
|
-
function handleQueryRequest(transformQuery, schema, requestOrJsonBody, logLevel = "info") {
|
|
50
|
-
return transform((name, argsArray) => transformQuery(name, argsArray[0]), schema, requestOrJsonBody, "query", logLevel);
|
|
38
|
+
function handleQueryRequest(inputOrTransformQuery, schema, requestOrJsonBody, logLevel) {
|
|
39
|
+
return transform(typeof inputOrTransformQuery === "object" && "handler" in inputOrTransformQuery ? normalizeQueryRequestInput(inputOrTransformQuery) : normalizeLegacyQueryRequestArgs(wrapQueryRequestHandler(inputOrTransformQuery), schema, requestOrJsonBody, logLevel), "query");
|
|
51
40
|
}
|
|
52
|
-
|
|
53
|
-
|
|
41
|
+
function normalizeQueryRequestInput(input) {
|
|
42
|
+
return "request" in input ? normalizeLegacyQueryRequestArgs(wrapQueryRequestHandler(input.handler), input.schema, input.request, input.logLevel, input.userID ?? null) : normalizeLegacyQueryRequestArgs(wrapQueryRequestHandler(input.handler), input.schema, input.body, input.logLevel, input.userID ?? null);
|
|
43
|
+
}
|
|
44
|
+
function normalizeLegacyQueryRequestArgs(handler, schema, requestOrJsonBody, logLevel, userID) {
|
|
45
|
+
assert(typeof schema !== "undefined", "Schema must be provided when using handleQueryRequest");
|
|
46
|
+
if (requestOrJsonBody instanceof Request) return {
|
|
47
|
+
type: "request",
|
|
48
|
+
handler,
|
|
49
|
+
schema,
|
|
50
|
+
request: requestOrJsonBody,
|
|
51
|
+
userID,
|
|
52
|
+
logLevel: logLevel ?? "info"
|
|
53
|
+
};
|
|
54
|
+
assert(typeof requestOrJsonBody !== "undefined", "JSON body cannot be undefined");
|
|
55
|
+
return {
|
|
56
|
+
type: "body",
|
|
57
|
+
handler,
|
|
58
|
+
schema,
|
|
59
|
+
jsonBody: requestOrJsonBody,
|
|
60
|
+
userID,
|
|
61
|
+
logLevel: logLevel ?? "info"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async function transform(args, apiName) {
|
|
65
|
+
const lc = createLogContext(args.logLevel).withContext("TransformRequest");
|
|
54
66
|
let parsed;
|
|
55
67
|
let queryIDs = [];
|
|
56
68
|
try {
|
|
57
69
|
let body;
|
|
58
|
-
if (
|
|
59
|
-
else body =
|
|
70
|
+
if (args.type === "request") body = await args.request.json();
|
|
71
|
+
else body = args.jsonBody;
|
|
60
72
|
parsed = parse(body, transformRequestMessageSchema);
|
|
61
73
|
queryIDs = parsed[1].map((r) => r.id);
|
|
62
74
|
} catch (error) {
|
|
63
75
|
lc.error?.(`Failed to parse ${apiName} request`, error);
|
|
64
76
|
const message = `Failed to parse ${apiName} request: ${getErrorMessage(error)}`;
|
|
65
77
|
const details = getErrorDetails(error);
|
|
66
|
-
return
|
|
78
|
+
return {
|
|
67
79
|
kind: TransformFailed,
|
|
68
80
|
origin: Server,
|
|
69
81
|
reason: Parse,
|
|
70
82
|
message,
|
|
71
83
|
queryIDs,
|
|
72
84
|
...details ? { details } : {}
|
|
73
|
-
}
|
|
85
|
+
};
|
|
74
86
|
}
|
|
75
87
|
try {
|
|
76
|
-
const nameMapper = clientToServer(schema.tables);
|
|
77
|
-
return
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
88
|
+
const nameMapper = clientToServer(args.schema.tables);
|
|
89
|
+
return {
|
|
90
|
+
kind: "QueryResponse",
|
|
91
|
+
queries: await Promise.all(parsed[1].map(async (req) => {
|
|
92
|
+
let finalQuery;
|
|
93
|
+
try {
|
|
94
|
+
const result = await args.handler(req.name, req.args);
|
|
95
|
+
finalQuery = "query" in result ? result.query : result;
|
|
96
|
+
} catch (error) {
|
|
97
|
+
const message = getErrorMessage(error);
|
|
98
|
+
const details = getErrorDetails(error);
|
|
99
|
+
return {
|
|
100
|
+
error: error instanceof QueryParseError ? "parse" : "app",
|
|
101
|
+
id: req.id,
|
|
102
|
+
name: req.name,
|
|
103
|
+
message,
|
|
104
|
+
...details ? { details } : {}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const ast = mapAST(asQueryInternals(finalQuery).ast, nameMapper);
|
|
109
|
+
return {
|
|
110
|
+
id: req.id,
|
|
111
|
+
name: req.name,
|
|
112
|
+
ast
|
|
113
|
+
};
|
|
114
|
+
} catch (error) {
|
|
115
|
+
lc.error?.("Failed to map AST", error);
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
})),
|
|
119
|
+
...typeof args.userID !== "undefined" ? { userID: args.userID } : {}
|
|
120
|
+
};
|
|
105
121
|
} catch (e) {
|
|
106
122
|
const message = getErrorMessage(e);
|
|
107
123
|
const details = getErrorDetails(e);
|
|
108
|
-
return
|
|
124
|
+
return {
|
|
109
125
|
kind: TransformFailed,
|
|
110
126
|
origin: Server,
|
|
111
127
|
reason: Internal,
|
|
112
128
|
message,
|
|
113
129
|
queryIDs,
|
|
114
130
|
...details ? { details } : {}
|
|
115
|
-
}
|
|
131
|
+
};
|
|
116
132
|
}
|
|
117
133
|
}
|
|
134
|
+
function wrapQueryRequestHandler(handler) {
|
|
135
|
+
return (name, args) => handler(name, args[0]);
|
|
136
|
+
}
|
|
118
137
|
//#endregion
|
|
119
138
|
export { handleGetQueriesRequest, handleQueryRequest, handleTransformRequest };
|
|
120
139
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-queries.js","names":[],"sources":["../../../../../zero-server/src/queries/process-queries.ts"],"sourcesContent":["import type {LogLevel} from '@rocicorp/logger';\nimport {getErrorDetails, getErrorMessage} from '../../../shared/src/error.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {MaybePromise} from '../../../shared/src/types.ts';\nimport * as v from '../../../shared/src/valita.ts';\nimport {mapAST} from '../../../zero-protocol/src/ast.ts';\nimport {\n transformRequestMessageSchema,\n type TransformRequestMessage,\n type TransformResponseBody,\n type TransformResponseMessage,\n} from '../../../zero-protocol/src/custom-queries.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts';\nimport {ErrorReason} from '../../../zero-protocol/src/error-reason.ts';\nimport {clientToServer} from '../../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {QueryParseError} from '../../../zql/src/query/error.ts';\nimport {asQueryInternals} from '../../../zql/src/query/query-internals.ts';\nimport type {AnyQuery} from '../../../zql/src/query/query.ts';\nimport {createLogContext} from '../logging.ts';\n\n/**\n * Invokes the callback `cb` for each query in the request or JSON body.\n * The callback should return a Query or Promise<Query> that is the transformed result.\n *\n * This function will call `cb` in parallel for each query found in the request.\n *\n * If you need to limit concurrency, you can use a library like `p-limit` to wrap the `cb` function.\n * @deprecated Use {@linkcode handleQueryRequest} instead.\n */\nexport function handleGetQueriesRequest<S extends Schema>(\n cb: (\n name: string,\n args: readonly ReadonlyJSONValue[],\n ) => MaybePromise<{query: AnyQuery} | AnyQuery>,\n schema: S,\n requestOrJsonBody: Request | ReadonlyJSONValue,\n logLevel: LogLevel = 'info',\n): Promise<TransformResponseMessage> {\n return transform(cb, schema, requestOrJsonBody, 'getQueries', logLevel);\n}\n\n/**\n * Invokes the callback `cb` for each query in the request or JSON body.\n * The callback should return a Query or Promise<Query> that is the transformed result.\n *\n * This function will call `cb` in parallel for each query found in the request.\n *\n * If you need to limit concurrency, you can use a library like `p-limit` to wrap the `cb` function.\n * @deprecated Use {@linkcode handleQueryRequest} instead.\n */\nexport function handleTransformRequest<S extends Schema>(\n cb: (\n name: string,\n args: readonly ReadonlyJSONValue[],\n ) => MaybePromise<{query: AnyQuery} | AnyQuery>,\n schema: S,\n requestOrJsonBody: Request | ReadonlyJSONValue,\n logLevel: LogLevel = 'info',\n): Promise<TransformResponseMessage> {\n return transform(cb, schema, requestOrJsonBody, 'transform', logLevel);\n}\n\n/**\n * Processes a transform request by invoking the provided callback for each query.\n * The callback should return a Query that is the transformed result.\n *\n * This function will call `transformQuery` in parallel for each query found in the request.\n *\n * @param transformQuery - Callback function that takes a query name and args, and returns a Query\n * @param schema - The Zero schema\n * @param requestOrJsonBody - Either a Request object or the JSON body directly\n * @param logLevel - Logging level (defaults to 'info')\n * @returns A Promise that resolves to a TransformResponseMessage\n */\nexport function handleQueryRequest<S extends Schema>(\n transformQuery: TransformQueryFunction,\n schema: S,\n requestOrJsonBody: Request | ReadonlyJSONValue,\n logLevel: LogLevel = 'info',\n) {\n return transform(\n (name, argsArray) => transformQuery(name, argsArray[0]),\n schema,\n requestOrJsonBody,\n 'query',\n logLevel,\n );\n}\n\nasync function transform<S extends Schema>(\n cb: (\n name: string,\n args: readonly ReadonlyJSONValue[],\n ) => MaybePromise<{query: AnyQuery} | AnyQuery>,\n schema: S,\n requestOrJsonBody: Request | ReadonlyJSONValue,\n apiName: 'query' | 'getQueries' | 'transform',\n logLevel: LogLevel = 'info',\n): Promise<TransformResponseMessage> {\n const lc = createLogContext(logLevel).withContext('TransformRequest');\n let parsed: TransformRequestMessage;\n let queryIDs: string[] = [];\n try {\n let body: ReadonlyJSONValue;\n if (requestOrJsonBody instanceof Request) {\n body = await requestOrJsonBody.json();\n } else {\n body = requestOrJsonBody;\n }\n\n parsed = v.parse(body, transformRequestMessageSchema);\n\n queryIDs = parsed[1].map(r => r.id);\n } catch (error) {\n lc.error?.(`Failed to parse ${apiName} request`, error);\n\n const message = `Failed to parse ${apiName} request: ${getErrorMessage(error)}`;\n const details = getErrorDetails(error);\n\n return [\n 'transformFailed',\n {\n kind: ErrorKind.TransformFailed,\n origin: ErrorOrigin.Server,\n reason: ErrorReason.Parse,\n message,\n queryIDs,\n ...(details ? {details} : {}),\n },\n ];\n }\n\n try {\n const nameMapper = clientToServer(schema.tables);\n\n const responses: TransformResponseBody = await Promise.all(\n parsed[1].map(async req => {\n let finalQuery: AnyQuery;\n try {\n const result = await cb(req.name, req.args);\n finalQuery = 'query' in result ? result.query : result;\n } catch (error) {\n const message = getErrorMessage(error);\n const details = getErrorDetails(error);\n\n return {\n error: error instanceof QueryParseError ? 'parse' : 'app',\n id: req.id,\n name: req.name,\n message,\n ...(details ? {details} : {}),\n };\n }\n\n try {\n const q = asQueryInternals(finalQuery);\n const ast = mapAST(q.ast, nameMapper);\n\n return {\n id: req.id,\n name: req.name,\n ast,\n };\n } catch (error) {\n lc.error?.('Failed to map AST', error);\n throw error;\n }\n }),\n );\n\n return ['transformed', responses];\n } catch (e) {\n const message = getErrorMessage(e);\n const details = getErrorDetails(e);\n\n return [\n 'transformFailed',\n {\n kind: ErrorKind.TransformFailed,\n origin: ErrorOrigin.Server,\n reason: ErrorReason.Internal,\n message,\n queryIDs,\n ...(details ? {details} : {}),\n },\n ];\n }\n}\n\n/**\n * A function that transforms a query by name and arguments into a Query object.\n *\n * @param name - The name of the query (can be dot-separated for nested queries)\n * @param args - The arguments to pass to the query (can be undefined)\n * @returns A Query object\n */\nexport type TransformQueryFunction = (\n name: string,\n args: ReadonlyJSONValue | undefined,\n) => AnyQuery;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA+BA,SAAgB,wBACd,IAIA,QACA,mBACA,WAAqB,QACc;AACnC,QAAO,UAAU,IAAI,QAAQ,mBAAmB,cAAc,SAAS;;;;;;;;;;;AAYzE,SAAgB,uBACd,IAIA,QACA,mBACA,WAAqB,QACc;AACnC,QAAO,UAAU,IAAI,QAAQ,mBAAmB,aAAa,SAAS;;;;;;;;;;;;;;AAexE,SAAgB,mBACd,gBACA,QACA,mBACA,WAAqB,QACrB;AACA,QAAO,WACJ,MAAM,cAAc,eAAe,MAAM,UAAU,GAAG,EACvD,QACA,mBACA,SACA,SACD;;AAGH,eAAe,UACb,IAIA,QACA,mBACA,SACA,WAAqB,QACc;CACnC,MAAM,KAAK,iBAAiB,SAAS,CAAC,YAAY,mBAAmB;CACrE,IAAI;CACJ,IAAI,WAAqB,EAAE;AAC3B,KAAI;EACF,IAAI;AACJ,MAAI,6BAA6B,QAC/B,QAAO,MAAM,kBAAkB,MAAM;MAErC,QAAO;AAGT,WAAS,MAAQ,MAAM,8BAA8B;AAErD,aAAW,OAAO,GAAG,KAAI,MAAK,EAAE,GAAG;UAC5B,OAAO;AACd,KAAG,QAAQ,mBAAmB,QAAQ,WAAW,MAAM;EAEvD,MAAM,UAAU,mBAAmB,QAAQ,YAAY,gBAAgB,MAAM;EAC7E,MAAM,UAAU,gBAAgB,MAAM;AAEtC,SAAO,CACL,mBACA;GACE,MAAM;GACN,QAAQ;GACR,QAAQ;GACR;GACA;GACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;GAC7B,CACF;;AAGH,KAAI;EACF,MAAM,aAAa,eAAe,OAAO,OAAO;AAqChD,SAAO,CAAC,eAnCiC,MAAM,QAAQ,IACrD,OAAO,GAAG,IAAI,OAAM,QAAO;GACzB,IAAI;AACJ,OAAI;IACF,MAAM,SAAS,MAAM,GAAG,IAAI,MAAM,IAAI,KAAK;AAC3C,iBAAa,WAAW,SAAS,OAAO,QAAQ;YACzC,OAAO;IACd,MAAM,UAAU,gBAAgB,MAAM;IACtC,MAAM,UAAU,gBAAgB,MAAM;AAEtC,WAAO;KACL,OAAO,iBAAiB,kBAAkB,UAAU;KACpD,IAAI,IAAI;KACR,MAAM,IAAI;KACV;KACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;KAC7B;;AAGH,OAAI;IAEF,MAAM,MAAM,OADF,iBAAiB,WAAW,CACjB,KAAK,WAAW;AAErC,WAAO;KACL,IAAI,IAAI;KACR,MAAM,IAAI;KACV;KACD;YACM,OAAO;AACd,OAAG,QAAQ,qBAAqB,MAAM;AACtC,UAAM;;IAER,CACH,CAEgC;UAC1B,GAAG;EACV,MAAM,UAAU,gBAAgB,EAAE;EAClC,MAAM,UAAU,gBAAgB,EAAE;AAElC,SAAO,CACL,mBACA;GACE,MAAM;GACN,QAAQ;GACR,QAAQ;GACR;GACA;GACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;GAC7B,CACF"}
|
|
1
|
+
{"version":3,"file":"process-queries.js","names":[],"sources":["../../../../../zero-server/src/queries/process-queries.ts"],"sourcesContent":["import type {LogLevel} from '@rocicorp/logger';\nimport {assert} from '../../../shared/src/asserts.ts';\nimport {getErrorDetails, getErrorMessage} from '../../../shared/src/error.ts';\nimport type {ReadonlyJSONValue} from '../../../shared/src/json.ts';\nimport type {MaybePromise} from '../../../shared/src/types.ts';\nimport * as v from '../../../shared/src/valita.ts';\nimport {mapAST} from '../../../zero-protocol/src/ast.ts';\nimport {\n transformRequestMessageSchema,\n type TransformRequestMessage,\n type TransformResponseBody,\n} from '../../../zero-protocol/src/custom-queries.ts';\nimport {ErrorKind} from '../../../zero-protocol/src/error-kind.ts';\nimport {ErrorOrigin} from '../../../zero-protocol/src/error-origin.ts';\nimport {ErrorReason} from '../../../zero-protocol/src/error-reason.ts';\nimport type {QueryResponse} from '../../../zero-protocol/src/query-server.ts';\nimport {clientToServer} from '../../../zero-schema/src/name-mapper.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {QueryParseError} from '../../../zql/src/query/error.ts';\nimport {asQueryInternals} from '../../../zql/src/query/query-internals.ts';\nimport type {AnyQuery} from '../../../zql/src/query/query.ts';\nimport {createLogContext} from '../logging.ts';\n\n/**\n * Invokes the callback `cb` for each query in the request or JSON body.\n * The callback should return a Query or Promise<Query> that is the transformed result.\n *\n * This function will call `cb` in parallel for each query found in the request.\n *\n * If you need to limit concurrency, you can use a library like `p-limit` to wrap the `cb` function.\n * @deprecated Use {@linkcode handleQueryRequest} instead.\n */\nexport function handleGetQueriesRequest<S extends Schema>(\n cb: (\n name: string,\n args: readonly ReadonlyJSONValue[],\n ) => MaybePromise<{query: AnyQuery} | AnyQuery>,\n schema: S,\n requestOrJsonBody: Request | ReadonlyJSONValue,\n logLevel: LogLevel = 'info',\n): Promise<QueryResponse> {\n return transform(\n normalizeLegacyQueryRequestArgs(cb, schema, requestOrJsonBody, logLevel),\n 'getQueries',\n );\n}\n\n/**\n * Invokes the callback `cb` for each query in the request or JSON body.\n * The callback should return a Query or Promise<Query> that is the transformed result.\n *\n * This function will call `cb` in parallel for each query found in the request.\n *\n * If you need to limit concurrency, you can use a library like `p-limit` to wrap the `cb` function.\n * @deprecated Use {@linkcode handleQueryRequest} instead.\n */\nexport function handleTransformRequest<S extends Schema>(\n cb: (\n name: string,\n args: readonly ReadonlyJSONValue[],\n ) => MaybePromise<{query: AnyQuery} | AnyQuery>,\n schema: S,\n requestOrJsonBody: Request | ReadonlyJSONValue,\n logLevel: LogLevel = 'info',\n): Promise<QueryResponse> {\n return transform(\n normalizeLegacyQueryRequestArgs(cb, schema, requestOrJsonBody, logLevel),\n 'transform',\n );\n}\n\n/**\n * Parsed query params accepted by {@linkcode handleQueryRequest} when the\n * incoming request URL has already been handled by your framework.\n */\nexport type QuerySearchParams = URLSearchParams | Record<string, string>;\n\nexport type HandleQueryRequestArgs<S extends Schema> = {\n /** Callback that transforms each requested query into a `Query`. */\n handler: QueryRequestHandler;\n /** Schema used when building the returned ASTs. */\n schema: S;\n /**\n * Authenticated user ID. Null or undefined means the user is logged out.\n */\n userID: string | null | undefined;\n /** Optional log level for request parsing and execution. */\n logLevel?: LogLevel | undefined;\n} & (\n | {\n /** Fetch request containing the `/query` JSON body. */\n request: Request;\n }\n | {\n /** Parsed query params from the `/query` request URL. */\n query: QuerySearchParams;\n /** Parsed JSON body from the `/query` request. */\n body: ReadonlyJSONValue;\n }\n);\n\ntype NormalizedQueryRequestArgs<S extends Schema> = {\n readonly schema: S;\n readonly handler: LegacyQueryRequestHandler;\n // Note: semantics of undefined differ from HandleQueryRequestArgs.userID.\n // Here, undefined means the app didn't provide a user ID - we do not know if\n // the user is logged in or not. This is legacy behavior needed to support\n // deprecated signatures of handleQueryRequest which did not receive userID\n // from app.\n readonly userID: string | null | undefined;\n readonly logLevel: LogLevel;\n} & (\n | {\n readonly type: 'request';\n readonly request: Request;\n }\n | {\n readonly type: 'body';\n readonly jsonBody: ReadonlyJSONValue;\n }\n);\n\n/**\n * Process a `/query` request from a Fetch `Request`.\n */\nexport function handleQueryRequest<S extends Schema>(\n input: HandleQueryRequestArgs<S>,\n): Promise<QueryResponse>;\n\n/**\n * @deprecated Pass a single object instead:\n * `handleQueryRequest({handler, schema, request, userID, logLevel})`.\n */\nexport function handleQueryRequest<S extends Schema>(\n transformQuery: QueryRequestHandler,\n schema: S,\n request: Request,\n logLevel?: LogLevel,\n): Promise<QueryResponse>;\n\n/**\n * @deprecated Pass a single object instead:\n * `handleQueryRequest({handler, schema, body, userID, logLevel})`.\n */\nexport function handleQueryRequest<S extends Schema>(\n transformQuery: QueryRequestHandler,\n schema: S,\n jsonBody: ReadonlyJSONValue,\n logLevel?: LogLevel,\n): Promise<QueryResponse>;\n\nexport function handleQueryRequest<S extends Schema>(\n inputOrTransformQuery: HandleQueryRequestArgs<S> | QueryRequestHandler,\n schema?: S,\n requestOrJsonBody?: Request | ReadonlyJSONValue,\n logLevel?: LogLevel,\n): Promise<QueryResponse> {\n const normalized =\n typeof inputOrTransformQuery === 'object' &&\n 'handler' in inputOrTransformQuery\n ? normalizeQueryRequestInput(inputOrTransformQuery)\n : normalizeLegacyQueryRequestArgs(\n wrapQueryRequestHandler(inputOrTransformQuery),\n schema,\n requestOrJsonBody,\n logLevel,\n );\n\n return transform(normalized, 'query');\n}\n\nfunction normalizeQueryRequestInput<S extends Schema>(\n input: HandleQueryRequestArgs<S>,\n): NormalizedQueryRequestArgs<S> {\n return 'request' in input\n ? normalizeLegacyQueryRequestArgs(\n wrapQueryRequestHandler(input.handler),\n input.schema,\n input.request,\n input.logLevel,\n input.userID ?? null,\n )\n : normalizeLegacyQueryRequestArgs(\n wrapQueryRequestHandler(input.handler),\n input.schema,\n input.body,\n input.logLevel,\n input.userID ?? null,\n );\n}\n\nfunction normalizeLegacyQueryRequestArgs<S extends Schema>(\n handler: LegacyQueryRequestHandler,\n schema: S | undefined,\n requestOrJsonBody: Request | ReadonlyJSONValue | undefined,\n logLevel: LogLevel | undefined,\n userID?: string | null,\n): NormalizedQueryRequestArgs<S> {\n assert(\n typeof schema !== 'undefined',\n 'Schema must be provided when using handleQueryRequest',\n );\n\n if (requestOrJsonBody instanceof Request) {\n return {\n type: 'request',\n handler,\n schema,\n request: requestOrJsonBody,\n userID,\n logLevel: logLevel ?? 'info',\n };\n }\n\n assert(\n typeof requestOrJsonBody !== 'undefined',\n 'JSON body cannot be undefined',\n );\n\n return {\n type: 'body',\n handler,\n schema,\n jsonBody: requestOrJsonBody,\n userID,\n logLevel: logLevel ?? 'info',\n };\n}\n\nasync function transform<S extends Schema>(\n args: NormalizedQueryRequestArgs<S>,\n apiName: 'query' | 'transform' | 'getQueries',\n): Promise<QueryResponse> {\n const lc = createLogContext(args.logLevel).withContext('TransformRequest');\n let parsed: TransformRequestMessage;\n let queryIDs: string[] = [];\n try {\n let body: ReadonlyJSONValue;\n if (args.type === 'request') {\n body = await args.request.json();\n } else {\n body = args.jsonBody;\n }\n\n parsed = v.parse(body, transformRequestMessageSchema);\n\n queryIDs = parsed[1].map(r => r.id);\n } catch (error) {\n lc.error?.(`Failed to parse ${apiName} request`, error);\n\n const message = `Failed to parse ${apiName} request: ${getErrorMessage(error)}`;\n const details = getErrorDetails(error);\n\n return {\n kind: ErrorKind.TransformFailed,\n origin: ErrorOrigin.Server,\n reason: ErrorReason.Parse,\n message,\n queryIDs,\n ...(details ? {details} : {}),\n };\n }\n\n try {\n const nameMapper = clientToServer(args.schema.tables);\n\n const responses: TransformResponseBody = await Promise.all(\n parsed[1].map(async req => {\n let finalQuery: AnyQuery;\n try {\n const result = await args.handler(req.name, req.args);\n finalQuery = 'query' in result ? result.query : result;\n } catch (error) {\n const message = getErrorMessage(error);\n const details = getErrorDetails(error);\n\n return {\n error: error instanceof QueryParseError ? 'parse' : 'app',\n id: req.id,\n name: req.name,\n message,\n ...(details ? {details} : {}),\n };\n }\n\n try {\n const q = asQueryInternals(finalQuery);\n const ast = mapAST(q.ast, nameMapper);\n\n return {\n id: req.id,\n name: req.name,\n ast,\n };\n } catch (error) {\n lc.error?.('Failed to map AST', error);\n throw error;\n }\n }),\n );\n\n return {\n kind: 'QueryResponse',\n queries: responses,\n ...(typeof args.userID !== 'undefined' ? {userID: args.userID} : {}),\n } as const satisfies QueryResponse;\n } catch (e) {\n const message = getErrorMessage(e);\n const details = getErrorDetails(e);\n\n return {\n kind: ErrorKind.TransformFailed,\n origin: ErrorOrigin.Server,\n reason: ErrorReason.Internal,\n message,\n queryIDs,\n ...(details ? {details} : {}),\n };\n }\n}\n\n/**\n * A function that transforms a query by name and arguments into a Query object.\n *\n * @param name - The name of the query (can be dot-separated for nested queries)\n * @param args - The arguments to pass to the query (can be undefined)\n * @returns A Query object\n */\nexport type QueryRequestHandler = (\n name: string,\n args: ReadonlyJSONValue | undefined,\n) => AnyQuery;\n\n/** @deprecated Use `QueryRequestHandler` instead. */\nexport type TransformQueryFunction = QueryRequestHandler;\n\nexport type LegacyQueryRequestHandler = (\n name: string,\n args: readonly ReadonlyJSONValue[],\n) => MaybePromise<{query: AnyQuery} | AnyQuery>;\n\nfunction wrapQueryRequestHandler(\n handler: QueryRequestHandler,\n): LegacyQueryRequestHandler {\n return (name, args) => handler(name, args[0]);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zql-database.js","names":["#crudFactory","#makeServerTransaction"],"sources":["../../../../zero-server/src/zql-database.ts"],"sourcesContent":["import type {MaybePromise} from '../../shared/src/types.ts';\nimport {formatPg, sql} from '../../z2s/src/sql.ts';\nimport type {CleanupResultsArg} from '../../zero-protocol/src/
|
|
1
|
+
{"version":3,"file":"zql-database.js","names":["#crudFactory","#makeServerTransaction"],"sources":["../../../../zero-server/src/zql-database.ts"],"sourcesContent":["import type {MaybePromise} from '../../shared/src/types.ts';\nimport {formatPg, sql} from '../../z2s/src/sql.ts';\nimport type {CleanupResultsArg} from '../../zero-protocol/src/mutation.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {DBConnection, DBTransaction} from '../../zql/src/mutate/custom.ts';\nimport type {\n HumanReadable,\n Query,\n RunOptions,\n} from '../../zql/src/query/query.ts';\nimport {CRUDMutatorFactory, type TransactionImpl} from './custom.ts';\nimport type {\n Database,\n TransactionProviderHooks,\n TransactionProviderInput,\n} from './process-mutations.ts';\n\n/**\n * Implements a Database for use with PushProcessor that is backed by Postgres.\n *\n * This implementation also implements the same ZQL interfaces for reading and\n * writing data that the Zero client does, so that mutator functions can be\n * shared across client and server.\n */\nexport class ZQLDatabase<\n TSchema extends Schema,\n TWrappedTransaction,\n> implements Database<TransactionImpl<TSchema, TWrappedTransaction>> {\n readonly connection: DBConnection<TWrappedTransaction>;\n readonly #crudFactory: CRUDMutatorFactory<TSchema>;\n\n constructor(connection: DBConnection<TWrappedTransaction>, schema: TSchema) {\n this.connection = connection;\n this.#crudFactory = new CRUDMutatorFactory(schema);\n }\n\n transaction<R>(\n callback: (\n tx: TransactionImpl<TSchema, TWrappedTransaction>,\n transactionHooks: TransactionProviderHooks,\n ) => MaybePromise<R>,\n transactionInput?: TransactionProviderInput,\n ): Promise<R> {\n // Icky hack. This is just here to have user not have to do this.\n // These interfaces need to be factored better.\n const {\n upstreamSchema = '',\n clientGroupID = '',\n clientID = '',\n mutationID = 0,\n } = transactionInput ?? {};\n return this.connection.transaction(async dbTx => {\n const zeroTx = await this.#makeServerTransaction(\n dbTx,\n clientID,\n mutationID,\n );\n\n return callback(zeroTx, {\n async updateClientMutationID() {\n const formatted = formatPg(\n sql`INSERT INTO ${sql.ident(upstreamSchema)}.clients \n as current (\"clientGroupID\", \"clientID\", \"lastMutationID\")\n VALUES (${clientGroupID}, ${clientID}, ${1})\n ON CONFLICT (\"clientGroupID\", \"clientID\")\n DO UPDATE SET \"lastMutationID\" = current.\"lastMutationID\" + 1\n RETURNING \"lastMutationID\"`,\n );\n\n const [{lastMutationID}] = (await dbTx.query(\n formatted.text,\n formatted.values,\n )) as {lastMutationID: bigint}[];\n\n return {lastMutationID};\n },\n\n async writeMutationResult(result) {\n const formatted = formatPg(\n sql`INSERT INTO ${sql.ident(upstreamSchema)}.mutations\n (\"clientGroupID\", \"clientID\", \"mutationID\", \"result\")\n VALUES (${clientGroupID}, ${result.id.clientID}, ${result.id.id}, ${JSON.stringify(\n result.result,\n )}::text::json)`,\n );\n await dbTx.query(formatted.text, formatted.values);\n },\n\n async deleteMutationResults(args: CleanupResultsArg) {\n if ('type' in args && args.type === 'bulk') {\n // Bulk deletion: delete all mutations for multiple clients\n const formatted = formatPg(\n sql`DELETE FROM ${sql.ident(upstreamSchema)}.\"mutations\"\n WHERE \"clientGroupID\" = ${args.clientGroupID}\n AND \"clientID\" = ANY(${args.clientIDs})`,\n );\n await dbTx.query(formatted.text, formatted.values);\n } else {\n // Single client (explicit 'single' or legacy without type): delete up to mutation ID\n const formatted = formatPg(\n sql`DELETE FROM ${sql.ident(upstreamSchema)}.\"mutations\"\n WHERE \"clientGroupID\" = ${args.clientGroupID}\n AND \"clientID\" = ${args.clientID}\n AND \"mutationID\" <= ${args.upToMutationID}`,\n );\n await dbTx.query(formatted.text, formatted.values);\n }\n },\n });\n });\n }\n\n #makeServerTransaction(\n dbTx: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n ) {\n return this.#crudFactory.createTransaction(dbTx, clientID, mutationID);\n }\n\n run<TTable extends keyof TSchema['tables'] & string, TReturn>(\n query: Query<TTable, TSchema, TReturn>,\n options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n return this.transaction(tx => tx.run(query, options));\n }\n}\n"],"mappings":";;;;;;;;;;AAwBA,IAAa,cAAb,MAGqE;CACnE;CACA;CAEA,YAAY,YAA+C,QAAiB;AAC1E,OAAK,aAAa;AAClB,QAAA,cAAoB,IAAI,mBAAmB,OAAO;;CAGpD,YACE,UAIA,kBACY;EAGZ,MAAM,EACJ,iBAAiB,IACjB,gBAAgB,IAChB,WAAW,IACX,aAAa,MACX,oBAAoB,EAAE;AAC1B,SAAO,KAAK,WAAW,YAAY,OAAM,SAAQ;AAO/C,UAAO,SANQ,MAAM,MAAA,sBACnB,MACA,UACA,WACD,EAEuB;IACtB,MAAM,yBAAyB;KAC7B,MAAM,YAAY,SAChB,GAAG,eAAe,IAAI,MAAM,eAAe,CAAC;;kCAEtB,cAAc,IAAI,SAAS,IAAI,EAAE;;;gDAIxD;KAED,MAAM,CAAC,EAAC,oBAAoB,MAAM,KAAK,MACrC,UAAU,MACV,UAAU,OACX;AAED,YAAO,EAAC,gBAAe;;IAGzB,MAAM,oBAAoB,QAAQ;KAChC,MAAM,YAAY,SAChB,GAAG,eAAe,IAAI,MAAM,eAAe,CAAC;;0BAE9B,cAAc,IAAI,OAAO,GAAG,SAAS,IAAI,OAAO,GAAG,GAAG,IAAI,KAAK,UACvE,OAAO,OACR,CAAC,eACP;AACD,WAAM,KAAK,MAAM,UAAU,MAAM,UAAU,OAAO;;IAGpD,MAAM,sBAAsB,MAAyB;AACnD,SAAI,UAAU,QAAQ,KAAK,SAAS,QAAQ;MAE1C,MAAM,YAAY,SAChB,GAAG,eAAe,IAAI,MAAM,eAAe,CAAC;4CACd,KAAK,cAAc;2CACpB,KAAK,UAAU,GAC7C;AACD,YAAM,KAAK,MAAM,UAAU,MAAM,UAAU,OAAO;YAC7C;MAEL,MAAM,YAAY,SAChB,GAAG,eAAe,IAAI,MAAM,eAAe,CAAC;4CACd,KAAK,cAAc;uCACxB,KAAK,SAAS;0CACX,KAAK,iBAClC;AACD,YAAM,KAAK,MAAM,UAAU,MAAM,UAAU,OAAO;;;IAGvD,CAAC;IACF;;CAGJ,uBACE,MACA,UACA,YACA;AACA,SAAO,MAAA,YAAkB,kBAAkB,MAAM,UAAU,WAAW;;CAGxE,IACE,OACA,SACiC;AACjC,SAAO,KAAK,aAAY,OAAM,GAAG,IAAI,OAAO,QAAQ,CAAC"}
|
|
@@ -16,6 +16,7 @@ import type { Schema } from './schema.ts';
|
|
|
16
16
|
*/
|
|
17
17
|
export interface DefaultTypes {
|
|
18
18
|
}
|
|
19
|
+
export type IsUnknown<T> = unknown extends T ? [T] extends [unknown] ? true : false : false;
|
|
19
20
|
export type DefaultSchema<TDefaultTypes = DefaultTypes> = TDefaultTypes extends {
|
|
20
21
|
readonly schema: infer S extends Schema;
|
|
21
22
|
} ? S : Schema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-types.d.ts","sourceRoot":"","sources":["../../../../zero-types/src/default-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AACvD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAExC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;CAAG;AAEhC,MAAM,MAAM,aAAa,CAAC,aAAa,GAAG,YAAY,IACpD,aAAa,SAAS;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,MAAM,CAAC;CACzC,GACG,CAAC,GACD,MAAM,CAAC;AAEb,MAAM,MAAM,iBAAiB,CAAC,aAAa,GAAG,YAAY,IACxD,aAAa,CAAC,aAAa,CAAC,CAAC;AAE/B,MAAM,MAAM,cAAc,CAAC,aAAa,GAAG,YAAY,IACrD,aAAa,SAAS;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAC3B,GACG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC;AAEd,MAAM,MAAM,kBAAkB,CAAC,aAAa,GAAG,YAAY,IACzD,OAAO,SAAS,cAAc,CAAC,aAAa,CAAC,GAEzC,GAAG,GACH,cAAc,CAAC,aAAa,CAAC,CAAC;AAEpC,MAAM,MAAM,8BAA8B,CAAC,WAAW,IAAI,WAAW,SAAS;IAC5E,WAAW,EAAE,CAAC,CAAC,EAEb,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAEzD,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,CAAC,CAAC,CAAC;CACjB,GACG,YAAY,GACZ,OAAO,CAAC;AAEZ,MAAM,MAAM,yBAAyB,CAAC,aAAa,GAAG,YAAY,IAChE,aAAa,SAAS;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,UAAU,CAAC;CACvC,GACG,8BAA8B,CAAC,UAAU,CAAC,SAAS,MAAM,YAAY,GACnE,YAAY,SAAS;IACnB,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;KACxD,CAAC;CACH,GACC,mBAAmB,GACnB;IACE,KAAK,EAAE,oGAAoG,CAAC;IAC5G,oBAAoB,EAAE,UAAU,CAAC;CAClC,GACH,KAAK,GACP,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"default-types.d.ts","sourceRoot":"","sources":["../../../../zero-types/src/default-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAC;AACvD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAExC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;CAAG;AAEhC,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,OAAO,SAAS,CAAC,GACxC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GACnB,IAAI,GACJ,KAAK,GACP,KAAK,CAAC;AAEV,MAAM,MAAM,aAAa,CAAC,aAAa,GAAG,YAAY,IACpD,aAAa,SAAS;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,MAAM,CAAC;CACzC,GACG,CAAC,GACD,MAAM,CAAC;AAEb,MAAM,MAAM,iBAAiB,CAAC,aAAa,GAAG,YAAY,IACxD,aAAa,CAAC,aAAa,CAAC,CAAC;AAE/B,MAAM,MAAM,cAAc,CAAC,aAAa,GAAG,YAAY,IACrD,aAAa,SAAS;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAC3B,GACG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC;AAEd,MAAM,MAAM,kBAAkB,CAAC,aAAa,GAAG,YAAY,IACzD,OAAO,SAAS,cAAc,CAAC,aAAa,CAAC,GAEzC,GAAG,GACH,cAAc,CAAC,aAAa,CAAC,CAAC;AAEpC,MAAM,MAAM,8BAA8B,CAAC,WAAW,IAAI,WAAW,SAAS;IAC5E,WAAW,EAAE,CAAC,CAAC,EAEb,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAEzD,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,CAAC,CAAC,CAAC;CACjB,GACG,YAAY,GACZ,OAAO,CAAC;AAEZ,MAAM,MAAM,yBAAyB,CAAC,aAAa,GAAG,YAAY,IAChE,aAAa,SAAS;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,UAAU,CAAC;CACvC,GACG,8BAA8B,CAAC,UAAU,CAAC,SAAS,MAAM,YAAY,GACnE,YAAY,SAAS;IACnB,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;KACxD,CAAC;CACH,GACC,mBAAmB,GACnB;IACE,KAAK,EAAE,oGAAoG,CAAC;IAC5G,oBAAoB,EAAE,UAAU,CAAC;CAClC,GACH,KAAK,GACP,OAAO,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../../zql/src/builder/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAE3D,OAAO,KAAK,EACV,GAAG,EAGH,SAAS,EAIT,WAAW,EAEX,QAAQ,EAIT,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,oCAAoC,CAAC;AAC5D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../../zql/src/builder/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { assert, unreachable } from "../../../shared/src/asserts.js";
|
|
2
2
|
import { must } from "../../../shared/src/must.js";
|
|
3
|
+
import { completeOrdering } from "../query/complete-ordering.js";
|
|
4
|
+
import { Take } from "../ivm/take.js";
|
|
5
|
+
import { Cap } from "../ivm/cap.js";
|
|
3
6
|
import { buildFilterPipeline } from "../ivm/filter-operators.js";
|
|
4
7
|
import { Exists } from "../ivm/exists.js";
|
|
5
8
|
import { FanIn } from "../ivm/fan-in.js";
|
|
@@ -8,8 +11,6 @@ import { Filter } from "../ivm/filter.js";
|
|
|
8
11
|
import { FlippedJoin } from "../ivm/flipped-join.js";
|
|
9
12
|
import { Join } from "../ivm/join.js";
|
|
10
13
|
import { Skip } from "../ivm/skip.js";
|
|
11
|
-
import { completeOrdering } from "../query/complete-ordering.js";
|
|
12
|
-
import { Take } from "../ivm/take.js";
|
|
13
14
|
import { UnionFanIn } from "../ivm/union-fan-in.js";
|
|
14
15
|
import { UnionFanOut } from "../ivm/union-fan-out.js";
|
|
15
16
|
import { planQuery } from "../planner/planner-builder.js";
|
|
@@ -112,7 +113,7 @@ function assertNoNotExists(condition) {
|
|
|
112
113
|
default: unreachable(condition);
|
|
113
114
|
}
|
|
114
115
|
}
|
|
115
|
-
function buildPipelineInternal(ast, delegate, queryID, name, partitionKey) {
|
|
116
|
+
function buildPipelineInternal(ast, delegate, queryID, name, partitionKey, isNonFlippedExistsChild) {
|
|
116
117
|
const source = delegate.getSource(ast.table);
|
|
117
118
|
if (!source) throw new Error(`Source not found: ${ast.table}`);
|
|
118
119
|
ast = uniquifyCorrelatedSubqueryConditionAliases(ast);
|
|
@@ -125,7 +126,11 @@ function buildPipelineInternal(ast, delegate, queryID, name, partitionKey) {
|
|
|
125
126
|
for (const key of csq.related.correlation.parentField) splitEditKeys.add(key);
|
|
126
127
|
}
|
|
127
128
|
if (ast.related) for (const csq of ast.related) for (const key of csq.correlation.parentField) splitEditKeys.add(key);
|
|
128
|
-
|
|
129
|
+
if (isNonFlippedExistsChild) {
|
|
130
|
+
assert(ast.start === void 0, "EXISTS subqueries must not have start");
|
|
131
|
+
assert(ast.related === void 0, "EXISTS subqueries must not have related");
|
|
132
|
+
}
|
|
133
|
+
const conn = source.connect(isNonFlippedExistsChild ? void 0 : must(ast.orderBy), ast.where, splitEditKeys, delegate.debug);
|
|
129
134
|
let end = delegate.decorateSourceInput(conn, queryID);
|
|
130
135
|
end = delegate.decorateInput(end, `${name}:source(${ast.table})`);
|
|
131
136
|
const { fullyAppliedFilters } = conn;
|
|
@@ -142,7 +147,12 @@ function buildPipelineInternal(ast, delegate, queryID, name, partitionKey) {
|
|
|
142
147
|
}
|
|
143
148
|
}, delegate, queryID, end, name, true);
|
|
144
149
|
if (ast.where && (!fullyAppliedFilters || delegate.applyFiltersAnyway)) end = applyWhere(end, ast.where, delegate, name);
|
|
145
|
-
if (ast.limit !== void 0) {
|
|
150
|
+
if (ast.limit !== void 0) if (isNonFlippedExistsChild) {
|
|
151
|
+
const capName = `${name}:cap`;
|
|
152
|
+
const cap = new Cap(end, delegate.createStorage(capName), ast.limit, partitionKey);
|
|
153
|
+
delegate.addEdge(end, cap);
|
|
154
|
+
end = delegate.decorateInput(cap, capName);
|
|
155
|
+
} else {
|
|
146
156
|
const takeName = `${name}:take`;
|
|
147
157
|
const take = new Take(end, delegate.createStorage(takeName), ast.limit, partitionKey);
|
|
148
158
|
delegate.addEdge(end, take);
|
|
@@ -192,7 +202,7 @@ function applyFilterWithFlips(input, condition, delegate, name) {
|
|
|
192
202
|
}
|
|
193
203
|
case "correlatedSubquery": {
|
|
194
204
|
const sq = condition.related;
|
|
195
|
-
const child = buildPipelineInternal(sq.subquery, delegate, "", `${name}.${sq.subquery.alias}`, sq.correlation.childField);
|
|
205
|
+
const child = buildPipelineInternal(sq.subquery, delegate, "", `${name}.${sq.subquery.alias}`, sq.correlation.childField, false);
|
|
196
206
|
const flippedJoin = new FlippedJoin({
|
|
197
207
|
parent: end,
|
|
198
208
|
child,
|
|
@@ -275,7 +285,7 @@ function valuePosName(left) {
|
|
|
275
285
|
function applyCorrelatedSubQuery(sq, delegate, queryID, end, name, fromCondition) {
|
|
276
286
|
if (sq.subquery.limit === 0 && fromCondition) return end;
|
|
277
287
|
assert(sq.subquery.alias, "Subquery must have an alias");
|
|
278
|
-
const child = buildPipelineInternal(sq.subquery, delegate, queryID, `${name}.${sq.subquery.alias}`, sq.correlation.childField);
|
|
288
|
+
const child = buildPipelineInternal(sq.subquery, delegate, queryID, `${name}.${sq.subquery.alias}`, sq.correlation.childField, fromCondition);
|
|
279
289
|
const joinName = `${name}:join(${sq.subquery.alias})`;
|
|
280
290
|
const join = new Join({
|
|
281
291
|
parent: end,
|