@rocicorp/zero 1.5.0-canary.0 → 1.5.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.
Files changed (33) hide show
  1. package/out/analyze-query/src/analyze-cli.js +2 -2
  2. package/out/analyze-query/src/analyze-cli.js.map +1 -1
  3. package/out/zero/package.js +1 -1
  4. package/out/zero/package.js.map +1 -1
  5. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  6. package/out/zero-cache/src/server/change-streamer.js +1 -1
  7. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  8. package/out/zero-cache/src/services/change-source/custom/change-source.js +2 -2
  9. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  10. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +1 -2
  11. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  12. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +5 -12
  13. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  14. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts +2 -0
  15. package/out/zero-cache/src/services/view-syncer/connection-context-manager.d.ts.map +1 -1
  16. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js +9 -2
  17. package/out/zero-cache/src/services/view-syncer/connection-context-manager.js.map +1 -1
  18. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  19. package/out/zero-cache/src/services/view-syncer/view-syncer.js +4 -0
  20. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  21. package/out/zero-cache/src/workers/connection.js +2 -2
  22. package/out/zero-cache/src/workers/connection.js.map +1 -1
  23. package/out/zero-client/src/client/version.js +1 -1
  24. package/out/zero-server/src/mod.d.ts +2 -2
  25. package/out/zero-server/src/process-mutations.d.ts +41 -32
  26. package/out/zero-server/src/process-mutations.d.ts.map +1 -1
  27. package/out/zero-server/src/process-mutations.js +49 -29
  28. package/out/zero-server/src/process-mutations.js.map +1 -1
  29. package/out/zero-server/src/queries/process-queries.d.ts +40 -18
  30. package/out/zero-server/src/queries/process-queries.d.ts.map +1 -1
  31. package/out/zero-server/src/queries/process-queries.js +37 -19
  32. package/out/zero-server/src/queries/process-queries.js.map +1 -1
  33. package/package.json +1 -1
@@ -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;AAE/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,CASxB;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,CASxB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACjC,CAAC;AAQF;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,cAAc,EAAE,sBAAsB,EACtC,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,OAAO,EAChB,iBAAiB,CAAC,EAAE,QAAQ,GAAG,mBAAmB,GACjD,OAAO,CAAC,aAAa,CAAC,CAAC;AAE1B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,cAAc,EAAE,sBAAsB,EACtC,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,iBAAiB,EAC3B,iBAAiB,CAAC,EAAE,QAAQ,GAAG,mBAAmB,GACjD,OAAO,CAAC,aAAa,CAAC,CAAC;AAoI1B;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,GAAG,SAAS,KAChC,QAAQ,CAAC"}
1
+ {"version":3,"file":"process-queries.d.ts","sourceRoot":"","sources":["../../../../../zero-server/src/queries/process-queries.ts"],"names":[],"mappings":"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"}
@@ -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, void 0, requestOrJsonBody, "getQueries", logLevel);
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,28 +33,42 @@ 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, void 0, requestOrJsonBody, "transform", logLevel);
36
+ return transform(normalizeLegacyQueryRequestArgs(cb, schema, requestOrJsonBody, logLevel), "transform");
36
37
  }
37
- function handleQueryRequest(transformQuery, schema, requestOrJsonBody, logLevelOrOptions) {
38
- const options = normalizeQueryRequestOptions(logLevelOrOptions);
39
- const normalized = {
40
- requestOrJsonBody,
41
- userID: "userID" in options ? options.userID ?? null : void 0,
42
- logLevel: options.logLevel ?? "info"
43
- };
44
- return transform((name, argsArray) => transformQuery(name, argsArray[0]), schema, normalized.userID, normalized.requestOrJsonBody, "query", normalized.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");
45
40
  }
46
- function normalizeQueryRequestOptions(logLevelOrOptions) {
47
- return typeof logLevelOrOptions === "string" ? { logLevel: logLevelOrOptions } : logLevelOrOptions ?? {};
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);
48
43
  }
