@rocicorp/zero 0.25.7 → 0.25.8

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.
@@ -1,4 +1,4 @@
1
- const version = "0.25.7";
1
+ const version = "0.25.8";
2
2
  const packageJson = {
3
3
  version
4
4
  };
@@ -1,6 +1,6 @@
1
- import { ApplicationError, isApplicationError, wrapWithApplicationError } from "../../zero-protocol/src/application-error.js";
2
- import { customMutatorKey } from "../../zql/src/mutate/custom.js";
3
- import { CRUDMutatorFactory, TransactionImpl, makeSchemaCRUD, makeServerTransaction } from "../../zero-server/src/custom.js";
1
+ import { ApplicationError, isApplicationError } from "../../zero-protocol/src/application-error.js";
2
+ import { CRUDMutatorFactory, makeSchemaCRUD } from "../../zero-server/src/custom.js";
3
+ import { executePostgresQuery } from "../../zero-server/src/pg-query-executor.js";
4
4
  import { OutOfOrderMutation, getMutation, handleMutateRequest, handleMutationRequest } from "../../zero-server/src/process-mutations.js";
5
5
  import { PushProcessor } from "../../zero-server/src/push-processor.js";
6
6
  import { handleGetQueriesRequest, handleQueryRequest, handleTransformRequest } from "../../zero-server/src/queries/process-queries.js";
