@rocicorp/zero 0.25.0-canary.11 → 0.25.0-canary.12
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/zero/package.json.js +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +4 -0
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +15 -5
- package/out/zero-cache/src/config/zero-config.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 +8 -2
- package/out/zero-cache/src/server/change-streamer.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 +42 -62
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/control.d.ts +0 -1
- package/out/zero-cache/src/services/change-source/protocol/current/control.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/control.js +1 -5
- package/out/zero-cache/src/services/change-source/protocol/current/control.js.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +0 -2
- package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current.d.ts +0 -1
- package/out/zero-cache/src/services/change-source/protocol/current.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current.js +0 -3
- package/out/zero-cache/src/services/change-source/protocol/current.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -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 +5 -0
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +1 -8
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +3 -2
- package/out/zero-cache/src/services/change-streamer/storer.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 +4 -0
- package/out/zero-cache/src/services/http-service.js.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.d.ts +0 -2
- package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/replication-status.js +1 -14
- package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -1
- package/out/zero-client/src/client/bindings.d.ts +2 -3
- package/out/zero-client/src/client/bindings.d.ts.map +1 -1
- package/out/zero-client/src/client/bindings.js.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.d.ts +2 -2
- package/out/zero-client/src/client/make-mutate-property.d.ts.map +1 -1
- package/out/zero-client/src/client/make-mutate-property.js.map +1 -1
- package/out/zero-client/src/client/make-replicache-mutators.js.map +1 -1
- package/out/zero-client/src/client/options.d.ts +3 -3
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero.d.ts +1 -2
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/mod.d.ts +5 -7
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-events/src/status.d.ts +1 -1
- package/out/zero-events/src/status.d.ts.map +1 -1
- package/out/zero-react/src/components/inspector.d.ts +1 -2
- package/out/zero-react/src/components/inspector.d.ts.map +1 -1
- package/out/zero-react/src/components/inspector.js.map +1 -1
- package/out/zero-react/src/components/zero-inspector.d.ts +1 -2
- package/out/zero-react/src/components/zero-inspector.d.ts.map +1 -1
- package/out/zero-react/src/components/zero-inspector.js.map +1 -1
- package/out/zero-react/src/use-query.d.ts +1 -2
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-react/src/zero-provider.d.ts +4 -5
- package/out/zero-react/src/zero-provider.d.ts.map +1 -1
- package/out/zero-react/src/zero-provider.js.map +1 -1
- package/out/zero-solid/src/use-zero.d.ts +4 -5
- package/out/zero-solid/src/use-zero.d.ts.map +1 -1
- package/out/zero-solid/src/use-zero.js.map +1 -1
- package/out/zero-types/src/default-types.d.ts +2 -2
- package/out/zero-types/src/default-types.d.ts.map +1 -1
- package/out/zql/src/ivm/join.d.ts.map +1 -1
- package/out/zql/src/ivm/join.js +14 -24
- package/out/zql/src/ivm/join.js.map +1 -1
- package/out/zql/src/mutate/custom.d.ts +2 -2
- package/out/zql/src/mutate/custom.d.ts.map +1 -1
- package/out/zql/src/mutate/custom.js.map +1 -1
- package/out/zql/src/mutate/mutator-registry.d.ts +33 -15
- package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator-registry.js +2 -8
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/mutate/mutator.d.ts +50 -25
- package/out/zql/src/mutate/mutator.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator.js +2 -3
- package/out/zql/src/mutate/mutator.js.map +1 -1
- package/out/zql/src/query/query-internals.d.ts.map +1 -1
- package/out/zql/src/query/query-internals.js +2 -2
- package/out/zql/src/query/query-internals.js.map +1 -1
- package/out/zql/src/query/query-registry.d.ts +126 -58
- package/out/zql/src/query/query-registry.d.ts.map +1 -1
- package/out/zql/src/query/query-registry.js +13 -21
- package/out/zql/src/query/query-registry.js.map +1 -1
- package/package.json +1 -1
- package/out/zero-cache/src/services/change-source/protocol/current/json.d.ts +0 -8
- package/out/zero-cache/src/services/change-source/protocol/current/json.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-source/protocol/current/json.js +0 -19
- package/out/zero-cache/src/services/change-source/protocol/current/json.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../../zero-client/src/mod.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../../zero-client/src/mod.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,6 +67,6 @@ export interface ReplicationStatusEvent extends StatusEvent {
|
|
|
67
67
|
type: typeof REPLICATION_STATUS_EVENT_V1_TYPE;
|
|
68
68
|
component: 'replication';
|
|
69
69
|
stage: ReplicationStage;
|
|
70
|
-
state
|
|
70
|
+
state: ReplicationState;
|
|
71
71
|
}
|
|
72
72
|
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../zero-events/src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAE1C,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;AAEpC,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,IAAI,EAAE,GAAG,OAAO,wBAAwB,GAAG,MAAM,EAAE,CAAC;IAEpD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAE/B,sEAAsE;IACtE,YAAY,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,UAAU,GAAG,aAAa,CAAC;AAE3E,eAAO,MAAM,gCAAgC,sCACR,CAAC;AAEtC,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,IAAI,EAAE,OAAO,gCAAgC,CAAC;IAC9C,SAAS,EAAE,aAAa,CAAC;IACzB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../zero-events/src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAE1C,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;AAEpC,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,IAAI,EAAE,GAAG,OAAO,wBAAwB,GAAG,MAAM,EAAE,CAAC;IAEpD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAE/B,sEAAsE;IACtE,YAAY,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,UAAU,GAAG,aAAa,CAAC;AAE3E,eAAO,MAAM,gCAAgC,sCACR,CAAC;AAEtC,MAAM,WAAW,sBAAuB,SAAQ,WAAW;IACzD,IAAI,EAAE,OAAO,gCAAgC,CAAC;IAC9C,SAAS,EAAE,aAAa,CAAC;IACzB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;CACzB"}
|
|
@@ -2,8 +2,7 @@ import type { CustomMutatorDefs } from '../../../zero-client/src/client/custom.t
|
|
|
2
2
|
import type { Zero } from '../../../zero-client/src/client/zero.ts';
|
|
3
3
|
import type { DefaultContext, DefaultSchema } from '../../../zero-types/src/default-types.ts';
|
|
4
4
|
import type { Schema } from '../../../zero-types/src/schema.ts';
|
|
5
|
-
|
|
6
|
-
export default function Inspector<S extends Schema = DefaultSchema, MD extends AnyMutatorRegistry | CustomMutatorDefs | undefined = undefined, Context = DefaultContext>({ zero, onClose }: {
|
|
5
|
+
export default function Inspector<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>({ zero, onClose }: {
|
|
7
6
|
zero: Zero<S, MD, Context>;
|
|
8
7
|
onClose: () => void;
|
|
9
8
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../../../../zero-react/src/components/inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,yCAAyC,CAAC;AAClE,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../../../../zero-react/src/components/inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,yCAAyC,CAAC;AAClE,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAG9D,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,EACxB,EAAC,IAAI,EAAE,OAAO,EAAC,EAAE;IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAC,2CA4BnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspector.js","sources":["../../../../../zero-react/src/components/inspector.tsx"],"sourcesContent":["import type {CustomMutatorDefs} from '../../../zero-client/src/client/custom.ts';\nimport type {Zero} from '../../../zero-client/src/client/zero.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport
|
|
1
|
+
{"version":3,"file":"inspector.js","sources":["../../../../../zero-react/src/components/inspector.tsx"],"sourcesContent":["import type {CustomMutatorDefs} from '../../../zero-client/src/client/custom.ts';\nimport type {Zero} from '../../../zero-client/src/client/zero.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {MarkIcon} from './mark-icon.tsx';\n\nexport default function Inspector<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>({zero, onClose}: {zero: Zero<S, MD, Context>; onClose: () => void}) {\n return (\n <dialog\n open\n style={{\n alignItems: 'center',\n backgroundColor: 'white',\n borderRadius: '8px 0 0 0',\n bottom: 0,\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1)',\n color: 'black',\n display: 'flex',\n height: 'fit-content',\n marginRight: 0,\n opacity: 0.95,\n padding: '0.25em 0.5em',\n position: 'fixed',\n width: 'fit-content',\n zIndex: 1000,\n }}\n >\n <MarkIcon style={{margin: '0.5em'}} />\n <div>Zero v{zero.version}</div>\n <button onClick={onClose} style={{padding: '0.5em'}}>\n ✖︎\n </button>\n </dialog>\n );\n}\n"],"names":[],"mappings":";;AASA,SAAwB,UAItB,EAAC,MAAM,WAA6D;AACpE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAI;AAAA,MACJ,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA;AAAA,MAGV,UAAA;AAAA,QAAA,oBAAC,UAAA,EAAS,OAAO,EAAC,QAAQ,WAAU;AAAA,6BACnC,OAAA,EAAI,UAAA;AAAA,UAAA;AAAA,UAAO,KAAK;AAAA,QAAA,GAAQ;AAAA,QACzB,oBAAC,YAAO,SAAS,SAAS,OAAO,EAAC,SAAS,QAAA,GAAU,UAAA,KAAA,CAErD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -2,8 +2,7 @@ import type { CustomMutatorDefs } from '../../../zero-client/src/client/custom.t
|
|
|
2
2
|
import type { Zero } from '../../../zero-client/src/client/zero.ts';
|
|
3
3
|
import type { DefaultContext, DefaultSchema } from '../../../zero-types/src/default-types.ts';
|
|
4
4
|
import type { Schema } from '../../../zero-types/src/schema.ts';
|
|
5
|
-
|
|
6
|
-
export declare function ZeroInspector<S extends Schema = DefaultSchema, MD extends AnyMutatorRegistry | CustomMutatorDefs | undefined = undefined, Context = DefaultContext>({ zero }: {
|
|
5
|
+
export declare function ZeroInspector<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>({ zero }: {
|
|
7
6
|
zero: Zero<S, MD, Context>;
|
|
8
7
|
}): JSX.Element;
|
|
9
8
|
//# sourceMappingURL=zero-inspector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zero-inspector.d.ts","sourceRoot":"","sources":["../../../../../zero-react/src/components/zero-inspector.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,yCAAyC,CAAC;AAClE,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"zero-inspector.d.ts","sourceRoot":"","sources":["../../../../../zero-react/src/components/zero-inspector.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,yCAAyC,CAAC;AAClE,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAK9D,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,EACxB,EAAC,IAAI,EAAC,EAAE;IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;CAAC,GAAG,GAAG,CAAC,OAAO,CAkCnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zero-inspector.js","sources":["../../../../../zero-react/src/components/zero-inspector.tsx"],"sourcesContent":["import {lazy, Suspense, useState} from 'react';\nimport type {CustomMutatorDefs} from '../../../zero-client/src/client/custom.ts';\nimport type {Zero} from '../../../zero-client/src/client/zero.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport
|
|
1
|
+
{"version":3,"file":"zero-inspector.js","sources":["../../../../../zero-react/src/components/zero-inspector.tsx"],"sourcesContent":["import {lazy, Suspense, useState} from 'react';\nimport type {CustomMutatorDefs} from '../../../zero-client/src/client/custom.ts';\nimport type {Zero} from '../../../zero-client/src/client/zero.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../../zero-types/src/schema.ts';\nimport {MarkIcon} from './mark-icon.tsx';\n\nconst Inspector = lazy(() => import('./inspector.tsx'));\n\nexport function ZeroInspector<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>({zero}: {zero: Zero<S, MD, Context>}): JSX.Element {\n const [show, setShow] = useState(false);\n return show ? (\n <Suspense fallback={<div>Loading Inspector...</div>}>\n <Inspector\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n zero={zero as any}\n onClose={() => setShow(false)}\n />\n </Suspense>\n ) : (\n <button\n onClick={() => setShow(!show)}\n style={{\n position: 'fixed',\n bottom: 0,\n right: 0,\n zIndex: 1000,\n padding: '5px',\n color: 'white',\n backgroundColor: '#333',\n borderTopLeftRadius: '8px',\n opacity: 0.95,\n }}\n >\n <MarkIcon\n style={{\n width: '20px',\n height: '20px',\n fill: 'currentColor',\n }}\n />\n </button>\n );\n}\n"],"names":[],"mappings":";;;AAUA,MAAM,YAAY,KAAK,MAAM,OAAO,gBAAiB,CAAC;AAE/C,SAAS,cAId,EAAC,QAAkD;AACnD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,SAAO,OACL,oBAAC,UAAA,EAAS,UAAU,oBAAC,OAAA,EAAI,kCAAoB,GAC3C,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC;AAAA,MACA,SAAS,MAAM,QAAQ,KAAK;AAAA,IAAA;AAAA,EAAA,GAEhC,IAEA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,MAC5B,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,QACP,iBAAiB;AAAA,QACjB,qBAAqB;AAAA,QACrB,SAAS;AAAA,MAAA;AAAA,MAGX,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,MAAM;AAAA,UAAA;AAAA,QACR;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;"}
|
|
@@ -3,7 +3,6 @@ import type { Zero } from '../../zero-client/src/client/zero.ts';
|
|
|
3
3
|
import type { QueryResultDetails } from '../../zero-client/src/types/query-result.ts';
|
|
4
4
|
import type { DefaultContext, DefaultSchema } from '../../zero-types/src/default-types.ts';
|
|
5
5
|
import type { Schema } from '../../zero-types/src/schema.ts';
|
|
6
|
-
import type { AnyMutatorRegistry } from '../../zql/src/mutate/mutator-registry.ts';
|
|
7
6
|
import { type HumanReadable, type PullRow, type ToQuery } from '../../zql/src/query/query.ts';
|
|
8
7
|
import { type TTL } from '../../zql/src/query/ttl.ts';
|
|
9
8
|
export type QueryResult<TReturn> = readonly [
|
|
@@ -88,7 +87,7 @@ export declare function getAllViewsSizeForTesting(store: ViewStore): number;
|
|
|
88
87
|
export declare class ViewStore {
|
|
89
88
|
#private;
|
|
90
89
|
constructor();
|
|
91
|
-
getView<TTable extends keyof TSchema['tables'] & string, TSchema extends Schema, TReturn, MD extends
|
|
90
|
+
getView<TTable extends keyof TSchema['tables'] & string, TSchema extends Schema, TReturn, MD extends CustomMutatorDefs | undefined, TContext>(zero: Zero<TSchema, MD, TContext>, query: ToQuery<TTable, TSchema, TReturn, TContext>, enabled: boolean, ttl: TTL): {
|
|
92
91
|
getSnapshot: () => QueryResult<TReturn>;
|
|
93
92
|
subscribeReactInternals: (internals: () => void) => () => void;
|
|
94
93
|
updateTTL: (ttl: TTL) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-query.d.ts","sourceRoot":"","sources":["../../../../zero-react/src/use-query.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,wCAAwC,CAAC;AAC9E,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,sCAAsC,CAAC;AAC/D,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,6CAA6C,CAAC;AAErD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"use-query.d.ts","sourceRoot":"","sources":["../../../../zero-react/src/use-query.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-query.js","sources":["../../../../zero-react/src/use-query.tsx"],"sourcesContent":["import {resolver} from '@rocicorp/resolver';\nimport React, {useSyncExternalStore} from 'react';\nimport {deepClone} from '../../shared/src/deep-clone.ts';\nimport type {Immutable} from '../../shared/src/immutable.ts';\nimport type {ReadonlyJSONValue} from '../../shared/src/json.ts';\nimport {\n bindingsForZero,\n type BindingsForZero,\n} from '../../zero-client/src/client/bindings.ts';\nimport type {CustomMutatorDefs} from '../../zero-client/src/client/custom.ts';\nimport type {Zero} from '../../zero-client/src/client/zero.ts';\nimport type {\n QueryErrorDetails,\n QueryResultDetails,\n} from '../../zero-client/src/types/query-result.ts';\nimport type {ErroredQuery} from '../../zero-protocol/src/custom-queries.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {Format} from '../../zql/src/ivm/view.ts';\nimport type {AnyMutatorRegistry} from '../../zql/src/mutate/mutator-registry.ts';\nimport {\n type HumanReadable,\n type PullRow,\n type Query,\n type ToQuery,\n} from '../../zql/src/query/query.ts';\nimport {DEFAULT_TTL_MS, type TTL} from '../../zql/src/query/ttl.ts';\nimport type {ResultType, TypedView} from '../../zql/src/query/typed-view.ts';\nimport {useZero} from './zero-provider.tsx';\n\nexport type QueryResult<TReturn> = readonly [\n HumanReadable<TReturn>,\n QueryResultDetails & {},\n];\n\nexport type UseQueryOptions = {\n enabled?: boolean | undefined;\n /**\n * Time to live (TTL) in seconds. Controls how long query results are cached\n * after the query is removed. During this time, Zero continues to sync the query.\n * Default is 'never'.\n */\n ttl?: TTL | undefined;\n};\n\nexport type UseSuspenseQueryOptions = UseQueryOptions & {\n /**\n * Whether to suspend until:\n * - 'partial': the query has partial results (partial array or defined\n * value for singular results) which may be of result type 'unknown',\n * or the query result type is 'complete' (in which case results may be\n * empty). This is useful for suspending until there are partial\n * optimistic local results, or the query has completed loading from the\n * server.\n * - 'complete': the query result type is 'complete'.\n *\n * Default is 'partial'.\n */\n suspendUntil?: 'complete' | 'partial';\n};\n\nconst reactUse = (React as {use?: (p: Promise<unknown>) => void}).use;\nconst suspend: (p: Promise<unknown>) => void = reactUse\n ? reactUse\n : p => {\n throw p;\n };\n\nexport function useQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema = DefaultSchema,\n TReturn = PullRow<TTable, TSchema>,\n TContext = DefaultContext,\n>(\n query: ToQuery<TTable, TSchema, TReturn, TContext>,\n options?: UseQueryOptions | boolean,\n): QueryResult<TReturn> {\n let enabled = true;\n let ttl: TTL = DEFAULT_TTL_MS;\n if (typeof options === 'boolean') {\n enabled = options;\n } else if (options) {\n ({enabled = true, ttl = DEFAULT_TTL_MS} = options);\n }\n\n const zero = useZero<TSchema, undefined, TContext>();\n const view = viewStore.getView(zero, query, enabled, ttl);\n // https://react.dev/reference/react/useSyncExternalStore\n return useSyncExternalStore(\n view.subscribeReactInternals,\n view.getSnapshot,\n view.getSnapshot,\n );\n}\n\nexport function useSuspenseQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema = DefaultSchema,\n TReturn = PullRow<TTable, TSchema>,\n TContext = DefaultContext,\n>(\n query: ToQuery<TTable, TSchema, TReturn, TContext>,\n options?: UseSuspenseQueryOptions | boolean,\n): QueryResult<TReturn> {\n let enabled = true;\n let ttl: TTL = DEFAULT_TTL_MS;\n let suspendUntil: 'complete' | 'partial' = 'partial';\n if (typeof options === 'boolean') {\n enabled = options;\n } else if (options) {\n ({\n enabled = true,\n ttl = DEFAULT_TTL_MS,\n suspendUntil = 'complete',\n } = options);\n }\n\n const zero = useZero<TSchema, undefined, TContext>();\n\n const view = viewStore.getView(zero, query, enabled, ttl);\n // https://react.dev/reference/react/useSyncExternalStore\n const snapshot = useSyncExternalStore(\n view.subscribeReactInternals,\n view.getSnapshot,\n view.getSnapshot,\n );\n\n if (enabled) {\n if (suspendUntil === 'complete' && !view.complete) {\n suspend(view.waitForComplete());\n }\n\n if (suspendUntil === 'partial' && !view.nonEmpty) {\n suspend(view.waitForNonEmpty());\n }\n }\n\n return snapshot;\n}\n\nconst emptyArray: unknown[] = [];\nconst disabledSubscriber = () => () => {};\n\nconst resultTypeUnknown = {type: 'unknown'} as const;\nconst resultTypeComplete = {type: 'complete'} as const;\nconst resultTypeError = {type: 'error'} as const;\n\nconst emptySnapshotSingularUnknown = [undefined, resultTypeUnknown] as const;\nconst emptySnapshotSingularComplete = [undefined, resultTypeComplete] as const;\nconst emptySnapshotSingularErrorUnknown = [undefined, resultTypeError] as const;\nconst emptySnapshotPluralUnknown = [emptyArray, resultTypeUnknown] as const;\nconst emptySnapshotPluralComplete = [emptyArray, resultTypeComplete] as const;\nconst emptySnapshotErrorUnknown = [emptyArray, resultTypeError] as const;\n\nfunction getDefaultSnapshot<TReturn>(singular: boolean): QueryResult<TReturn> {\n return (\n singular ? emptySnapshotSingularUnknown : emptySnapshotPluralUnknown\n ) as QueryResult<TReturn>;\n}\n\n/**\n * Returns a new snapshot or one of the empty predefined ones. Returning the\n * predefined ones is important to prevent unnecessary re-renders in React.\n */\nfunction getSnapshot<TReturn>(\n singular: boolean,\n data: HumanReadable<TReturn>,\n resultType: ResultType,\n retryFn: () => void,\n error?: ErroredQuery,\n): QueryResult<TReturn> {\n if (singular && data === undefined) {\n switch (resultType) {\n case 'error':\n if (error) {\n return [\n undefined,\n makeError(retryFn, error),\n ] as unknown as QueryResult<TReturn>;\n }\n return emptySnapshotSingularErrorUnknown as unknown as QueryResult<TReturn>;\n case 'complete':\n return emptySnapshotSingularComplete as unknown as QueryResult<TReturn>;\n case 'unknown':\n return emptySnapshotSingularUnknown as unknown as QueryResult<TReturn>;\n }\n }\n\n if (!singular && (data as unknown[]).length === 0) {\n switch (resultType) {\n case 'error':\n if (error) {\n return [\n emptyArray,\n makeError(retryFn, error),\n ] as unknown as QueryResult<TReturn>;\n }\n return emptySnapshotErrorUnknown as unknown as QueryResult<TReturn>;\n case 'complete':\n return emptySnapshotPluralComplete as unknown as QueryResult<TReturn>;\n case 'unknown':\n return emptySnapshotPluralUnknown as unknown as QueryResult<TReturn>;\n }\n }\n\n switch (resultType) {\n case 'error':\n if (error) {\n return [data, makeError(retryFn, error)];\n }\n return [\n data,\n makeError(retryFn, {\n error: 'app',\n id: 'unknown',\n name: 'unknown',\n message: 'An unknown error occurred',\n }),\n ];\n case 'complete':\n return [data, resultTypeComplete];\n case 'unknown':\n return [data, resultTypeUnknown];\n }\n}\n\nfunction makeError(retry: () => void, error: ErroredQuery): QueryErrorDetails {\n const message = error.message ?? 'An unknown error occurred';\n return {\n type: 'error',\n retry,\n refetch: retry,\n error: {\n type: error.error,\n message,\n ...(error.details ? {details: error.details} : {}),\n },\n };\n}\n\ndeclare const TESTING: boolean;\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyViewWrapper = ViewWrapper<any, any, any, any, any>;\n\nconst allViews = new WeakMap<ViewStore, Map<string, AnyViewWrapper>>();\n\nexport function getAllViewsSizeForTesting(store: ViewStore): number {\n if (TESTING) {\n return allViews.get(store)?.size ?? 0;\n }\n return 0;\n}\n\n/**\n * A global store of all active views.\n *\n * React subscribes and unsubscribes to these views\n * via `useSyncExternalStore`.\n *\n * Managing views through `useEffect` or `useLayoutEffect` causes\n * inconsistencies because effects run after render.\n *\n * For example, if useQuery used use*Effect in the component below:\n * ```ts\n * function Foo({issueID}) {\n * const issue = useQuery(z.query.issue.where('id', issueID).one());\n * if (issue?.id !== undefined && issue.id !== issueID) {\n * console.log('MISMATCH!', issue.id, issueID);\n * }\n * }\n * ```\n *\n * `MISMATCH` will be printed whenever the `issueID` prop changes.\n *\n * This is because the component will render once with\n * the old state returned from `useQuery`. Then the effect inside\n * `useQuery` will run. The component will render again with the new\n * state. This inconsistent transition can cause unexpected results.\n *\n * Emulating `useEffect` via `useState` and `if` causes resource leaks.\n * That is:\n *\n * ```ts\n * function useQuery(q) {\n * const [oldHash, setOldHash] = useState();\n * if (hash(q) !== oldHash) {\n * // make new view\n * }\n *\n * useEffect(() => {\n * return () => view.destroy();\n * }, []);\n * }\n * ```\n *\n * I'm not sure why but in strict mode the cleanup function\n * fails to be called for the first instance of the view and only\n * cleans up later instances.\n *\n * Swapping `useState` to `useRef` has similar problems.\n */\nexport class ViewStore {\n #views = new Map<string, AnyViewWrapper>();\n\n constructor() {\n if (TESTING) {\n allViews.set(this, this.#views);\n }\n }\n\n getView<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n MD extends AnyMutatorRegistry | CustomMutatorDefs | undefined,\n TContext,\n >(\n zero: Zero<TSchema, MD, TContext>,\n query: ToQuery<TTable, TSchema, TReturn, TContext>,\n enabled: boolean,\n ttl: TTL,\n ): {\n getSnapshot: () => QueryResult<TReturn>;\n subscribeReactInternals: (internals: () => void) => () => void;\n updateTTL: (ttl: TTL) => void;\n waitForComplete: () => Promise<void>;\n waitForNonEmpty: () => Promise<void>;\n complete: boolean;\n nonEmpty: boolean;\n } {\n const q = query.toQuery(zero.context);\n const bindings = bindingsForZero(zero);\n const format = bindings.format(q);\n if (!enabled) {\n return {\n getSnapshot: () => getDefaultSnapshot(format.singular),\n subscribeReactInternals: disabledSubscriber,\n updateTTL: () => {},\n waitForComplete: () => Promise.resolve(),\n waitForNonEmpty: () => Promise.resolve(),\n complete: false,\n nonEmpty: false,\n };\n }\n\n const hash = bindings.hash(q) + zero.clientID;\n let existing = this.#views.get(hash);\n if (!existing) {\n existing = new ViewWrapper(bindings, q, format, ttl, view => {\n const currentView = this.#views.get(hash);\n if (currentView && currentView !== view) {\n // we replaced the view with a new one already.\n return;\n }\n this.#views.delete(hash);\n });\n this.#views.set(hash, existing);\n } else {\n existing.updateTTL(ttl);\n }\n return existing as ViewWrapper<TTable, TSchema, TReturn, MD, TContext>;\n }\n}\n\nconst viewStore = new ViewStore();\n\n/**\n * This wraps and ref counts a view.\n *\n * The only signal we have from React as to whether or not it is\n * done with a view is when it calls `unsubscribe`.\n *\n * In non-strict-mode we can clean up the view as soon\n * as the listener count goes to 0.\n *\n * In strict-mode, the listener count will go to 0 then a\n * new listener for the same view is immediately added back.\n *\n * This is why the `onMaterialized` and `onDematerialized` callbacks exist --\n * they allow a view which React is still referencing to be added\n * back into the store when React re-subscribes to it.\n *\n * This wrapper also exists to deal with the various\n * `useSyncExternalStore` caveats that cause excessive\n * re-renders and materializations.\n *\n * See: https://react.dev/reference/react/useSyncExternalStore#caveats\n * Especially:\n * 1. The store snapshot returned by getSnapshot must be immutable. If the underlying store has mutable data, return a new immutable snapshot if the data has changed. Otherwise, return a cached last snapshot.\n * 2. If a different subscribe function is passed during a re-render, React will re-subscribe to the store using the newly passed subscribe function. You can prevent this by declaring subscribe outside the component.\n */\nclass ViewWrapper<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n MD extends AnyMutatorRegistry | CustomMutatorDefs | undefined,\n TContext,\n> {\n #view: TypedView<HumanReadable<TReturn>> | undefined;\n readonly #onDematerialized;\n readonly #query: Query<TTable, TSchema, TReturn>;\n readonly #format: Format;\n #snapshot: QueryResult<TReturn>;\n #reactInternals: Set<() => void>;\n #ttl: TTL;\n #complete = false;\n #completeResolver = resolver<void>();\n #nonEmpty = false;\n #nonEmptyResolver = resolver<void>();\n readonly #bindings: BindingsForZero<TSchema>;\n\n constructor(\n bindings: BindingsForZero<TSchema>,\n query: Query<TTable, TSchema, TReturn>,\n format: Format,\n ttl: TTL,\n onDematerialized: (\n view: ViewWrapper<TTable, TSchema, TReturn, MD, TContext>,\n ) => void,\n ) {\n this.#bindings = bindings;\n this.#query = query;\n this.#format = format;\n this.#ttl = ttl;\n this.#onDematerialized = onDematerialized;\n this.#snapshot = getDefaultSnapshot(format.singular);\n this.#reactInternals = new Set();\n this.#materializeIfNeeded();\n }\n\n #onData = (\n snap: Immutable<HumanReadable<TReturn>>,\n resultType: ResultType,\n error?: ErroredQuery,\n ) => {\n const data =\n snap === undefined\n ? snap\n : (deepClone(snap as ReadonlyJSONValue) as HumanReadable<TReturn>);\n this.#snapshot = getSnapshot(\n this.#format.singular,\n data,\n resultType,\n this.#retry,\n error,\n );\n if (resultType === 'complete' || resultType === 'error') {\n this.#complete = true;\n this.#completeResolver.resolve();\n this.#nonEmpty = true;\n this.#nonEmptyResolver.resolve();\n }\n\n if (\n this.#format.singular\n ? this.#snapshot[0] !== undefined\n : (this.#snapshot[0] as unknown[]).length !== 0\n ) {\n this.#nonEmpty = true;\n this.#nonEmptyResolver.resolve();\n }\n\n for (const internals of this.#reactInternals) {\n internals();\n }\n };\n\n /**\n * Called by the user to force a retry of the query\n * in the case the query errored.\n */\n #retry = () => {\n this.#view?.destroy();\n this.#view = undefined;\n this.#materializeIfNeeded();\n };\n\n #materializeIfNeeded = () => {\n if (this.#view) {\n return;\n }\n this.#view = this.#bindings.materialize(this.#query, undefined, {\n ttl: this.#ttl,\n });\n this.#view.addListener(this.#onData);\n };\n\n getSnapshot = () => this.#snapshot;\n\n subscribeReactInternals = (internals: () => void): (() => void) => {\n this.#reactInternals.add(internals);\n this.#materializeIfNeeded();\n return () => {\n this.#reactInternals.delete(internals);\n\n // only schedule a cleanup task if we have no listeners left\n if (this.#reactInternals.size === 0) {\n setTimeout(() => {\n // We already destroyed the view\n if (this.#view === undefined) {\n return;\n }\n\n // Someone re-registered a listener on this view before the timeout elapsed.\n // This happens often in strict-mode which forces a component\n // to mount, unmount, remount.\n if (this.#reactInternals.size > 0) {\n return;\n }\n\n this.#view.destroy();\n this.#view = undefined;\n this.#complete = false;\n this.#completeResolver = resolver();\n this.#nonEmpty = false;\n this.#nonEmptyResolver = resolver();\n this.#onDematerialized(this);\n }, 10);\n }\n };\n };\n\n updateTTL(ttl: TTL): void {\n this.#ttl = ttl;\n this.#view?.updateTTL(ttl);\n }\n\n get complete() {\n return this.#complete;\n }\n\n waitForComplete(): Promise<void> {\n return this.#completeResolver.promise;\n }\n\n get nonEmpty() {\n return this.#nonEmpty;\n }\n\n waitForNonEmpty(): Promise<void> {\n return this.#nonEmptyResolver.promise;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-query.js","sources":["../../../../zero-react/src/use-query.tsx"],"sourcesContent":["import {resolver} from '@rocicorp/resolver';\nimport React, {useSyncExternalStore} from 'react';\nimport {deepClone} from '../../shared/src/deep-clone.ts';\nimport type {Immutable} from '../../shared/src/immutable.ts';\nimport type {ReadonlyJSONValue} from '../../shared/src/json.ts';\nimport {\n bindingsForZero,\n type BindingsForZero,\n} from '../../zero-client/src/client/bindings.ts';\nimport type {CustomMutatorDefs} from '../../zero-client/src/client/custom.ts';\nimport type {Zero} from '../../zero-client/src/client/zero.ts';\nimport type {\n QueryErrorDetails,\n QueryResultDetails,\n} from '../../zero-client/src/types/query-result.ts';\nimport type {ErroredQuery} from '../../zero-protocol/src/custom-queries.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\nimport type {Format} from '../../zql/src/ivm/view.ts';\nimport type {AnyMutatorRegistry} from '../../zql/src/mutate/mutator-registry.ts';\nimport {\n type HumanReadable,\n type PullRow,\n type Query,\n type ToQuery,\n} from '../../zql/src/query/query.ts';\nimport {DEFAULT_TTL_MS, type TTL} from '../../zql/src/query/ttl.ts';\nimport type {ResultType, TypedView} from '../../zql/src/query/typed-view.ts';\nimport {useZero} from './zero-provider.tsx';\n\nexport type QueryResult<TReturn> = readonly [\n HumanReadable<TReturn>,\n QueryResultDetails & {},\n];\n\nexport type UseQueryOptions = {\n enabled?: boolean | undefined;\n /**\n * Time to live (TTL) in seconds. Controls how long query results are cached\n * after the query is removed. During this time, Zero continues to sync the query.\n * Default is 'never'.\n */\n ttl?: TTL | undefined;\n};\n\nexport type UseSuspenseQueryOptions = UseQueryOptions & {\n /**\n * Whether to suspend until:\n * - 'partial': the query has partial results (partial array or defined\n * value for singular results) which may be of result type 'unknown',\n * or the query result type is 'complete' (in which case results may be\n * empty). This is useful for suspending until there are partial\n * optimistic local results, or the query has completed loading from the\n * server.\n * - 'complete': the query result type is 'complete'.\n *\n * Default is 'partial'.\n */\n suspendUntil?: 'complete' | 'partial';\n};\n\nconst reactUse = (React as {use?: (p: Promise<unknown>) => void}).use;\nconst suspend: (p: Promise<unknown>) => void = reactUse\n ? reactUse\n : p => {\n throw p;\n };\n\nexport function useQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema = DefaultSchema,\n TReturn = PullRow<TTable, TSchema>,\n TContext = DefaultContext,\n>(\n query: ToQuery<TTable, TSchema, TReturn, TContext>,\n options?: UseQueryOptions | boolean,\n): QueryResult<TReturn> {\n let enabled = true;\n let ttl: TTL = DEFAULT_TTL_MS;\n if (typeof options === 'boolean') {\n enabled = options;\n } else if (options) {\n ({enabled = true, ttl = DEFAULT_TTL_MS} = options);\n }\n\n const zero = useZero<TSchema, undefined, TContext>();\n const view = viewStore.getView(zero, query, enabled, ttl);\n // https://react.dev/reference/react/useSyncExternalStore\n return useSyncExternalStore(\n view.subscribeReactInternals,\n view.getSnapshot,\n view.getSnapshot,\n );\n}\n\nexport function useSuspenseQuery<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema = DefaultSchema,\n TReturn = PullRow<TTable, TSchema>,\n TContext = DefaultContext,\n>(\n query: ToQuery<TTable, TSchema, TReturn, TContext>,\n options?: UseSuspenseQueryOptions | boolean,\n): QueryResult<TReturn> {\n let enabled = true;\n let ttl: TTL = DEFAULT_TTL_MS;\n let suspendUntil: 'complete' | 'partial' = 'partial';\n if (typeof options === 'boolean') {\n enabled = options;\n } else if (options) {\n ({\n enabled = true,\n ttl = DEFAULT_TTL_MS,\n suspendUntil = 'complete',\n } = options);\n }\n\n const zero = useZero<TSchema, undefined, TContext>();\n\n const view = viewStore.getView(zero, query, enabled, ttl);\n // https://react.dev/reference/react/useSyncExternalStore\n const snapshot = useSyncExternalStore(\n view.subscribeReactInternals,\n view.getSnapshot,\n view.getSnapshot,\n );\n\n if (enabled) {\n if (suspendUntil === 'complete' && !view.complete) {\n suspend(view.waitForComplete());\n }\n\n if (suspendUntil === 'partial' && !view.nonEmpty) {\n suspend(view.waitForNonEmpty());\n }\n }\n\n return snapshot;\n}\n\nconst emptyArray: unknown[] = [];\nconst disabledSubscriber = () => () => {};\n\nconst resultTypeUnknown = {type: 'unknown'} as const;\nconst resultTypeComplete = {type: 'complete'} as const;\nconst resultTypeError = {type: 'error'} as const;\n\nconst emptySnapshotSingularUnknown = [undefined, resultTypeUnknown] as const;\nconst emptySnapshotSingularComplete = [undefined, resultTypeComplete] as const;\nconst emptySnapshotSingularErrorUnknown = [undefined, resultTypeError] as const;\nconst emptySnapshotPluralUnknown = [emptyArray, resultTypeUnknown] as const;\nconst emptySnapshotPluralComplete = [emptyArray, resultTypeComplete] as const;\nconst emptySnapshotErrorUnknown = [emptyArray, resultTypeError] as const;\n\nfunction getDefaultSnapshot<TReturn>(singular: boolean): QueryResult<TReturn> {\n return (\n singular ? emptySnapshotSingularUnknown : emptySnapshotPluralUnknown\n ) as QueryResult<TReturn>;\n}\n\n/**\n * Returns a new snapshot or one of the empty predefined ones. Returning the\n * predefined ones is important to prevent unnecessary re-renders in React.\n */\nfunction getSnapshot<TReturn>(\n singular: boolean,\n data: HumanReadable<TReturn>,\n resultType: ResultType,\n retryFn: () => void,\n error?: ErroredQuery,\n): QueryResult<TReturn> {\n if (singular && data === undefined) {\n switch (resultType) {\n case 'error':\n if (error) {\n return [\n undefined,\n makeError(retryFn, error),\n ] as unknown as QueryResult<TReturn>;\n }\n return emptySnapshotSingularErrorUnknown as unknown as QueryResult<TReturn>;\n case 'complete':\n return emptySnapshotSingularComplete as unknown as QueryResult<TReturn>;\n case 'unknown':\n return emptySnapshotSingularUnknown as unknown as QueryResult<TReturn>;\n }\n }\n\n if (!singular && (data as unknown[]).length === 0) {\n switch (resultType) {\n case 'error':\n if (error) {\n return [\n emptyArray,\n makeError(retryFn, error),\n ] as unknown as QueryResult<TReturn>;\n }\n return emptySnapshotErrorUnknown as unknown as QueryResult<TReturn>;\n case 'complete':\n return emptySnapshotPluralComplete as unknown as QueryResult<TReturn>;\n case 'unknown':\n return emptySnapshotPluralUnknown as unknown as QueryResult<TReturn>;\n }\n }\n\n switch (resultType) {\n case 'error':\n if (error) {\n return [data, makeError(retryFn, error)];\n }\n return [\n data,\n makeError(retryFn, {\n error: 'app',\n id: 'unknown',\n name: 'unknown',\n message: 'An unknown error occurred',\n }),\n ];\n case 'complete':\n return [data, resultTypeComplete];\n case 'unknown':\n return [data, resultTypeUnknown];\n }\n}\n\nfunction makeError(retry: () => void, error: ErroredQuery): QueryErrorDetails {\n const message = error.message ?? 'An unknown error occurred';\n return {\n type: 'error',\n retry,\n refetch: retry,\n error: {\n type: error.error,\n message,\n ...(error.details ? {details: error.details} : {}),\n },\n };\n}\n\ndeclare const TESTING: boolean;\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyViewWrapper = ViewWrapper<any, any, any, any, any>;\n\nconst allViews = new WeakMap<ViewStore, Map<string, AnyViewWrapper>>();\n\nexport function getAllViewsSizeForTesting(store: ViewStore): number {\n if (TESTING) {\n return allViews.get(store)?.size ?? 0;\n }\n return 0;\n}\n\n/**\n * A global store of all active views.\n *\n * React subscribes and unsubscribes to these views\n * via `useSyncExternalStore`.\n *\n * Managing views through `useEffect` or `useLayoutEffect` causes\n * inconsistencies because effects run after render.\n *\n * For example, if useQuery used use*Effect in the component below:\n * ```ts\n * function Foo({issueID}) {\n * const issue = useQuery(z.query.issue.where('id', issueID).one());\n * if (issue?.id !== undefined && issue.id !== issueID) {\n * console.log('MISMATCH!', issue.id, issueID);\n * }\n * }\n * ```\n *\n * `MISMATCH` will be printed whenever the `issueID` prop changes.\n *\n * This is because the component will render once with\n * the old state returned from `useQuery`. Then the effect inside\n * `useQuery` will run. The component will render again with the new\n * state. This inconsistent transition can cause unexpected results.\n *\n * Emulating `useEffect` via `useState` and `if` causes resource leaks.\n * That is:\n *\n * ```ts\n * function useQuery(q) {\n * const [oldHash, setOldHash] = useState();\n * if (hash(q) !== oldHash) {\n * // make new view\n * }\n *\n * useEffect(() => {\n * return () => view.destroy();\n * }, []);\n * }\n * ```\n *\n * I'm not sure why but in strict mode the cleanup function\n * fails to be called for the first instance of the view and only\n * cleans up later instances.\n *\n * Swapping `useState` to `useRef` has similar problems.\n */\nexport class ViewStore {\n #views = new Map<string, AnyViewWrapper>();\n\n constructor() {\n if (TESTING) {\n allViews.set(this, this.#views);\n }\n }\n\n getView<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n MD extends CustomMutatorDefs | undefined,\n TContext,\n >(\n zero: Zero<TSchema, MD, TContext>,\n query: ToQuery<TTable, TSchema, TReturn, TContext>,\n enabled: boolean,\n ttl: TTL,\n ): {\n getSnapshot: () => QueryResult<TReturn>;\n subscribeReactInternals: (internals: () => void) => () => void;\n updateTTL: (ttl: TTL) => void;\n waitForComplete: () => Promise<void>;\n waitForNonEmpty: () => Promise<void>;\n complete: boolean;\n nonEmpty: boolean;\n } {\n const q = query.toQuery(zero.context);\n const bindings = bindingsForZero(zero);\n const format = bindings.format(q);\n if (!enabled) {\n return {\n getSnapshot: () => getDefaultSnapshot(format.singular),\n subscribeReactInternals: disabledSubscriber,\n updateTTL: () => {},\n waitForComplete: () => Promise.resolve(),\n waitForNonEmpty: () => Promise.resolve(),\n complete: false,\n nonEmpty: false,\n };\n }\n\n const hash = bindings.hash(q) + zero.clientID;\n let existing = this.#views.get(hash);\n if (!existing) {\n existing = new ViewWrapper(bindings, q, format, ttl, view => {\n const currentView = this.#views.get(hash);\n if (currentView && currentView !== view) {\n // we replaced the view with a new one already.\n return;\n }\n this.#views.delete(hash);\n });\n this.#views.set(hash, existing);\n } else {\n existing.updateTTL(ttl);\n }\n return existing as ViewWrapper<TTable, TSchema, TReturn, MD, TContext>;\n }\n}\n\nconst viewStore = new ViewStore();\n\n/**\n * This wraps and ref counts a view.\n *\n * The only signal we have from React as to whether or not it is\n * done with a view is when it calls `unsubscribe`.\n *\n * In non-strict-mode we can clean up the view as soon\n * as the listener count goes to 0.\n *\n * In strict-mode, the listener count will go to 0 then a\n * new listener for the same view is immediately added back.\n *\n * This is why the `onMaterialized` and `onDematerialized` callbacks exist --\n * they allow a view which React is still referencing to be added\n * back into the store when React re-subscribes to it.\n *\n * This wrapper also exists to deal with the various\n * `useSyncExternalStore` caveats that cause excessive\n * re-renders and materializations.\n *\n * See: https://react.dev/reference/react/useSyncExternalStore#caveats\n * Especially:\n * 1. The store snapshot returned by getSnapshot must be immutable. If the underlying store has mutable data, return a new immutable snapshot if the data has changed. Otherwise, return a cached last snapshot.\n * 2. If a different subscribe function is passed during a re-render, React will re-subscribe to the store using the newly passed subscribe function. You can prevent this by declaring subscribe outside the component.\n */\nclass ViewWrapper<\n TTable extends keyof TSchema['tables'] & string,\n TSchema extends Schema,\n TReturn,\n MD extends AnyMutatorRegistry | CustomMutatorDefs | undefined,\n TContext,\n> {\n #view: TypedView<HumanReadable<TReturn>> | undefined;\n readonly #onDematerialized;\n readonly #query: Query<TTable, TSchema, TReturn>;\n readonly #format: Format;\n #snapshot: QueryResult<TReturn>;\n #reactInternals: Set<() => void>;\n #ttl: TTL;\n #complete = false;\n #completeResolver = resolver<void>();\n #nonEmpty = false;\n #nonEmptyResolver = resolver<void>();\n readonly #bindings: BindingsForZero<TSchema>;\n\n constructor(\n bindings: BindingsForZero<TSchema>,\n query: Query<TTable, TSchema, TReturn>,\n format: Format,\n ttl: TTL,\n onDematerialized: (\n view: ViewWrapper<TTable, TSchema, TReturn, MD, TContext>,\n ) => void,\n ) {\n this.#bindings = bindings;\n this.#query = query;\n this.#format = format;\n this.#ttl = ttl;\n this.#onDematerialized = onDematerialized;\n this.#snapshot = getDefaultSnapshot(format.singular);\n this.#reactInternals = new Set();\n this.#materializeIfNeeded();\n }\n\n #onData = (\n snap: Immutable<HumanReadable<TReturn>>,\n resultType: ResultType,\n error?: ErroredQuery,\n ) => {\n const data =\n snap === undefined\n ? snap\n : (deepClone(snap as ReadonlyJSONValue) as HumanReadable<TReturn>);\n this.#snapshot = getSnapshot(\n this.#format.singular,\n data,\n resultType,\n this.#retry,\n error,\n );\n if (resultType === 'complete' || resultType === 'error') {\n this.#complete = true;\n this.#completeResolver.resolve();\n this.#nonEmpty = true;\n this.#nonEmptyResolver.resolve();\n }\n\n if (\n this.#format.singular\n ? this.#snapshot[0] !== undefined\n : (this.#snapshot[0] as unknown[]).length !== 0\n ) {\n this.#nonEmpty = true;\n this.#nonEmptyResolver.resolve();\n }\n\n for (const internals of this.#reactInternals) {\n internals();\n }\n };\n\n /**\n * Called by the user to force a retry of the query\n * in the case the query errored.\n */\n #retry = () => {\n this.#view?.destroy();\n this.#view = undefined;\n this.#materializeIfNeeded();\n };\n\n #materializeIfNeeded = () => {\n if (this.#view) {\n return;\n }\n this.#view = this.#bindings.materialize(this.#query, undefined, {\n ttl: this.#ttl,\n });\n this.#view.addListener(this.#onData);\n };\n\n getSnapshot = () => this.#snapshot;\n\n subscribeReactInternals = (internals: () => void): (() => void) => {\n this.#reactInternals.add(internals);\n this.#materializeIfNeeded();\n return () => {\n this.#reactInternals.delete(internals);\n\n // only schedule a cleanup task if we have no listeners left\n if (this.#reactInternals.size === 0) {\n setTimeout(() => {\n // We already destroyed the view\n if (this.#view === undefined) {\n return;\n }\n\n // Someone re-registered a listener on this view before the timeout elapsed.\n // This happens often in strict-mode which forces a component\n // to mount, unmount, remount.\n if (this.#reactInternals.size > 0) {\n return;\n }\n\n this.#view.destroy();\n this.#view = undefined;\n this.#complete = false;\n this.#completeResolver = resolver();\n this.#nonEmpty = false;\n this.#nonEmptyResolver = resolver();\n this.#onDematerialized(this);\n }, 10);\n }\n };\n };\n\n updateTTL(ttl: TTL): void {\n this.#ttl = ttl;\n this.#view?.updateTTL(ttl);\n }\n\n get complete() {\n return this.#complete;\n }\n\n waitForComplete(): Promise<void> {\n return this.#completeResolver.promise;\n }\n\n get nonEmpty() {\n return this.#nonEmpty;\n }\n\n waitForNonEmpty(): Promise<void> {\n return this.#nonEmptyResolver.promise;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,8 @@ import type { ZeroOptions } from '../../zero-client/src/client/options.ts';
|
|
|
4
4
|
import { Zero } from '../../zero-client/src/client/zero.ts';
|
|
5
5
|
import type { DefaultContext, DefaultSchema } from '../../zero-types/src/default-types.ts';
|
|
6
6
|
import type { Schema } from '../../zero-types/src/schema.ts';
|
|
7
|
-
import type { AnyMutatorRegistry } from '../../zql/src/mutate/mutator-registry.ts';
|
|
8
7
|
export declare const ZeroContext: import("react").Context<Zero<any, any, any> | undefined>;
|
|
9
|
-
export declare function useZero<S extends Schema = DefaultSchema, MD extends
|
|
8
|
+
export declare function useZero<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>(): Zero<S, MD, Context>;
|
|
10
9
|
/**
|
|
11
10
|
* @deprecated Use {@linkcode useZero} instead, alongside default types defined with:
|
|
12
11
|
*
|
|
@@ -18,12 +17,12 @@ export declare function useZero<S extends Schema = DefaultSchema, MD extends Any
|
|
|
18
17
|
* }
|
|
19
18
|
* }
|
|
20
19
|
*/
|
|
21
|
-
export declare function createUseZero<S extends Schema = DefaultSchema, MD extends
|
|
22
|
-
export type ZeroProviderProps<S extends Schema = DefaultSchema, MD extends
|
|
20
|
+
export declare function createUseZero<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>(): () => Zero<S, MD, Context>;
|
|
21
|
+
export type ZeroProviderProps<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext> = (ZeroOptions<S, MD, Context> | {
|
|
23
22
|
zero: Zero<S, MD, Context>;
|
|
24
23
|
}) & {
|
|
25
24
|
init?: (zero: Zero<S, MD, Context>) => void;
|
|
26
25
|
children: ReactNode;
|
|
27
26
|
};
|
|
28
|
-
export declare function ZeroProvider<S extends Schema = DefaultSchema, MD extends
|
|
27
|
+
export declare function ZeroProvider<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>({ children, init, ...props }: ZeroProviderProps<S, MD, Context>): import("react/jsx-runtime").JSX.Element | undefined;
|
|
29
28
|
//# sourceMappingURL=zero-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zero-provider.d.ts","sourceRoot":"","sources":["../../../../zero-react/src/zero-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,wCAAwC,CAAC;AAC9E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAC,IAAI,EAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"zero-provider.d.ts","sourceRoot":"","sources":["../../../../zero-react/src/zero-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,wCAAwC,CAAC;AAC9E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAC,IAAI,EAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;AAG3D,eAAO,MAAM,WAAW,0DAEvB,CAAC;AAEF,wBAAgB,OAAO,CACrB,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,KACrB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAMxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,gCAGzB;AAED,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,IACtB,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG;IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;CAAC,CAAC,GAAG;IACjE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAIF,wBAAgB,YAAY,CAC1B,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,EACxB,EAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,EAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,uDA0D9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zero-provider.js","sources":["../../../../zero-react/src/zero-provider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport {stringCompare} from '../../shared/src/string-compare.ts';\nimport type {CustomMutatorDefs} from '../../zero-client/src/client/custom.ts';\nimport type {ZeroOptions} from '../../zero-client/src/client/options.ts';\nimport {Zero} from '../../zero-client/src/client/zero.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\
|
|
1
|
+
{"version":3,"file":"zero-provider.js","sources":["../../../../zero-react/src/zero-provider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport {stringCompare} from '../../shared/src/string-compare.ts';\nimport type {CustomMutatorDefs} from '../../zero-client/src/client/custom.ts';\nimport type {ZeroOptions} from '../../zero-client/src/client/options.ts';\nimport {Zero} from '../../zero-client/src/client/zero.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\n\n// oxlint-disable-next-line no-explicit-any\nexport const ZeroContext = createContext<Zero<any, any, any> | undefined>(\n undefined,\n);\n\nexport function useZero<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>(): Zero<S, MD, Context> {\n const zero = useContext(ZeroContext);\n if (zero === undefined) {\n throw new Error('useZero must be used within a ZeroProvider');\n }\n return zero as Zero<S, MD, Context>;\n}\n\n/**\n * @deprecated Use {@linkcode useZero} instead, alongside default types defined with:\n *\n * ```ts\n * declare module '@rocicorp/zero' {\n * interface DefaultTypes {\n * schema: typeof schema;\n * context: Context;\n * }\n * }\n */\nexport function createUseZero<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>() {\n return () => useZero<S, MD, Context>();\n}\n\nexport type ZeroProviderProps<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n> = (ZeroOptions<S, MD, Context> | {zero: Zero<S, MD, Context>}) & {\n init?: (zero: Zero<S, MD, Context>) => void;\n children: ReactNode;\n};\n\nconst NO_AUTH_SET = Symbol();\n\nexport function ZeroProvider<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>({children, init, ...props}: ZeroProviderProps<S, MD, Context>) {\n const isExternalZero = 'zero' in props;\n\n const [zero, setZero] = useState<Zero<S, MD, Context> | undefined>(\n isExternalZero ? props.zero : undefined,\n );\n\n const auth = 'auth' in props ? props.auth : NO_AUTH_SET;\n const prevAuthRef = useRef<typeof auth>(auth);\n\n const keysWithoutAuth = useMemo(\n () =>\n Object.entries(props)\n .filter(([key]) => key !== 'auth')\n .sort(([a], [b]) => stringCompare(a, b))\n .map(([_, value]) => value),\n [props],\n );\n\n // If Zero is not passed in, we construct it, but only client-side.\n // Zero doesn't really work SSR today so this is usually the right thing.\n // When we support Zero SSR this will either become a breaking change or\n // more likely server support will be opt-in with a new prop on this\n // component.\n useEffect(() => {\n if (isExternalZero) {\n setZero(props.zero);\n return;\n }\n\n const z = new Zero(props);\n init?.(z);\n setZero(z);\n\n return () => {\n void z.close();\n setZero(undefined);\n };\n // we intentionally don't include auth in the dependency array\n // to avoid closing zero when auth changes\n }, [init, ...keysWithoutAuth]);\n\n useEffect(() => {\n if (!zero) return;\n\n const authChanged = auth !== prevAuthRef.current;\n\n if (authChanged) {\n prevAuthRef.current = auth;\n void zero.connection.connect({\n auth: auth === NO_AUTH_SET ? undefined : auth,\n });\n }\n }, [auth, zero]);\n\n return (\n zero && <ZeroContext.Provider value={zero}>{children}</ZeroContext.Provider>\n );\n}\n"],"names":[],"mappings":";;;;AAoBO,MAAM,cAAc;AAAA,EACzB;AACF;AAEO,SAAS,UAIU;AACxB,QAAM,OAAO,WAAW,WAAW;AACnC,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;AAaO,SAAS,gBAIZ;AACF,SAAO,MAAM,QAAA;AACf;AAWA,MAAM,cAAc,OAAA;AAEb,SAAS,aAId,EAAC,UAAU,MAAM,GAAG,SAA2C;AAC/D,QAAM,iBAAiB,UAAU;AAEjC,QAAM,CAAC,MAAM,OAAO,IAAI;AAAA,IACtB,iBAAiB,MAAM,OAAO;AAAA,EAAA;AAGhC,QAAM,OAAO,UAAU,QAAQ,MAAM,OAAO;AAC5C,QAAM,cAAc,OAAoB,IAAI;AAE5C,QAAM,kBAAkB;AAAA,IACtB,MACE,OAAO,QAAQ,KAAK,EACjB,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,EAChC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,EACtC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,KAAK;AAAA,IAC9B,CAAC,KAAK;AAAA,EAAA;AAQR,YAAU,MAAM;AACd,QAAI,gBAAgB;AAClB,cAAQ,MAAM,IAAI;AAClB;AAAA,IACF;AAEA,UAAM,IAAI,IAAI,KAAK,KAAK;AACxB,WAAO,CAAC;AACR,YAAQ,CAAC;AAET,WAAO,MAAM;AACX,WAAK,EAAE,MAAA;AACP,cAAQ,MAAS;AAAA,IACnB;AAAA,EAGF,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AAEX,UAAM,cAAc,SAAS,YAAY;AAEzC,QAAI,aAAa;AACf,kBAAY,UAAU;AACtB,WAAK,KAAK,WAAW,QAAQ;AAAA,QAC3B,MAAM,SAAS,cAAc,SAAY;AAAA,MAAA,CAC1C;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,SACE,QAAQ,oBAAC,YAAY,UAAZ,EAAqB,OAAO,MAAO,UAAS;AAEzD;"}
|
|
@@ -4,12 +4,11 @@ import type { ZeroOptions } from '../../zero-client/src/client/options.ts';
|
|
|
4
4
|
import { Zero } from '../../zero-client/src/client/zero.ts';
|
|
5
5
|
import type { DefaultContext, DefaultSchema } from '../../zero-types/src/default-types.ts';
|
|
6
6
|
import type { Schema } from '../../zero-types/src/schema.ts';
|
|
7
|
-
import type { AnyMutatorRegistry } from '../../zql/src/mutate/mutator-registry.ts';
|
|
8
7
|
/**
|
|
9
8
|
* @deprecated Use {@linkcode ZeroProvider} instead of managing your own Zero instance.
|
|
10
9
|
*/
|
|
11
|
-
export declare function createZero<S extends Schema = DefaultSchema, MD extends
|
|
12
|
-
export declare function useZero<S extends Schema = DefaultSchema, MD extends
|
|
10
|
+
export declare function createZero<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>(options: ZeroOptions<S, MD, Context>): Zero<S, MD, Context>;
|
|
11
|
+
export declare function useZero<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>(): () => Zero<S, MD, Context>;
|
|
13
12
|
/**
|
|
14
13
|
* @deprecated Use {@linkcode useZero} instead, alongside default types defined with:
|
|
15
14
|
*
|
|
@@ -21,8 +20,8 @@ export declare function useZero<S extends Schema = DefaultSchema, MD extends Any
|
|
|
21
20
|
* }
|
|
22
21
|
* }
|
|
23
22
|
*/
|
|
24
|
-
export declare function createUseZero<S extends Schema = DefaultSchema, MD extends
|
|
25
|
-
export declare function ZeroProvider<S extends Schema = DefaultSchema, MD extends
|
|
23
|
+
export declare function createUseZero<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>(): () => () => Zero<S, MD, Context>;
|
|
24
|
+
export declare function ZeroProvider<S extends Schema = DefaultSchema, MD extends CustomMutatorDefs | undefined = undefined, Context = DefaultContext>(props: {
|
|
26
25
|
children: JSX.Element;
|
|
27
26
|
init?: (zero: Zero<S, MD, Context>) => void;
|
|
28
27
|
} & ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-zero.d.ts","sourceRoot":"","sources":["../../../../zero-solid/src/use-zero.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,GAAG,EACT,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,wCAAwC,CAAC;AAC9E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAC,IAAI,EAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"use-zero.d.ts","sourceRoot":"","sources":["../../../../zero-solid/src/use-zero.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,GAAG,EACT,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,wCAAwC,CAAC;AAC9E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAC,IAAI,EAAC,MAAM,sCAAsC,CAAC;AAC1D,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,gCAAgC,CAAC;AAO3D;;GAEG;AACH,wBAAgB,UAAU,CACxB,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,EACxB,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAM5D;AAED,wBAAgB,OAAO,CACrB,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,KACrB,MAAM,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAO9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,sCAGzB;AAID,wBAAgB,YAAY,CAC1B,CAAC,SAAS,MAAM,GAAG,aAAa,EAChC,EAAE,SAAS,iBAAiB,GAAG,SAAS,GAAG,SAAS,EACpD,OAAO,GAAG,cAAc,EAExB,KAAK,EAAE;IACL,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC7C,GAAG,CACA;IACE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;CAC5B,GACD,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAC9B,eAsDF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-zero.js","sources":["../../../../zero-solid/src/use-zero.ts"],"sourcesContent":["import {\n batch,\n createContext,\n createEffect,\n createMemo,\n onCleanup,\n splitProps,\n untrack,\n useContext,\n type Accessor,\n type JSX,\n} from 'solid-js';\nimport type {CustomMutatorDefs} from '../../zero-client/src/client/custom.ts';\nimport type {ZeroOptions} from '../../zero-client/src/client/options.ts';\nimport {Zero} from '../../zero-client/src/client/zero.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\
|
|
1
|
+
{"version":3,"file":"use-zero.js","sources":["../../../../zero-solid/src/use-zero.ts"],"sourcesContent":["import {\n batch,\n createContext,\n createEffect,\n createMemo,\n onCleanup,\n splitProps,\n untrack,\n useContext,\n type Accessor,\n type JSX,\n} from 'solid-js';\nimport type {CustomMutatorDefs} from '../../zero-client/src/client/custom.ts';\nimport type {ZeroOptions} from '../../zero-client/src/client/options.ts';\nimport {Zero} from '../../zero-client/src/client/zero.ts';\nimport type {\n DefaultContext,\n DefaultSchema,\n} from '../../zero-types/src/default-types.ts';\nimport type {Schema} from '../../zero-types/src/schema.ts';\n\nconst ZeroContext = createContext<\n // oxlint-disable-next-line no-explicit-any\n Accessor<Zero<any, any, any>> | undefined\n>(undefined);\n\n/**\n * @deprecated Use {@linkcode ZeroProvider} instead of managing your own Zero instance.\n */\nexport function createZero<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>(options: ZeroOptions<S, MD, Context>): Zero<S, MD, Context> {\n const opts = {\n ...options,\n batchViewUpdates: batch,\n };\n return new Zero(opts);\n}\n\nexport function useZero<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>(): () => Zero<S, MD, Context> {\n const zero = useContext(ZeroContext);\n\n if (zero === undefined) {\n throw new Error('useZero must be used within a ZeroProvider');\n }\n return zero;\n}\n\n/**\n * @deprecated Use {@linkcode useZero} instead, alongside default types defined with:\n *\n * ```ts\n * declare module '@rocicorp/zero' {\n * interface DefaultTypes {\n * schema: typeof schema;\n * context: Context;\n * }\n * }\n */\nexport function createUseZero<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>() {\n return () => useZero<S, MD, Context>();\n}\n\nconst NO_AUTH_SET = Symbol();\n\nexport function ZeroProvider<\n S extends Schema = DefaultSchema,\n MD extends CustomMutatorDefs | undefined = undefined,\n Context = DefaultContext,\n>(\n props: {\n children: JSX.Element;\n init?: (zero: Zero<S, MD, Context>) => void;\n } & (\n | {\n zero: Zero<S, MD, Context>;\n }\n | ZeroOptions<S, MD, Context>\n ),\n) {\n const zero = createMemo(() => {\n if ('zero' in props) {\n return props.zero;\n }\n\n const [, options] = splitProps(props, ['children', 'auth']);\n\n const authValue = untrack(() => props.auth);\n const createdZero = new Zero({\n ...options,\n ...(authValue !== undefined ? {auth: authValue} : {}),\n batchViewUpdates: batch,\n });\n options.init?.(createdZero);\n onCleanup(() => createdZero.close());\n return createdZero;\n });\n\n const auth = createMemo<\n typeof NO_AUTH_SET | ZeroOptions<S, MD, Context>['auth']\n >(() => ('auth' in props ? props.auth : NO_AUTH_SET));\n\n let prevAuth: typeof NO_AUTH_SET | ZeroOptions<S, MD, Context>['auth'] =\n NO_AUTH_SET;\n\n createEffect(() => {\n const currentZero = zero();\n if (!currentZero) {\n return;\n }\n\n const currentAuth = auth();\n\n if (prevAuth === NO_AUTH_SET) {\n prevAuth = currentAuth;\n return;\n }\n\n if (currentAuth !== prevAuth) {\n prevAuth = currentAuth;\n void currentZero.connection.connect({\n auth: currentAuth === NO_AUTH_SET ? undefined : currentAuth,\n });\n }\n });\n\n return ZeroContext.Provider({\n value: zero,\n get children() {\n return props.children;\n },\n });\n}\n"],"names":[],"mappings":";;AAqBA,MAAM,cAAc,cAGlB,MAAS;AAKJ,SAAS,WAId,SAA4D;AAC5D,QAAM,OAAO;AAAA,IACX,GAAG;AAAA,IACH,kBAAkB;AAAA,EAAA;AAEpB,SAAO,IAAI,KAAK,IAAI;AACtB;AAEO,SAAS,UAIgB;AAC9B,QAAM,OAAO,WAAW,WAAW;AAEnC,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;AAaO,SAAS,gBAIZ;AACF,SAAO,MAAM,QAAA;AACf;AAEA,MAAM,cAAc,OAAA;AAEb,SAAS,aAKd,OASA;AACA,QAAM,OAAO,WAAW,MAAM;AAC5B,QAAI,UAAU,OAAO;AACnB,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,CAAA,EAAG,OAAO,IAAI,WAAW,OAAO,CAAC,YAAY,MAAM,CAAC;AAE1D,UAAM,YAAY,QAAQ,MAAM,MAAM,IAAI;AAC1C,UAAM,cAAc,IAAI,KAAK;AAAA,MAC3B,GAAG;AAAA,MACH,GAAI,cAAc,SAAY,EAAC,MAAM,UAAA,IAAa,CAAA;AAAA,MAClD,kBAAkB;AAAA,IAAA,CACnB;AACD,YAAQ,OAAO,WAAW;AAC1B,cAAU,MAAM,YAAY,OAAO;AACnC,WAAO;AAAA,EACT,CAAC;AAED,QAAM,OAAO,WAEX,MAAO,UAAU,QAAQ,MAAM,OAAO,WAAY;AAEpD,MAAI,WACF;AAEF,eAAa,MAAM;AACjB,UAAM,cAAc,KAAA;AACpB,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAEA,UAAM,cAAc,KAAA;AAEpB,QAAI,aAAa,aAAa;AAC5B,iBAAW;AACX;AAAA,IACF;AAEA,QAAI,gBAAgB,UAAU;AAC5B,iBAAW;AACX,WAAK,YAAY,WAAW,QAAQ;AAAA,QAClC,MAAM,gBAAgB,cAAc,SAAY;AAAA,MAAA,CACjD;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,YAAY,SAAS;AAAA,IAC1B,OAAO;AAAA,IACP,IAAI,WAAW;AACb,aAAO,MAAM;AAAA,IACf;AAAA,EAAA,CACD;AACH;"}
|
|
@@ -8,7 +8,7 @@ import type { Schema } from './schema.ts';
|
|
|
8
8
|
* declare module '@rocicorp/zero' {
|
|
9
9
|
* interface DefaultTypes {
|
|
10
10
|
* schema: typeof schema;
|
|
11
|
-
* context: AuthData;
|
|
11
|
+
* context: AuthData | undefined;
|
|
12
12
|
* dbProvider: typeof dbProvider;
|
|
13
13
|
* }
|
|
14
14
|
* }
|
|
@@ -21,7 +21,7 @@ export type DefaultSchema<TDefaultTypes = DefaultTypes> = TDefaultTypes extends
|
|
|
21
21
|
} ? S : Schema;
|
|
22
22
|
export type DefaultContext<TDefaultTypes = DefaultTypes> = TDefaultTypes extends {
|
|
23
23
|
readonly context: infer C;
|
|
24
|
-
} ? Expand<Readonly<C>>
|
|
24
|
+
} ? Expand<Readonly<C>> : unknown;
|
|
25
25
|
export type InferTransactionFromDbProvider<TDbProvider> = TDbProvider extends {
|
|
26
26
|
transaction: <R>(callback: (tx: infer TTransaction, ...args: any[]) => any, ...args: any[]) => Promise<R>;
|
|
27
27
|
} ? TTransaction : unknown;
|
|
@@ -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,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,
|
|
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,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,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":"join.d.ts","sourceRoot":"","sources":["../../../../../zql/src/ivm/join.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,WAAW,EAAE,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAC,GAAG,EAAE,KAAK,EAAC,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,2CAA2C,CAAC;AAE1E,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAOpC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAO,KAAK,MAAM,EAAC,MAAM,aAAa,CAAC;AAE9C,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IAEjB,SAAS,EAAE,WAAW,CAAC;IACvB,QAAQ,EAAE,WAAW,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;GASG;AACH,qBAAa,IAAK,YAAW,KAAK;;gBAapB,EACV,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACN,MAAM,GACP,EAAE,IAAI;IAmCP,OAAO,IAAI,IAAI;IAKf,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,SAAS,IAAI,YAAY;IAIxB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;IAchD,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../../../../zql/src/ivm/join.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,WAAW,EAAE,MAAM,EAAC,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAC,GAAG,EAAE,KAAK,EAAC,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,2CAA2C,CAAC;AAE1E,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAOpC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAO,KAAK,MAAM,EAAC,MAAM,aAAa,CAAC;AAE9C,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IAEjB,SAAS,EAAE,WAAW,CAAC;IACvB,QAAQ,EAAE,WAAW,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;GASG;AACH,qBAAa,IAAK,YAAW,KAAK;;gBAapB,EACV,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACN,MAAM,GACP,EAAE,IAAI;IAmCP,OAAO,IAAI,IAAI;IAKf,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,SAAS,IAAI,YAAY;IAIxB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;IAchD,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;CAyO1C;AAID,4BAA4B;AAC5B,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,MAAM,CAGxE;AAED,4BAA4B;AAC5B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,GAAG,GACP,MAAM,CAMR"}
|
package/out/zql/src/ivm/join.js
CHANGED
|
@@ -165,19 +165,14 @@ class Join {
|
|
|
165
165
|
position: void 0
|
|
166
166
|
};
|
|
167
167
|
try {
|
|
168
|
-
|
|
169
|
-
const constraint = Object.fromEntries(
|
|
170
|
-
this.#parentKey.map((key, i) => {
|
|
171
|
-
const value = childRow[this.#childKey[i]];
|
|
172
|
-
if (value === null) {
|
|
173
|
-
anyNull = true;
|
|
174
|
-
}
|
|
175
|
-
return [key, value];
|
|
176
|
-
})
|
|
177
|
-
);
|
|
178
|
-
const parentNodes = anyNull ? [] : skipYields(
|
|
168
|
+
const parentNodes = skipYields(
|
|
179
169
|
this.#parent.fetch({
|
|
180
|
-
constraint
|
|
170
|
+
constraint: Object.fromEntries(
|
|
171
|
+
this.#parentKey.map((key, i) => [
|
|
172
|
+
key,
|
|
173
|
+
childRow[this.#childKey[i]]
|
|
174
|
+
])
|
|
175
|
+
)
|
|
181
176
|
})
|
|
182
177
|
);
|
|
183
178
|
for (const parentNode of parentNodes) {
|
|
@@ -257,18 +252,13 @@ class Join {
|
|
|
257
252
|
);
|
|
258
253
|
}
|
|
259
254
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
return [key, value];
|
|
268
|
-
})
|
|
269
|
-
);
|
|
270
|
-
const stream = anyNull ? [] : this.#child[method]({
|
|
271
|
-
constraint
|
|
255
|
+
const stream = this.#child[method]({
|
|
256
|
+
constraint: Object.fromEntries(
|
|
257
|
+
this.#childKey.map((key, i) => [
|
|
258
|
+
key,
|
|
259
|
+
parentNodeRow[this.#parentKey[i]]
|
|
260
|
+
])
|
|
261
|
+
)
|
|
272
262
|
});
|
|
273
263
|
if (this.#inprogressChildChange && isJoinMatch(
|
|
274
264
|
parentNodeRow,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join.js","sources":["../../../../../zql/src/ivm/join.ts"],"sourcesContent":["import {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport type {CompoundKey, System} from '../../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../../zero-protocol/src/data.ts';\nimport type {PrimaryKey} from '../../../zero-protocol/src/primary-key.ts';\nimport type {Change, ChildChange} from './change.ts';\nimport type {Node} from './data.ts';\nimport {\n generateWithOverlay,\n isJoinMatch,\n rowEqualsForCompoundKey,\n type JoinChangeOverlay,\n} from './join-utils.ts';\nimport {\n throwOutput,\n skipYields,\n type FetchRequest,\n type Input,\n type Output,\n type Storage,\n} from './operator.ts';\nimport type {SourceSchema} from './schema.ts';\nimport {take, type Stream} from './stream.ts';\n\ntype Args = {\n parent: Input;\n child: Input;\n storage: Storage;\n // The nth key in parentKey corresponds to the nth key in childKey.\n parentKey: CompoundKey;\n childKey: CompoundKey;\n relationshipName: string;\n hidden: boolean;\n system: System;\n};\n\n/**\n * The Join operator joins the output from two upstream inputs. Zero's join\n * is a little different from SQL's join in that we output hierarchical data,\n * not a flat table. This makes it a lot more useful for UI programming and\n * avoids duplicating tons of data like left join would.\n *\n * The Nodes output from Join have a new relationship added to them, which has\n * the name #relationshipName. The value of the relationship is a stream of\n * child nodes which are the corresponding values from the child source.\n */\nexport class Join implements Input {\n readonly #parent: Input;\n readonly #child: Input;\n readonly #storage: Storage;\n readonly #parentKey: CompoundKey;\n readonly #childKey: CompoundKey;\n readonly #relationshipName: string;\n readonly #schema: SourceSchema;\n\n #output: Output = throwOutput;\n\n #inprogressChildChange: JoinChangeOverlay | undefined;\n\n constructor({\n parent,\n child,\n storage,\n parentKey,\n childKey,\n relationshipName,\n hidden,\n system,\n }: Args) {\n assert(parent !== child, 'Parent and child must be different operators');\n assert(\n parentKey.length === childKey.length,\n 'The parentKey and childKey keys must have same length',\n );\n this.#parent = parent;\n this.#child = child;\n this.#storage = storage;\n this.#parentKey = parentKey;\n this.#childKey = childKey;\n this.#relationshipName = relationshipName;\n\n const parentSchema = parent.getSchema();\n const childSchema = child.getSchema();\n this.#schema = {\n ...parentSchema,\n relationships: {\n ...parentSchema.relationships,\n [relationshipName]: {\n ...childSchema,\n isHidden: hidden,\n system,\n },\n },\n };\n\n parent.setOutput({\n push: (change: Change) => this.#pushParent(change),\n });\n child.setOutput({\n push: (change: Change) => this.#pushChild(change),\n });\n }\n\n destroy(): void {\n this.#parent.destroy();\n this.#child.destroy();\n }\n\n setOutput(output: Output): void {\n this.#output = output;\n }\n\n getSchema(): SourceSchema {\n return this.#schema;\n }\n\n *fetch(req: FetchRequest): Stream<Node | 'yield'> {\n for (const parentNode of this.#parent.fetch(req)) {\n if (parentNode === 'yield') {\n yield parentNode;\n continue;\n }\n yield this.#processParentNode(\n parentNode.row,\n parentNode.relationships,\n 'fetch',\n );\n }\n }\n\n *cleanup(req: FetchRequest): Stream<Node> {\n for (const parentNode of this.#parent.cleanup(req)) {\n yield this.#processParentNode(\n parentNode.row,\n parentNode.relationships,\n 'cleanup',\n );\n }\n }\n\n #pushParent(change: Change): void {\n switch (change.type) {\n case 'add':\n this.#output.push(\n {\n type: 'add',\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'fetch',\n ),\n },\n this,\n );\n break;\n case 'remove':\n this.#output.push(\n {\n type: 'remove',\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'cleanup',\n ),\n },\n this,\n );\n break;\n case 'child':\n this.#output.push(\n {\n type: 'child',\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'fetch',\n ),\n child: change.child,\n },\n this,\n );\n break;\n case 'edit': {\n // Assert the edit could not change the relationship.\n assert(\n rowEqualsForCompoundKey(\n change.oldNode.row,\n change.node.row,\n this.#parentKey,\n ),\n `Parent edit must not change relationship.`,\n );\n this.#output.push(\n {\n type: 'edit',\n oldNode: this.#processParentNode(\n change.oldNode.row,\n change.oldNode.relationships,\n 'cleanup',\n ),\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'fetch',\n ),\n },\n this,\n );\n break;\n }\n default:\n unreachable(change);\n }\n }\n\n #pushChild(change: Change): void {\n const pushChildChange = (childRow: Row, change: Change) => {\n this.#inprogressChildChange = {\n change,\n position: undefined,\n };\n try {\n let anyNull = false;\n const constraint = Object.fromEntries(\n this.#parentKey.map((key, i) => {\n const value = childRow[this.#childKey[i]];\n if (value === null) {\n anyNull = true;\n }\n return [key, value];\n }),\n );\n const parentNodes = anyNull\n ? []\n : skipYields(\n this.#parent.fetch({\n constraint,\n }),\n );\n\n for (const parentNode of parentNodes) {\n this.#inprogressChildChange.position = parentNode.row;\n const childChange: ChildChange = {\n type: 'child',\n node: this.#processParentNode(\n parentNode.row,\n parentNode.relationships,\n 'fetch',\n ),\n child: {\n relationshipName: this.#relationshipName,\n change,\n },\n };\n this.#output.push(childChange, this);\n }\n } finally {\n this.#inprogressChildChange = undefined;\n }\n };\n\n switch (change.type) {\n case 'add':\n case 'remove':\n pushChildChange(change.node.row, change);\n break;\n case 'child':\n pushChildChange(change.node.row, change);\n break;\n case 'edit': {\n const childRow = change.node.row;\n const oldChildRow = change.oldNode.row;\n // Assert the edit could not change the relationship.\n assert(\n rowEqualsForCompoundKey(oldChildRow, childRow, this.#childKey),\n 'Child edit must not change relationship.',\n );\n pushChildChange(childRow, change);\n break;\n }\n\n default:\n unreachable(change);\n }\n }\n\n #processParentNode(\n parentNodeRow: Row,\n parentNodeRelations: Record<string, () => Stream<Node | 'yield'>>,\n mode: ProcessParentMode,\n ): Node {\n let method: ProcessParentMode = mode;\n let storageUpdated = false;\n const childStream = () => {\n if (!storageUpdated) {\n if (mode === 'cleanup') {\n this.#storage.del(\n makeStorageKey(\n this.#parentKey,\n this.#parent.getSchema().primaryKey,\n parentNodeRow,\n ),\n );\n const empty =\n [\n ...take(\n this.#storage.scan({\n prefix: makeStorageKeyPrefix(parentNodeRow, this.#parentKey),\n }),\n 1,\n ),\n ].length === 0;\n method = empty ? 'cleanup' : 'fetch';\n }\n\n storageUpdated = true;\n // Defer the work to update storage until the child stream\n // is actually accessed\n if (mode === 'fetch') {\n this.#storage.set(\n makeStorageKey(\n this.#parentKey,\n this.#parent.getSchema().primaryKey,\n parentNodeRow,\n ),\n true,\n );\n }\n }\n\n let anyNull = false;\n const constraint = Object.fromEntries(\n this.#childKey.map((key, i) => {\n const value = parentNodeRow[this.#parentKey[i]];\n if (value === null) {\n anyNull = true;\n }\n return [key, value];\n }),\n );\n const stream = anyNull\n ? []\n : this.#child[method]({\n constraint,\n });\n\n if (\n this.#inprogressChildChange &&\n isJoinMatch(\n parentNodeRow,\n this.#parentKey,\n this.#inprogressChildChange.change.node.row,\n this.#childKey,\n ) &&\n this.#inprogressChildChange.position &&\n this.#schema.compareRows(\n parentNodeRow,\n this.#inprogressChildChange.position,\n ) > 0\n ) {\n return generateWithOverlay(\n stream,\n this.#inprogressChildChange.change,\n this.#child.getSchema(),\n );\n }\n return stream;\n };\n\n return {\n row: parentNodeRow,\n relationships: {\n ...parentNodeRelations,\n [this.#relationshipName]: childStream,\n },\n };\n }\n}\n\ntype ProcessParentMode = 'fetch' | 'cleanup';\n\n/** Exported for testing. */\nexport function makeStorageKeyForValues(values: readonly Value[]): string {\n const json = JSON.stringify(['pKeySet', ...values]);\n return json.substring(1, json.length - 1) + ',';\n}\n\n/** Exported for testing. */\nexport function makeStorageKeyPrefix(row: Row, key: CompoundKey): string {\n return makeStorageKeyForValues(key.map(k => row[k]));\n}\n\n/** Exported for testing.\n * This storage key tracks the primary keys seen for each unique\n * value joined on. This is used to know when to cleanup a child's state.\n */\nexport function makeStorageKey(\n key: CompoundKey,\n primaryKey: PrimaryKey,\n row: Row,\n): string {\n const values: Value[] = key.map(k => row[k]);\n for (const key of primaryKey) {\n values.push(row[key]);\n }\n return makeStorageKeyForValues(values);\n}\n"],"names":["change","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"join.js","sources":["../../../../../zql/src/ivm/join.ts"],"sourcesContent":["import {assert, unreachable} from '../../../shared/src/asserts.ts';\nimport type {CompoundKey, System} from '../../../zero-protocol/src/ast.ts';\nimport type {Row, Value} from '../../../zero-protocol/src/data.ts';\nimport type {PrimaryKey} from '../../../zero-protocol/src/primary-key.ts';\nimport type {Change, ChildChange} from './change.ts';\nimport type {Node} from './data.ts';\nimport {\n generateWithOverlay,\n isJoinMatch,\n rowEqualsForCompoundKey,\n type JoinChangeOverlay,\n} from './join-utils.ts';\nimport {\n throwOutput,\n skipYields,\n type FetchRequest,\n type Input,\n type Output,\n type Storage,\n} from './operator.ts';\nimport type {SourceSchema} from './schema.ts';\nimport {take, type Stream} from './stream.ts';\n\ntype Args = {\n parent: Input;\n child: Input;\n storage: Storage;\n // The nth key in parentKey corresponds to the nth key in childKey.\n parentKey: CompoundKey;\n childKey: CompoundKey;\n relationshipName: string;\n hidden: boolean;\n system: System;\n};\n\n/**\n * The Join operator joins the output from two upstream inputs. Zero's join\n * is a little different from SQL's join in that we output hierarchical data,\n * not a flat table. This makes it a lot more useful for UI programming and\n * avoids duplicating tons of data like left join would.\n *\n * The Nodes output from Join have a new relationship added to them, which has\n * the name #relationshipName. The value of the relationship is a stream of\n * child nodes which are the corresponding values from the child source.\n */\nexport class Join implements Input {\n readonly #parent: Input;\n readonly #child: Input;\n readonly #storage: Storage;\n readonly #parentKey: CompoundKey;\n readonly #childKey: CompoundKey;\n readonly #relationshipName: string;\n readonly #schema: SourceSchema;\n\n #output: Output = throwOutput;\n\n #inprogressChildChange: JoinChangeOverlay | undefined;\n\n constructor({\n parent,\n child,\n storage,\n parentKey,\n childKey,\n relationshipName,\n hidden,\n system,\n }: Args) {\n assert(parent !== child, 'Parent and child must be different operators');\n assert(\n parentKey.length === childKey.length,\n 'The parentKey and childKey keys must have same length',\n );\n this.#parent = parent;\n this.#child = child;\n this.#storage = storage;\n this.#parentKey = parentKey;\n this.#childKey = childKey;\n this.#relationshipName = relationshipName;\n\n const parentSchema = parent.getSchema();\n const childSchema = child.getSchema();\n this.#schema = {\n ...parentSchema,\n relationships: {\n ...parentSchema.relationships,\n [relationshipName]: {\n ...childSchema,\n isHidden: hidden,\n system,\n },\n },\n };\n\n parent.setOutput({\n push: (change: Change) => this.#pushParent(change),\n });\n child.setOutput({\n push: (change: Change) => this.#pushChild(change),\n });\n }\n\n destroy(): void {\n this.#parent.destroy();\n this.#child.destroy();\n }\n\n setOutput(output: Output): void {\n this.#output = output;\n }\n\n getSchema(): SourceSchema {\n return this.#schema;\n }\n\n *fetch(req: FetchRequest): Stream<Node | 'yield'> {\n for (const parentNode of this.#parent.fetch(req)) {\n if (parentNode === 'yield') {\n yield parentNode;\n continue;\n }\n yield this.#processParentNode(\n parentNode.row,\n parentNode.relationships,\n 'fetch',\n );\n }\n }\n\n *cleanup(req: FetchRequest): Stream<Node> {\n for (const parentNode of this.#parent.cleanup(req)) {\n yield this.#processParentNode(\n parentNode.row,\n parentNode.relationships,\n 'cleanup',\n );\n }\n }\n\n #pushParent(change: Change): void {\n switch (change.type) {\n case 'add':\n this.#output.push(\n {\n type: 'add',\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'fetch',\n ),\n },\n this,\n );\n break;\n case 'remove':\n this.#output.push(\n {\n type: 'remove',\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'cleanup',\n ),\n },\n this,\n );\n break;\n case 'child':\n this.#output.push(\n {\n type: 'child',\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'fetch',\n ),\n child: change.child,\n },\n this,\n );\n break;\n case 'edit': {\n // Assert the edit could not change the relationship.\n assert(\n rowEqualsForCompoundKey(\n change.oldNode.row,\n change.node.row,\n this.#parentKey,\n ),\n `Parent edit must not change relationship.`,\n );\n this.#output.push(\n {\n type: 'edit',\n oldNode: this.#processParentNode(\n change.oldNode.row,\n change.oldNode.relationships,\n 'cleanup',\n ),\n node: this.#processParentNode(\n change.node.row,\n change.node.relationships,\n 'fetch',\n ),\n },\n this,\n );\n break;\n }\n default:\n unreachable(change);\n }\n }\n\n #pushChild(change: Change): void {\n const pushChildChange = (childRow: Row, change: Change) => {\n this.#inprogressChildChange = {\n change,\n position: undefined,\n };\n try {\n const parentNodes = skipYields(\n this.#parent.fetch({\n constraint: Object.fromEntries(\n this.#parentKey.map((key, i) => [\n key,\n childRow[this.#childKey[i]],\n ]),\n ),\n }),\n );\n\n for (const parentNode of parentNodes) {\n this.#inprogressChildChange.position = parentNode.row;\n const childChange: ChildChange = {\n type: 'child',\n node: this.#processParentNode(\n parentNode.row,\n parentNode.relationships,\n 'fetch',\n ),\n child: {\n relationshipName: this.#relationshipName,\n change,\n },\n };\n this.#output.push(childChange, this);\n }\n } finally {\n this.#inprogressChildChange = undefined;\n }\n };\n\n switch (change.type) {\n case 'add':\n case 'remove':\n pushChildChange(change.node.row, change);\n break;\n case 'child':\n pushChildChange(change.node.row, change);\n break;\n case 'edit': {\n const childRow = change.node.row;\n const oldChildRow = change.oldNode.row;\n // Assert the edit could not change the relationship.\n assert(\n rowEqualsForCompoundKey(oldChildRow, childRow, this.#childKey),\n 'Child edit must not change relationship.',\n );\n pushChildChange(childRow, change);\n break;\n }\n\n default:\n unreachable(change);\n }\n }\n\n #processParentNode(\n parentNodeRow: Row,\n parentNodeRelations: Record<string, () => Stream<Node | 'yield'>>,\n mode: ProcessParentMode,\n ): Node {\n let method: ProcessParentMode = mode;\n let storageUpdated = false;\n const childStream = () => {\n if (!storageUpdated) {\n if (mode === 'cleanup') {\n this.#storage.del(\n makeStorageKey(\n this.#parentKey,\n this.#parent.getSchema().primaryKey,\n parentNodeRow,\n ),\n );\n const empty =\n [\n ...take(\n this.#storage.scan({\n prefix: makeStorageKeyPrefix(parentNodeRow, this.#parentKey),\n }),\n 1,\n ),\n ].length === 0;\n method = empty ? 'cleanup' : 'fetch';\n }\n\n storageUpdated = true;\n // Defer the work to update storage until the child stream\n // is actually accessed\n if (mode === 'fetch') {\n this.#storage.set(\n makeStorageKey(\n this.#parentKey,\n this.#parent.getSchema().primaryKey,\n parentNodeRow,\n ),\n true,\n );\n }\n }\n\n const stream = this.#child[method]({\n constraint: Object.fromEntries(\n this.#childKey.map((key, i) => [\n key,\n parentNodeRow[this.#parentKey[i]],\n ]),\n ),\n });\n\n if (\n this.#inprogressChildChange &&\n isJoinMatch(\n parentNodeRow,\n this.#parentKey,\n this.#inprogressChildChange.change.node.row,\n this.#childKey,\n ) &&\n this.#inprogressChildChange.position &&\n this.#schema.compareRows(\n parentNodeRow,\n this.#inprogressChildChange.position,\n ) > 0\n ) {\n return generateWithOverlay(\n stream,\n this.#inprogressChildChange.change,\n this.#child.getSchema(),\n );\n }\n return stream;\n };\n\n return {\n row: parentNodeRow,\n relationships: {\n ...parentNodeRelations,\n [this.#relationshipName]: childStream,\n },\n };\n }\n}\n\ntype ProcessParentMode = 'fetch' | 'cleanup';\n\n/** Exported for testing. */\nexport function makeStorageKeyForValues(values: readonly Value[]): string {\n const json = JSON.stringify(['pKeySet', ...values]);\n return json.substring(1, json.length - 1) + ',';\n}\n\n/** Exported for testing. */\nexport function makeStorageKeyPrefix(row: Row, key: CompoundKey): string {\n return makeStorageKeyForValues(key.map(k => row[k]));\n}\n\n/** Exported for testing.\n * This storage key tracks the primary keys seen for each unique\n * value joined on. This is used to know when to cleanup a child's state.\n */\nexport function makeStorageKey(\n key: CompoundKey,\n primaryKey: PrimaryKey,\n row: Row,\n): string {\n const values: Value[] = key.map(k => row[k]);\n for (const key of primaryKey) {\n values.push(row[key]);\n }\n return makeStorageKeyForValues(values);\n}\n"],"names":["change","key"],"mappings":"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"}
|
|
@@ -8,8 +8,6 @@ import type { Format } from '../ivm/view.ts';
|
|
|
8
8
|
import type { HumanReadable, Query, RunOptions } from '../query/query.ts';
|
|
9
9
|
import type { SchemaQuery } from '../query/schema-query.ts';
|
|
10
10
|
type ClientID = string;
|
|
11
|
-
export type Location = 'client' | 'server';
|
|
12
|
-
export type TransactionReason = 'optimistic' | 'rebase' | 'authoritative';
|
|
13
11
|
/**
|
|
14
12
|
* A base transaction interface that any Transaction<S, T> is assignable to.
|
|
15
13
|
* Used in places where the schema type doesn't need to be preserved,
|
|
@@ -21,6 +19,8 @@ export interface AnyTransaction {
|
|
|
21
19
|
readonly mutationID: number;
|
|
22
20
|
readonly reason: TransactionReason;
|
|
23
21
|
}
|
|
22
|
+
export type Location = 'client' | 'server';
|
|
23
|
+
export type TransactionReason = 'optimistic' | 'rebase' | 'authoritative';
|
|
24
24
|
export interface TransactionBase<S extends Schema> {
|
|
25
25
|
readonly location: Location;
|
|
26
26
|
readonly clientID: ClientID;
|