49
- async function transform(cb, schema, userID, requestOrJsonBody, apiName, logLevel = "info") {
50
- const lc = createLogContext(logLevel).withContext("TransformRequest");
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");
51
66
  let parsed;
52
67
  let queryIDs = [];
53
68
  try {
54
69
  let body;
55
- if (requestOrJsonBody instanceof Request) body = await requestOrJsonBody.json();
56
- else body = requestOrJsonBody;
70
+ if (args.type === "request") body = await args.request.json();
71
+ else body = args.jsonBody;
57
72
  parsed = parse(body, transformRequestMessageSchema);
58
73
  queryIDs = parsed[1].map((r) => r.id);
59
74
  } catch (error) {
@@ -70,13 +85,13 @@ async function transform(cb, schema, userID, requestOrJsonBody, apiName, logLeve
70
85
  };
71
86
  }
72
87
  try {
73
- const nameMapper = clientToServer(schema.tables);
88
+ const nameMapper = clientToServer(args.schema.tables);
74
89
  return {
75
90
  kind: "QueryResponse",
76
91
  queries: await Promise.all(parsed[1].map(async (req) => {
77
92
  let finalQuery;
78
93
  try {
79
- const result = await cb(req.name, req.args);
94
+ const result = await args.handler(req.name, req.args);
80
95
  finalQuery = "query" in result ? result.query : result;
81
96
  } catch (error) {
82
97
  const message = getErrorMessage(error);
@@ -101,7 +116,7 @@ async function transform(cb, schema, userID, requestOrJsonBody, apiName, logLeve
101
116
  throw error;
102
117
  }
103
118
  })),
104
- ...typeof userID !== "undefined" ? { userID } : {}
119
+ ...typeof args.userID !== "undefined" ? { userID: args.userID } : {}
105
120
  };
106
121
  } catch (e) {
107
122
  const message = getErrorMessage(e);
@@ -116,6 +131,9 @@ async function transform(cb, schema, userID, requestOrJsonBody, apiName, logLeve
116
131
  };
117
132
  }
118
133
  }
134
+ function wrapQueryRequestHandler(handler) {
135
+ return (name, args) => handler(name, args[0]);
136
+ }
119
137
  //#endregion
120
138
  export { handleGetQueriesRequest, handleQueryRequest, handleTransformRequest };
121
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} 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 cb,\n schema,\n undefined,\n requestOrJsonBody,\n 'getQueries',\n logLevel,\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 cb,\n schema,\n undefined,\n requestOrJsonBody,\n 'transform',\n logLevel,\n );\n}\n\nexport type QueryRequestOptions = {\n userID?: string | null | undefined;\n logLevel?: LogLevel | undefined;\n};\n\ntype NormalizedQueryRequestArgs = {\n readonly requestOrJsonBody: Request | ReadonlyJSONValue;\n readonly userID: string | null | undefined;\n readonly logLevel: LogLevel;\n};\n\n/**\n * Process a `/query` request.\n *\n * @param transformQuery - Runs once per requested query with the query name\n * and first JSON argument. Returns a `Query`.\n * @param schema - Schema used when building the returned ASTs.\n * @param request - A Fetch `Request`.\n * @param logLevelOrOptions - Either a log level or additional request\n * options.\n * @returns A `QueryResponse`. Success returns `userID: options.userID ?? null`\n * when `options.userID` is provided. Per-query errors stay in `queries`;\n * malformed requests return `TransformFailed`.\n */\nexport function handleQueryRequest<S extends Schema>(\n transformQuery: TransformQueryFunction,\n schema: S,\n request: Request,\n logLevelOrOptions?: LogLevel | QueryRequestOptions,\n): Promise<QueryResponse>;\n\n/**\n * Process a `/query` request from a parsed JSON body.\n */\nexport function handleQueryRequest<S extends Schema>(\n transformQuery: TransformQueryFunction,\n schema: S,\n jsonBody: ReadonlyJSONValue,\n logLevelOrOptions?: LogLevel | QueryRequestOptions,\n): Promise<QueryResponse>;\n\nexport function handleQueryRequest<S extends Schema>(\n transformQuery: TransformQueryFunction,\n schema: S,\n requestOrJsonBody: Request | ReadonlyJSONValue,\n logLevelOrOptions?: LogLevel | QueryRequestOptions,\n): Promise<QueryResponse> {\n const options = normalizeQueryRequestOptions(logLevelOrOptions);\n const normalized: NormalizedQueryRequestArgs = {\n requestOrJsonBody,\n userID: 'userID' in options ? (options.userID ?? null) : undefined,\n logLevel: options.logLevel ?? 'info',\n };\n\n return transform(\n (name, argsArray) => transformQuery(name, argsArray[0]),\n schema,\n normalized.userID,\n normalized.requestOrJsonBody,\n 'query',\n normalized.logLevel,\n );\n}\n\nfunction normalizeQueryRequestOptions(\n logLevelOrOptions: LogLevel | QueryRequestOptions | undefined,\n): QueryRequestOptions {\n return typeof logLevelOrOptions === 'string'\n ? {logLevel: logLevelOrOptions}\n : (logLevelOrOptions ?? {});\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 userID: string | null | undefined,\n requestOrJsonBody: Request | ReadonlyJSONValue,\n apiName: 'query' | 'getQueries' | 'transform',\n logLevel: LogLevel = 'info',\n): Promise<QueryResponse> {\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 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(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 {\n kind: 'QueryResponse',\n queries: responses,\n ...(typeof userID !== 'undefined' ? {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 TransformQueryFunction = (\n name: string,\n args: ReadonlyJSONValue | undefined,\n) => AnyQuery;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA+BA,SAAgB,wBACd,IAIA,QACA,mBACA,WAAqB,QACG;AACxB,QAAO,UACL,IACA,QACA,KAAA,GACA,mBACA,cACA,SACD;;;;;;;;;;;AAYH,SAAgB,uBACd,IAIA,QACA,mBACA,WAAqB,QACG;AACxB,QAAO,UACL,IACA,QACA,KAAA,GACA,mBACA,aACA,SACD;;AA4CH,SAAgB,mBACd,gBACA,QACA,mBACA,mBACwB;CACxB,MAAM,UAAU,6BAA6B,kBAAkB;CAC/D,MAAM,aAAyC;EAC7C;EACA,QAAQ,YAAY,UAAW,QAAQ,UAAU,OAAQ,KAAA;EACzD,UAAU,QAAQ,YAAY;EAC/B;AAED,QAAO,WACJ,MAAM,cAAc,eAAe,MAAM,UAAU,GAAG,EACvD,QACA,WAAW,QACX,WAAW,mBACX,SACA,WAAW,SACZ;;AAGH,SAAS,6BACP,mBACqB;AACrB,QAAO,OAAO,sBAAsB,WAChC,EAAC,UAAU,mBAAkB,GAC5B,qBAAqB,EAAE;;AAG9B,eAAe,UACb,IAIA,QACA,QACA,mBACA,SACA,WAAqB,QACG;CACxB,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;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;GACR;GACA;GACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;GAC7B;;AAGH,KAAI;EACF,MAAM,aAAa,eAAe,OAAO,OAAO;AAqChD,SAAO;GACL,MAAM;GACN,SArCuC,MAAM,QAAQ,IACrD,OAAO,GAAG,IAAI,OAAM,QAAO;IACzB,IAAI;AACJ,QAAI;KACF,MAAM,SAAS,MAAM,GAAG,IAAI,MAAM,IAAI,KAAK;AAC3C,kBAAa,WAAW,SAAS,OAAO,QAAQ;aACzC,OAAO;KACd,MAAM,UAAU,gBAAgB,MAAM;KACtC,MAAM,UAAU,gBAAgB,MAAM;AAEtC,YAAO;MACL,OAAO,iBAAiB,kBAAkB,UAAU;MACpD,IAAI,IAAI;MACR,MAAM,IAAI;MACV;MACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;MAC7B;;AAGH,QAAI;KAEF,MAAM,MAAM,OADF,iBAAiB,WAAW,CACjB,KAAK,WAAW;AAErC,YAAO;MACL,IAAI,IAAI;MACR,MAAM,IAAI;MACV;MACD;aACM,OAAO;AACd,QAAG,QAAQ,qBAAqB,MAAM;AACtC,WAAM;;KAER,CACH;GAKC,GAAI,OAAO,WAAW,cAAc,EAAC,QAAO,GAAG,EAAE;GAClD;UACM,GAAG;EACV,MAAM,UAAU,gBAAgB,EAAE;EAClC,MAAM,UAAU,gBAAgB,EAAE;AAElC,SAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;GACR;GACA;GACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;GAC7B"}
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":";;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,wBACd,IAIA,QACA,mBACA,WAAqB,QACG;AACxB,QAAO,UACL,gCAAgC,IAAI,QAAQ,mBAAmB,SAAS,EACxE,aACD;;;;;;;;;;;AAYH,SAAgB,uBACd,IAIA,QACA,mBACA,WAAqB,QACG;AACxB,QAAO,UACL,gCAAgC,IAAI,QAAQ,mBAAmB,SAAS,EACxE,YACD;;AAmFH,SAAgB,mBACd,uBACA,QACA,mBACA,UACwB;AAYxB,QAAO,UAVL,OAAO,0BAA0B,YACjC,aAAa,wBACT,2BAA2B,sBAAsB,GACjD,gCACE,wBAAwB,sBAAsB,EAC9C,QACA,mBACA,SACD,EAEsB,QAAQ;;AAGvC,SAAS,2BACP,OAC+B;AAC/B,QAAO,aAAa,QAChB,gCACE,wBAAwB,MAAM,QAAQ,EACtC,MAAM,QACN,MAAM,SACN,MAAM,UACN,MAAM,UAAU,KACjB,GACD,gCACE,wBAAwB,MAAM,QAAQ,EACtC,MAAM,QACN,MAAM,MACN,MAAM,UACN,MAAM,UAAU,KACjB;;AAGP,SAAS,gCACP,SACA,QACA,mBACA,UACA,QAC+B;AAC/B,QACE,OAAO,WAAW,aAClB,wDACD;AAED,KAAI,6BAA6B,QAC/B,QAAO;EACL,MAAM;EACN;EACA;EACA,SAAS;EACT;EACA,UAAU,YAAY;EACvB;AAGH,QACE,OAAO,sBAAsB,aAC7B,gCACD;AAED,QAAO;EACL,MAAM;EACN;EACA;EACA,UAAU;EACV;EACA,UAAU,YAAY;EACvB;;AAGH,eAAe,UACb,MACA,SACwB;CACxB,MAAM,KAAK,iBAAiB,KAAK,SAAS,CAAC,YAAY,mBAAmB;CAC1E,IAAI;CACJ,IAAI,WAAqB,EAAE;AAC3B,KAAI;EACF,IAAI;AACJ,MAAI,KAAK,SAAS,UAChB,QAAO,MAAM,KAAK,QAAQ,MAAM;MAEhC,QAAO,KAAK;AAGd,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;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;GACR;GACA;GACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;GAC7B;;AAGH,KAAI;EACF,MAAM,aAAa,eAAe,KAAK,OAAO,OAAO;AAqCrD,SAAO;GACL,MAAM;GACN,SArCuC,MAAM,QAAQ,IACrD,OAAO,GAAG,IAAI,OAAM,QAAO;IACzB,IAAI;AACJ,QAAI;KACF,MAAM,SAAS,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;AACrD,kBAAa,WAAW,SAAS,OAAO,QAAQ;aACzC,OAAO;KACd,MAAM,UAAU,gBAAgB,MAAM;KACtC,MAAM,UAAU,gBAAgB,MAAM;AAEtC,YAAO;MACL,OAAO,iBAAiB,kBAAkB,UAAU;MACpD,IAAI,IAAI;MACR,MAAM,IAAI;MACV;MACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;MAC7B;;AAGH,QAAI;KAEF,MAAM,MAAM,OADF,iBAAiB,WAAW,CACjB,KAAK,WAAW;AAErC,YAAO;MACL,IAAI,IAAI;MACR,MAAM,IAAI;MACV;MACD;aACM,OAAO;AACd,QAAG,QAAQ,qBAAqB,MAAM;AACtC,WAAM;;KAER,CACH;GAKC,GAAI,OAAO,KAAK,WAAW,cAAc,EAAC,QAAQ,KAAK,QAAO,GAAG,EAAE;GACpE;UACM,GAAG;EACV,MAAM,UAAU,gBAAgB,EAAE;EAClC,MAAM,UAAU,gBAAgB,EAAE;AAElC,SAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;GACR;GACA;GACA,GAAI,UAAU,EAAC,SAAQ,GAAG,EAAE;GAC7B;;;AAwBL,SAAS,wBACP,SAC2B;AAC3B,SAAQ,MAAM,SAAS,QAAQ,MAAM,KAAK,GAAG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rocicorp/zero",
3
- "version": "1.5.0-canary.0",
3
+ "version": "1.5.0-canary.2",
4
4
  "description": "Zero is a web framework for serverless web development.",
5
5
  "homepage": "https://zero.rocicorp.dev",
6
6
  "bugs": {