@@ -13,9 +13,8 @@ export {
13
13
  PostgresJSConnection,
14
14
  PostgresJsTransactionInternal,
15
15
  PushProcessor,
16
- TransactionImpl,
17
16
  ZQLDatabase,
18
- customMutatorKey,
17
+ executePostgresQuery,
19
18
  getMutation,
20
19
  handleGetQueriesRequest,
21
20
  handleMutateRequest,
@@ -24,8 +23,6 @@ export {
24
23
  handleTransformRequest,
25
24
  isApplicationError,
26
25
  makeSchemaCRUD,
27
- makeServerTransaction,
28
- wrapWithApplicationError,
29
26
  zeroPostgresJS
30
27
  };
31
28
  //# sourceMappingURL=pg.js.map
@@ -1,6 +1,6 @@
1
- import { ApplicationError, isApplicationError, wrapWithApplicationError } from "../../zero-protocol/src/application-error.js";
2
- import { customMutatorKey } from "../../zql/src/mutate/custom.js";
3
- import { CRUDMutatorFactory, TransactionImpl, makeSchemaCRUD, makeServerTransaction } from "../../zero-server/src/custom.js";
1
+ import { ApplicationError, isApplicationError } from "../../zero-protocol/src/application-error.js";
2
+ import { CRUDMutatorFactory, makeSchemaCRUD } from "../../zero-server/src/custom.js";
3
+ import { executePostgresQuery } from "../../zero-server/src/pg-query-executor.js";
4
4
  import { OutOfOrderMutation, getMutation, handleMutateRequest, handleMutationRequest } from "../../zero-server/src/process-mutations.js";
5
5
  import { PushProcessor } from "../../zero-server/src/push-processor.js";
6
6
  import { handleGetQueriesRequest, handleQueryRequest, handleTransformRequest } from "../../zero-server/src/queries/process-queries.js";
@@ -10,9 +10,8 @@ export {
10
10
  CRUDMutatorFactory,
11
11
  OutOfOrderMutation,
12
12
  PushProcessor,
13
- TransactionImpl,
14
13
  ZQLDatabase,
15
- customMutatorKey,
14
+ executePostgresQuery,
16
15
  getMutation,
17
16
  handleGetQueriesRequest,
18
17
  handleMutateRequest,
@@ -20,8 +19,6 @@ export {
20
19
  handleQueryRequest,
21
20
  handleTransformRequest,
22
21
  isApplicationError,
23
- makeSchemaCRUD,
24
- makeServerTransaction,
25
- wrapWithApplicationError
22
+ makeSchemaCRUD
26
23
  };
27
24
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/observability/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAc,KAAK,UAAU,EAAC,MAAM,6BAA6B,CAAC;AAIzE,OAAO,EAAC,KAAK,SAAS,EAAC,MAAM,mCAAmC,CAAC;AACjE,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAsBjE;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,UAAU,EACd,EAAC,MAAM,EAAE,UAAU,EAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,YAAY,CAAC,QA4C1E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,OAAa,QAO1E;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,QAEzE;AAED,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,SAAS,EAC5D,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,CAAC,iBAGT;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,CAevD"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../../zero-cache/src/observability/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAc,KAAK,UAAU,EAAC,MAAM,6BAA6B,CAAC;AAKzE,OAAO,EAAC,KAAK,SAAS,EAAC,MAAM,mCAAmC,CAAC;AACjE,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAyBjE;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,UAAU,EACd,EAAC,MAAM,EAAE,UAAU,EAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,YAAY,CAAC,QAqD1E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,OAAa,QAO1E;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,QAEzE;AAED,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,SAAS,EAC5D,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,CAAC,iBAGT;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,CAevD"}
@@ -3,8 +3,11 @@ import { nanoid } from "nanoid";
3
3
  import { isJSONValue } from "../../../shared/src/json.js";
4
4
  import { must } from "../../../shared/src/must.js";
5
5
  import { promiseVoid } from "../../../shared/src/resolved-promises.js";
6
+ import { sleep } from "../../../shared/src/sleep.js";
6
7
  import { parse } from "../../../shared/src/valita.js";
7
8
  import { union, string, number, boolean, record, object } from "@badrap/valita";
9
+ const MAX_PUBLISH_ATTEMPTS = 6;
10
+ const INITIAL_PUBLISH_BACKOFF_MS = 500;
8
11
  let publishFn = (lc, { type }) => {
9
12
  lc.warn?.(
10
13
  `Cannot publish "${type}" event before initEventSink(). This is only expected in unit tests.`
@@ -44,11 +47,18 @@ function initEventSink(lc, { taskID, cloudEvent }) {
44
47
  lc.debug?.(`Publishing ZeroEvents to ${sinkURI}`);
45
48
  publishFn = async (lc2, event) => {
46
49
  const cloudEvent2 = createCloudEvent(event);
47
- lc2.info?.(`Publishing CloudEvent: ${cloudEvent2.type}`, cloudEvent2);
48
- try {
49
- await emit(cloudEvent2);
50
- } catch (e) {
51
- lc2.warn?.(`Error publishing ${cloudEvent2.type}`, e);
50
+ lc2.debug?.(`Publishing CloudEvent: ${cloudEvent2.type}`);
51
+ for (let i = 0; i < MAX_PUBLISH_ATTEMPTS; i++) {
52
+ if (i > 0) {
53
+ await sleep(INITIAL_PUBLISH_BACKOFF_MS * 2 ** (i - 1));
54
+ }
55
+ try {
56
+ await emit(cloudEvent2);
57
+ lc2.info?.(`Published CloudEvent: ${cloudEvent2.type}`, cloudEvent2);
58
+ return;
59
+ } catch (e) {
60
+ lc2.warn?.(`Error publishing ${cloudEvent2.type} (attempt ${i + 1})`, e);
61
+ }
52
62
  }
53
63
  };
54
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sources":["../../../../../zero-cache/src/observability/events.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {CloudEvent, emitterFor, httpTransport} from 'cloudevents';\nimport {nanoid} from 'nanoid';\nimport {isJSONValue, type JSONObject} from '../../../shared/src/json.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport {promiseVoid} from '../../../shared/src/resolved-promises.ts';\nimport * as v from '../../../shared/src/valita.ts';\nimport {type ZeroEvent} from '../../../zero-events/src/index.ts';\nimport type {NormalizedZeroConfig} from '../config/normalize.ts';\n\ntype PublisherFn = (lc: LogContext, event: ZeroEvent) => Promise<void>;\n\nlet publishFn: PublisherFn = (lc, {type}) => {\n lc.warn?.(\n `Cannot publish \"${type}\" event before initEventSink(). ` +\n `This is only expected in unit tests.`,\n );\n return promiseVoid;\n};\n\nconst attributeValueSchema = v.union(v.string(), v.number(), v.boolean());\n\nconst eventSchema = v.record(attributeValueSchema);\n\ntype PartialEvent = v.Infer<typeof eventSchema>;\n\n// Note: This conforms to the format of the knative K_CE_OVERRIDES binding:\n// https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding\nconst extensionsObjectSchema = v.object({extensions: eventSchema});\n\n/**\n * Initializes a per-process event sink according to the cloud event\n * parameters in the ZeroConfig. This must be called at the beginning\n * of the process, before any ZeroEvents are generated / published.\n */\nexport function initEventSink(\n lc: LogContext,\n {taskID, cloudEvent}: Pick<NormalizedZeroConfig, 'taskID' | 'cloudEvent'>,\n) {\n if (!cloudEvent.sinkEnv) {\n // The default implementation just outputs the events to logs.\n publishFn = (lc, event) => {\n lc.info?.(`ZeroEvent: ${event.type}`, event);\n return promiseVoid;\n };\n return;\n }\n\n let overrides: PartialEvent = {};\n\n if (cloudEvent.extensionOverridesEnv) {\n const strVal = must(process.env[cloudEvent.extensionOverridesEnv]);\n const {extensions} = v.parse(JSON.parse(strVal), extensionsObjectSchema);\n overrides = extensions;\n }\n\n function createCloudEvent(data: ZeroEvent) {\n const {type, time} = data;\n return new CloudEvent({\n id: nanoid(),\n source: taskID,\n type,\n time,\n data,\n ...overrides,\n });\n }\n\n const sinkURI = must(process.env[cloudEvent.sinkEnv]);\n const emit = emitterFor(httpTransport(sinkURI));\n lc.debug?.(`Publishing ZeroEvents to ${sinkURI}`);\n\n publishFn = async (lc, event) => {\n const cloudEvent = createCloudEvent(event);\n lc.info?.(`Publishing CloudEvent: ${cloudEvent.type}`, cloudEvent);\n try {\n await emit(cloudEvent);\n } catch (e) {\n lc.warn?.(`Error publishing ${cloudEvent.type}`, e);\n }\n };\n}\n\nexport function initEventSinkForTesting(sink: ZeroEvent[], now = new Date()) {\n publishFn = (lc, event) => {\n lc.info?.(`Testing event sink received ${event.type} event`, event);\n // Replace the default Date.now() with the test instance for determinism.\n sink.push({...event, time: now.toISOString()});\n return promiseVoid;\n };\n}\n\nexport function publishEvent<E extends ZeroEvent>(lc: LogContext, event: E) {\n void publishFn(lc, event);\n}\n\nexport async function publishCriticalEvent<E extends ZeroEvent>(\n lc: LogContext,\n event: E,\n) {\n await publishFn(lc, event);\n}\n\nexport function makeErrorDetails(e: unknown): JSONObject {\n const err = e instanceof Error ? e : new Error(String(e));\n const errorDetails: JSONObject = {\n name: err.name,\n message: err.message,\n stack: err.stack,\n cause: err.cause ? makeErrorDetails(err.cause) : undefined,\n };\n // Include any enumerable properties (e.g. of Error subtypes).\n for (const [field, value] of Object.entries(err)) {\n if (isJSONValue(value, [])) {\n errorDetails[field] = value;\n }\n }\n return errorDetails;\n}\n"],"names":["v.union","v.string","v.number","v.boolean","v.record","v.object","lc","v.parse","cloudEvent"],"mappings":";;;;;;;AAYA,IAAI,YAAyB,CAAC,IAAI,EAAC,WAAU;AAC3C,KAAG;AAAA,IACD,mBAAmB,IAAI;AAAA,EAAA;AAGzB,SAAO;AACT;AAEA,MAAM,uBAAuBA,MAAQC,OAAE,GAAUC,OAAE,GAAUC,QAAE,CAAS;AAExE,MAAM,cAAcC,OAAS,oBAAoB;AAMjD,MAAM,yBAAyBC,OAAS,EAAC,YAAY,aAAY;AAO1D,SAAS,cACd,IACA,EAAC,QAAQ,cACT;AACA,MAAI,CAAC,WAAW,SAAS;AAEvB,gBAAY,CAACC,KAAI,UAAU;AACzBA,UAAG,OAAO,cAAc,MAAM,IAAI,IAAI,KAAK;AAC3C,aAAO;AAAA,IACT;AACA;AAAA,EACF;AAEA,MAAI,YAA0B,CAAA;AAE9B,MAAI,WAAW,uBAAuB;AACpC,UAAM,SAAS,KAAK,QAAQ,IAAI,WAAW,qBAAqB,CAAC;AACjE,UAAM,EAAC,eAAcC,MAAQ,KAAK,MAAM,MAAM,GAAG,sBAAsB;AACvE,gBAAY;AAAA,EACd;AAEA,WAAS,iBAAiB,MAAiB;AACzC,UAAM,EAAC,MAAM,KAAA,IAAQ;AACrB,WAAO,IAAI,WAAW;AAAA,MACpB,IAAI,OAAA;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IAAA,CACJ;AAAA,EACH;AAEA,QAAM,UAAU,KAAK,QAAQ,IAAI,WAAW,OAAO,CAAC;AACpD,QAAM,OAAO,WAAW,cAAc,OAAO,CAAC;AAC9C,KAAG,QAAQ,4BAA4B,OAAO,EAAE;AAEhD,cAAY,OAAOD,KAAI,UAAU;AAC/B,UAAME,cAAa,iBAAiB,KAAK;AACzCF,QAAG,OAAO,0BAA0BE,YAAW,IAAI,IAAIA,WAAU;AACjE,QAAI;AACF,YAAM,KAAKA,WAAU;AAAA,IACvB,SAAS,GAAG;AACVF,UAAG,OAAO,oBAAoBE,YAAW,IAAI,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AACF;AAWO,SAAS,aAAkC,IAAgB,OAAU;AAC1E,OAAK,UAAU,IAAI,KAAK;AAC1B;AAEA,eAAsB,qBACpB,IACA,OACA;AACA,QAAM,UAAU,IAAI,KAAK;AAC3B;AAEO,SAAS,iBAAiB,GAAwB;AACvD,QAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,QAAM,eAA2B;AAAA,IAC/B,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,OAAO,IAAI;AAAA,IACX,OAAO,IAAI,QAAQ,iBAAiB,IAAI,KAAK,IAAI;AAAA,EAAA;AAGnD,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAChD,QAAI,YAAY,OAAO,CAAA,CAAE,GAAG;AAC1B,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"events.js","sources":["../../../../../zero-cache/src/observability/events.ts"],"sourcesContent":["import type {LogContext} from '@rocicorp/logger';\nimport {CloudEvent, emitterFor, httpTransport} from 'cloudevents';\nimport {nanoid} from 'nanoid';\nimport {isJSONValue, type JSONObject} from '../../../shared/src/json.ts';\nimport {must} from '../../../shared/src/must.ts';\nimport {promiseVoid} from '../../../shared/src/resolved-promises.ts';\nimport {sleep} from '../../../shared/src/sleep.ts';\nimport * as v from '../../../shared/src/valita.ts';\nimport {type ZeroEvent} from '../../../zero-events/src/index.ts';\nimport type {NormalizedZeroConfig} from '../config/normalize.ts';\n\nconst MAX_PUBLISH_ATTEMPTS = 6;\nconst INITIAL_PUBLISH_BACKOFF_MS = 500;\n\ntype PublisherFn = (lc: LogContext, event: ZeroEvent) => Promise<void>;\n\nlet publishFn: PublisherFn = (lc, {type}) => {\n lc.warn?.(\n `Cannot publish \"${type}\" event before initEventSink(). ` +\n `This is only expected in unit tests.`,\n );\n return promiseVoid;\n};\n\nconst attributeValueSchema = v.union(v.string(), v.number(), v.boolean());\n\nconst eventSchema = v.record(attributeValueSchema);\n\ntype PartialEvent = v.Infer<typeof eventSchema>;\n\n// Note: This conforms to the format of the knative K_CE_OVERRIDES binding:\n// https://github.com/knative/eventing/blob/main/docs/spec/sources.md#sinkbinding\nconst extensionsObjectSchema = v.object({extensions: eventSchema});\n\n/**\n * Initializes a per-process event sink according to the cloud event\n * parameters in the ZeroConfig. This must be called at the beginning\n * of the process, before any ZeroEvents are generated / published.\n */\nexport function initEventSink(\n lc: LogContext,\n {taskID, cloudEvent}: Pick<NormalizedZeroConfig, 'taskID' | 'cloudEvent'>,\n) {\n if (!cloudEvent.sinkEnv) {\n // The default implementation just outputs the events to logs.\n publishFn = (lc, event) => {\n lc.info?.(`ZeroEvent: ${event.type}`, event);\n return promiseVoid;\n };\n return;\n }\n\n let overrides: PartialEvent = {};\n\n if (cloudEvent.extensionOverridesEnv) {\n const strVal = must(process.env[cloudEvent.extensionOverridesEnv]);\n const {extensions} = v.parse(JSON.parse(strVal), extensionsObjectSchema);\n overrides = extensions;\n }\n\n function createCloudEvent(data: ZeroEvent) {\n const {type, time} = data;\n return new CloudEvent({\n id: nanoid(),\n source: taskID,\n type,\n time,\n data,\n ...overrides,\n });\n }\n\n const sinkURI = must(process.env[cloudEvent.sinkEnv]);\n const emit = emitterFor(httpTransport(sinkURI));\n lc.debug?.(`Publishing ZeroEvents to ${sinkURI}`);\n\n publishFn = async (lc, event) => {\n const cloudEvent = createCloudEvent(event);\n lc.debug?.(`Publishing CloudEvent: ${cloudEvent.type}`);\n\n for (let i = 0; i < MAX_PUBLISH_ATTEMPTS; i++) {\n if (i > 0) {\n // exponential backoff on retries\n await sleep(INITIAL_PUBLISH_BACKOFF_MS * 2 ** (i - 1));\n }\n try {\n await emit(cloudEvent);\n lc.info?.(`Published CloudEvent: ${cloudEvent.type}`, cloudEvent);\n return;\n } catch (e) {\n lc.warn?.(`Error publishing ${cloudEvent.type} (attempt ${i + 1})`, e);\n }\n }\n };\n}\n\nexport function initEventSinkForTesting(sink: ZeroEvent[], now = new Date()) {\n publishFn = (lc, event) => {\n lc.info?.(`Testing event sink received ${event.type} event`, event);\n // Replace the default Date.now() with the test instance for determinism.\n sink.push({...event, time: now.toISOString()});\n return promiseVoid;\n };\n}\n\nexport function publishEvent<E extends ZeroEvent>(lc: LogContext, event: E) {\n void publishFn(lc, event);\n}\n\nexport async function publishCriticalEvent<E extends ZeroEvent>(\n lc: LogContext,\n event: E,\n) {\n await publishFn(lc, event);\n}\n\nexport function makeErrorDetails(e: unknown): JSONObject {\n const err = e instanceof Error ? e : new Error(String(e));\n const errorDetails: JSONObject = {\n name: err.name,\n message: err.message,\n stack: err.stack,\n cause: err.cause ? makeErrorDetails(err.cause) : undefined,\n };\n // Include any enumerable properties (e.g. of Error subtypes).\n for (const [field, value] of Object.entries(err)) {\n if (isJSONValue(value, [])) {\n errorDetails[field] = value;\n }\n }\n return errorDetails;\n}\n"],"names":["v.union","v.string","v.number","v.boolean","v.record","v.object","lc","v.parse","cloudEvent"],"mappings":";;;;;;;;AAWA,MAAM,uBAAuB;AAC7B,MAAM,6BAA6B;AAInC,IAAI,YAAyB,CAAC,IAAI,EAAC,WAAU;AAC3C,KAAG;AAAA,IACD,mBAAmB,IAAI;AAAA,EAAA;AAGzB,SAAO;AACT;AAEA,MAAM,uBAAuBA,MAAQC,OAAE,GAAUC,OAAE,GAAUC,QAAE,CAAS;AAExE,MAAM,cAAcC,OAAS,oBAAoB;AAMjD,MAAM,yBAAyBC,OAAS,EAAC,YAAY,aAAY;AAO1D,SAAS,cACd,IACA,EAAC,QAAQ,cACT;AACA,MAAI,CAAC,WAAW,SAAS;AAEvB,gBAAY,CAACC,KAAI,UAAU;AACzBA,UAAG,OAAO,cAAc,MAAM,IAAI,IAAI,KAAK;AAC3C,aAAO;AAAA,IACT;AACA;AAAA,EACF;AAEA,MAAI,YAA0B,CAAA;AAE9B,MAAI,WAAW,uBAAuB;AACpC,UAAM,SAAS,KAAK,QAAQ,IAAI,WAAW,qBAAqB,CAAC;AACjE,UAAM,EAAC,eAAcC,MAAQ,KAAK,MAAM,MAAM,GAAG,sBAAsB;AACvE,gBAAY;AAAA,EACd;AAEA,WAAS,iBAAiB,MAAiB;AACzC,UAAM,EAAC,MAAM,KAAA,IAAQ;AACrB,WAAO,IAAI,WAAW;AAAA,MACpB,IAAI,OAAA;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IAAA,CACJ;AAAA,EACH;AAEA,QAAM,UAAU,KAAK,QAAQ,IAAI,WAAW,OAAO,CAAC;AACpD,QAAM,OAAO,WAAW,cAAc,OAAO,CAAC;AAC9C,KAAG,QAAQ,4BAA4B,OAAO,EAAE;AAEhD,cAAY,OAAOD,KAAI,UAAU;AAC/B,UAAME,cAAa,iBAAiB,KAAK;AACzCF,QAAG,QAAQ,0BAA0BE,YAAW,IAAI,EAAE;AAEtD,aAAS,IAAI,GAAG,IAAI,sBAAsB,KAAK;AAC7C,UAAI,IAAI,GAAG;AAET,cAAM,MAAM,6BAA6B,MAAM,IAAI,EAAE;AAAA,MACvD;AACA,UAAI;AACF,cAAM,KAAKA,WAAU;AACrBF,YAAG,OAAO,yBAAyBE,YAAW,IAAI,IAAIA,WAAU;AAChE;AAAA,MACF,SAAS,GAAG;AACVF,YAAG,OAAO,oBAAoBE,YAAW,IAAI,aAAa,IAAI,CAAC,KAAK,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AACF;AAWO,SAAS,aAAkC,IAAgB,OAAU;AAC1E,OAAK,UAAU,IAAI,KAAK;AAC1B;AAEA,eAAsB,qBACpB,IACA,OACA;AACA,QAAM,UAAU,IAAI,KAAK;AAC3B;AAEO,SAAS,iBAAiB,GAAwB;AACvD,QAAM,MAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AACxD,QAAM,eAA2B;AAAA,IAC/B,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,OAAO,IAAI;AAAA,IACX,OAAO,IAAI,QAAQ,iBAAiB,IAAI,KAAK,IAAI;AAAA,EAAA;AAGnD,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAChD,QAAI,YAAY,OAAO,CAAA,CAAE,GAAG;AAC1B,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;"}
@@ -1,4 +1,4 @@
1
- const version = "0.25.7";
1
+ const version = "0.25.8";
2
2
  export {
3
3
  version
4
4
  };
@@ -132,19 +132,6 @@ class CRUDMutatorFactory {
132
132
  );
133
133
  }
134
134
  }
135
- async function makeServerTransaction(dbTransaction, clientID, mutationID, schema) {
136
- const serverSchema = await getServerSchema(dbTransaction, schema);
137
- const executor = makeServerCRUDExecutor(schema, dbTransaction, serverSchema);
138
- const mutate = makeTransactionMutate(schema, executor);
139
- return new TransactionImpl(
140
- dbTransaction,
141
- clientID,
142
- mutationID,
143
- mutate,
144
- schema,
145
- serverSchema
146
- );
147
- }
148
135
  function makeSchemaCRUD(schema) {
149
136
  return (dbTransaction, serverSchema) => makeCRUDMutate(
150
137
  schema,
@@ -299,7 +286,6 @@ function sqlInsertValue(value, serverColumnSchema) {
299
286
  export {
300
287
  CRUDMutatorFactory,
301
288
  TransactionImpl,
302
- makeSchemaCRUD,
303
- makeServerTransaction
289
+ makeSchemaCRUD
304
290
  };
305
291
  //# sourceMappingURL=custom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"custom.js","sources":["../../../../zero-server/src/custom.ts"],"sourcesContent":["import {assert} from '../../shared/src/asserts.ts';\nimport {mapValues} from '../../shared/src/objects.ts';\nimport {recordProxy} from '../../shared/src/record-proxy.ts';\nimport {\n formatPgInternalConvert,\n sql,\n sqlConvertColumnArg,\n} from '../../z2s/src/sql.ts';\nimport type {TableSchema} from '../../zero-schema/src/table-schema.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {\n ServerColumnSchema,\n ServerSchema,\n ServerTableSchema,\n} from '../../zero-types/src/server-schema.ts';\nimport {\n type CRUDExecutor,\n type CRUDKind,\n makeCRUDMutate,\n makeTransactionMutate,\n type SchemaCRUD,\n type TableCRUD,\n type TransactionMutate,\n} from '../../zql/src/mutate/crud.ts';\nimport type {\n DBTransaction,\n MutateCRUD,\n ServerTransaction,\n} from '../../zql/src/mutate/custom.ts';\nimport {createRunnableBuilder} from '../../zql/src/query/create-builder.ts';\nimport {QueryDelegateBase} from '../../zql/src/query/query-delegate-base.ts';\nimport {asQueryInternals} from '../../zql/src/query/query-internals.ts';\nimport type {\n HumanReadable,\n Query,\n RunOptions,\n} from '../../zql/src/query/query.ts';\nimport type {ConditionalSchemaQuery} from '../../zql/src/query/schema-query.ts';\nimport {getServerSchema} from './schema.ts';\n\nexport type CustomMutatorDefs<TDBTransaction> = {\n [namespaceOrKey: string]:\n | CustomMutatorImpl<TDBTransaction>\n | CustomMutatorDefs<TDBTransaction>;\n};\n\nexport type CustomMutatorImpl<\n TDBTransaction,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n TArgs = any,\n Context = unknown,\n> = (tx: TDBTransaction, args: TArgs, ctx: Context) => Promise<void>;\n\n/**\n * QueryDelegate implementation for server-side transactions.\n * Extends QueryDelegateBase to satisfy the QueryDelegate interface,\n * but overrides run() to execute against Postgres and throws on\n * preload()/materialize() which don't make sense server-side.\n */\nclass ServerTransactionQueryDelegate extends QueryDelegateBase {\n readonly #dbTransaction: DBTransaction<unknown>;\n readonly #schema: Schema;\n readonly #serverSchema: ServerSchema;\n\n readonly defaultQueryComplete = true;\n\n constructor(\n dbTransaction: DBTransaction<unknown>,\n schema: Schema,\n serverSchema: ServerSchema,\n ) {\n super();\n this.#dbTransaction = dbTransaction;\n this.#schema = schema;\n this.#serverSchema = serverSchema;\n }\n\n getSource(): never {\n throw new Error('not implemented');\n }\n\n override run<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n _options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n const queryInternals = asQueryInternals(query);\n return this.#dbTransaction.runQuery<TReturn>(\n queryInternals.ast,\n queryInternals.format,\n this.#schema,\n this.#serverSchema,\n );\n }\n\n override preload(): never {\n throw new Error('preload() is not supported in server transactions');\n }\n\n override materialize(): never {\n throw new Error('materialize() is not supported in server transactions');\n }\n}\n\nexport class TransactionImpl<TSchema extends Schema, TWrappedTransaction>\n implements ServerTransaction<TSchema, TWrappedTransaction>\n{\n readonly location = 'server';\n readonly reason = 'authoritative';\n readonly dbTransaction: DBTransaction<TWrappedTransaction>;\n readonly clientID: string;\n readonly mutationID: number;\n readonly mutate: TransactionMutate<TSchema>;\n /**\n * @deprecated Use {@linkcode createBuilder} with `tx.run(zql.table.where(...))` instead.\n */\n readonly query: ConditionalSchemaQuery<TSchema>;\n\n readonly #schema: TSchema;\n readonly #serverSchema: ServerSchema;\n\n constructor(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n mutate: TransactionMutate<TSchema>,\n schema: TSchema,\n serverSchema: ServerSchema,\n ) {\n this.dbTransaction = dbTransaction;\n this.clientID = clientID;\n this.mutationID = mutationID;\n this.mutate = mutate;\n this.#schema = schema;\n this.#serverSchema = serverSchema;\n\n const delegate = new ServerTransactionQueryDelegate(\n dbTransaction,\n schema,\n serverSchema,\n );\n this.query = createRunnableBuilder(delegate, schema);\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 const queryInternals = asQueryInternals(query);\n\n // Execute the query using the database-specific executor\n return this.dbTransaction.runQuery<TReturn>(\n queryInternals.ast,\n queryInternals.format,\n this.#schema,\n this.#serverSchema,\n );\n }\n}\n\nconst dbTxSymbol = Symbol();\n\nconst serverSchemaSymbol = Symbol();\n\ntype WithHiddenTxAndSchema = {\n [dbTxSymbol]: DBTransaction<unknown>;\n [serverSchemaSymbol]: ServerSchema;\n};\n\n/**\n * Factory for creating MutateCRUD instances efficiently.\n *\n * Pre-creates the SQL-generating TableCRUD methods once from the schema,\n * caches the serverSchema after first fetch, and only binds the transaction\n * at transaction time.\n *\n * Use this when you need to create many transactions and want to avoid\n * the overhead of re-creating CRUD methods for each one.\n */\nexport class CRUDMutatorFactory<S extends Schema> {\n readonly #schema: S;\n readonly #tableCRUDs: Record<string, TableCRUD<TableSchema>>;\n #serverSchema: ServerSchema | undefined;\n\n constructor(schema: S) {\n this.#schema = schema;\n // Pre-create TableCRUD methods for each table once\n this.#tableCRUDs = {};\n for (const tableSchema of Object.values(schema.tables)) {\n this.#tableCRUDs[tableSchema.name] = makeServerTableCRUD(tableSchema);\n }\n }\n\n /**\n * Gets the cached serverSchema, or fetches and caches it on first call.\n */\n async #getOrFetchServerSchema(\n dbTransaction: DBTransaction<unknown>,\n ): Promise<ServerSchema> {\n if (!this.#serverSchema) {\n this.#serverSchema = await getServerSchema(dbTransaction, this.#schema);\n }\n return this.#serverSchema;\n }\n\n /**\n * Creates a CRUDExecutor bound to the given transaction and serverSchema.\n * Uses the pre-created TableCRUD methods from construction time.\n */\n createExecutor(\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n ): CRUDExecutor {\n const txHolder: WithHiddenTxAndSchema = {\n [dbTxSymbol]: dbTransaction,\n [serverSchemaSymbol]: serverSchema,\n };\n const boundCRUDs = recordProxy(this.#tableCRUDs, tableCRUD =>\n mapValues(tableCRUD, method => method.bind(txHolder)),\n ) as unknown as SchemaCRUD<S>;\n\n return (table: string, kind: CRUDKind, args: unknown) => {\n const tableCRUD = boundCRUDs[table as keyof S['tables']];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (tableCRUD as any)[kind](args);\n };\n }\n\n /**\n * Creates a full ServerTransaction.\n * Fetches/caches serverSchema automatically.\n */\n async createTransaction<TWrappedTransaction>(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n ): Promise<TransactionImpl<S, TWrappedTransaction>> {\n const serverSchema = await this.#getOrFetchServerSchema(dbTransaction);\n const executor = this.createExecutor(dbTransaction, serverSchema);\n const mutate = makeTransactionMutate(this.#schema, executor);\n return new TransactionImpl(\n dbTransaction,\n clientID,\n mutationID,\n mutate,\n this.#schema,\n serverSchema,\n );\n }\n}\n\nexport async function makeServerTransaction<\n TSchema extends Schema,\n TWrappedTransaction,\n>(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n schema: TSchema,\n) {\n const serverSchema = await getServerSchema(dbTransaction, schema);\n // Use the internal executor and shared function directly,\n // bypassing the validation in makeMutateCRUD/makeSchemaCRUD\n const executor = makeServerCRUDExecutor(schema, dbTransaction, serverSchema);\n const mutate = makeTransactionMutate(schema, executor);\n return new TransactionImpl(\n dbTransaction,\n clientID,\n mutationID,\n mutate,\n schema,\n serverSchema,\n );\n}\n\n/**\n * @deprecated Use transactions instead.\n *\n * Returns a curried function for backwards compatibility.\n */\nexport function makeSchemaCRUD<S extends Schema>(\n schema: S,\n): (\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n) => MutateCRUD<S, true> {\n return (dbTransaction: DBTransaction<unknown>, serverSchema: ServerSchema) =>\n makeCRUDMutate(\n schema,\n true,\n makeServerCRUDExecutor(schema, dbTransaction, serverSchema),\n );\n}\n\nfunction removeUndefined<T extends Record<string, unknown>>(value: T): T {\n const valueWithoutUndefined: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n if (val !== undefined) {\n valueWithoutUndefined[key] = val;\n }\n }\n return valueWithoutUndefined as T;\n}\n\n/**\n * Creates a CRUDExecutor for server-side SQL execution.\n *\n * For users with very large schemas it is expensive to re-create\n * all the CRUD mutators for each transaction. Instead, we create\n * the SQL-generating methods once up-front and then bind them to\n * the transaction as requested.\n */\nfunction makeServerCRUDExecutor<S extends Schema>(\n schema: S,\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n): CRUDExecutor {\n // Pre-create TableCRUD methods for each table (optimization for large schemas)\n const tableCRUDs: Record<string, TableCRUD<TableSchema>> = {};\n for (const tableSchema of Object.values(schema.tables)) {\n tableCRUDs[tableSchema.name] = makeServerTableCRUD(tableSchema);\n }\n\n // Bind transaction context to the methods\n const txHolder: WithHiddenTxAndSchema = {\n [dbTxSymbol]: dbTransaction,\n [serverSchemaSymbol]: serverSchema,\n };\n const boundCRUDs = recordProxy(tableCRUDs, tableCRUD =>\n mapValues(tableCRUD, method => method.bind(txHolder)),\n ) as unknown as SchemaCRUD<S>;\n\n // Return executor that dispatches to bound methods\n return (table: string, kind: CRUDKind, args: unknown) => {\n const tableCRUD = boundCRUDs[table as keyof S['tables']];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (tableCRUD as any)[kind](args);\n };\n}\n\n/**\n * Creates SQL-generating TableCRUD methods for a table.\n * Methods use `this` context to access transaction and server schema.\n */\nfunction makeServerTableCRUD(schema: TableSchema): TableCRUD<TableSchema> {\n return {\n async insert(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPgInternalConvert(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.entries(value).map(([col, v]) =>\n sqlInsertValue(v, serverTableSchema[serverNameFor(col, schema)]),\n ),\n ', ',\n )})`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async upsert(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const primaryKeyColumns = origAndServerNamesFor(\n schema.primaryKey,\n schema,\n );\n const stmt = formatPgInternalConvert(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.entries(value).map(([col, val]) =>\n sqlInsertValue(val, serverTableSchema[serverNameFor(col, schema)]),\n ),\n ', ',\n )}) ON CONFLICT (${sql.join(\n primaryKeyColumns.map(([, serverName]) => sql.ident(serverName)),\n ', ',\n )}) DO UPDATE SET ${sql.join(\n Object.entries(value).map(\n ([col, val]) =>\n sql`${sql.ident(\n schema.columns[col].serverName ?? col,\n )} = ${sqlInsertValue(val, serverTableSchema[serverNameFor(col, schema)])}`,\n ),\n ', ',\n )}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async update(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPgInternalConvert(\n sql`UPDATE ${sql.ident(serverName(schema))} SET ${sql.join(\n targetedColumns.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)} = ${sqlInsertValue(value[origName], serverTableSchema[serverName])}`,\n ),\n ', ',\n )} WHERE ${primaryKeyClause(schema, serverTableSchema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async delete(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const stmt = formatPgInternalConvert(\n sql`DELETE FROM ${sql.ident(\n serverName(schema),\n )} WHERE ${primaryKeyClause(schema, serverTableSchema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n };\n}\n\nfunction serverName(x: {name: string; serverName?: string | undefined}) {\n return x.serverName ?? x.name;\n}\n\nfunction primaryKeyClause(\n schema: TableSchema,\n serverTableSchema: ServerTableSchema,\n row: Record<string, unknown>,\n) {\n const primaryKey = origAndServerNamesFor(schema.primaryKey, schema);\n return sql`${sql.join(\n primaryKey.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)}${maybeCastColumn(serverTableSchema[serverName])} = ${sqlValue(row[origName], serverTableSchema[serverName])}`,\n ),\n ' AND ',\n )}`;\n}\n\nfunction maybeCastColumn(col: ServerColumnSchema) {\n if (col.type === 'uuid' || col.isEnum) {\n return sql`::text`;\n }\n return sql``;\n}\n\nfunction origAndServerNamesFor(\n originalNames: readonly string[],\n schema: TableSchema,\n): [origName: string, serverName: string][] {\n return originalNames.map(\n name => [name, serverNameFor(name, schema)] as const,\n );\n}\n\nfunction serverNameFor(originalName: string, schema: TableSchema): string {\n const col = schema.columns[originalName];\n assert(\n col,\n `Column ${originalName} was not found in the Zero schema for the table ${schema.name}`,\n );\n return col.serverName ?? originalName;\n}\n\nfunction sqlValue(value: unknown, serverColumnSchema: ServerColumnSchema) {\n return sqlConvertColumnArg(serverColumnSchema, value, false, true);\n}\n\nfunction sqlInsertValue(\n value: unknown,\n serverColumnSchema: ServerColumnSchema,\n) {\n return sqlConvertColumnArg(serverColumnSchema, value, false, false);\n}\n"],"names":["serverName"],"mappings":"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"}
1
+ {"version":3,"file":"custom.js","sources":["../../../../zero-server/src/custom.ts"],"sourcesContent":["import {assert} from '../../shared/src/asserts.ts';\nimport {mapValues} from '../../shared/src/objects.ts';\nimport {recordProxy} from '../../shared/src/record-proxy.ts';\nimport {\n formatPgInternalConvert,\n sql,\n sqlConvertColumnArg,\n} from '../../z2s/src/sql.ts';\nimport type {TableSchema} from '../../zero-schema/src/table-schema.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {\n ServerColumnSchema,\n ServerSchema,\n ServerTableSchema,\n} from '../../zero-types/src/server-schema.ts';\nimport {\n type CRUDExecutor,\n type CRUDKind,\n makeCRUDMutate,\n makeTransactionMutate,\n type SchemaCRUD,\n type TableCRUD,\n type TransactionMutate,\n} from '../../zql/src/mutate/crud.ts';\nimport type {\n DBTransaction,\n MutateCRUD,\n ServerTransaction,\n} from '../../zql/src/mutate/custom.ts';\nimport {createRunnableBuilder} from '../../zql/src/query/create-builder.ts';\nimport {QueryDelegateBase} from '../../zql/src/query/query-delegate-base.ts';\nimport {asQueryInternals} from '../../zql/src/query/query-internals.ts';\nimport type {\n HumanReadable,\n Query,\n RunOptions,\n} from '../../zql/src/query/query.ts';\nimport type {ConditionalSchemaQuery} from '../../zql/src/query/schema-query.ts';\nimport {getServerSchema} from './schema.ts';\n\nexport type CustomMutatorDefs<TDBTransaction> = {\n [namespaceOrKey: string]:\n | CustomMutatorImpl<TDBTransaction>\n | CustomMutatorDefs<TDBTransaction>;\n};\n\nexport type CustomMutatorImpl<\n TDBTransaction,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n TArgs = any,\n Context = unknown,\n> = (tx: TDBTransaction, args: TArgs, ctx: Context) => Promise<void>;\n\n/**\n * QueryDelegate implementation for server-side transactions.\n * Extends QueryDelegateBase to satisfy the QueryDelegate interface,\n * but overrides run() to execute against Postgres and throws on\n * preload()/materialize() which don't make sense server-side.\n */\nclass ServerTransactionQueryDelegate extends QueryDelegateBase {\n readonly #dbTransaction: DBTransaction<unknown>;\n readonly #schema: Schema;\n readonly #serverSchema: ServerSchema;\n\n readonly defaultQueryComplete = true;\n\n constructor(\n dbTransaction: DBTransaction<unknown>,\n schema: Schema,\n serverSchema: ServerSchema,\n ) {\n super();\n this.#dbTransaction = dbTransaction;\n this.#schema = schema;\n this.#serverSchema = serverSchema;\n }\n\n getSource(): never {\n throw new Error('not implemented');\n }\n\n override run<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n >(\n query: Query<TTable, TSchema, TReturn>,\n _options?: RunOptions,\n ): Promise<HumanReadable<TReturn>> {\n const queryInternals = asQueryInternals(query);\n return this.#dbTransaction.runQuery<TReturn>(\n queryInternals.ast,\n queryInternals.format,\n this.#schema,\n this.#serverSchema,\n );\n }\n\n override preload(): never {\n throw new Error('preload() is not supported in server transactions');\n }\n\n override materialize(): never {\n throw new Error('materialize() is not supported in server transactions');\n }\n}\n\nexport class TransactionImpl<TSchema extends Schema, TWrappedTransaction>\n implements ServerTransaction<TSchema, TWrappedTransaction>\n{\n readonly location = 'server';\n readonly reason = 'authoritative';\n readonly dbTransaction: DBTransaction<TWrappedTransaction>;\n readonly clientID: string;\n readonly mutationID: number;\n readonly mutate: TransactionMutate<TSchema>;\n /**\n * @deprecated Use {@linkcode createBuilder} with `tx.run(zql.table.where(...))` instead.\n */\n readonly query: ConditionalSchemaQuery<TSchema>;\n\n readonly #schema: TSchema;\n readonly #serverSchema: ServerSchema;\n\n constructor(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n mutate: TransactionMutate<TSchema>,\n schema: TSchema,\n serverSchema: ServerSchema,\n ) {\n this.dbTransaction = dbTransaction;\n this.clientID = clientID;\n this.mutationID = mutationID;\n this.mutate = mutate;\n this.#schema = schema;\n this.#serverSchema = serverSchema;\n\n const delegate = new ServerTransactionQueryDelegate(\n dbTransaction,\n schema,\n serverSchema,\n );\n this.query = createRunnableBuilder(delegate, schema);\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 const queryInternals = asQueryInternals(query);\n\n // Execute the query using the database-specific executor\n return this.dbTransaction.runQuery<TReturn>(\n queryInternals.ast,\n queryInternals.format,\n this.#schema,\n this.#serverSchema,\n );\n }\n}\n\nconst dbTxSymbol = Symbol();\n\nconst serverSchemaSymbol = Symbol();\n\ntype WithHiddenTxAndSchema = {\n [dbTxSymbol]: DBTransaction<unknown>;\n [serverSchemaSymbol]: ServerSchema;\n};\n\n/**\n * Factory for creating MutateCRUD instances efficiently.\n *\n * Pre-creates the SQL-generating TableCRUD methods once from the schema,\n * caches the serverSchema after first fetch, and only binds the transaction\n * at transaction time.\n *\n * Use this when you need to create many transactions and want to avoid\n * the overhead of re-creating CRUD methods for each one.\n */\nexport class CRUDMutatorFactory<S extends Schema> {\n readonly #schema: S;\n readonly #tableCRUDs: Record<string, TableCRUD<TableSchema>>;\n #serverSchema: ServerSchema | undefined;\n\n constructor(schema: S) {\n this.#schema = schema;\n // Pre-create TableCRUD methods for each table once\n this.#tableCRUDs = {};\n for (const tableSchema of Object.values(schema.tables)) {\n this.#tableCRUDs[tableSchema.name] = makeServerTableCRUD(tableSchema);\n }\n }\n\n /**\n * Gets the cached serverSchema, or fetches and caches it on first call.\n */\n async #getOrFetchServerSchema(\n dbTransaction: DBTransaction<unknown>,\n ): Promise<ServerSchema> {\n if (!this.#serverSchema) {\n this.#serverSchema = await getServerSchema(dbTransaction, this.#schema);\n }\n return this.#serverSchema;\n }\n\n /**\n * Creates a CRUDExecutor bound to the given transaction and serverSchema.\n * Uses the pre-created TableCRUD methods from construction time.\n */\n createExecutor(\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n ): CRUDExecutor {\n const txHolder: WithHiddenTxAndSchema = {\n [dbTxSymbol]: dbTransaction,\n [serverSchemaSymbol]: serverSchema,\n };\n const boundCRUDs = recordProxy(this.#tableCRUDs, tableCRUD =>\n mapValues(tableCRUD, method => method.bind(txHolder)),\n ) as unknown as SchemaCRUD<S>;\n\n return (table: string, kind: CRUDKind, args: unknown) => {\n const tableCRUD = boundCRUDs[table as keyof S['tables']];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (tableCRUD as any)[kind](args);\n };\n }\n\n /**\n * Creates a full ServerTransaction.\n * Fetches/caches serverSchema automatically.\n */\n async createTransaction<TWrappedTransaction>(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n ): Promise<TransactionImpl<S, TWrappedTransaction>> {\n const serverSchema = await this.#getOrFetchServerSchema(dbTransaction);\n const executor = this.createExecutor(dbTransaction, serverSchema);\n const mutate = makeTransactionMutate(this.#schema, executor);\n return new TransactionImpl(\n dbTransaction,\n clientID,\n mutationID,\n mutate,\n this.#schema,\n serverSchema,\n );\n }\n}\n\nexport async function makeServerTransaction<\n TSchema extends Schema,\n TWrappedTransaction,\n>(\n dbTransaction: DBTransaction<TWrappedTransaction>,\n clientID: string,\n mutationID: number,\n schema: TSchema,\n) {\n const serverSchema = await getServerSchema(dbTransaction, schema);\n // Use the internal executor and shared function directly,\n // bypassing the validation in makeMutateCRUD/makeSchemaCRUD\n const executor = makeServerCRUDExecutor(schema, dbTransaction, serverSchema);\n const mutate = makeTransactionMutate(schema, executor);\n return new TransactionImpl(\n dbTransaction,\n clientID,\n mutationID,\n mutate,\n schema,\n serverSchema,\n );\n}\n\n/**\n * @deprecated Use transactions instead.\n *\n * Returns a curried function for backwards compatibility.\n */\nexport function makeSchemaCRUD<S extends Schema>(\n schema: S,\n): (\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n) => MutateCRUD<S, true> {\n return (dbTransaction: DBTransaction<unknown>, serverSchema: ServerSchema) =>\n makeCRUDMutate(\n schema,\n true,\n makeServerCRUDExecutor(schema, dbTransaction, serverSchema),\n );\n}\n\nfunction removeUndefined<T extends Record<string, unknown>>(value: T): T {\n const valueWithoutUndefined: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n if (val !== undefined) {\n valueWithoutUndefined[key] = val;\n }\n }\n return valueWithoutUndefined as T;\n}\n\n/**\n * Creates a CRUDExecutor for server-side SQL execution.\n *\n * For users with very large schemas it is expensive to re-create\n * all the CRUD mutators for each transaction. Instead, we create\n * the SQL-generating methods once up-front and then bind them to\n * the transaction as requested.\n */\nfunction makeServerCRUDExecutor<S extends Schema>(\n schema: S,\n dbTransaction: DBTransaction<unknown>,\n serverSchema: ServerSchema,\n): CRUDExecutor {\n // Pre-create TableCRUD methods for each table (optimization for large schemas)\n const tableCRUDs: Record<string, TableCRUD<TableSchema>> = {};\n for (const tableSchema of Object.values(schema.tables)) {\n tableCRUDs[tableSchema.name] = makeServerTableCRUD(tableSchema);\n }\n\n // Bind transaction context to the methods\n const txHolder: WithHiddenTxAndSchema = {\n [dbTxSymbol]: dbTransaction,\n [serverSchemaSymbol]: serverSchema,\n };\n const boundCRUDs = recordProxy(tableCRUDs, tableCRUD =>\n mapValues(tableCRUD, method => method.bind(txHolder)),\n ) as unknown as SchemaCRUD<S>;\n\n // Return executor that dispatches to bound methods\n return (table: string, kind: CRUDKind, args: unknown) => {\n const tableCRUD = boundCRUDs[table as keyof S['tables']];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n return (tableCRUD as any)[kind](args);\n };\n}\n\n/**\n * Creates SQL-generating TableCRUD methods for a table.\n * Methods use `this` context to access transaction and server schema.\n */\nfunction makeServerTableCRUD(schema: TableSchema): TableCRUD<TableSchema> {\n return {\n async insert(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPgInternalConvert(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.entries(value).map(([col, v]) =>\n sqlInsertValue(v, serverTableSchema[serverNameFor(col, schema)]),\n ),\n ', ',\n )})`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async upsert(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const primaryKeyColumns = origAndServerNamesFor(\n schema.primaryKey,\n schema,\n );\n const stmt = formatPgInternalConvert(\n sql`INSERT INTO ${sql.ident(serverName(schema))} (${sql.join(\n targetedColumns.map(([, serverName]) => sql.ident(serverName)),\n ',',\n )}) VALUES (${sql.join(\n Object.entries(value).map(([col, val]) =>\n sqlInsertValue(val, serverTableSchema[serverNameFor(col, schema)]),\n ),\n ', ',\n )}) ON CONFLICT (${sql.join(\n primaryKeyColumns.map(([, serverName]) => sql.ident(serverName)),\n ', ',\n )}) DO UPDATE SET ${sql.join(\n Object.entries(value).map(\n ([col, val]) =>\n sql`${sql.ident(\n schema.columns[col].serverName ?? col,\n )} = ${sqlInsertValue(val, serverTableSchema[serverNameFor(col, schema)])}`,\n ),\n ', ',\n )}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async update(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const targetedColumns = origAndServerNamesFor(Object.keys(value), schema);\n const stmt = formatPgInternalConvert(\n sql`UPDATE ${sql.ident(serverName(schema))} SET ${sql.join(\n targetedColumns.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)} = ${sqlInsertValue(value[origName], serverTableSchema[serverName])}`,\n ),\n ', ',\n )} WHERE ${primaryKeyClause(schema, serverTableSchema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n async delete(this: WithHiddenTxAndSchema, value) {\n value = removeUndefined(value);\n const serverTableSchema = this[serverSchemaSymbol][serverName(schema)];\n const stmt = formatPgInternalConvert(\n sql`DELETE FROM ${sql.ident(\n serverName(schema),\n )} WHERE ${primaryKeyClause(schema, serverTableSchema, value)}`,\n );\n const tx = this[dbTxSymbol];\n await tx.query(stmt.text, stmt.values);\n },\n };\n}\n\nfunction serverName(x: {name: string; serverName?: string | undefined}) {\n return x.serverName ?? x.name;\n}\n\nfunction primaryKeyClause(\n schema: TableSchema,\n serverTableSchema: ServerTableSchema,\n row: Record<string, unknown>,\n) {\n const primaryKey = origAndServerNamesFor(schema.primaryKey, schema);\n return sql`${sql.join(\n primaryKey.map(\n ([origName, serverName]) =>\n sql`${sql.ident(serverName)}${maybeCastColumn(serverTableSchema[serverName])} = ${sqlValue(row[origName], serverTableSchema[serverName])}`,\n ),\n ' AND ',\n )}`;\n}\n\nfunction maybeCastColumn(col: ServerColumnSchema) {\n if (col.type === 'uuid' || col.isEnum) {\n return sql`::text`;\n }\n return sql``;\n}\n\nfunction origAndServerNamesFor(\n originalNames: readonly string[],\n schema: TableSchema,\n): [origName: string, serverName: string][] {\n return originalNames.map(\n name => [name, serverNameFor(name, schema)] as const,\n );\n}\n\nfunction serverNameFor(originalName: string, schema: TableSchema): string {\n const col = schema.columns[originalName];\n assert(\n col,\n `Column ${originalName} was not found in the Zero schema for the table ${schema.name}`,\n );\n return col.serverName ?? originalName;\n}\n\nfunction sqlValue(value: unknown, serverColumnSchema: ServerColumnSchema) {\n return sqlConvertColumnArg(serverColumnSchema, value, false, true);\n}\n\nfunction sqlInsertValue(\n value: unknown,\n serverColumnSchema: ServerColumnSchema,\n) {\n return sqlConvertColumnArg(serverColumnSchema, value, false, false);\n}\n"],"names":["serverName"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
- export * from '../../zero-protocol/src/application-error.ts';
2
- export * from '../../zql/src/mutate/custom.ts';
3
- export * from './custom.ts';
4
- export * from './process-mutations.ts';
5
- export * from './push-processor.ts';
6
- export * from './queries/process-queries.ts';
7
- export { handleQueryRequest, handleTransformRequest, handleGetQueriesRequest, type TransformQueryFunction, } from './queries/process-queries.ts';
8
- export * from './zql-database.ts';
1
+ export { ApplicationError, isApplicationError, type ApplicationErrorOptions, } from '../../zero-protocol/src/application-error.ts';
2
+ export type { ServerColumnSchema, ServerSchema, ServerTableSchema, } from '../../zero-types/src/server-schema.ts';
3
+ export type { AnyTransaction, ClientTransaction, DBConnection, DBTransaction, Location, MutateCRUD, Row, ServerTransaction, Transaction, TransactionBase, TransactionReason, } from '../../zql/src/mutate/custom.ts';
4
+ export { CRUDMutatorFactory, makeSchemaCRUD, type CustomMutatorDefs, } from './custom.ts';
5
+ export { executePostgresQuery } from './pg-query-executor.ts';
6
+ export { getMutation, handleMutateRequest, handleMutationRequest, OutOfOrderMutation, type Database, type ExtractTransactionType, type Params, type Parsed, type TransactFn, type TransactFnCallback, type TransactionProviderHooks, type TransactionProviderInput, } from './process-mutations.ts';
7
+ export { PushProcessor } from './push-processor.ts';
8
+ export { handleGetQueriesRequest, handleQueryRequest, handleTransformRequest, type TransformQueryFunction, } from './queries/process-queries.ts';
9
+ export { ZQLDatabase } from './zql-database.ts';
9
10
  //# sourceMappingURL=mod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../../zero-server/src/mod.ts"],"names":[],"mappings":"AAAA,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../../zero-server/src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,8CAA8C,CAAC;AACtD,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,GAClB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,UAAU,EACV,GAAG,EACH,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAC3B,KAAK,MAAM,EACX,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rocicorp/zero",
3
- "version": "0.25.7",
3
+ "version": "0.25.8",
4
4
  "description": "Zero is a web framework for serverless web development.",
5
5
  "author": "Rocicorp, Inc.",
6
6
  "repository": {