@lsync/client 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +10 -64
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +48 -182
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { BaseCollectionConfig, ChangeMessageOrDeleteKeyMessage, Collection, OperationConfig, TransactionWithMutations, WritableDeep } from "@tanstack/db";
|
|
1
2
|
import { ApiCall as ApiCall$1, ApiCallArgs as ApiCallArgs$1, ApiCallInput as ApiCallInput$1, ApiContract as ApiContract$1, ApiInput as ApiInput$1, ApiOutput as ApiOutput$1, ApiPath as ApiPath$1, ApiRoute as ApiRoute$1, Batch as Batch$1, Broadcast as Broadcast$1, PushResult as PushResult$1, ReadFilterInput, ReadFilterOperator as ReadFilterOperator$1, ReadQueryInput, ReadResult as ReadResult$1, SequencedUpdate as SequencedUpdate$1, SyncChangesQueryInput, SyncChangesResult as SyncChangesResult$1, Update as Update$1 } from "@lsync/transport";
|
|
2
|
-
import { BaseCollectionConfig, ChangeMessageOrDeleteKeyMessage, Collection, CollectionConfig, InferSchemaOutput, OperationConfig, TransactionWithMutations, WritableDeep } from "@tanstack/db";
|
|
3
3
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
4
4
|
import { ApiDefinition, CollectionAtPath, CollectionDefinition, CollectionDefinitions, CollectionPath, CollectionSet } from "@lsync/definitions";
|
|
5
5
|
|
|
@@ -68,21 +68,6 @@ interface ClientSubscription {
|
|
|
68
68
|
declare function createBatch<T extends object>(collection: string, clientId: string, transaction: Pick<TransactionWithMutations<T>, "mutations">): Batch;
|
|
69
69
|
declare function toChangeMessage<T extends object, TKey extends string | number>(update: Update, existing?: boolean): ChangeMessageOrDeleteKeyMessage<T, TKey>;
|
|
70
70
|
//#endregion
|
|
71
|
-
//#region src/client.d.ts
|
|
72
|
-
declare function createClient<TApi extends ApiContract = ApiContract>(options: ClientOptions): Client<TApi>;
|
|
73
|
-
//#endregion
|
|
74
|
-
//#region src/collection.d.ts
|
|
75
|
-
declare function collectionOptions<TSchema extends StandardSchemaV1, TKey extends string | number = string | number>(options: CollectionOptions<InferSchemaOutput<TSchema>, TKey, TSchema> & {
|
|
76
|
-
schema: TSchema;
|
|
77
|
-
}): CollectionConfig<InferSchemaOutput<TSchema>, TKey, TSchema> & {
|
|
78
|
-
schema: TSchema;
|
|
79
|
-
};
|
|
80
|
-
declare function collectionOptions<T extends object, TKey extends string | number = string | number>(options: CollectionOptions<T, TKey, never> & {
|
|
81
|
-
schema?: never;
|
|
82
|
-
}): CollectionConfig<T, TKey, never> & {
|
|
83
|
-
schema?: never;
|
|
84
|
-
};
|
|
85
|
-
//#endregion
|
|
86
71
|
//#region src/collection-path.d.ts
|
|
87
72
|
type CollectionScopeParams = Record<string, string | number>;
|
|
88
73
|
//#endregion
|
|
@@ -156,9 +141,9 @@ interface OptionalCollectionTypeConnection {
|
|
|
156
141
|
}
|
|
157
142
|
//#endregion
|
|
158
143
|
//#region src/definition-builder.d.ts
|
|
159
|
-
type BuilderIndexMode
|
|
160
|
-
type BuilderIndexType
|
|
161
|
-
type BuilderSyncMode
|
|
144
|
+
type BuilderIndexMode = NonNullable<BaseCollectionConfig<any, any, any>["autoIndex"]>;
|
|
145
|
+
type BuilderIndexType = BaseCollectionConfig<any, any, any>["defaultIndexType"];
|
|
146
|
+
type BuilderSyncMode = "eager" | "on-demand";
|
|
162
147
|
declare function collectionTypesFrom<TCollections extends CollectionDefinitions>(definitions: CollectionSet<TCollections>): DefinitionCollectionTypesBuilder<TCollections>;
|
|
163
148
|
declare class DefinitionCollectionTypesBuilder<TCollections extends CollectionDefinitions> {
|
|
164
149
|
private readonly definitions;
|
|
@@ -175,8 +160,8 @@ declare class DefinitionCollectionTypesBuilder<TCollections extends CollectionDe
|
|
|
175
160
|
declare class ClientCollectionBuilder<TDefinition> {
|
|
176
161
|
private readonly override;
|
|
177
162
|
constructor(override: ClientCollectionOverride);
|
|
178
|
-
sync(syncMode: BuilderSyncMode
|
|
179
|
-
index(autoIndex: BuilderIndexMode
|
|
163
|
+
sync(syncMode: BuilderSyncMode): ClientCollectionBuilder<TDefinition>;
|
|
164
|
+
index(autoIndex: BuilderIndexMode, defaultIndexType?: BuilderIndexType): ClientCollectionBuilder<TDefinition>;
|
|
180
165
|
toOverride(): ClientCollectionOverride;
|
|
181
166
|
}
|
|
182
167
|
type CollectionManagers<TCollections extends CollectionDefinitions> = { [TName in keyof TCollections]: CollectionTypeForDefinition<TCollections[TName]> };
|
|
@@ -185,49 +170,10 @@ type ChildOptionsForDefinitions<TChildren extends CollectionDefinitions> = { [TN
|
|
|
185
170
|
type ChildOptionForDefinition<TDefinition> = TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi> ? ChildCollectionTypeOptions<TRow, Extract<TRow[TKey], string | number>, StandardSchemaV1, ChildOptionsForDefinitions<TChildren>, ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>> : never;
|
|
186
171
|
type ApiMethodsForDefinitions<TApi extends Record<string, ApiDefinition<any, any>>, TRow extends object, TKey extends string | number> = { [TName in keyof TApi]: TApi[TName] extends ApiDefinition<infer TInput, infer TOutput> ? CollectionApiMethod<TInput, TOutput, TRow, TKey> : never };
|
|
187
172
|
interface ClientCollectionOverride {
|
|
188
|
-
syncMode?: BuilderSyncMode
|
|
189
|
-
autoIndex?: BuilderIndexMode
|
|
190
|
-
defaultIndexType?: BuilderIndexType
|
|
191
|
-
}
|
|
192
|
-
//#endregion
|
|
193
|
-
//#region src/collection-type-builder-state.d.ts
|
|
194
|
-
type BuilderState = Record<string, unknown> & {
|
|
195
|
-
api?: CollectionTypeApi<any, any>;
|
|
196
|
-
name?: string;
|
|
197
|
-
path?: string;
|
|
198
|
-
};
|
|
199
|
-
//#endregion
|
|
200
|
-
//#region src/collection-type-builder.d.ts
|
|
201
|
-
type BuilderApiContext<TInput, T extends object, TKey extends string | number> = Omit<CollectionApiHandlerArgs<TInput, T, TKey>, "input">;
|
|
202
|
-
type BuilderApiHandler<TInput, TOutput, T extends object, TKey extends string | number> = (input: TInput, context: BuilderApiContext<TInput, T, TKey>) => TOutput | Promise<TOutput>;
|
|
203
|
-
type BuilderSyncMode = "eager" | "on-demand";
|
|
204
|
-
type BuilderIndexMode = NonNullable<BaseCollectionConfig<any, any, any>["autoIndex"]>;
|
|
205
|
-
type BuilderIndexType = BaseCollectionConfig<any, any, any>["defaultIndexType"];
|
|
206
|
-
declare function collectionTypeBuilder(): Pick<CollectionTypeBuilder<InferSchemaOutput<StandardSchemaV1>, "", StandardSchemaV1>, "name">;
|
|
207
|
-
declare const CollectionTypes: {
|
|
208
|
-
builder: typeof collectionTypeBuilder;
|
|
209
|
-
from: typeof collectionTypesFrom;
|
|
210
|
-
};
|
|
211
|
-
declare class CollectionTypeBuilder<T extends object, TKey extends string | number, TSchema extends StandardSchemaV1, TChildren extends CollectionTypeChildren = {}, TApi extends CollectionTypeApi<T, TKey> = {}> {
|
|
212
|
-
private readonly state;
|
|
213
|
-
constructor(state: BuilderState);
|
|
214
|
-
client(client: Client): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi>;
|
|
215
|
-
url(url: string | URL, options?: {
|
|
216
|
-
clientId?: string;
|
|
217
|
-
}): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi>;
|
|
218
|
-
name(name: string): Pick<CollectionTypeBuilder<T, TKey, TSchema, TChildren>, "schema">;
|
|
219
|
-
schema<TSchema extends StandardSchemaV1>(schema: TSchema): Omit<CollectionTypeBuilder<InferSchemaOutput<TSchema>, TKey, TSchema, TChildren>, "name" | "schema">;
|
|
220
|
-
sync(syncMode: BuilderSyncMode): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi>;
|
|
221
|
-
index(autoIndex: BuilderIndexMode, defaultIndexType?: BuilderIndexType): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi>;
|
|
222
|
-
child<TName extends string, TBuilder extends CollectionTypeBuilder<any, any, any, any, any>>(name: TName, configure: (builder: Pick<CollectionTypeBuilder<InferSchemaOutput<StandardSchemaV1>, "", StandardSchemaV1>, "schema">) => TBuilder): CollectionTypeBuilder<T, TKey, TSchema, TChildren & Record<TName, ChildOptionsForBuilder<TBuilder>>, TApi>;
|
|
223
|
-
key<TKeyNext extends string | number>(getKey: (item: T) => TKeyNext): CollectionTypeBuilder<T, TKeyNext, TSchema, TChildren>;
|
|
224
|
-
api<TName extends string, TInput = undefined, TOutput = unknown>(name: TName, method?: CollectionApiMethod<TInput, TOutput, T, TKey>): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi & Record<TName, CollectionApiMethod<TInput, TOutput, T, TKey>>>;
|
|
225
|
-
api<TName extends string, TInput, TOutput>(name: TName, handler: BuilderApiHandler<TInput, TOutput, T, TKey>): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi & Record<TName, CollectionApiMethod<TInput, TOutput, T, TKey>>>;
|
|
226
|
-
build(): CollectionType<T, TKey, TChildren, TApi>;
|
|
227
|
-
private next;
|
|
228
|
-
private childBuilder;
|
|
173
|
+
syncMode?: BuilderSyncMode;
|
|
174
|
+
autoIndex?: BuilderIndexMode;
|
|
175
|
+
defaultIndexType?: BuilderIndexType;
|
|
229
176
|
}
|
|
230
|
-
type ChildOptionsForBuilder<TBuilder> = TBuilder extends CollectionTypeBuilder<infer T, infer TKey, infer TSchema, infer TChildren, infer TApi> ? ChildCollectionTypeOptions<T, TKey, TSchema, TChildren, TApi> : never;
|
|
231
177
|
//#endregion
|
|
232
|
-
export { type ApiCall, type ApiCallArgs, type ApiCallInput, type ApiContract, type ApiInput, type ApiOutput, type ApiPath, type ApiRoute, type Batch, type Broadcast, type ChildCollectionTypeOptions, type Client, type ClientOptions, type ClientSubscription, type CollectionApiHandler, type CollectionApiHandlerArgs, type CollectionApiMethod, type CollectionApiMethods, type CollectionConnectionOptions, type CollectionEntity, type CollectionOptions, type CollectionScopeParams, type CollectionType, type CollectionTypeApi,
|
|
178
|
+
export { type ApiCall, type ApiCallArgs, type ApiCallInput, type ApiContract, type ApiInput, type ApiOutput, type ApiPath, type ApiRoute, type Batch, type Broadcast, type ChildCollectionTypeOptions, type Client, type ClientOptions, type ClientSubscription, type CollectionApiHandler, type CollectionApiHandlerArgs, type CollectionApiMethod, type CollectionApiMethods, type CollectionConnectionOptions, type CollectionEntity, type CollectionOptions, type CollectionScopeParams, type CollectionType, type CollectionTypeApi, type CollectionTypeOptions, type CollectionUsage, type PushResult, type ReadFilter, type ReadFilterOperator, type ReadQuery, type ReadResult, type SequencedUpdate, type SyncChangesQuery, type SyncChangesResult, type Update, collectionTypesFrom, createBatch, toChangeMessage };
|
|
233
179
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/batch.ts","../src/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/batch.ts","../src/collection-path.ts","../src/collection-type-types.ts","../src/definition-builder.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { createCollection } from "@tanstack/db";
|
|
1
2
|
import { createTRPCProxyClient } from "@trpc/client";
|
|
2
3
|
import { parseServerMessage, sendClientRpcRequest } from "@lsync/transport";
|
|
3
4
|
import { observable } from "@trpc/server/observable";
|
|
4
|
-
import { createCollection } from "@tanstack/db";
|
|
5
5
|
//#region src/batch.ts
|
|
6
6
|
function createBatch(collection, clientId, transaction) {
|
|
7
7
|
return { updates: transaction.mutations.map((mutation) => toUpdate(collection, clientId, mutation)) };
|
|
@@ -44,6 +44,41 @@ function toChangeMessage(update, existing) {
|
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
46
|
//#endregion
|
|
47
|
+
//#region src/collection-path.ts
|
|
48
|
+
function collectionScope$1(path, params) {
|
|
49
|
+
return `/${collectionPathSegments(path).map((segment) => segmentValue(segment, params)).map(normalizeSegment$1).join("/")}/`;
|
|
50
|
+
}
|
|
51
|
+
function firstNewPathParam(childPath, parentPath) {
|
|
52
|
+
if (!childPath) return void 0;
|
|
53
|
+
const parentParams = new Set(pathParams(parentPath));
|
|
54
|
+
return pathParams(childPath).find((param) => !parentParams.has(param));
|
|
55
|
+
}
|
|
56
|
+
function collectionPathSegments(path) {
|
|
57
|
+
return path.trim().replace(/^\/+|\/+$/g, "").split("/").filter(Boolean);
|
|
58
|
+
}
|
|
59
|
+
function collectionPathParamName(segment) {
|
|
60
|
+
return segment.match(/^\{([A-Za-z_][A-Za-z0-9_]*)\}$/)?.[1] ?? segment.match(/^:([A-Za-z_][A-Za-z0-9_]*)$/)?.[1];
|
|
61
|
+
}
|
|
62
|
+
function isCollectionPathParam(segment) {
|
|
63
|
+
return collectionPathParamName(segment) !== void 0;
|
|
64
|
+
}
|
|
65
|
+
function segmentValue(segment, params) {
|
|
66
|
+
const param = collectionPathParamName(segment);
|
|
67
|
+
if (!param) return segment;
|
|
68
|
+
const value = params[param];
|
|
69
|
+
if (value === void 0) throw new Error(`Missing collection path parameter: ${param}`);
|
|
70
|
+
return String(value);
|
|
71
|
+
}
|
|
72
|
+
function pathParams(path) {
|
|
73
|
+
return collectionPathSegments(path).flatMap((segment) => {
|
|
74
|
+
const param = collectionPathParamName(segment);
|
|
75
|
+
return param ? [param] : [];
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function normalizeSegment$1(segment) {
|
|
79
|
+
return encodeURIComponent(decodeURIComponent(segment));
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
47
82
|
//#region src/client-rpc.ts
|
|
48
83
|
function takePending(pending, id) {
|
|
49
84
|
if (id === null || id === void 0) return;
|
|
@@ -87,10 +122,10 @@ function requestForOperation(id, op) {
|
|
|
87
122
|
};
|
|
88
123
|
throw new Error(`Unsupported operation: ${op.type}.${op.path}`);
|
|
89
124
|
}
|
|
90
|
-
function collectionScope
|
|
91
|
-
return `/${collection.trim().replace(/^\/+|\/+$/g, "").split("/").filter(Boolean).map(normalizeSegment
|
|
125
|
+
function collectionScope(collection) {
|
|
126
|
+
return `/${collection.trim().replace(/^\/+|\/+$/g, "").split("/").filter(Boolean).map(normalizeSegment).join("/")}/`;
|
|
92
127
|
}
|
|
93
|
-
function normalizeSegment
|
|
128
|
+
function normalizeSegment(segment) {
|
|
94
129
|
return encodeURIComponent(decodeURIComponent(segment));
|
|
95
130
|
}
|
|
96
131
|
//#endregion
|
|
@@ -102,7 +137,7 @@ var ClientSubscriptions = class {
|
|
|
102
137
|
this.controls = controls;
|
|
103
138
|
}
|
|
104
139
|
subscribe(collection, listener) {
|
|
105
|
-
const key = collectionScope
|
|
140
|
+
const key = collectionScope(collection);
|
|
106
141
|
let entry = this.subscriptions.get(key);
|
|
107
142
|
const shouldSubscribe = !entry;
|
|
108
143
|
if (!entry) {
|
|
@@ -127,20 +162,20 @@ var ClientSubscriptions = class {
|
|
|
127
162
|
const updatesByCollection = /* @__PURE__ */ new Map();
|
|
128
163
|
const invalidationsByCollection = /* @__PURE__ */ new Map();
|
|
129
164
|
for (const update of broadcast.updates) {
|
|
130
|
-
const collection = collectionScope
|
|
165
|
+
const collection = collectionScope(update.collection);
|
|
131
166
|
const updates = updatesByCollection.get(collection) ?? [];
|
|
132
167
|
updates.push(update);
|
|
133
168
|
updatesByCollection.set(collection, updates);
|
|
134
169
|
}
|
|
135
170
|
for (const invalidation of broadcast.invalidations ?? []) {
|
|
136
|
-
const collection = collectionScope
|
|
171
|
+
const collection = collectionScope(invalidation.collection);
|
|
137
172
|
const invalidations = invalidationsByCollection.get(collection) ?? [];
|
|
138
173
|
invalidations.push(invalidation);
|
|
139
174
|
invalidationsByCollection.set(collection, invalidations);
|
|
140
175
|
}
|
|
141
176
|
for (const entry of this.subscriptions.values()) {
|
|
142
|
-
const updates = updatesByCollection.get(collectionScope
|
|
143
|
-
const invalidations = invalidationsByCollection.get(collectionScope
|
|
177
|
+
const updates = updatesByCollection.get(collectionScope(entry.collection));
|
|
178
|
+
const invalidations = invalidationsByCollection.get(collectionScope(entry.collection));
|
|
144
179
|
if ((!updates || updates.length === 0) && (!invalidations || invalidations.length === 0)) continue;
|
|
145
180
|
const scopedBroadcast = {
|
|
146
181
|
...broadcast,
|
|
@@ -155,7 +190,7 @@ var ClientSubscriptions = class {
|
|
|
155
190
|
return socket?.readyState === WebSocket.OPEN ? this.subscribeOnSocket(socket, entry) : this.controls.open().then(() => void 0);
|
|
156
191
|
}
|
|
157
192
|
async subscribeOnSocket(ws, entry) {
|
|
158
|
-
if (this.subscriptions.get(collectionScope
|
|
193
|
+
if (this.subscriptions.get(collectionScope(entry.collection)) !== entry) return;
|
|
159
194
|
entry.collection = (await this.controls.send(ws, "subscribe", entry.collection)).collection;
|
|
160
195
|
}
|
|
161
196
|
unsubscribe(key, listener) {
|
|
@@ -811,41 +846,6 @@ function trackLocalTransaction(subsets, syncMode, transaction) {
|
|
|
811
846
|
}
|
|
812
847
|
}
|
|
813
848
|
//#endregion
|
|
814
|
-
//#region src/collection-path.ts
|
|
815
|
-
function collectionScope(path, params) {
|
|
816
|
-
return `/${collectionPathSegments(path).map((segment) => segmentValue(segment, params)).map(normalizeSegment).join("/")}/`;
|
|
817
|
-
}
|
|
818
|
-
function firstNewPathParam(childPath, parentPath) {
|
|
819
|
-
if (!childPath) return void 0;
|
|
820
|
-
const parentParams = new Set(pathParams(parentPath));
|
|
821
|
-
return pathParams(childPath).find((param) => !parentParams.has(param));
|
|
822
|
-
}
|
|
823
|
-
function collectionPathSegments(path) {
|
|
824
|
-
return path.trim().replace(/^\/+|\/+$/g, "").split("/").filter(Boolean);
|
|
825
|
-
}
|
|
826
|
-
function collectionPathParamName(segment) {
|
|
827
|
-
return segment.match(/^\{([A-Za-z_][A-Za-z0-9_]*)\}$/)?.[1] ?? segment.match(/^:([A-Za-z_][A-Za-z0-9_]*)$/)?.[1];
|
|
828
|
-
}
|
|
829
|
-
function isCollectionPathParam(segment) {
|
|
830
|
-
return collectionPathParamName(segment) !== void 0;
|
|
831
|
-
}
|
|
832
|
-
function segmentValue(segment, params) {
|
|
833
|
-
const param = collectionPathParamName(segment);
|
|
834
|
-
if (!param) return segment;
|
|
835
|
-
const value = params[param];
|
|
836
|
-
if (value === void 0) throw new Error(`Missing collection path parameter: ${param}`);
|
|
837
|
-
return String(value);
|
|
838
|
-
}
|
|
839
|
-
function pathParams(path) {
|
|
840
|
-
return collectionPathSegments(path).flatMap((segment) => {
|
|
841
|
-
const param = collectionPathParamName(segment);
|
|
842
|
-
return param ? [param] : [];
|
|
843
|
-
});
|
|
844
|
-
}
|
|
845
|
-
function normalizeSegment(segment) {
|
|
846
|
-
return encodeURIComponent(decodeURIComponent(segment));
|
|
847
|
-
}
|
|
848
|
-
//#endregion
|
|
849
849
|
//#region src/collection-api.ts
|
|
850
850
|
function defaultCollectionApiPath(path, name) {
|
|
851
851
|
const prefix = collectionPathSegments(path).filter((segment) => !isCollectionPathParam(segment)).join(".");
|
|
@@ -881,7 +881,7 @@ var CollectionTypeManager = class CollectionTypeManager {
|
|
|
881
881
|
}, this.apiMethods()), this.childManagers(this.params));
|
|
882
882
|
}
|
|
883
883
|
all(params) {
|
|
884
|
-
const scope = collectionScope(this.options.path, {
|
|
884
|
+
const scope = collectionScope$1(this.options.path, {
|
|
885
885
|
...this.params,
|
|
886
886
|
...params
|
|
887
887
|
});
|
|
@@ -935,7 +935,7 @@ var CollectionTypeManager = class CollectionTypeManager {
|
|
|
935
935
|
}
|
|
936
936
|
async callApi(name, method, input) {
|
|
937
937
|
if (method.handler) {
|
|
938
|
-
const scope = collectionScope(this.options.path, this.params);
|
|
938
|
+
const scope = collectionScope$1(this.options.path, this.params);
|
|
939
939
|
return method.handler({
|
|
940
940
|
input,
|
|
941
941
|
collection: this.all({}),
|
|
@@ -1067,140 +1067,6 @@ function collectionOptionsFromDefinition(definition, dotPath, overrides) {
|
|
|
1067
1067
|
};
|
|
1068
1068
|
}
|
|
1069
1069
|
//#endregion
|
|
1070
|
-
|
|
1071
|
-
function rootPathForName(name) {
|
|
1072
|
-
return `/${encodeURIComponent(name)}/`;
|
|
1073
|
-
}
|
|
1074
|
-
function childPathForName(parentPath, parentParam, name) {
|
|
1075
|
-
return `${parentPath.replace(/\/+$/g, "")}/{${parentParam}}/${encodeURIComponent(name)}/`;
|
|
1076
|
-
}
|
|
1077
|
-
function parentIdParamForName(name) {
|
|
1078
|
-
return `${name}Id`;
|
|
1079
|
-
}
|
|
1080
|
-
//#endregion
|
|
1081
|
-
//#region src/immutable.ts
|
|
1082
|
-
function cloneImmutable(value) {
|
|
1083
|
-
if (Array.isArray(value)) return Object.freeze(value.map(cloneImmutable));
|
|
1084
|
-
if (!isPlainObject(value)) return value;
|
|
1085
|
-
return Object.freeze(Object.fromEntries(Object.entries(value).map(([nestedKey, nestedValue]) => [nestedKey, cloneImmutable(nestedValue)])));
|
|
1086
|
-
}
|
|
1087
|
-
function isPlainObject(value) {
|
|
1088
|
-
if (typeof value !== "object" || value === null) return false;
|
|
1089
|
-
const prototype = Object.getPrototypeOf(value);
|
|
1090
|
-
return prototype === Object.prototype || prototype === null;
|
|
1091
|
-
}
|
|
1092
|
-
//#endregion
|
|
1093
|
-
//#region src/collection-type-builder-state.ts
|
|
1094
|
-
function freezeBuilderState(state) {
|
|
1095
|
-
return Object.freeze(Object.fromEntries(Object.entries(state).filter(([, value]) => value !== void 0).map(([key, value]) => [key, copyBuilderStateValue(key, value)])));
|
|
1096
|
-
}
|
|
1097
|
-
function copyBuilderStateValue(key, value) {
|
|
1098
|
-
if (key === "api" && isApiMap(value)) return freezeApiMap(value);
|
|
1099
|
-
if (key === "url" && value instanceof URL) return value.toString();
|
|
1100
|
-
return cloneImmutable(value);
|
|
1101
|
-
}
|
|
1102
|
-
function freezeApiMap(api) {
|
|
1103
|
-
return Object.freeze(Object.fromEntries(Object.entries(api).map(([name, method]) => [name, freezeApiMethod(method)])));
|
|
1104
|
-
}
|
|
1105
|
-
function freezeApiMethod(method) {
|
|
1106
|
-
return Object.freeze({ ...method });
|
|
1107
|
-
}
|
|
1108
|
-
function isApiMap(value) {
|
|
1109
|
-
return typeof value === "object" && value !== null;
|
|
1110
|
-
}
|
|
1111
|
-
//#endregion
|
|
1112
|
-
//#region src/collection-type-builder.ts
|
|
1113
|
-
function collectionTypeBuilder() {
|
|
1114
|
-
return new CollectionTypeBuilder({});
|
|
1115
|
-
}
|
|
1116
|
-
const CollectionTypes = {
|
|
1117
|
-
builder: collectionTypeBuilder,
|
|
1118
|
-
from: collectionTypesFrom
|
|
1119
|
-
};
|
|
1120
|
-
var CollectionTypeBuilder = class CollectionTypeBuilder {
|
|
1121
|
-
state;
|
|
1122
|
-
constructor(state) {
|
|
1123
|
-
this.state = freezeBuilderState(state);
|
|
1124
|
-
}
|
|
1125
|
-
client(client) {
|
|
1126
|
-
return this.next({
|
|
1127
|
-
client,
|
|
1128
|
-
url: void 0,
|
|
1129
|
-
clientId: void 0
|
|
1130
|
-
});
|
|
1131
|
-
}
|
|
1132
|
-
url(url, options = {}) {
|
|
1133
|
-
return this.next({
|
|
1134
|
-
client: void 0,
|
|
1135
|
-
url,
|
|
1136
|
-
...options.clientId ? { clientId: options.clientId } : {}
|
|
1137
|
-
});
|
|
1138
|
-
}
|
|
1139
|
-
name(name) {
|
|
1140
|
-
return this.next({
|
|
1141
|
-
name,
|
|
1142
|
-
path: rootPathForName(name)
|
|
1143
|
-
});
|
|
1144
|
-
}
|
|
1145
|
-
schema(schema) {
|
|
1146
|
-
return this.next({ schema });
|
|
1147
|
-
}
|
|
1148
|
-
sync(syncMode) {
|
|
1149
|
-
return this.next({ syncMode });
|
|
1150
|
-
}
|
|
1151
|
-
index(autoIndex, defaultIndexType) {
|
|
1152
|
-
return this.next({
|
|
1153
|
-
autoIndex,
|
|
1154
|
-
...defaultIndexType ? { defaultIndexType } : {}
|
|
1155
|
-
});
|
|
1156
|
-
}
|
|
1157
|
-
child(name, configure) {
|
|
1158
|
-
const child = configure(this.childBuilder(name));
|
|
1159
|
-
const children = typeof this.state.children === "object" && this.state.children !== null ? this.state.children : {};
|
|
1160
|
-
return this.next({ children: {
|
|
1161
|
-
...children,
|
|
1162
|
-
[name]: child.state
|
|
1163
|
-
} });
|
|
1164
|
-
}
|
|
1165
|
-
key(getKey) {
|
|
1166
|
-
return this.next({ getKey });
|
|
1167
|
-
}
|
|
1168
|
-
api(name, method) {
|
|
1169
|
-
const entry = typeof method === "function" ? localApiMethod(method) : method ?? {};
|
|
1170
|
-
return this.next({ api: {
|
|
1171
|
-
...this.state.api,
|
|
1172
|
-
[name]: entry
|
|
1173
|
-
} });
|
|
1174
|
-
}
|
|
1175
|
-
build() {
|
|
1176
|
-
if (!this.state.name || !this.state.path) throw new Error("CollectionTypes.builder requires a name");
|
|
1177
|
-
if (!this.state.getKey) throw new Error("CollectionTypes.builder requires a key function");
|
|
1178
|
-
return createCollectionTypeFromOptions(this.state);
|
|
1179
|
-
}
|
|
1180
|
-
next(updates) {
|
|
1181
|
-
return new CollectionTypeBuilder({
|
|
1182
|
-
...this.state,
|
|
1183
|
-
...updates
|
|
1184
|
-
});
|
|
1185
|
-
}
|
|
1186
|
-
childBuilder(name) {
|
|
1187
|
-
if (!this.state.name || !this.state.path) throw new Error("CollectionTypes.builder.child requires a parent name");
|
|
1188
|
-
const parentParam = parentIdParamForName(this.state.name);
|
|
1189
|
-
return new CollectionTypeBuilder({
|
|
1190
|
-
name,
|
|
1191
|
-
parentParam,
|
|
1192
|
-
path: childPathForName(this.state.path, parentParam, name)
|
|
1193
|
-
});
|
|
1194
|
-
}
|
|
1195
|
-
};
|
|
1196
|
-
function localApiMethod(handler) {
|
|
1197
|
-
return Object.freeze({ handler: ({ input, collection, params, scope }) => handler(input, {
|
|
1198
|
-
collection,
|
|
1199
|
-
params,
|
|
1200
|
-
scope
|
|
1201
|
-
}) });
|
|
1202
|
-
}
|
|
1203
|
-
//#endregion
|
|
1204
|
-
export { CollectionTypeBuilder, CollectionTypes, DefinitionCollectionTypesBuilder, collectionOptions, createBatch, createClient, toChangeMessage };
|
|
1070
|
+
export { collectionTypesFrom, createBatch, toChangeMessage };
|
|
1205
1071
|
|
|
1206
1072
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["collectionScope","normalizeSegment","collectionScope"],"sources":["../src/batch.ts","../src/client-rpc.ts","../src/client-subscriptions.ts","../src/client.ts","../src/read-query.ts","../src/subsets.ts","../src/collection.ts","../src/collection-path.ts","../src/collection-api.ts","../src/collection-type.ts","../src/definition-builder.ts","../src/collection-name.ts","../src/immutable.ts","../src/collection-type-builder-state.ts","../src/collection-type-builder.ts"],"sourcesContent":["import type {\n ChangeMessageOrDeleteKeyMessage,\n PendingMutation,\n TransactionWithMutations,\n} from \"@tanstack/db\";\nimport type { Batch, Update } from \"./types\";\n\nexport function createBatch<T extends object>(\n collection: string,\n clientId: string,\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): Batch {\n return {\n updates: transaction.mutations.map((mutation) => toUpdate(collection, clientId, mutation)),\n };\n}\n\nfunction toUpdate<T extends object>(\n collection: string,\n clientId: string,\n mutation: PendingMutation<T>,\n): Update {\n const base = {\n id: mutation.mutationId,\n collection,\n key: mutation.key as string | number,\n type: mutation.type,\n clientId,\n createdAt: mutation.createdAt.getTime(),\n };\n\n if (mutation.type === \"delete\") {\n return {\n ...base,\n type: \"delete\",\n previousValue: mutation.original,\n };\n }\n\n if (mutation.type === \"update\") {\n return {\n ...base,\n type: \"update\",\n value: mutation.modified,\n previousValue: mutation.original,\n };\n }\n\n return {\n ...base,\n type: \"insert\",\n value: mutation.modified,\n };\n}\n\nexport function toChangeMessage<T extends object, TKey extends string | number>(\n update: Update,\n existing?: boolean,\n): ChangeMessageOrDeleteKeyMessage<T, TKey> {\n if (update.type === \"delete\") {\n return {\n type: \"delete\",\n key: update.key as TKey,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>;\n }\n\n const type =\n update.type === \"update\" && existing === false\n ? \"insert\"\n : update.type === \"insert\" && existing === true\n ? \"update\"\n : update.type;\n\n return {\n type,\n key: update.key as TKey,\n value: update.value as T,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>;\n}\n","import type { ClientRpcRequest, RpcId } from \"@lsync/transport\";\nimport type { ApiCall, Batch, ReadQuery, SyncChangesQuery } from \"./types\";\n\nexport interface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n}\n\nexport function takePending(\n pending: Map<string, PendingRequest>,\n id: RpcId,\n): PendingRequest | undefined {\n if (id === null || id === undefined) {\n return undefined;\n }\n\n const key = String(id);\n const request = pending.get(key);\n pending.delete(key);\n return request;\n}\n\nexport function requestForOperation(\n id: string,\n op: { type: string; path: string; input: unknown },\n): ClientRpcRequest {\n if (op.type === \"mutation\" && op.path === \"push\") {\n return {\n id,\n method: \"mutation\",\n params: {\n path: \"push\",\n input: {\n json: op.input as Batch,\n },\n },\n };\n }\n\n if (op.type === \"query\" && op.path === \"read\") {\n return {\n id,\n method: \"query\",\n params: {\n path: \"read\",\n input: {\n json: op.input as ReadQuery,\n },\n },\n };\n }\n\n if (op.type === \"query\" && op.path === \"changes\") {\n return {\n id,\n method: \"query\",\n params: {\n path: \"changes\",\n input: {\n json: op.input as SyncChangesQuery,\n },\n },\n };\n }\n\n if (op.type === \"mutation\" && op.path === \"api\") {\n return {\n id,\n method: \"mutation\",\n params: {\n path: \"api\",\n input: {\n json: op.input as ApiCall,\n },\n },\n };\n }\n\n throw new Error(`Unsupported operation: ${op.type}.${op.path}`);\n}\n\nexport function collectionScope(collection: string): string {\n const segments = collection\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n return `/${segments.map(normalizeSegment).join(\"/\")}/`;\n}\n\nfunction normalizeSegment(segment: string): string {\n return encodeURIComponent(decodeURIComponent(segment));\n}\n","import { collectionScope } from \"./client-rpc\";\nimport type { Broadcast, ClientSubscription, SubscriptionControlResult } from \"./types\";\n\ntype SubscriptionListener = (broadcast: Broadcast) => void;\n\ninterface SubscriptionEntry {\n collection: string;\n listeners: Set<SubscriptionListener>;\n ready: Promise<void>;\n}\n\nexport interface SubscriptionControls {\n currentSocket(): WebSocket | undefined;\n open(): Promise<WebSocket>;\n send(\n ws: WebSocket,\n path: \"subscribe\" | \"unsubscribe\",\n collection: string,\n ): Promise<SubscriptionControlResult>;\n}\n\nexport class ClientSubscriptions {\n private readonly subscriptions = new Map<string, SubscriptionEntry>();\n\n constructor(private readonly controls: SubscriptionControls) {}\n\n subscribe(collection: string, listener: SubscriptionListener): ClientSubscription {\n const key = collectionScope(collection);\n let entry = this.subscriptions.get(key);\n const shouldSubscribe = !entry;\n\n if (!entry) {\n entry = {\n collection: key,\n listeners: new Set(),\n ready: Promise.resolve(),\n };\n this.subscriptions.set(key, entry);\n }\n\n entry.listeners.add(listener);\n if (shouldSubscribe) {\n entry.ready = this.start(entry);\n }\n\n return {\n ready: entry.ready,\n unsubscribe: () => this.unsubscribe(key, listener),\n };\n }\n\n async replay(ws: WebSocket): Promise<void> {\n await Promise.all(\n [...this.subscriptions.values()].map((entry) => this.subscribeOnSocket(ws, entry)),\n );\n }\n\n dispatch(broadcast: Broadcast): void {\n const updatesByCollection = new Map<string, Broadcast[\"updates\"]>();\n const invalidationsByCollection = new Map<string, NonNullable<Broadcast[\"invalidations\"]>>();\n\n for (const update of broadcast.updates) {\n const collection = collectionScope(update.collection);\n const updates = updatesByCollection.get(collection) ?? [];\n updates.push(update);\n updatesByCollection.set(collection, updates);\n }\n\n for (const invalidation of broadcast.invalidations ?? []) {\n const collection = collectionScope(invalidation.collection);\n const invalidations = invalidationsByCollection.get(collection) ?? [];\n invalidations.push(invalidation);\n invalidationsByCollection.set(collection, invalidations);\n }\n\n for (const entry of this.subscriptions.values()) {\n const updates = updatesByCollection.get(collectionScope(entry.collection));\n const invalidations = invalidationsByCollection.get(collectionScope(entry.collection));\n if ((!updates || updates.length === 0) && (!invalidations || invalidations.length === 0)) {\n continue;\n }\n\n const scopedBroadcast: Broadcast = {\n ...broadcast,\n ...(invalidations ? { invalidations } : {}),\n updates: updates ?? [],\n };\n for (const listener of entry.listeners) {\n listener(scopedBroadcast);\n }\n }\n }\n\n private start(entry: SubscriptionEntry): Promise<void> {\n const socket = this.controls.currentSocket();\n return socket?.readyState === WebSocket.OPEN\n ? this.subscribeOnSocket(socket, entry)\n : this.controls.open().then(() => undefined);\n }\n\n private async subscribeOnSocket(ws: WebSocket, entry: SubscriptionEntry): Promise<void> {\n if (this.subscriptions.get(collectionScope(entry.collection)) !== entry) {\n return;\n }\n\n const result = await this.controls.send(ws, \"subscribe\", entry.collection);\n entry.collection = result.collection;\n }\n\n private unsubscribe(key: string, listener: SubscriptionListener): void {\n const entry = this.subscriptions.get(key);\n if (!entry) {\n return;\n }\n\n entry.listeners.delete(listener);\n if (entry.listeners.size > 0) {\n return;\n }\n\n this.subscriptions.delete(key);\n const socket = this.controls.currentSocket();\n if (socket?.readyState === WebSocket.OPEN) {\n void this.controls.send(socket, \"unsubscribe\", entry.collection);\n }\n }\n}\n","import { createTRPCProxyClient, type TRPCLink } from \"@trpc/client\";\nimport { parseServerMessage, sendClientRpcRequest, type ClientRpcRequest } from \"@lsync/transport\";\nimport { observable } from \"@trpc/server/observable\";\nimport { ClientSubscriptions } from \"./client-subscriptions\";\nimport { requestForOperation, takePending, type PendingRequest } from \"./client-rpc\";\nimport type {\n ApiCall,\n ApiCallArgs,\n ApiContract,\n ApiOutput,\n ApiPath,\n Batch,\n Client,\n ClientOptions,\n PushResult,\n ReadQuery,\n ReadResult,\n SubscriptionControlResult,\n SyncChangesQuery,\n SyncChangesResult,\n} from \"./types\";\n\ntype Router = any;\n\ninterface SharedClientEntry {\n client: Client;\n refs: number;\n}\n\nexport interface SharedClientLease<TApi extends ApiContract = ApiContract> {\n readonly client: Client<TApi>;\n release(): void;\n}\n\nconst sharedClients = new Map<string, SharedClientEntry>();\n\nexport function createClient<TApi extends ApiContract = ApiContract>(\n options: ClientOptions,\n): Client<TApi> {\n const clientId = options.clientId ?? crypto.randomUUID();\n const pending = new Map<string, PendingRequest>();\n let nextId = 1;\n let socket: WebSocket | undefined;\n let connectPromise: Promise<WebSocket> | undefined;\n let subscriptions: ClientSubscriptions;\n\n const open = async (): Promise<WebSocket> => {\n if (socket?.readyState === WebSocket.OPEN) {\n return socket;\n }\n\n if (connectPromise) {\n return connectPromise;\n }\n\n connectPromise = new Promise((resolve, reject) => {\n const url = new URL(options.url);\n url.searchParams.set(\"clientId\", clientId);\n const ws = new WebSocket(url);\n ws.binaryType = \"arraybuffer\";\n\n ws.addEventListener(\"open\", () => {\n socket = ws;\n subscriptions\n .replay(ws)\n .then(() => {\n connectPromise = undefined;\n resolve(ws);\n })\n .catch((error) => {\n connectPromise = undefined;\n reject(error);\n });\n });\n\n ws.addEventListener(\"message\", (event) => {\n const message = parseServerMessage(event.data);\n\n if (\"method\" in message) {\n subscriptions.dispatch(message.params.input.json);\n return;\n }\n\n if (\"error\" in message) {\n const request = takePending(pending, message.id);\n\n if (!request) {\n return;\n }\n\n request.reject(new Error(message.error.message));\n return;\n }\n\n const request = takePending(pending, message.id);\n\n if (!request) {\n return;\n }\n\n request.resolve(message.result.data.json);\n });\n\n ws.addEventListener(\"close\", () => {\n socket = undefined;\n connectPromise = undefined;\n });\n\n ws.addEventListener(\"error\", () => {\n reject(new Error(\"Unable to open sync WebSocket\"));\n });\n });\n\n return connectPromise;\n };\n\n const sendRequest = <TResult>(ws: WebSocket, request: ClientRpcRequest): Promise<TResult> => {\n return new Promise((resolve, reject) => {\n const id = request.id;\n if (id === null || id === undefined) {\n reject(new Error(\"RPC request requires an id\"));\n return;\n }\n\n pending.set(String(id), {\n resolve: (value) => resolve(value as TResult),\n reject,\n });\n\n try {\n sendClientRpcRequest(ws, request);\n } catch (error) {\n pending.delete(String(id));\n reject(error);\n }\n });\n };\n\n const sendSubscriptionControl = async (\n ws: WebSocket,\n method: \"subscribe\" | \"unsubscribe\",\n collection: string,\n ): Promise<SubscriptionControlResult> => {\n const id = String(nextId++);\n return sendRequest<SubscriptionControlResult>(ws, {\n id,\n method,\n params: {\n input: {\n json: {\n collection,\n },\n },\n },\n });\n };\n\n subscriptions = new ClientSubscriptions({\n currentSocket: () => socket,\n open,\n send: sendSubscriptionControl,\n });\n\n const link: TRPCLink<Router> = () => {\n return ({ op }) =>\n observable((observer) => {\n let cancelled = false;\n\n open()\n .then((ws) => {\n if (cancelled) return;\n\n const id = String(nextId++);\n sendRequest(ws, requestForOperation(id, op))\n .then((value) => {\n observer.next({ result: { data: value } });\n observer.complete();\n })\n .catch((error) => observer.error(error as never));\n })\n .catch((error) => observer.error(error as never));\n\n return () => {\n cancelled = true;\n };\n });\n };\n\n const trpc = createTRPCProxyClient<Router>({ links: [link] }) as unknown as {\n push: {\n mutate: (batch: Batch) => Promise<PushResult>;\n };\n read: {\n query: <T = unknown>(query: ReadQuery) => Promise<ReadResult<T>>;\n };\n changes: {\n query: (query: SyncChangesQuery) => Promise<SyncChangesResult>;\n };\n api: {\n mutate: <TResult = unknown>(call: ApiCall) => Promise<TResult>;\n };\n };\n\n return {\n clientId,\n push: (batch) => trpc.push.mutate(batch),\n read: (query) => trpc.read.query(query),\n changes: (query) => trpc.changes.query(query),\n call: <TPath extends ApiPath<TApi>>(path: TPath, ...args: ApiCallArgs<TApi, TPath>) => {\n const [input] = args;\n const call = input === undefined ? { path } : { path, input };\n return trpc.api.mutate<ApiOutput<TApi, TPath>>(call);\n },\n subscribe: (collection, listener) => subscriptions.subscribe(collection, listener),\n close() {\n socket?.close();\n socket = undefined;\n },\n };\n}\n\nexport function acquireSharedClient<TApi extends ApiContract = ApiContract>(\n options: ClientOptions,\n): SharedClientLease<TApi> {\n const key = sharedClientKey(options);\n let entry = sharedClients.get(key);\n\n if (!entry) {\n entry = {\n client: createClient({\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n }),\n refs: 0,\n };\n sharedClients.set(key, entry);\n }\n\n entry.refs += 1;\n\n let released = false;\n return {\n client: entry.client as Client<TApi>,\n release() {\n if (released) {\n return;\n }\n\n released = true;\n entry.refs -= 1;\n\n if (entry.refs === 0 && sharedClients.get(key) === entry) {\n sharedClients.delete(key);\n entry.client.close();\n }\n },\n };\n}\n\nfunction sharedClientKey(options: ClientOptions): string {\n const url = new URL(options.url);\n url.searchParams.delete(\"clientId\");\n return `${url.toString()}\\0${options.clientId ?? \"\"}`;\n}\n","import type { LoadSubsetOptions } from \"@tanstack/db\";\nimport type { ReadFilter, ReadOrderBy, ReadPredicate, ReadQuery } from \"./types\";\n\nexport type ReadOptions = Omit<ReadQuery, \"collection\">;\ntype ReadComparisonPredicate = Extract<ReadPredicate, { type: \"comparison\" }>;\n\nexport function initialReadQuery(\n collection: string,\n read: false | ReadOptions | undefined,\n): ReadQuery | undefined {\n if (read === false) {\n return undefined;\n }\n\n return {\n collection,\n ...read,\n };\n}\n\nexport function subsetId(options: LoadSubsetOptions): string {\n return JSON.stringify({\n cursor: options.cursor\n ? {\n whereCurrent: toReadPredicate(options.cursor.whereCurrent),\n whereFrom: toReadPredicate(options.cursor.whereFrom),\n }\n : undefined,\n predicate: options.where ? toReadPredicate(options.where) : undefined,\n limit: options.limit,\n offset: options.offset,\n orderBy: toReadOrderByList(options.orderBy),\n });\n}\n\nexport function readQueryForSubset(\n collection: string,\n baseRead: ReadOptions | undefined,\n options: LoadSubsetOptions,\n): ReadQuery {\n const query: ReadQuery = {\n collection,\n ...baseRead,\n filters: [...(baseRead?.filters ?? [])],\n };\n\n const predicate = combinePredicates(\n baseRead?.predicate,\n options.where ? toReadPredicate(options.where) : undefined,\n );\n if (predicate) {\n query.predicate = predicate;\n }\n\n const limit = options.limit ?? baseRead?.limit;\n if (limit !== undefined) {\n query.limit = limit;\n }\n\n const offset = options.cursor ? undefined : (options.offset ?? baseRead?.offset);\n if (offset !== undefined) {\n query.offset = offset;\n }\n\n const subsetOrderBy = toReadOrderByList(options.orderBy);\n const orderBy = subsetOrderBy.length > 0 ? subsetOrderBy : baseRead?.orderBy;\n if (orderBy) {\n query.orderBy = orderBy;\n }\n\n if (options.cursor) {\n query.cursor = {\n whereCurrent: toReadPredicate(options.cursor.whereCurrent),\n whereFrom: toReadPredicate(options.cursor.whereFrom),\n ...(options.cursor.lastKey !== undefined ? { lastKey: options.cursor.lastKey } : {}),\n };\n }\n\n return query;\n}\n\nfunction combinePredicates(\n left: ReadPredicate | undefined,\n right: ReadPredicate | undefined,\n): ReadPredicate | undefined {\n if (!left) return right;\n if (!right) return left;\n return { type: \"and\", predicates: [left, right] };\n}\n\nfunction toReadPredicate(expression: unknown): ReadPredicate {\n const unwrapped = unwrapExpression(expression);\n\n if (!isFuncExpression(unwrapped)) {\n throw new Error(\"On-demand cursor predicates must be function expressions\");\n }\n\n if (unwrapped.name === \"and\" || unwrapped.name === \"or\") {\n return {\n type: unwrapped.name,\n predicates: unwrapped.args.map(toReadPredicate),\n };\n }\n\n if (unwrapped.name === \"not\") {\n return negatePredicate(toReadPredicate(unwrapped.args[0]));\n }\n\n const comparison = comparisonFromExpression(unwrapped);\n if (!comparison) {\n throw new Error(`Unsupported on-demand cursor operator: ${unwrapped.name}`);\n }\n\n return {\n type: \"comparison\",\n ...comparison,\n };\n}\n\nfunction negatePredicate(predicate: ReadPredicate): ReadPredicate {\n if (predicate.type === \"and\" || predicate.type === \"or\") {\n return {\n type: predicate.type === \"and\" ? \"or\" : \"and\",\n predicates: predicate.predicates.map(negatePredicate),\n };\n }\n\n const comparison = predicate as ReadComparisonPredicate;\n return {\n ...comparison,\n op: negateOperator(comparison.op),\n };\n}\n\nfunction negateOperator(operator: ReadComparisonPredicate[\"op\"]): ReadComparisonPredicate[\"op\"] {\n switch (operator) {\n case \"eq\":\n return \"ne\";\n case \"ne\":\n return \"eq\";\n case \"gt\":\n return \"lte\";\n case \"gte\":\n return \"lt\";\n case \"lt\":\n return \"gte\";\n case \"lte\":\n return \"gt\";\n case \"in\":\n throw new Error(\"Unsupported on-demand cursor operator: not(in)\");\n default:\n throw new Error(\"Unsupported on-demand cursor operator\");\n }\n}\n\nfunction comparisonFromExpression(\n expression: FuncExpression,\n): Omit<ReadComparisonPredicate, \"type\"> | undefined {\n const op = toReadFilterOperator(expression.name);\n const [left, right] = expression.args;\n if (!op || !isRefExpression(left) || !isValExpression(right)) {\n return undefined;\n }\n\n return {\n field: left.path.join(\".\"),\n op,\n value: right.value,\n };\n}\n\nfunction toReadOrderByList(orderBy: LoadSubsetOptions[\"orderBy\"]): Array<ReadOrderBy> {\n return (orderBy ?? []).map((sort) => {\n const expression = unwrapExpression(sort.expression);\n if (!isRefExpression(expression)) {\n throw new Error(`On-demand orderBy must be a field reference`);\n }\n\n return toReadOrderBy({\n field: expression.path,\n direction: sort.compareOptions.direction,\n });\n });\n}\n\nfunction toReadOrderBy(sort: { field: Array<string | number>; direction: \"asc\" | \"desc\" }) {\n return {\n field: sort.field.join(\".\"),\n direction: sort.direction,\n };\n}\n\nfunction toReadFilterOperator(operator: string): ReadFilter[\"op\"] | undefined {\n switch (operator) {\n case \"eq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"in\":\n return operator;\n case \"not_eq\":\n return \"ne\";\n case \"not_gt\":\n return \"lte\";\n case \"not_gte\":\n return \"lt\";\n case \"not_lt\":\n return \"gte\";\n case \"not_lte\":\n return \"gt\";\n default:\n return undefined;\n }\n}\n\ninterface Expression {\n type: \"func\" | \"ref\" | \"val\";\n name?: string;\n args?: Array<unknown>;\n path?: Array<string | number>;\n value?: unknown;\n}\n\ntype FuncExpression = Expression & { args: Array<unknown>; name: string; type: \"func\" };\ntype RefExpression = Expression & { path: Array<string | number>; type: \"ref\" };\n\nfunction unwrapExpression(value: unknown): unknown {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"expression\" in value &&\n isExpression((value as { expression: unknown }).expression)\n ) {\n return (value as { expression: unknown }).expression;\n }\n\n return value;\n}\n\nfunction isExpression(value: unknown): value is Expression {\n return typeof value === \"object\" && value !== null && \"type\" in value;\n}\n\nfunction isFuncExpression(value: unknown): value is FuncExpression {\n return (\n isExpression(value) &&\n value.type === \"func\" &&\n typeof value.name === \"string\" &&\n Array.isArray(value.args)\n );\n}\n\nfunction isRefExpression(value: unknown): value is RefExpression {\n return isExpression(value) && value.type === \"ref\" && Array.isArray(value.path);\n}\n\nfunction isValExpression(value: unknown): value is Expression {\n return isExpression(value) && value.type === \"val\";\n}\n","import { type ChangeMessageOrDeleteKeyMessage, type Collection } from \"@tanstack/db\";\nimport type { ReadFilter, ReadPredicate } from \"./types\";\n\ntype Writer<T extends object, TKey extends string | number> = (\n message: ChangeMessageOrDeleteKeyMessage<T, TKey>,\n) => void;\n\ninterface SubsetState<TKey extends string | number> {\n filters: Array<ReadFilter>;\n keys: Set<TKey>;\n loaded: boolean;\n predicate?: ReadPredicate;\n refs: number;\n}\n\nexport interface RetainResult {\n loaded: boolean;\n}\n\nexport interface TrackRowResult {\n before: boolean;\n after: boolean;\n}\n\nexport class SubsetTracker<T extends object, TKey extends string | number> {\n private readonly subsets = new Map<string, SubsetState<TKey>>();\n private readonly keyRefs = new Map<TKey, number>();\n\n constructor(private readonly getKey: (item: T) => TKey) {}\n\n replace(\n subsetId: string,\n rows: Array<T>,\n filters: Array<ReadFilter>,\n predicate?: ReadPredicate,\n ): Array<TKey> {\n const previous = this.subsets.get(subsetId);\n const refs = previous?.refs ?? 0;\n if (previous) {\n this.releaseKeys(previous.keys);\n }\n\n const keys = new Set(rows.map((row) => this.getKey(row)));\n this.addKeys(keys);\n this.subsets.set(subsetId, {\n filters,\n keys,\n loaded: true,\n ...(predicate ? { predicate } : {}),\n refs,\n });\n\n const removed: Array<TKey> = [];\n previous?.keys.forEach((key) => {\n if (!keys.has(key) && !this.keyRefs.has(key)) {\n removed.push(key);\n }\n });\n return removed;\n }\n\n retain(subsetId: string): RetainResult {\n const subset = this.subsets.get(subsetId);\n if (subset) {\n subset.refs += 1;\n return { loaded: subset.loaded };\n }\n\n this.subsets.set(subsetId, { filters: [], keys: new Set(), loaded: false, refs: 1 });\n return { loaded: false };\n }\n\n trackRow(row: T): boolean {\n const result = this.reconcileRow(row);\n return result.before || result.after;\n }\n\n reconcileRow(row: T): TrackRowResult {\n const key = this.getKey(row);\n let before = false;\n\n this.subsets.forEach((subset) => {\n const had = subset.keys.has(key);\n before ||= had;\n\n if (matchesSubset(row, subset)) {\n if (!had) {\n subset.keys.add(key);\n this.keyRefs.set(key, (this.keyRefs.get(key) ?? 0) + 1);\n }\n return;\n }\n\n if (had) {\n subset.keys.delete(key);\n this.releaseKey(key);\n }\n });\n\n return {\n before,\n after: this.keyRefs.has(key),\n };\n }\n\n deleteKey(key: TKey): boolean {\n if (!this.keyRefs.has(key)) {\n return false;\n }\n\n this.subsets.forEach((subset) => {\n subset.keys.delete(key);\n });\n this.keyRefs.delete(key);\n return true;\n }\n\n release(subsetId: string, retain = false): Array<TKey> {\n const subset = this.subsets.get(subsetId);\n if (!subset) {\n return [];\n }\n\n subset.refs -= 1;\n if (subset.refs > 0) {\n return [];\n }\n\n subset.refs = 0;\n if (retain) {\n return [];\n }\n\n return this.expire(subsetId);\n }\n\n expire(subsetId: string): Array<TKey> {\n const subset = this.subsets.get(subsetId);\n if (!subset || subset.refs > 0) {\n return [];\n }\n\n this.subsets.delete(subsetId);\n return this.releaseKeys(subset.keys);\n }\n\n clear(): Array<TKey> {\n const keys = [...this.keyRefs.keys()];\n this.subsets.clear();\n this.keyRefs.clear();\n return keys;\n }\n\n private addKeys(keys: Set<TKey>): void {\n keys.forEach((key) => {\n this.keyRefs.set(key, (this.keyRefs.get(key) ?? 0) + 1);\n });\n }\n\n private releaseKeys(keys: Set<TKey>): Array<TKey> {\n const removed: Array<TKey> = [];\n keys.forEach((key) => {\n if (this.releaseKey(key)) {\n removed.push(key);\n }\n });\n return removed;\n }\n\n private releaseKey(key: TKey): boolean {\n const refs = (this.keyRefs.get(key) ?? 0) - 1;\n if (refs <= 0) {\n this.keyRefs.delete(key);\n return true;\n }\n\n this.keyRefs.set(key, refs);\n return false;\n }\n}\n\nexport function writeRows<T extends object, TKey extends string | number>(\n collection: Collection<T, TKey>,\n rows: Array<T>,\n getKey: (item: T) => TKey,\n write: Writer<T, TKey>,\n): void {\n for (const row of rows) {\n const key = getKey(row);\n write({\n type: collection.has(key) ? \"update\" : \"insert\",\n key,\n value: row,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>);\n }\n}\n\nfunction matchesFilters(row: unknown, filters: Array<ReadFilter>): boolean {\n return filters.every((filter) => matchesFilter(row, filter));\n}\n\nfunction matchesSubset<TKey extends string | number>(\n row: unknown,\n subset: SubsetState<TKey>,\n): boolean {\n return matchesFilters(row, subset.filters) && matchesPredicate(row, subset.predicate);\n}\n\nfunction matchesPredicate(row: unknown, predicate: ReadPredicate | undefined): boolean {\n if (!predicate) {\n return true;\n }\n\n if (predicate.type === \"comparison\") {\n return matchesFilter(row, predicate);\n }\n\n if (predicate.type === \"and\") {\n return predicate.predicates.every((child) => matchesPredicate(row, child));\n }\n\n return predicate.predicates.some((child) => matchesPredicate(row, child));\n}\n\nfunction matchesFilter(row: unknown, filter: ReadFilter): boolean {\n const value = valueAtPath(row, filter.field);\n\n switch (filter.op) {\n case \"eq\":\n return value === filter.value;\n case \"ne\":\n return value !== filter.value;\n case \"gt\":\n return compareValues(value, filter.value, (left, right) => left > right);\n case \"gte\":\n return compareValues(value, filter.value, (left, right) => left >= right);\n case \"lt\":\n return compareValues(value, filter.value, (left, right) => left < right);\n case \"lte\":\n return compareValues(value, filter.value, (left, right) => left <= right);\n case \"in\":\n return Array.isArray(filter.value) && filter.value.includes(value);\n }\n\n return false;\n}\n\nfunction compareValues(\n left: unknown,\n right: unknown,\n compare: (left: number | string, right: number | string) => boolean,\n): boolean {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return compare(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n return compare(left, right);\n }\n\n return false;\n}\n\nfunction valueAtPath(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, segment) => {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[segment];\n }, row);\n}\n","import type {\n CollectionConfig,\n InferSchemaOutput,\n LoadSubsetOptions,\n TransactionWithMutations,\n} from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { createBatch, toChangeMessage } from \"./batch\";\nimport { acquireSharedClient } from \"./client\";\nimport { initialReadQuery, readQueryForSubset, subsetId } from \"./read-query\";\nimport type { CollectionOptions } from \"./types\";\nimport { SubsetTracker, writeRows } from \"./subsets\";\n\nexport function collectionOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number = string | number,\n>(\n options: CollectionOptions<InferSchemaOutput<TSchema>, TKey, TSchema> & {\n schema: TSchema;\n },\n): CollectionConfig<InferSchemaOutput<TSchema>, TKey, TSchema> & {\n schema: TSchema;\n};\n\nexport function collectionOptions<T extends object, TKey extends string | number = string | number>(\n options: CollectionOptions<T, TKey, never> & {\n schema?: never;\n },\n): CollectionConfig<T, TKey, never> & {\n schema?: never;\n};\n\nexport function collectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n>(options: CollectionOptions<T, TKey, TSchema>): CollectionConfig<T, TKey, TSchema> {\n let lease: ReturnType<typeof acquireSharedClient> | undefined;\n let client = options.client;\n let activeSubsets: SubsetTracker<T, TKey> | undefined;\n\n if (!client) {\n if (!options.url) {\n throw new Error(\"collectionOptions requires either client or url\");\n }\n\n lease = acquireSharedClient({\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n client = lease.client;\n }\n\n return {\n ...(options.id ? { id: options.id } : {}),\n ...(options.gcTime !== undefined ? { gcTime: options.gcTime } : {}),\n ...(options.schema ? { schema: options.schema } : {}),\n ...(options.startSync !== undefined ? { startSync: options.startSync } : {}),\n ...(options.syncMode ? { syncMode: options.syncMode } : {}),\n ...(options.autoIndex !== undefined ? { autoIndex: options.autoIndex } : {}),\n ...(options.defaultIndexType !== undefined\n ? { defaultIndexType: options.defaultIndexType }\n : {}),\n getKey: options.getKey,\n sync: {\n sync: ({ begin, write, commit, markReady, collection }) => {\n const subsets = new SubsetTracker<T, TKey>(options.getKey);\n activeSubsets = subsets;\n const subsetGcTime = options.gcTime ?? 300000;\n const retentionTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const deleteKeys = (keys: Array<TKey>) => {\n if (keys.length === 0) return;\n\n begin();\n for (const key of keys) {\n write({ type: \"delete\", key });\n }\n commit();\n };\n const cancelRetention = (id: string) => {\n const timer = retentionTimers.get(id);\n if (!timer) return;\n\n clearTimeout(timer);\n retentionTimers.delete(id);\n };\n const scheduleRetention = (id: string) => {\n if (!Number.isFinite(subsetGcTime)) {\n return;\n }\n\n if (subsetGcTime <= 0) {\n deleteKeys(subsets.expire(id));\n return;\n }\n\n cancelRetention(id);\n retentionTimers.set(\n id,\n setTimeout(() => {\n retentionTimers.delete(id);\n deleteKeys(subsets.expire(id));\n }, subsetGcTime),\n );\n };\n const subscription = client.subscribe(options.collection, (broadcast) => {\n if ((broadcast.invalidations ?? []).length > 0 && options.syncMode === \"on-demand\") {\n deleteKeys(subsets.clear());\n }\n\n const changes = broadcast.updates.flatMap((update) => {\n if (update.collection !== options.collection) return [];\n const ownUpdate = update.clientId === client.clientId;\n if ((options.ignoreOwnUpdates ?? false) && ownUpdate) {\n return [];\n }\n\n if (options.syncMode !== \"on-demand\") {\n return [toChangeMessage<T, TKey>(update, collection.has(update.key as TKey))];\n }\n\n const key = update.key as TKey;\n const exists = collection.has(key);\n if (update.type === \"delete\") {\n subsets.deleteKey(key);\n return exists ? [{ type: \"delete\" as const, key }] : [];\n }\n\n const current = collection.get(key) as T | undefined;\n const row =\n update.type === \"update\" && current\n ? ({ ...current, ...(update.value as Partial<T>) } as T)\n : (update.value as T);\n const tracked = subsets.reconcileRow(row);\n\n if (ownUpdate || exists || tracked.after) {\n return [toChangeMessage<T, TKey>(update, exists)];\n }\n\n return [];\n });\n\n if (changes.length === 0) {\n return;\n }\n\n begin();\n for (const change of changes) {\n write(change);\n }\n commit();\n });\n\n const readSubset = (subsetOptions: LoadSubsetOptions): true | Promise<void> => {\n const id = subsetId(subsetOptions);\n cancelRetention(id);\n const retained = subsets.retain(id);\n if (retained.loaded) {\n return true;\n }\n\n return (async () => {\n const query = readQueryForSubset(\n options.collection,\n options.read === false ? undefined : options.read,\n subsetOptions,\n );\n await subscription.ready;\n const result = await client.read<T>(query);\n const removedKeys = subsets.replace(\n id,\n result.rows,\n query.filters ?? [],\n query.predicate,\n );\n\n begin();\n writeRows(collection, result.rows, options.getKey, write);\n for (const key of removedKeys) {\n write({ type: \"delete\", key });\n }\n commit();\n })().catch((error: unknown) => {\n deleteKeys(subsets.release(id));\n throw error;\n });\n };\n\n if (options.syncMode === \"on-demand\") {\n markReady();\n return {\n loadSubset: readSubset,\n unloadSubset: (subsetOptions: LoadSubsetOptions) => {\n const id = subsetId(subsetOptions);\n const removedKeys = subsets.release(id, subsetGcTime !== 0);\n deleteKeys(removedKeys);\n if (removedKeys.length === 0) scheduleRetention(id);\n },\n cleanup: () => {\n retentionTimers.forEach((timer) => {\n clearTimeout(timer);\n });\n retentionTimers.clear();\n subsets.clear();\n if (activeSubsets === subsets) {\n activeSubsets = undefined;\n }\n subscription.unsubscribe();\n lease?.release();\n },\n };\n }\n\n const initialQuery = initialReadQuery(options.collection, options.read);\n if (!initialQuery) {\n void subscription.ready.then(() => {\n markReady();\n });\n } else {\n void subscription.ready\n .then(() => client.read<T>(initialQuery))\n .then((result) => {\n if (result.rows.length > 0) {\n begin();\n writeRows(collection, result.rows, options.getKey, write);\n commit();\n }\n markReady();\n });\n }\n\n return () => {\n if (activeSubsets === subsets) {\n activeSubsets = undefined;\n }\n subscription.unsubscribe();\n lease?.release();\n };\n },\n rowUpdateMode: \"partial\",\n },\n onInsert: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n onUpdate: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n onDelete: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n } as CollectionConfig<T, TKey, TSchema>;\n}\n\nfunction trackLocalTransaction<T extends object, TKey extends string | number>(\n subsets: SubsetTracker<T, TKey> | undefined,\n syncMode: CollectionConfig<T, TKey>[\"syncMode\"],\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): void {\n if (syncMode !== \"on-demand\" || !subsets) {\n return;\n }\n\n for (const mutation of transaction.mutations) {\n if (mutation.type === \"delete\") {\n subsets.deleteKey(mutation.key as TKey);\n continue;\n }\n\n subsets.reconcileRow(mutation.modified as T);\n }\n}\n","export type CollectionScopeParams = Record<string, string | number>;\n\nexport function collectionScope(path: string, params: CollectionScopeParams): string {\n const segments = collectionPathSegments(path).map((segment) => segmentValue(segment, params));\n return `/${segments.map(normalizeSegment).join(\"/\")}/`;\n}\n\nexport function firstNewPathParam(\n childPath: string | undefined,\n parentPath: string,\n): string | undefined {\n if (!childPath) return undefined;\n\n const parentParams = new Set(pathParams(parentPath));\n return pathParams(childPath).find((param) => !parentParams.has(param));\n}\n\nexport function collectionPathSegments(path: string): Array<string> {\n return path\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n}\n\nexport function collectionPathParamName(segment: string): string | undefined {\n return (\n segment.match(/^\\{([A-Za-z_][A-Za-z0-9_]*)\\}$/)?.[1] ??\n segment.match(/^:([A-Za-z_][A-Za-z0-9_]*)$/)?.[1]\n );\n}\n\nexport function isCollectionPathParam(segment: string): boolean {\n return collectionPathParamName(segment) !== undefined;\n}\n\nfunction segmentValue(segment: string, params: CollectionScopeParams): string {\n const param = collectionPathParamName(segment);\n if (!param) return segment;\n\n const value = params[param];\n if (value === undefined) {\n throw new Error(`Missing collection path parameter: ${param}`);\n }\n\n return String(value);\n}\n\nfunction pathParams(path: string): Array<string> {\n return collectionPathSegments(path).flatMap((segment) => {\n const param = collectionPathParamName(segment);\n return param ? [param] : [];\n });\n}\n\nfunction normalizeSegment(segment: string): string {\n return encodeURIComponent(decodeURIComponent(segment));\n}\n","import { collectionPathSegments, isCollectionPathParam } from \"./collection-path\";\n\nexport function defaultCollectionApiPath(path: string, name: string): string {\n const prefix = collectionPathSegments(path)\n .filter((segment) => !isCollectionPathParam(segment))\n .join(\".\");\n\n return prefix ? `${prefix}.${name}` : name;\n}\n","import { createCollection, type Collection, type InferSchemaOutput } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { collectionScope, firstNewPathParam, type CollectionScopeParams } from \"./collection-path\";\nimport { collectionOptions } from \"./collection\";\nimport { acquireSharedClient } from \"./client\";\nimport { defaultCollectionApiPath } from \"./collection-api\";\nimport type {\n ChildCollectionTypeOptions,\n ChildManagers,\n CollectionApiMethod,\n CollectionApiMethods,\n CollectionTypeApi,\n CollectionCache,\n CollectionCacheEntry,\n CollectionEntity,\n CollectionType,\n CollectionTypeBaseOptions,\n CollectionTypeChildren,\n CollectionTypeConnection,\n CollectionTypeId,\n CollectionTypeOptions,\n CollectionUsage,\n OptionalCollectionTypeConnection,\n} from \"./collection-type-types\";\nimport type { ApiContract, Client } from \"./types\";\n\nexport type { CollectionScopeParams };\nexport type {\n ChildCollectionTypeOptions,\n CollectionApiHandler,\n CollectionApiHandlerArgs,\n CollectionApiMethod,\n CollectionApiMethods,\n CollectionTypeApi,\n CollectionEntity,\n CollectionType,\n CollectionTypeOptions,\n CollectionUsage,\n} from \"./collection-type-types\";\n\nexport function createCollectionTypeFromOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number = string | number,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<InferSchemaOutput<TSchema>, TKey> = {},\n>(\n options: CollectionTypeOptions<InferSchemaOutput<TSchema>, TKey, TSchema, TChildren, TApi> & {\n schema: TSchema;\n },\n): CollectionType<InferSchemaOutput<TSchema>, TKey, TChildren, TApi>;\n\nexport function createCollectionTypeFromOptions<\n T extends object,\n TKey extends string | number = string | number,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n>(\n options: CollectionTypeOptions<T, TKey, never, TChildren, TApi> & {\n schema?: never;\n },\n): CollectionType<T, TKey, TChildren, TApi>;\n\nexport function createCollectionTypeFromOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n>(\n options: CollectionTypeOptions<T, TKey, TSchema, TChildren, TApi>,\n): CollectionType<T, TKey, TChildren, TApi> {\n const connection = connectionFrom(options);\n\n if (!connection) {\n throw new Error(\"CollectionTypes.builder requires either client or url\");\n }\n\n return new CollectionTypeManager<T, TKey, TSchema, TChildren, TApi>(\n options,\n connection,\n {},\n new Map(),\n ).api();\n}\n\nclass CollectionTypeManager<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren,\n TApi extends CollectionTypeApi<T, TKey> = {},\n> {\n constructor(\n private readonly options: CollectionTypeBaseOptions<T, TKey, TSchema, TChildren, TApi>,\n private readonly connection: CollectionTypeConnection,\n private readonly params: CollectionScopeParams,\n private readonly cache: CollectionCache,\n ) {}\n\n api(): CollectionType<T, TKey, TChildren, TApi> {\n const base = {\n all: (params: CollectionScopeParams = {}) => this.all(params),\n delete: (...args: Parameters<Collection<T, TKey>[\"delete\"]>) => this.all({}).delete(...args),\n insert: (...args: Parameters<Collection<T, TKey>[\"insert\"]>) => this.all({}).insert(...args),\n with: (params: CollectionScopeParams) => this.with(params),\n withId: (id: TKey, childParam?: string) => this.withId(id, childParam),\n update: (...args: Parameters<Collection<T, TKey>[\"update\"]>) => this.all({}).update(...args),\n usage: () => this.usage(),\n };\n const withApi = withApiMethods(base, this.apiMethods());\n return withChildren(withApi, this.childManagers(this.params)) as CollectionType<\n T,\n TKey,\n TChildren,\n TApi\n >;\n }\n\n private all(params: CollectionScopeParams): Collection<T, TKey> {\n const scope = collectionScope(this.options.path, { ...this.params, ...params });\n const key = `${this.options.path}\\n${scope}`;\n const existing = this.cache.get(key) as CollectionCacheEntry<T, TKey> | undefined;\n\n if (existing) {\n existing.usage.accessCount += 1;\n existing.usage.lastAccessedAt = Date.now();\n return existing.collection;\n }\n\n const id = collectionId(this.options.id, this.options.path, scope);\n const collection = createCollection(\n collectionOptions({\n ...collectionConfig(this.options),\n ...this.connection,\n id,\n collection: scope,\n } as any),\n ) as unknown as Collection<T, TKey>;\n\n const usage = {\n id,\n path: this.options.path,\n scope,\n accessCount: 1,\n createdAt: Date.now(),\n lastAccessedAt: Date.now(),\n };\n\n this.cache.set(key, { collection, usage });\n return collection;\n }\n\n private with(params: CollectionScopeParams): CollectionType<T, TKey, TChildren, TApi> {\n return new CollectionTypeManager(\n this.options,\n this.connection,\n { ...this.params, ...params },\n this.cache,\n ).api();\n }\n\n private withId(id: TKey, childParam?: string): CollectionEntity<T, TKey, TChildren> {\n const base = {\n all: () => this.all({}),\n delete: (config?: Parameters<Collection<T, TKey>[\"delete\"]>[1]) =>\n this.all({}).delete(id, config),\n get: () => this.all({}).get(id),\n update: (...args: Array<unknown>) => this.all({}).update(id, ...(args as [any, any])),\n };\n return withChildren(\n base,\n this.childManagers(this.childParams(id, childParam)),\n ) as CollectionEntity<T, TKey, TChildren>;\n }\n\n private usage(): Array<CollectionUsage> {\n return [...this.cache.values()].map((entry) => ({ ...entry.usage }));\n }\n\n private apiMethods(): CollectionApiMethods<TApi> {\n return Object.fromEntries(\n Object.entries(this.options.api ?? {}).map(([name, method]) => [\n name,\n (...args: Array<unknown>) => this.callApi(name, method, args[0]),\n ]),\n ) as CollectionApiMethods<TApi>;\n }\n\n private async callApi(\n name: string,\n method: CollectionApiMethod<unknown, unknown, T, TKey>,\n input: unknown,\n ): Promise<unknown> {\n if (method.handler) {\n const scope = collectionScope(this.options.path, this.params);\n return method.handler({\n input,\n collection: this.all({}),\n params: this.params,\n scope,\n });\n }\n\n const path = method.path ?? defaultCollectionApiPath(this.options.path, name);\n const lease = this.connection.client ? undefined : acquireSharedClient(this.connection);\n const client = (this.connection.client ?? lease?.client) as Client<ApiContract>;\n\n try {\n return await client.call(path, input);\n } finally {\n lease?.release();\n }\n }\n\n private childManagers(params: CollectionScopeParams): ChildManagers<TChildren> {\n const children = (this.options.children ?? {}) as CollectionTypeChildren;\n return Object.fromEntries(\n Object.entries(children).map(([name, child]) => [\n name,\n new CollectionTypeManager<any, any, any, any>(\n child,\n connectionFrom(child) ?? this.connection,\n params,\n this.cache,\n ).api(),\n ]),\n ) as ChildManagers<TChildren>;\n }\n\n private childParams(id: TKey, childParam?: string): CollectionScopeParams {\n const param = childParam ?? firstChildParam(this.options);\n return param ? { ...this.params, [param]: id } : this.params;\n }\n}\n\nfunction collectionConfig<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n>(options: CollectionTypeBaseOptions<T, TKey, TSchema, any, any>) {\n const { api, children, id, name, parentParam, path, ...config } = options;\n void api;\n void children;\n void id;\n void name;\n void parentParam;\n void path;\n return config;\n}\n\nfunction withChildren<TTarget extends object, TChildren extends CollectionTypeChildren>(\n target: TTarget,\n children: ChildManagers<TChildren>,\n): TTarget & ChildManagers<TChildren> {\n return Object.assign(target, children);\n}\n\nfunction withApiMethods<TTarget extends object, TApi extends CollectionTypeApi<any, any>>(\n target: TTarget,\n api: CollectionApiMethods<TApi>,\n): TTarget & CollectionApiMethods<TApi> {\n for (const name of Object.keys(api)) {\n if (name in target) {\n throw new Error(`Collection API method conflicts with existing property: ${name}`);\n }\n }\n\n return Object.assign(target, api);\n}\n\nfunction connectionFrom(\n options: OptionalCollectionTypeConnection,\n): CollectionTypeConnection | undefined {\n if (options.client) {\n return { client: options.client };\n }\n\n if (options.url) {\n return {\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n };\n }\n\n return undefined;\n}\n\nfunction collectionId(id: CollectionTypeId | undefined, path: string, scope: string): string {\n return typeof id === \"function\" ? id({ path, scope }) : (id ?? scope);\n}\n\nfunction firstChildParam(\n options: CollectionTypeBaseOptions<any, any, any, any, any>,\n): string | undefined {\n const child = Object.values(options.children ?? {})[0] as\n | ChildCollectionTypeOptions<any, any, any, any, any>\n | undefined;\n return child?.parentParam ?? firstNewPathParam(child?.path, options.path);\n}\n","import type { BaseCollectionConfig } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n ApiDefinition,\n CollectionAtPath,\n CollectionDefinition,\n CollectionDefinitions,\n CollectionPath,\n CollectionSet,\n} from \"@lsync/definitions\";\nimport { createCollectionTypeFromOptions } from \"./collection-type\";\nimport type {\n ChildCollectionTypeOptions,\n CollectionApiMethod,\n CollectionType,\n CollectionTypeApi,\n CollectionTypeConnection,\n} from \"./collection-type-types\";\nimport type { Client } from \"./types\";\n\ntype BuilderIndexMode = NonNullable<BaseCollectionConfig<any, any, any>[\"autoIndex\"]>;\ntype BuilderIndexType = BaseCollectionConfig<any, any, any>[\"defaultIndexType\"];\ntype BuilderSyncMode = \"eager\" | \"on-demand\";\n\nexport function collectionTypesFrom<TCollections extends CollectionDefinitions>(\n definitions: CollectionSet<TCollections>,\n): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(definitions.collections, {}, undefined);\n}\n\nexport class DefinitionCollectionTypesBuilder<TCollections extends CollectionDefinitions> {\n constructor(\n private readonly definitions: TCollections,\n private readonly overrides: Record<string, ClientCollectionOverride>,\n private readonly connection: CollectionTypeConnection | undefined,\n ) {}\n\n client(client: Client): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(this.definitions, this.overrides, { client });\n }\n\n url(\n url: string | URL,\n options: { clientId?: string } = {},\n ): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(this.definitions, this.overrides, {\n url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n }\n\n collection<TPath extends CollectionPath<TCollections>>(\n path: TPath,\n configure: (\n collection: ClientCollectionBuilder<CollectionAtPath<TCollections, TPath>>,\n ) => ClientCollectionBuilder<CollectionAtPath<TCollections, TPath>>,\n ): DefinitionCollectionTypesBuilder<TCollections> {\n const override = configure(new ClientCollectionBuilder({})).toOverride();\n return new DefinitionCollectionTypesBuilder(\n this.definitions,\n { ...this.overrides, [path]: override },\n this.connection,\n );\n }\n\n build(): CollectionManagers<TCollections> {\n if (!this.connection) {\n throw new Error(\"CollectionTypes.from requires either client or url\");\n }\n\n return Object.fromEntries(\n Object.entries(this.definitions).map(([name, definition]) => [\n name,\n collectionTypeFromDefinition(definition, name, this.overrides, this.connection!),\n ]),\n ) as CollectionManagers<TCollections>;\n }\n}\n\nexport class ClientCollectionBuilder<TDefinition> {\n constructor(private readonly override: ClientCollectionOverride) {}\n\n sync(syncMode: BuilderSyncMode): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({ ...this.override, syncMode });\n }\n\n index(\n autoIndex: BuilderIndexMode,\n defaultIndexType?: BuilderIndexType,\n ): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({\n ...this.override,\n autoIndex,\n ...(defaultIndexType ? { defaultIndexType } : {}),\n });\n }\n\n toOverride(): ClientCollectionOverride {\n return this.override;\n }\n}\n\nexport type CollectionManagers<TCollections extends CollectionDefinitions> = {\n [TName in keyof TCollections]: CollectionTypeForDefinition<TCollections[TName]>;\n};\n\ntype CollectionTypeForDefinition<TDefinition> =\n TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi>\n ? CollectionType<\n TRow,\n Extract<TRow[TKey], string | number>,\n ChildOptionsForDefinitions<TChildren>,\n ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>\n >\n : never;\n\ntype ChildOptionsForDefinitions<TChildren extends CollectionDefinitions> = {\n [TName in keyof TChildren]: ChildOptionForDefinition<TChildren[TName]>;\n};\n\ntype ChildOptionForDefinition<TDefinition> =\n TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi>\n ? ChildCollectionTypeOptions<\n TRow,\n Extract<TRow[TKey], string | number>,\n StandardSchemaV1,\n ChildOptionsForDefinitions<TChildren>,\n ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>\n >\n : never;\n\ntype ApiMethodsForDefinitions<\n TApi extends Record<string, ApiDefinition<any, any>>,\n TRow extends object,\n TKey extends string | number,\n> = {\n [TName in keyof TApi]: TApi[TName] extends ApiDefinition<infer TInput, infer TOutput>\n ? CollectionApiMethod<TInput, TOutput, TRow, TKey>\n : never;\n};\n\ninterface ClientCollectionOverride {\n syncMode?: BuilderSyncMode;\n autoIndex?: BuilderIndexMode;\n defaultIndexType?: BuilderIndexType;\n}\n\nfunction collectionTypeFromDefinition(\n definition: CollectionDefinition,\n dotPath: string,\n overrides: Record<string, ClientCollectionOverride>,\n connection: CollectionTypeConnection,\n): CollectionType<any, any, any, any> {\n return createCollectionTypeFromOptions({\n ...collectionOptionsFromDefinition(definition, dotPath, overrides),\n ...connection,\n } as any);\n}\n\nfunction collectionOptionsFromDefinition(\n definition: CollectionDefinition,\n dotPath: string,\n overrides: Record<string, ClientCollectionOverride>,\n): Record<string, unknown> {\n return {\n ...overrides[dotPath],\n name: definition.name,\n path: definition.path,\n schema: definition.schema,\n getKey: (item: Record<string, unknown>) => item[definition.key],\n children: Object.fromEntries(\n Object.entries(definition.children).map(([name, child]) => [\n name,\n collectionOptionsFromDefinition(child, `${dotPath}.${name}`, overrides),\n ]),\n ),\n api: Object.fromEntries(\n Object.entries(definition.api).map(([name, api]) => [\n name,\n api.path ? { path: api.path } : {},\n ]),\n ) satisfies CollectionTypeApi<any, any>,\n };\n}\n","export function rootPathForName(name: string): string {\n return `/${encodeURIComponent(name)}/`;\n}\n\nexport function childPathForName(parentPath: string, parentParam: string, name: string): string {\n return `${parentPath.replace(/\\/+$/g, \"\")}/{${parentParam}}/${encodeURIComponent(name)}/`;\n}\n\nexport function parentIdParamForName(name: string): string {\n return `${name}Id`;\n}\n","export function cloneImmutable(value: unknown): unknown {\n if (Array.isArray(value)) {\n return Object.freeze(value.map(cloneImmutable));\n }\n\n if (!isPlainObject(value)) {\n return value;\n }\n\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).map(([nestedKey, nestedValue]) => [\n nestedKey,\n cloneImmutable(nestedValue),\n ]),\n ),\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false;\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n","import { cloneImmutable } from \"./immutable\";\nimport type { CollectionApiMethod, CollectionTypeApi } from \"./collection-type-types\";\n\nexport type BuilderState = Record<string, unknown> & {\n api?: CollectionTypeApi<any, any>;\n name?: string;\n path?: string;\n};\n\nexport function freezeBuilderState(state: BuilderState): Readonly<BuilderState> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(state)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, copyBuilderStateValue(key, value)]),\n ) as BuilderState,\n );\n}\n\nfunction copyBuilderStateValue(key: string, value: unknown): unknown {\n if (key === \"api\" && isApiMap(value)) {\n return freezeApiMap(value);\n }\n\n if (key === \"url\" && value instanceof URL) {\n return value.toString();\n }\n\n return cloneImmutable(value);\n}\n\nfunction freezeApiMap(api: CollectionTypeApi<any, any>): CollectionTypeApi<any, any> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(api).map(([name, method]) => [name, freezeApiMethod(method)]),\n ),\n );\n}\n\nfunction freezeApiMethod<\n TInput,\n TOutput,\n T extends object = any,\n TKey extends string | number = any,\n>(\n method: CollectionApiMethod<TInput, TOutput, T, TKey>,\n): CollectionApiMethod<TInput, TOutput, T, TKey> {\n return Object.freeze({ ...method });\n}\n\nfunction isApiMap(value: unknown): value is CollectionTypeApi<any, any> {\n return typeof value === \"object\" && value !== null;\n}\n","import type { BaseCollectionConfig, Collection, InferSchemaOutput } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { childPathForName, parentIdParamForName, rootPathForName } from \"./collection-name\";\nimport { createCollectionTypeFromOptions } from \"./collection-type\";\nimport { freezeBuilderState, type BuilderState } from \"./collection-type-builder-state\";\nimport type {\n ChildCollectionTypeOptions,\n CollectionApiHandlerArgs,\n CollectionApiMethod,\n CollectionType as CollectionTypeInstance,\n CollectionTypeApi,\n CollectionTypeChildren,\n} from \"./collection-type-types\";\nimport type { Client } from \"./types\";\nimport { collectionTypesFrom } from \"./definition-builder\";\n\ntype BuilderApiContext<TInput, T extends object, TKey extends string | number> = Omit<\n CollectionApiHandlerArgs<TInput, T, TKey>,\n \"input\"\n>;\n\ntype BuilderApiHandler<TInput, TOutput, T extends object, TKey extends string | number> = (\n input: TInput,\n context: BuilderApiContext<TInput, T, TKey>,\n) => TOutput | Promise<TOutput>;\n\ntype BuilderSyncMode = \"eager\" | \"on-demand\";\ntype BuilderIndexMode = NonNullable<BaseCollectionConfig<any, any, any>[\"autoIndex\"]>;\ntype BuilderIndexType = BaseCollectionConfig<any, any, any>[\"defaultIndexType\"];\n\nexport function collectionTypeBuilder(): Pick<\n CollectionTypeBuilder<InferSchemaOutput<StandardSchemaV1>, \"\", StandardSchemaV1>,\n \"name\"\n> {\n return new CollectionTypeBuilder({});\n}\n\nexport const CollectionTypes = {\n builder: collectionTypeBuilder,\n from: collectionTypesFrom,\n};\n\nexport class CollectionTypeBuilder<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n> {\n private readonly state: Readonly<BuilderState>;\n\n constructor(state: BuilderState) {\n this.state = freezeBuilderState(state);\n }\n\n client(client: Client): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi> {\n return this.next({ client, url: undefined, clientId: undefined });\n }\n\n url(\n url: string | URL,\n options: { clientId?: string } = {},\n ): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi> {\n return this.next({\n client: undefined,\n url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n }\n\n name(name: string): Pick<CollectionTypeBuilder<T, TKey, TSchema, TChildren>, \"schema\"> {\n return this.next({ name, path: rootPathForName(name) }) as unknown as CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren\n >;\n }\n\n schema<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n ): Omit<\n CollectionTypeBuilder<InferSchemaOutput<TSchema>, TKey, TSchema, TChildren>,\n \"name\" | \"schema\"\n > {\n return this.next({ schema }) as unknown as CollectionTypeBuilder<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TChildren\n >;\n }\n\n sync(syncMode: BuilderSyncMode): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi> {\n return this.next({ syncMode });\n }\n\n index(\n autoIndex: BuilderIndexMode,\n defaultIndexType?: BuilderIndexType,\n ): CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi> {\n return this.next({\n autoIndex,\n ...(defaultIndexType ? { defaultIndexType } : {}),\n });\n }\n\n child<TName extends string, TBuilder extends CollectionTypeBuilder<any, any, any, any, any>>(\n name: TName,\n configure: (\n builder: Pick<\n CollectionTypeBuilder<InferSchemaOutput<StandardSchemaV1>, \"\", StandardSchemaV1>,\n \"schema\"\n >,\n ) => TBuilder,\n ): CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren & Record<TName, ChildOptionsForBuilder<TBuilder>>,\n TApi\n > {\n const child = configure(this.childBuilder(name));\n const children =\n typeof this.state.children === \"object\" && this.state.children !== null\n ? this.state.children\n : {};\n return this.next({\n children: {\n ...children,\n [name]: child.state,\n },\n }) as unknown as CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren & Record<TName, ChildOptionsForBuilder<TBuilder>>,\n TApi\n >;\n }\n\n key<TKeyNext extends string | number>(\n getKey: (item: T) => TKeyNext,\n ): CollectionTypeBuilder<T, TKeyNext, TSchema, TChildren> {\n return this.next({ getKey }) as unknown as CollectionTypeBuilder<\n T,\n TKeyNext,\n TSchema,\n TChildren\n >;\n }\n\n api<TName extends string, TInput = undefined, TOutput = unknown>(\n name: TName,\n method?: CollectionApiMethod<TInput, TOutput, T, TKey>,\n ): CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren,\n TApi & Record<TName, CollectionApiMethod<TInput, TOutput, T, TKey>>\n >;\n api<TName extends string, TInput, TOutput>(\n name: TName,\n handler: BuilderApiHandler<TInput, TOutput, T, TKey>,\n ): CollectionTypeBuilder<\n T,\n TKey,\n TSchema,\n TChildren,\n TApi & Record<TName, CollectionApiMethod<TInput, TOutput, T, TKey>>\n >;\n api<TName extends string, TInput, TOutput>(\n name: TName,\n method?:\n | CollectionApiMethod<TInput, TOutput, T, TKey>\n | BuilderApiHandler<TInput, TOutput, T, TKey>,\n ) {\n const entry = typeof method === \"function\" ? localApiMethod(method) : (method ?? {});\n return this.next({\n api: {\n ...this.state.api,\n [name]: entry,\n },\n });\n }\n\n build(): CollectionTypeInstance<T, TKey, TChildren, TApi> {\n if (!this.state.name || !this.state.path) {\n throw new Error(\"CollectionTypes.builder requires a name\");\n }\n\n if (!this.state.getKey) {\n throw new Error(\"CollectionTypes.builder requires a key function\");\n }\n\n return createCollectionTypeFromOptions(this.state as any) as CollectionTypeInstance<\n T,\n TKey,\n TChildren,\n TApi\n >;\n }\n\n private next(updates: Partial<BuilderState>) {\n return new CollectionTypeBuilder<T, TKey, TSchema, TChildren, TApi>({\n ...this.state,\n ...updates,\n });\n }\n\n private childBuilder(\n name: string,\n ): Pick<\n CollectionTypeBuilder<InferSchemaOutput<StandardSchemaV1>, \"\", StandardSchemaV1>,\n \"schema\"\n > {\n if (!this.state.name || !this.state.path) {\n throw new Error(\"CollectionTypes.builder.child requires a parent name\");\n }\n\n const parentParam = parentIdParamForName(this.state.name);\n return new CollectionTypeBuilder({\n name,\n parentParam,\n path: childPathForName(this.state.path, parentParam, name),\n });\n }\n}\n\ntype ChildOptionsForBuilder<TBuilder> =\n TBuilder extends CollectionTypeBuilder<\n infer T,\n infer TKey,\n infer TSchema,\n infer TChildren,\n infer TApi\n >\n ? ChildCollectionTypeOptions<T, TKey, TSchema, TChildren, TApi>\n : never;\n\nfunction localApiMethod<TInput, TOutput, T extends object, TKey extends string | number>(\n handler: BuilderApiHandler<TInput, TOutput, T, TKey>,\n): CollectionApiMethod<TInput, TOutput, T, TKey> {\n return Object.freeze({\n handler: ({ input, collection, params, scope }: CollectionApiHandlerArgs<TInput, T, TKey>) =>\n handler(input, {\n collection: collection as Collection<T, TKey>,\n params,\n scope,\n }),\n });\n}\n"],"mappings":";;;;;AAOA,SAAgB,YACd,YACA,UACA,aACO;CACP,OAAO,EACL,SAAS,YAAY,UAAU,KAAK,aAAa,SAAS,YAAY,UAAU,QAAQ,CAAC,EAC3F;AACF;AAEA,SAAS,SACP,YACA,UACA,UACQ;CACR,MAAM,OAAO;EACX,IAAI,SAAS;EACb;EACA,KAAK,SAAS;EACd,MAAM,SAAS;EACf;EACA,WAAW,SAAS,UAAU,QAAQ;CACxC;CAEA,IAAI,SAAS,SAAS,UACpB,OAAO;EACL,GAAG;EACH,MAAM;EACN,eAAe,SAAS;CAC1B;CAGF,IAAI,SAAS,SAAS,UACpB,OAAO;EACL,GAAG;EACH,MAAM;EACN,OAAO,SAAS;EAChB,eAAe,SAAS;CAC1B;CAGF,OAAO;EACL,GAAG;EACH,MAAM;EACN,OAAO,SAAS;CAClB;AACF;AAEA,SAAgB,gBACd,QACA,UAC0C;CAC1C,IAAI,OAAO,SAAS,UAClB,OAAO;EACL,MAAM;EACN,KAAK,OAAO;CACd;CAUF,OAAO;EACL,MAPA,OAAO,SAAS,YAAY,aAAa,QACrC,WACA,OAAO,SAAS,YAAY,aAAa,OACvC,WACA,OAAO;EAIb,KAAK,OAAO;EACZ,OAAO,OAAO;CAChB;AACF;;;ACtEA,SAAgB,YACd,SACA,IAC4B;CAC5B,IAAI,OAAO,QAAQ,OAAO,KAAA,GACxB;CAGF,MAAM,MAAM,OAAO,EAAE;CACrB,MAAM,UAAU,QAAQ,IAAI,GAAG;CAC/B,QAAQ,OAAO,GAAG;CAClB,OAAO;AACT;AAEA,SAAgB,oBACd,IACA,IACkB;CAClB,IAAI,GAAG,SAAS,cAAc,GAAG,SAAS,QACxC,OAAO;EACL;EACA,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,OAAO,EACL,MAAM,GAAG,MACX;EACF;CACF;CAGF,IAAI,GAAG,SAAS,WAAW,GAAG,SAAS,QACrC,OAAO;EACL;EACA,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,OAAO,EACL,MAAM,GAAG,MACX;EACF;CACF;CAGF,IAAI,GAAG,SAAS,WAAW,GAAG,SAAS,WACrC,OAAO;EACL;EACA,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,OAAO,EACL,MAAM,GAAG,MACX;EACF;CACF;CAGF,IAAI,GAAG,SAAS,cAAc,GAAG,SAAS,OACxC,OAAO;EACL;EACA,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,OAAO,EACL,MAAM,GAAG,MACX;EACF;CACF;CAGF,MAAM,IAAI,MAAM,0BAA0B,GAAG,KAAK,GAAG,GAAG,MAAM;AAChE;AAEA,SAAgBA,kBAAgB,YAA4B;CAO1D,OAAO,IANU,WACd,KAAK,CAAC,CACN,QAAQ,cAAc,EAAE,CAAC,CACzB,MAAM,GAAG,CAAC,CACV,OAAO,OAEQ,CAAC,CAAC,IAAIC,kBAAgB,CAAC,CAAC,KAAK,GAAG,EAAE;AACtD;AAEA,SAASA,mBAAiB,SAAyB;CACjD,OAAO,mBAAmB,mBAAmB,OAAO,CAAC;AACvD;;;ACxEA,IAAa,sBAAb,MAAiC;CAGF;CAF7B,gCAAiC,IAAI,IAA+B;CAEpE,YAAY,UAAiD;EAAhC,KAAA,WAAA;CAAiC;CAE9D,UAAU,YAAoB,UAAoD;EAChF,MAAM,MAAMC,kBAAgB,UAAU;EACtC,IAAI,QAAQ,KAAK,cAAc,IAAI,GAAG;EACtC,MAAM,kBAAkB,CAAC;EAEzB,IAAI,CAAC,OAAO;GACV,QAAQ;IACN,YAAY;IACZ,2BAAW,IAAI,IAAI;IACnB,OAAO,QAAQ,QAAQ;GACzB;GACA,KAAK,cAAc,IAAI,KAAK,KAAK;EACnC;EAEA,MAAM,UAAU,IAAI,QAAQ;EAC5B,IAAI,iBACF,MAAM,QAAQ,KAAK,MAAM,KAAK;EAGhC,OAAO;GACL,OAAO,MAAM;GACb,mBAAmB,KAAK,YAAY,KAAK,QAAQ;EACnD;CACF;CAEA,MAAM,OAAO,IAA8B;EACzC,MAAM,QAAQ,IACZ,CAAC,GAAG,KAAK,cAAc,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,KAAK,kBAAkB,IAAI,KAAK,CAAC,CACnF;CACF;CAEA,SAAS,WAA4B;EACnC,MAAM,sCAAsB,IAAI,IAAkC;EAClE,MAAM,4CAA4B,IAAI,IAAqD;EAE3F,KAAK,MAAM,UAAU,UAAU,SAAS;GACtC,MAAM,aAAaA,kBAAgB,OAAO,UAAU;GACpD,MAAM,UAAU,oBAAoB,IAAI,UAAU,KAAK,CAAC;GACxD,QAAQ,KAAK,MAAM;GACnB,oBAAoB,IAAI,YAAY,OAAO;EAC7C;EAEA,KAAK,MAAM,gBAAgB,UAAU,iBAAiB,CAAC,GAAG;GACxD,MAAM,aAAaA,kBAAgB,aAAa,UAAU;GAC1D,MAAM,gBAAgB,0BAA0B,IAAI,UAAU,KAAK,CAAC;GACpE,cAAc,KAAK,YAAY;GAC/B,0BAA0B,IAAI,YAAY,aAAa;EACzD;EAEA,KAAK,MAAM,SAAS,KAAK,cAAc,OAAO,GAAG;GAC/C,MAAM,UAAU,oBAAoB,IAAIA,kBAAgB,MAAM,UAAU,CAAC;GACzE,MAAM,gBAAgB,0BAA0B,IAAIA,kBAAgB,MAAM,UAAU,CAAC;GACrF,KAAK,CAAC,WAAW,QAAQ,WAAW,OAAO,CAAC,iBAAiB,cAAc,WAAW,IACpF;GAGF,MAAM,kBAA6B;IACjC,GAAG;IACH,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;IACzC,SAAS,WAAW,CAAC;GACvB;GACA,KAAK,MAAM,YAAY,MAAM,WAC3B,SAAS,eAAe;EAE5B;CACF;CAEA,MAAc,OAAyC;EACrD,MAAM,SAAS,KAAK,SAAS,cAAc;EAC3C,OAAO,QAAQ,eAAe,UAAU,OACpC,KAAK,kBAAkB,QAAQ,KAAK,IACpC,KAAK,SAAS,KAAK,CAAC,CAAC,WAAW,KAAA,CAAS;CAC/C;CAEA,MAAc,kBAAkB,IAAe,OAAyC;EACtF,IAAI,KAAK,cAAc,IAAIA,kBAAgB,MAAM,UAAU,CAAC,MAAM,OAChE;EAIF,MAAM,cAAa,MADE,KAAK,SAAS,KAAK,IAAI,aAAa,MAAM,UAAU,EAAA,CAC/C;CAC5B;CAEA,YAAoB,KAAa,UAAsC;EACrE,MAAM,QAAQ,KAAK,cAAc,IAAI,GAAG;EACxC,IAAI,CAAC,OACH;EAGF,MAAM,UAAU,OAAO,QAAQ;EAC/B,IAAI,MAAM,UAAU,OAAO,GACzB;EAGF,KAAK,cAAc,OAAO,GAAG;EAC7B,MAAM,SAAS,KAAK,SAAS,cAAc;EAC3C,IAAI,QAAQ,eAAe,UAAU,MACnC,KAAU,SAAS,KAAK,QAAQ,eAAe,MAAM,UAAU;CAEnE;AACF;;;AC5FA,MAAM,gCAAgB,IAAI,IAA+B;AAEzD,SAAgB,aACd,SACc;CACd,MAAM,WAAW,QAAQ,YAAY,OAAO,WAAW;CACvD,MAAM,0BAAU,IAAI,IAA4B;CAChD,IAAI,SAAS;CACb,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,MAAM,OAAO,YAAgC;EAC3C,IAAI,QAAQ,eAAe,UAAU,MACnC,OAAO;EAGT,IAAI,gBACF,OAAO;EAGT,iBAAiB,IAAI,SAAS,SAAS,WAAW;GAChD,MAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;GAC/B,IAAI,aAAa,IAAI,YAAY,QAAQ;GACzC,MAAM,KAAK,IAAI,UAAU,GAAG;GAC5B,GAAG,aAAa;GAEhB,GAAG,iBAAiB,cAAc;IAChC,SAAS;IACT,cACG,OAAO,EAAE,CAAC,CACV,WAAW;KACV,iBAAiB,KAAA;KACjB,QAAQ,EAAE;IACZ,CAAC,CAAC,CACD,OAAO,UAAU;KAChB,iBAAiB,KAAA;KACjB,OAAO,KAAK;IACd,CAAC;GACL,CAAC;GAED,GAAG,iBAAiB,YAAY,UAAU;IACxC,MAAM,UAAU,mBAAmB,MAAM,IAAI;IAE7C,IAAI,YAAY,SAAS;KACvB,cAAc,SAAS,QAAQ,OAAO,MAAM,IAAI;KAChD;IACF;IAEA,IAAI,WAAW,SAAS;KACtB,MAAM,UAAU,YAAY,SAAS,QAAQ,EAAE;KAE/C,IAAI,CAAC,SACH;KAGF,QAAQ,OAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;KAC/C;IACF;IAEA,MAAM,UAAU,YAAY,SAAS,QAAQ,EAAE;IAE/C,IAAI,CAAC,SACH;IAGF,QAAQ,QAAQ,QAAQ,OAAO,KAAK,IAAI;GAC1C,CAAC;GAED,GAAG,iBAAiB,eAAe;IACjC,SAAS,KAAA;IACT,iBAAiB,KAAA;GACnB,CAAC;GAED,GAAG,iBAAiB,eAAe;IACjC,uBAAO,IAAI,MAAM,+BAA+B,CAAC;GACnD,CAAC;EACH,CAAC;EAED,OAAO;CACT;CAEA,MAAM,eAAwB,IAAe,YAAgD;EAC3F,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,KAAK,QAAQ;GACnB,IAAI,OAAO,QAAQ,OAAO,KAAA,GAAW;IACnC,uBAAO,IAAI,MAAM,4BAA4B,CAAC;IAC9C;GACF;GAEA,QAAQ,IAAI,OAAO,EAAE,GAAG;IACtB,UAAU,UAAU,QAAQ,KAAgB;IAC5C;GACF,CAAC;GAED,IAAI;IACF,qBAAqB,IAAI,OAAO;GAClC,SAAS,OAAO;IACd,QAAQ,OAAO,OAAO,EAAE,CAAC;IACzB,OAAO,KAAK;GACd;EACF,CAAC;CACH;CAEA,MAAM,0BAA0B,OAC9B,IACA,QACA,eACuC;EACvC,MAAM,KAAK,OAAO,QAAQ;EAC1B,OAAO,YAAuC,IAAI;GAChD;GACA;GACA,QAAQ,EACN,OAAO,EACL,MAAM,EACJ,WACF,EACF,EACF;EACF,CAAC;CACH;CAEA,gBAAgB,IAAI,oBAAoB;EACtC,qBAAqB;EACrB;EACA,MAAM;CACR,CAAC;CAED,MAAM,aAA+B;EACnC,QAAQ,EAAE,SACR,YAAY,aAAa;GACvB,IAAI,YAAY;GAEhB,KAAK,CAAC,CACH,MAAM,OAAO;IACZ,IAAI,WAAW;IAEf,MAAM,KAAK,OAAO,QAAQ;IAC1B,YAAY,IAAI,oBAAoB,IAAI,EAAE,CAAC,CAAC,CACzC,MAAM,UAAU;KACf,SAAS,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,EAAE,CAAC;KACzC,SAAS,SAAS;IACpB,CAAC,CAAC,CACD,OAAO,UAAU,SAAS,MAAM,KAAc,CAAC;GACpD,CAAC,CAAC,CACD,OAAO,UAAU,SAAS,MAAM,KAAc,CAAC;GAElD,aAAa;IACX,YAAY;GACd;EACF,CAAC;CACL;CAEA,MAAM,OAAO,sBAA8B,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;CAe5D,OAAO;EACL;EACA,OAAO,UAAU,KAAK,KAAK,OAAO,KAAK;EACvC,OAAO,UAAU,KAAK,KAAK,MAAM,KAAK;EACtC,UAAU,UAAU,KAAK,QAAQ,MAAM,KAAK;EAC5C,OAAoC,MAAa,GAAG,SAAmC;GACrF,MAAM,CAAC,SAAS;GAChB,MAAM,OAAO,UAAU,KAAA,IAAY,EAAE,KAAK,IAAI;IAAE;IAAM;GAAM;GAC5D,OAAO,KAAK,IAAI,OAA+B,IAAI;EACrD;EACA,YAAY,YAAY,aAAa,cAAc,UAAU,YAAY,QAAQ;EACjF,QAAQ;GACN,QAAQ,MAAM;GACd,SAAS,KAAA;EACX;CACF;AACF;AAEA,SAAgB,oBACd,SACyB;CACzB,MAAM,MAAM,gBAAgB,OAAO;CACnC,IAAI,QAAQ,cAAc,IAAI,GAAG;CAEjC,IAAI,CAAC,OAAO;EACV,QAAQ;GACN,QAAQ,aAAa;IACnB,KAAK,QAAQ;IACb,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;GAC3D,CAAC;GACD,MAAM;EACR;EACA,cAAc,IAAI,KAAK,KAAK;CAC9B;CAEA,MAAM,QAAQ;CAEd,IAAI,WAAW;CACf,OAAO;EACL,QAAQ,MAAM;EACd,UAAU;GACR,IAAI,UACF;GAGF,WAAW;GACX,MAAM,QAAQ;GAEd,IAAI,MAAM,SAAS,KAAK,cAAc,IAAI,GAAG,MAAM,OAAO;IACxD,cAAc,OAAO,GAAG;IACxB,MAAM,OAAO,MAAM;GACrB;EACF;CACF;AACF;AAEA,SAAS,gBAAgB,SAAgC;CACvD,MAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;CAC/B,IAAI,aAAa,OAAO,UAAU;CAClC,OAAO,GAAG,IAAI,SAAS,EAAE,IAAI,QAAQ,YAAY;AACnD;;;ACjQA,SAAgB,iBACd,YACA,MACuB;CACvB,IAAI,SAAS,OACX;CAGF,OAAO;EACL;EACA,GAAG;CACL;AACF;AAEA,SAAgB,SAAS,SAAoC;CAC3D,OAAO,KAAK,UAAU;EACpB,QAAQ,QAAQ,SACZ;GACE,cAAc,gBAAgB,QAAQ,OAAO,YAAY;GACzD,WAAW,gBAAgB,QAAQ,OAAO,SAAS;EACrD,IACA,KAAA;EACJ,WAAW,QAAQ,QAAQ,gBAAgB,QAAQ,KAAK,IAAI,KAAA;EAC5D,OAAO,QAAQ;EACf,QAAQ,QAAQ;EAChB,SAAS,kBAAkB,QAAQ,OAAO;CAC5C,CAAC;AACH;AAEA,SAAgB,mBACd,YACA,UACA,SACW;CACX,MAAM,QAAmB;EACvB;EACA,GAAG;EACH,SAAS,CAAC,GAAI,UAAU,WAAW,CAAC,CAAE;CACxC;CAEA,MAAM,YAAY,kBAChB,UAAU,WACV,QAAQ,QAAQ,gBAAgB,QAAQ,KAAK,IAAI,KAAA,CACnD;CACA,IAAI,WACF,MAAM,YAAY;CAGpB,MAAM,QAAQ,QAAQ,SAAS,UAAU;CACzC,IAAI,UAAU,KAAA,GACZ,MAAM,QAAQ;CAGhB,MAAM,SAAS,QAAQ,SAAS,KAAA,IAAa,QAAQ,UAAU,UAAU;CACzE,IAAI,WAAW,KAAA,GACb,MAAM,SAAS;CAGjB,MAAM,gBAAgB,kBAAkB,QAAQ,OAAO;CACvD,MAAM,UAAU,cAAc,SAAS,IAAI,gBAAgB,UAAU;CACrE,IAAI,SACF,MAAM,UAAU;CAGlB,IAAI,QAAQ,QACV,MAAM,SAAS;EACb,cAAc,gBAAgB,QAAQ,OAAO,YAAY;EACzD,WAAW,gBAAgB,QAAQ,OAAO,SAAS;EACnD,GAAI,QAAQ,OAAO,YAAY,KAAA,IAAY,EAAE,SAAS,QAAQ,OAAO,QAAQ,IAAI,CAAC;CACpF;CAGF,OAAO;AACT;AAEA,SAAS,kBACP,MACA,OAC2B;CAC3B,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,CAAC,OAAO,OAAO;CACnB,OAAO;EAAE,MAAM;EAAO,YAAY,CAAC,MAAM,KAAK;CAAE;AAClD;AAEA,SAAS,gBAAgB,YAAoC;CAC3D,MAAM,YAAY,iBAAiB,UAAU;CAE7C,IAAI,CAAC,iBAAiB,SAAS,GAC7B,MAAM,IAAI,MAAM,0DAA0D;CAG5E,IAAI,UAAU,SAAS,SAAS,UAAU,SAAS,MACjD,OAAO;EACL,MAAM,UAAU;EAChB,YAAY,UAAU,KAAK,IAAI,eAAe;CAChD;CAGF,IAAI,UAAU,SAAS,OACrB,OAAO,gBAAgB,gBAAgB,UAAU,KAAK,EAAE,CAAC;CAG3D,MAAM,aAAa,yBAAyB,SAAS;CACrD,IAAI,CAAC,YACH,MAAM,IAAI,MAAM,0CAA0C,UAAU,MAAM;CAG5E,OAAO;EACL,MAAM;EACN,GAAG;CACL;AACF;AAEA,SAAS,gBAAgB,WAAyC;CAChE,IAAI,UAAU,SAAS,SAAS,UAAU,SAAS,MACjD,OAAO;EACL,MAAM,UAAU,SAAS,QAAQ,OAAO;EACxC,YAAY,UAAU,WAAW,IAAI,eAAe;CACtD;CAGF,MAAM,aAAa;CACnB,OAAO;EACL,GAAG;EACH,IAAI,eAAe,WAAW,EAAE;CAClC;AACF;AAEA,SAAS,eAAe,UAAwE;CAC9F,QAAQ,UAAR;EACE,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,MACH,MAAM,IAAI,MAAM,gDAAgD;EAClE,SACE,MAAM,IAAI,MAAM,uCAAuC;CAC3D;AACF;AAEA,SAAS,yBACP,YACmD;CACnD,MAAM,KAAK,qBAAqB,WAAW,IAAI;CAC/C,MAAM,CAAC,MAAM,SAAS,WAAW;CACjC,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,KAAK,GACzD;CAGF,OAAO;EACL,OAAO,KAAK,KAAK,KAAK,GAAG;EACzB;EACA,OAAO,MAAM;CACf;AACF;AAEA,SAAS,kBAAkB,SAA2D;CACpF,QAAQ,WAAW,CAAC,EAAA,CAAG,KAAK,SAAS;EACnC,MAAM,aAAa,iBAAiB,KAAK,UAAU;EACnD,IAAI,CAAC,gBAAgB,UAAU,GAC7B,MAAM,IAAI,MAAM,6CAA6C;EAG/D,OAAO,cAAc;GACnB,OAAO,WAAW;GAClB,WAAW,KAAK,eAAe;EACjC,CAAC;CACH,CAAC;AACH;AAEA,SAAS,cAAc,MAAoE;CACzF,OAAO;EACL,OAAO,KAAK,MAAM,KAAK,GAAG;EAC1B,WAAW,KAAK;CAClB;AACF;AAEA,SAAS,qBAAqB,UAAgD;CAC5E,QAAQ,UAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,MACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,SACE;CACJ;AACF;AAaA,SAAS,iBAAiB,OAAyB;CACjD,IACE,OAAO,UAAU,YACjB,UAAU,QACV,gBAAgB,SAChB,aAAc,MAAkC,UAAU,GAE1D,OAAQ,MAAkC;CAG5C,OAAO;AACT;AAEA,SAAS,aAAa,OAAqC;CACzD,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU;AAClE;AAEA,SAAS,iBAAiB,OAAyC;CACjE,OACE,aAAa,KAAK,KAClB,MAAM,SAAS,UACf,OAAO,MAAM,SAAS,YACtB,MAAM,QAAQ,MAAM,IAAI;AAE5B;AAEA,SAAS,gBAAgB,OAAwC;CAC/D,OAAO,aAAa,KAAK,KAAK,MAAM,SAAS,SAAS,MAAM,QAAQ,MAAM,IAAI;AAChF;AAEA,SAAS,gBAAgB,OAAqC;CAC5D,OAAO,aAAa,KAAK,KAAK,MAAM,SAAS;AAC/C;;;AC3OA,IAAa,gBAAb,MAA2E;CAI5C;CAH7B,0BAA2B,IAAI,IAA+B;CAC9D,0BAA2B,IAAI,IAAkB;CAEjD,YAAY,QAA4C;EAA3B,KAAA,SAAA;CAA4B;CAEzD,QACE,UACA,MACA,SACA,WACa;EACb,MAAM,WAAW,KAAK,QAAQ,IAAI,QAAQ;EAC1C,MAAM,OAAO,UAAU,QAAQ;EAC/B,IAAI,UACF,KAAK,YAAY,SAAS,IAAI;EAGhC,MAAM,OAAO,IAAI,IAAI,KAAK,KAAK,QAAQ,KAAK,OAAO,GAAG,CAAC,CAAC;EACxD,KAAK,QAAQ,IAAI;EACjB,KAAK,QAAQ,IAAI,UAAU;GACzB;GACA;GACA,QAAQ;GACR,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;GACjC;EACF,CAAC;EAED,MAAM,UAAuB,CAAC;EAC9B,UAAU,KAAK,SAAS,QAAQ;GAC9B,IAAI,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,KAAK,QAAQ,IAAI,GAAG,GACzC,QAAQ,KAAK,GAAG;EAEpB,CAAC;EACD,OAAO;CACT;CAEA,OAAO,UAAgC;EACrC,MAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;EACxC,IAAI,QAAQ;GACV,OAAO,QAAQ;GACf,OAAO,EAAE,QAAQ,OAAO,OAAO;EACjC;EAEA,KAAK,QAAQ,IAAI,UAAU;GAAE,SAAS,CAAC;GAAG,sBAAM,IAAI,IAAI;GAAG,QAAQ;GAAO,MAAM;EAAE,CAAC;EACnF,OAAO,EAAE,QAAQ,MAAM;CACzB;CAEA,SAAS,KAAiB;EACxB,MAAM,SAAS,KAAK,aAAa,GAAG;EACpC,OAAO,OAAO,UAAU,OAAO;CACjC;CAEA,aAAa,KAAwB;EACnC,MAAM,MAAM,KAAK,OAAO,GAAG;EAC3B,IAAI,SAAS;EAEb,KAAK,QAAQ,SAAS,WAAW;GAC/B,MAAM,MAAM,OAAO,KAAK,IAAI,GAAG;GAC/B,WAAW;GAEX,IAAI,cAAc,KAAK,MAAM,GAAG;IAC9B,IAAI,CAAC,KAAK;KACR,OAAO,KAAK,IAAI,GAAG;KACnB,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK,CAAC;IACxD;IACA;GACF;GAEA,IAAI,KAAK;IACP,OAAO,KAAK,OAAO,GAAG;IACtB,KAAK,WAAW,GAAG;GACrB;EACF,CAAC;EAED,OAAO;GACL;GACA,OAAO,KAAK,QAAQ,IAAI,GAAG;EAC7B;CACF;CAEA,UAAU,KAAoB;EAC5B,IAAI,CAAC,KAAK,QAAQ,IAAI,GAAG,GACvB,OAAO;EAGT,KAAK,QAAQ,SAAS,WAAW;GAC/B,OAAO,KAAK,OAAO,GAAG;EACxB,CAAC;EACD,KAAK,QAAQ,OAAO,GAAG;EACvB,OAAO;CACT;CAEA,QAAQ,UAAkB,SAAS,OAAoB;EACrD,MAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;EACxC,IAAI,CAAC,QACH,OAAO,CAAC;EAGV,OAAO,QAAQ;EACf,IAAI,OAAO,OAAO,GAChB,OAAO,CAAC;EAGV,OAAO,OAAO;EACd,IAAI,QACF,OAAO,CAAC;EAGV,OAAO,KAAK,OAAO,QAAQ;CAC7B;CAEA,OAAO,UAA+B;EACpC,MAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;EACxC,IAAI,CAAC,UAAU,OAAO,OAAO,GAC3B,OAAO,CAAC;EAGV,KAAK,QAAQ,OAAO,QAAQ;EAC5B,OAAO,KAAK,YAAY,OAAO,IAAI;CACrC;CAEA,QAAqB;EACnB,MAAM,OAAO,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC;EACpC,KAAK,QAAQ,MAAM;EACnB,KAAK,QAAQ,MAAM;EACnB,OAAO;CACT;CAEA,QAAgB,MAAuB;EACrC,KAAK,SAAS,QAAQ;GACpB,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK,CAAC;EACxD,CAAC;CACH;CAEA,YAAoB,MAA8B;EAChD,MAAM,UAAuB,CAAC;EAC9B,KAAK,SAAS,QAAQ;GACpB,IAAI,KAAK,WAAW,GAAG,GACrB,QAAQ,KAAK,GAAG;EAEpB,CAAC;EACD,OAAO;CACT;CAEA,WAAmB,KAAoB;EACrC,MAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK;EAC5C,IAAI,QAAQ,GAAG;GACb,KAAK,QAAQ,OAAO,GAAG;GACvB,OAAO;EACT;EAEA,KAAK,QAAQ,IAAI,KAAK,IAAI;EAC1B,OAAO;CACT;AACF;AAEA,SAAgB,UACd,YACA,MACA,QACA,OACM;CACN,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,MAAM,OAAO,GAAG;EACtB,MAAM;GACJ,MAAM,WAAW,IAAI,GAAG,IAAI,WAAW;GACvC;GACA,OAAO;EACT,CAA6C;CAC/C;AACF;AAEA,SAAS,eAAe,KAAc,SAAqC;CACzE,OAAO,QAAQ,OAAO,WAAW,cAAc,KAAK,MAAM,CAAC;AAC7D;AAEA,SAAS,cACP,KACA,QACS;CACT,OAAO,eAAe,KAAK,OAAO,OAAO,KAAK,iBAAiB,KAAK,OAAO,SAAS;AACtF;AAEA,SAAS,iBAAiB,KAAc,WAA+C;CACrF,IAAI,CAAC,WACH,OAAO;CAGT,IAAI,UAAU,SAAS,cACrB,OAAO,cAAc,KAAK,SAAS;CAGrC,IAAI,UAAU,SAAS,OACrB,OAAO,UAAU,WAAW,OAAO,UAAU,iBAAiB,KAAK,KAAK,CAAC;CAG3E,OAAO,UAAU,WAAW,MAAM,UAAU,iBAAiB,KAAK,KAAK,CAAC;AAC1E;AAEA,SAAS,cAAc,KAAc,QAA6B;CAChE,MAAM,QAAQ,YAAY,KAAK,OAAO,KAAK;CAE3C,QAAQ,OAAO,IAAf;EACE,KAAK,MACH,OAAO,UAAU,OAAO;EAC1B,KAAK,MACH,OAAO,UAAU,OAAO;EAC1B,KAAK,MACH,OAAO,cAAc,OAAO,OAAO,QAAQ,MAAM,UAAU,OAAO,KAAK;EACzE,KAAK,OACH,OAAO,cAAc,OAAO,OAAO,QAAQ,MAAM,UAAU,QAAQ,KAAK;EAC1E,KAAK,MACH,OAAO,cAAc,OAAO,OAAO,QAAQ,MAAM,UAAU,OAAO,KAAK;EACzE,KAAK,OACH,OAAO,cAAc,OAAO,OAAO,QAAQ,MAAM,UAAU,QAAQ,KAAK;EAC1E,KAAK,MACH,OAAO,MAAM,QAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,KAAK;CACrE;CAEA,OAAO;AACT;AAEA,SAAS,cACP,MACA,OACA,SACS;CACT,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAC/C,OAAO,QAAQ,MAAM,KAAK;CAG5B,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAC/C,OAAO,QAAQ,MAAM,KAAK;CAG5B,OAAO;AACT;AAEA,SAAS,YAAY,KAAc,OAAwB;CACzD,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,QAAiB,OAAO,YAAY;EAC1D,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;EAGF,OAAQ,MAAkC;CAC5C,GAAG,GAAG;AACR;;;AC/OA,SAAgB,kBAId,SAAkF;CAClF,IAAI;CACJ,IAAI,SAAS,QAAQ;CACrB,IAAI;CAEJ,IAAI,CAAC,QAAQ;EACX,IAAI,CAAC,QAAQ,KACX,MAAM,IAAI,MAAM,iDAAiD;EAGnE,QAAQ,oBAAoB;GAC1B,KAAK,QAAQ;GACb,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;EAC3D,CAAC;EACD,SAAS,MAAM;CACjB;CAEA,OAAO;EACL,GAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC;EACvC,GAAI,QAAQ,WAAW,KAAA,IAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACjE,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACnD,GAAI,QAAQ,cAAc,KAAA,IAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;EAC1E,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;EACzD,GAAI,QAAQ,cAAc,KAAA,IAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;EAC1E,GAAI,QAAQ,qBAAqB,KAAA,IAC7B,EAAE,kBAAkB,QAAQ,iBAAiB,IAC7C,CAAC;EACL,QAAQ,QAAQ;EAChB,MAAM;GACJ,OAAO,EAAE,OAAO,OAAO,QAAQ,WAAW,iBAAiB;IACzD,MAAM,UAAU,IAAI,cAAuB,QAAQ,MAAM;IACzD,gBAAgB;IAChB,MAAM,eAAe,QAAQ,UAAU;IACvC,MAAM,kCAAkB,IAAI,IAA2C;IACvE,MAAM,cAAc,SAAsB;KACxC,IAAI,KAAK,WAAW,GAAG;KAEvB,MAAM;KACN,KAAK,MAAM,OAAO,MAChB,MAAM;MAAE,MAAM;MAAU;KAAI,CAAC;KAE/B,OAAO;IACT;IACA,MAAM,mBAAmB,OAAe;KACtC,MAAM,QAAQ,gBAAgB,IAAI,EAAE;KACpC,IAAI,CAAC,OAAO;KAEZ,aAAa,KAAK;KAClB,gBAAgB,OAAO,EAAE;IAC3B;IACA,MAAM,qBAAqB,OAAe;KACxC,IAAI,CAAC,OAAO,SAAS,YAAY,GAC/B;KAGF,IAAI,gBAAgB,GAAG;MACrB,WAAW,QAAQ,OAAO,EAAE,CAAC;MAC7B;KACF;KAEA,gBAAgB,EAAE;KAClB,gBAAgB,IACd,IACA,iBAAiB;MACf,gBAAgB,OAAO,EAAE;MACzB,WAAW,QAAQ,OAAO,EAAE,CAAC;KAC/B,GAAG,YAAY,CACjB;IACF;IACA,MAAM,eAAe,OAAO,UAAU,QAAQ,aAAa,cAAc;KACvE,KAAK,UAAU,iBAAiB,CAAC,EAAA,CAAG,SAAS,KAAK,QAAQ,aAAa,aACrE,WAAW,QAAQ,MAAM,CAAC;KAG5B,MAAM,UAAU,UAAU,QAAQ,SAAS,WAAW;MACpD,IAAI,OAAO,eAAe,QAAQ,YAAY,OAAO,CAAC;MACtD,MAAM,YAAY,OAAO,aAAa,OAAO;MAC7C,KAAK,QAAQ,oBAAoB,UAAU,WACzC,OAAO,CAAC;MAGV,IAAI,QAAQ,aAAa,aACvB,OAAO,CAAC,gBAAyB,QAAQ,WAAW,IAAI,OAAO,GAAW,CAAC,CAAC;MAG9E,MAAM,MAAM,OAAO;MACnB,MAAM,SAAS,WAAW,IAAI,GAAG;MACjC,IAAI,OAAO,SAAS,UAAU;OAC5B,QAAQ,UAAU,GAAG;OACrB,OAAO,SAAS,CAAC;QAAE,MAAM;QAAmB;OAAI,CAAC,IAAI,CAAC;MACxD;MAEA,MAAM,UAAU,WAAW,IAAI,GAAG;MAClC,MAAM,MACJ,OAAO,SAAS,YAAY,UACvB;OAAE,GAAG;OAAS,GAAI,OAAO;MAAqB,IAC9C,OAAO;MACd,MAAM,UAAU,QAAQ,aAAa,GAAG;MAExC,IAAI,aAAa,UAAU,QAAQ,OACjC,OAAO,CAAC,gBAAyB,QAAQ,MAAM,CAAC;MAGlD,OAAO,CAAC;KACV,CAAC;KAED,IAAI,QAAQ,WAAW,GACrB;KAGF,MAAM;KACN,KAAK,MAAM,UAAU,SACnB,MAAM,MAAM;KAEd,OAAO;IACT,CAAC;IAED,MAAM,cAAc,kBAA2D;KAC7E,MAAM,KAAK,SAAS,aAAa;KACjC,gBAAgB,EAAE;KAElB,IADiB,QAAQ,OAAO,EACrB,CAAC,CAAC,QACX,OAAO;KAGT,QAAQ,YAAY;MAClB,MAAM,QAAQ,mBACZ,QAAQ,YACR,QAAQ,SAAS,QAAQ,KAAA,IAAY,QAAQ,MAC7C,aACF;MACA,MAAM,aAAa;MACnB,MAAM,SAAS,MAAM,OAAO,KAAQ,KAAK;MACzC,MAAM,cAAc,QAAQ,QAC1B,IACA,OAAO,MACP,MAAM,WAAW,CAAC,GAClB,MAAM,SACR;MAEA,MAAM;MACN,UAAU,YAAY,OAAO,MAAM,QAAQ,QAAQ,KAAK;MACxD,KAAK,MAAM,OAAO,aAChB,MAAM;OAAE,MAAM;OAAU;MAAI,CAAC;MAE/B,OAAO;KACT,EAAA,CAAG,CAAC,CAAC,OAAO,UAAmB;MAC7B,WAAW,QAAQ,QAAQ,EAAE,CAAC;MAC9B,MAAM;KACR,CAAC;IACH;IAEA,IAAI,QAAQ,aAAa,aAAa;KACpC,UAAU;KACV,OAAO;MACL,YAAY;MACZ,eAAe,kBAAqC;OAClD,MAAM,KAAK,SAAS,aAAa;OACjC,MAAM,cAAc,QAAQ,QAAQ,IAAI,iBAAiB,CAAC;OAC1D,WAAW,WAAW;OACtB,IAAI,YAAY,WAAW,GAAG,kBAAkB,EAAE;MACpD;MACA,eAAe;OACb,gBAAgB,SAAS,UAAU;QACjC,aAAa,KAAK;OACpB,CAAC;OACD,gBAAgB,MAAM;OACtB,QAAQ,MAAM;OACd,IAAI,kBAAkB,SACpB,gBAAgB,KAAA;OAElB,aAAa,YAAY;OACzB,OAAO,QAAQ;MACjB;KACF;IACF;IAEA,MAAM,eAAe,iBAAiB,QAAQ,YAAY,QAAQ,IAAI;IACtE,IAAI,CAAC,cACH,aAAkB,MAAM,WAAW;KACjC,UAAU;IACZ,CAAC;SAED,aAAkB,MACf,WAAW,OAAO,KAAQ,YAAY,CAAC,CAAC,CACxC,MAAM,WAAW;KAChB,IAAI,OAAO,KAAK,SAAS,GAAG;MAC1B,MAAM;MACN,UAAU,YAAY,OAAO,MAAM,QAAQ,QAAQ,KAAK;MACxD,OAAO;KACT;KACA,UAAU;IACZ,CAAC;IAGL,aAAa;KACX,IAAI,kBAAkB,SACpB,gBAAgB,KAAA;KAElB,aAAa,YAAY;KACzB,OAAO,QAAQ;IACjB;GACF;GACA,eAAe;EACjB;EACA,UAAU,OAAO,EAAE,kBAAkB;GACnC,sBAAsB,eAAe,QAAQ,UAAU,WAAW;GAClE,OAAO,OAAO,KAAK,YAAY,QAAQ,YAAY,OAAO,UAAU,WAAW,CAAC;EAClF;EACA,UAAU,OAAO,EAAE,kBAAkB;GACnC,sBAAsB,eAAe,QAAQ,UAAU,WAAW;GAClE,OAAO,OAAO,KAAK,YAAY,QAAQ,YAAY,OAAO,UAAU,WAAW,CAAC;EAClF;EACA,UAAU,OAAO,EAAE,kBAAkB;GACnC,sBAAsB,eAAe,QAAQ,UAAU,WAAW;GAClE,OAAO,OAAO,KAAK,YAAY,QAAQ,YAAY,OAAO,UAAU,WAAW,CAAC;EAClF;CACF;AACF;AAEA,SAAS,sBACP,SACA,UACA,aACM;CACN,IAAI,aAAa,eAAe,CAAC,SAC/B;CAGF,KAAK,MAAM,YAAY,YAAY,WAAW;EAC5C,IAAI,SAAS,SAAS,UAAU;GAC9B,QAAQ,UAAU,SAAS,GAAW;GACtC;EACF;EAEA,QAAQ,aAAa,SAAS,QAAa;CAC7C;AACF;;;AC/QA,SAAgB,gBAAgB,MAAc,QAAuC;CAEnF,OAAO,IADU,uBAAuB,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,SAAS,MAAM,CACzE,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,KAAK,GAAG,EAAE;AACtD;AAEA,SAAgB,kBACd,WACA,YACoB;CACpB,IAAI,CAAC,WAAW,OAAO,KAAA;CAEvB,MAAM,eAAe,IAAI,IAAI,WAAW,UAAU,CAAC;CACnD,OAAO,WAAW,SAAS,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC;AACvE;AAEA,SAAgB,uBAAuB,MAA6B;CAClE,OAAO,KACJ,KAAK,CAAC,CACN,QAAQ,cAAc,EAAE,CAAC,CACzB,MAAM,GAAG,CAAC,CACV,OAAO,OAAO;AACnB;AAEA,SAAgB,wBAAwB,SAAqC;CAC3E,OACE,QAAQ,MAAM,gCAAgC,CAAC,GAAG,MAClD,QAAQ,MAAM,6BAA6B,CAAC,GAAG;AAEnD;AAEA,SAAgB,sBAAsB,SAA0B;CAC9D,OAAO,wBAAwB,OAAO,MAAM,KAAA;AAC9C;AAEA,SAAS,aAAa,SAAiB,QAAuC;CAC5E,MAAM,QAAQ,wBAAwB,OAAO;CAC7C,IAAI,CAAC,OAAO,OAAO;CAEnB,MAAM,QAAQ,OAAO;CACrB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,sCAAsC,OAAO;CAG/D,OAAO,OAAO,KAAK;AACrB;AAEA,SAAS,WAAW,MAA6B;CAC/C,OAAO,uBAAuB,IAAI,CAAC,CAAC,SAAS,YAAY;EACvD,MAAM,QAAQ,wBAAwB,OAAO;EAC7C,OAAO,QAAQ,CAAC,KAAK,IAAI,CAAC;CAC5B,CAAC;AACH;AAEA,SAAS,iBAAiB,SAAyB;CACjD,OAAO,mBAAmB,mBAAmB,OAAO,CAAC;AACvD;;;ACvDA,SAAgB,yBAAyB,MAAc,MAAsB;CAC3E,MAAM,SAAS,uBAAuB,IAAI,CAAC,CACxC,QAAQ,YAAY,CAAC,sBAAsB,OAAO,CAAC,CAAC,CACpD,KAAK,GAAG;CAEX,OAAO,SAAS,GAAG,OAAO,GAAG,SAAS;AACxC;;;ACsDA,SAAgB,gCAOd,SAC0C;CAC1C,MAAM,aAAa,eAAe,OAAO;CAEzC,IAAI,CAAC,YACH,MAAM,IAAI,MAAM,uDAAuD;CAGzE,OAAO,IAAI,sBACT,SACA,YACA,CAAC,mBACD,IAAI,IAAI,CACV,CAAC,CAAC,IAAI;AACR;AAEA,IAAM,wBAAN,MAAM,sBAMJ;CAEmB;CACA;CACA;CACA;CAJnB,YACE,SACA,YACA,QACA,OACA;EAJiB,KAAA,UAAA;EACA,KAAA,aAAA;EACA,KAAA,SAAA;EACA,KAAA,QAAA;CAChB;CAEH,MAAgD;EAW9C,OAAO,aADS,eAAe;GAR7B,MAAM,SAAgC,CAAC,MAAM,KAAK,IAAI,MAAM;GAC5D,SAAS,GAAG,SAAoD,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI;GAC3F,SAAS,GAAG,SAAoD,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI;GAC3F,OAAO,WAAkC,KAAK,KAAK,MAAM;GACzD,SAAS,IAAU,eAAwB,KAAK,OAAO,IAAI,UAAU;GACrE,SAAS,GAAG,SAAoD,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI;GAC3F,aAAa,KAAK,MAAM;EAEQ,GAAG,KAAK,WAAW,CAC3B,GAAG,KAAK,cAAc,KAAK,MAAM,CAAC;CAM9D;CAEA,IAAY,QAAoD;EAC9D,MAAM,QAAQ,gBAAgB,KAAK,QAAQ,MAAM;GAAE,GAAG,KAAK;GAAQ,GAAG;EAAO,CAAC;EAC9E,MAAM,MAAM,GAAG,KAAK,QAAQ,KAAK,IAAI;EACrC,MAAM,WAAW,KAAK,MAAM,IAAI,GAAG;EAEnC,IAAI,UAAU;GACZ,SAAS,MAAM,eAAe;GAC9B,SAAS,MAAM,iBAAiB,KAAK,IAAI;GACzC,OAAO,SAAS;EAClB;EAEA,MAAM,KAAK,aAAa,KAAK,QAAQ,IAAI,KAAK,QAAQ,MAAM,KAAK;EACjE,MAAM,aAAa,iBACjB,kBAAkB;GAChB,GAAG,iBAAiB,KAAK,OAAO;GAChC,GAAG,KAAK;GACR;GACA,YAAY;EACd,CAAQ,CACV;EAEA,MAAM,QAAQ;GACZ;GACA,MAAM,KAAK,QAAQ;GACnB;GACA,aAAa;GACb,WAAW,KAAK,IAAI;GACpB,gBAAgB,KAAK,IAAI;EAC3B;EAEA,KAAK,MAAM,IAAI,KAAK;GAAE;GAAY;EAAM,CAAC;EACzC,OAAO;CACT;CAEA,KAAa,QAAyE;EACpF,OAAO,IAAI,sBACT,KAAK,SACL,KAAK,YACL;GAAE,GAAG,KAAK;GAAQ,GAAG;EAAO,GAC5B,KAAK,KACP,CAAC,CAAC,IAAI;CACR;CAEA,OAAe,IAAU,YAA2D;EAQlF,OAAO,aACL;GAPA,WAAW,KAAK,IAAI,CAAC,CAAC;GACtB,SAAS,WACP,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,MAAM;GAChC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;GAC9B,SAAS,GAAG,SAAyB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,GAAI,IAAmB;EAGjF,GACH,KAAK,cAAc,KAAK,YAAY,IAAI,UAAU,CAAC,CACrD;CACF;CAEA,QAAwC;EACtC,OAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,GAAG,MAAM,MAAM,EAAE;CACrE;CAEA,aAAiD;EAC/C,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CAC7D,OACC,GAAG,SAAyB,KAAK,QAAQ,MAAM,QAAQ,KAAK,EAAE,CACjE,CAAC,CACH;CACF;CAEA,MAAc,QACZ,MACA,QACA,OACkB;EAClB,IAAI,OAAO,SAAS;GAClB,MAAM,QAAQ,gBAAgB,KAAK,QAAQ,MAAM,KAAK,MAAM;GAC5D,OAAO,OAAO,QAAQ;IACpB;IACA,YAAY,KAAK,IAAI,CAAC,CAAC;IACvB,QAAQ,KAAK;IACb;GACF,CAAC;EACH;EAEA,MAAM,OAAO,OAAO,QAAQ,yBAAyB,KAAK,QAAQ,MAAM,IAAI;EAC5E,MAAM,QAAQ,KAAK,WAAW,SAAS,KAAA,IAAY,oBAAoB,KAAK,UAAU;EACtF,MAAM,SAAU,KAAK,WAAW,UAAU,OAAO;EAEjD,IAAI;GACF,OAAO,MAAM,OAAO,KAAK,MAAM,KAAK;EACtC,UAAU;GACR,OAAO,QAAQ;EACjB;CACF;CAEA,cAAsB,QAAyD;EAC7E,MAAM,WAAY,KAAK,QAAQ,YAAY,CAAC;EAC5C,OAAO,OAAO,YACZ,OAAO,QAAQ,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CAC9C,MACA,IAAI,sBACF,OACA,eAAe,KAAK,KAAK,KAAK,YAC9B,QACA,KAAK,KACP,CAAC,CAAC,IAAI,CACR,CAAC,CACH;CACF;CAEA,YAAoB,IAAU,YAA4C;EACxE,MAAM,QAAQ,cAAc,gBAAgB,KAAK,OAAO;EACxD,OAAO,QAAQ;GAAE,GAAG,KAAK;IAAS,QAAQ;EAAG,IAAI,KAAK;CACxD;AACF;AAEA,SAAS,iBAIP,SAAgE;CAChE,MAAM,EAAE,KAAK,UAAU,IAAI,MAAM,aAAa,MAAM,GAAG,WAAW;CAOlE,OAAO;AACT;AAEA,SAAS,aACP,QACA,UACoC;CACpC,OAAO,OAAO,OAAO,QAAQ,QAAQ;AACvC;AAEA,SAAS,eACP,QACA,KACsC;CACtC,KAAK,MAAM,QAAQ,OAAO,KAAK,GAAG,GAChC,IAAI,QAAQ,QACV,MAAM,IAAI,MAAM,2DAA2D,MAAM;CAIrF,OAAO,OAAO,OAAO,QAAQ,GAAG;AAClC;AAEA,SAAS,eACP,SACsC;CACtC,IAAI,QAAQ,QACV,OAAO,EAAE,QAAQ,QAAQ,OAAO;CAGlC,IAAI,QAAQ,KACV,OAAO;EACL,KAAK,QAAQ;EACb,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;CAC3D;AAIJ;AAEA,SAAS,aAAa,IAAkC,MAAc,OAAuB;CAC3F,OAAO,OAAO,OAAO,aAAa,GAAG;EAAE;EAAM;CAAM,CAAC,IAAK,MAAM;AACjE;AAEA,SAAS,gBACP,SACoB;CACpB,MAAM,QAAQ,OAAO,OAAO,QAAQ,YAAY,CAAC,CAAC,CAAC,CAAC;CAGpD,OAAO,OAAO,eAAe,kBAAkB,OAAO,MAAM,QAAQ,IAAI;AAC1E;;;AClRA,SAAgB,oBACd,aACgD;CAChD,OAAO,IAAI,iCAAiC,YAAY,aAAa,CAAC,GAAG,KAAA,CAAS;AACpF;AAEA,IAAa,mCAAb,MAAa,iCAA6E;CAErE;CACA;CACA;CAHnB,YACE,aACA,WACA,YACA;EAHiB,KAAA,cAAA;EACA,KAAA,YAAA;EACA,KAAA,aAAA;CAChB;CAEH,OAAO,QAAgE;EACrE,OAAO,IAAI,iCAAiC,KAAK,aAAa,KAAK,WAAW,EAAE,OAAO,CAAC;CAC1F;CAEA,IACE,KACA,UAAiC,CAAC,GACc;EAChD,OAAO,IAAI,iCAAiC,KAAK,aAAa,KAAK,WAAW;GAC5E;GACA,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;EAC3D,CAAC;CACH;CAEA,WACE,MACA,WAGgD;EAChD,MAAM,WAAW,UAAU,IAAI,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;EACvE,OAAO,IAAI,iCACT,KAAK,aACL;GAAE,GAAG,KAAK;IAAY,OAAO;EAAS,GACtC,KAAK,UACP;CACF;CAEA,QAA0C;EACxC,IAAI,CAAC,KAAK,YACR,MAAM,IAAI,MAAM,oDAAoD;EAGtE,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,KAAK,CAAC,MAAM,gBAAgB,CAC3D,MACA,6BAA6B,YAAY,MAAM,KAAK,WAAW,KAAK,UAAW,CACjF,CAAC,CACH;CACF;AACF;AAEA,IAAa,0BAAb,MAAa,wBAAqC;CACnB;CAA7B,YAAY,UAAqD;EAApC,KAAA,WAAA;CAAqC;CAElE,KAAK,UAAiE;EACpE,OAAO,IAAI,wBAAwB;GAAE,GAAG,KAAK;GAAU;EAAS,CAAC;CACnE;CAEA,MACE,WACA,kBACsC;EACtC,OAAO,IAAI,wBAAwB;GACjC,GAAG,KAAK;GACR;GACA,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;EACjD,CAAC;CACH;CAEA,aAAuC;EACrC,OAAO,KAAK;CACd;AACF;AA+CA,SAAS,6BACP,YACA,SACA,WACA,YACoC;CACpC,OAAO,gCAAgC;EACrC,GAAG,gCAAgC,YAAY,SAAS,SAAS;EACjE,GAAG;CACL,CAAQ;AACV;AAEA,SAAS,gCACP,YACA,SACA,WACyB;CACzB,OAAO;EACL,GAAG,UAAU;EACb,MAAM,WAAW;EACjB,MAAM,WAAW;EACjB,QAAQ,WAAW;EACnB,SAAS,SAAkC,KAAK,WAAW;EAC3D,UAAU,OAAO,YACf,OAAO,QAAQ,WAAW,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CACzD,MACA,gCAAgC,OAAO,GAAG,QAAQ,GAAG,QAAQ,SAAS,CACxE,CAAC,CACH;EACA,KAAK,OAAO,YACV,OAAO,QAAQ,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAClD,MACA,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,CACnC,CAAC,CACH;CACF;AACF;;;ACvLA,SAAgB,gBAAgB,MAAsB;CACpD,OAAO,IAAI,mBAAmB,IAAI,EAAE;AACtC;AAEA,SAAgB,iBAAiB,YAAoB,aAAqB,MAAsB;CAC9F,OAAO,GAAG,WAAW,QAAQ,SAAS,EAAE,EAAE,IAAI,YAAY,IAAI,mBAAmB,IAAI,EAAE;AACzF;AAEA,SAAgB,qBAAqB,MAAsB;CACzD,OAAO,GAAG,KAAK;AACjB;;;ACVA,SAAgB,eAAe,OAAyB;CACtD,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,OAAO,OAAO,MAAM,IAAI,cAAc,CAAC;CAGhD,IAAI,CAAC,cAAc,KAAK,GACtB,OAAO;CAGT,OAAO,OAAO,OACZ,OAAO,YACL,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,iBAAiB,CACtD,WACA,eAAe,WAAW,CAC5B,CAAC,CACH,CACF;AACF;AAEA,SAAS,cAAc,OAAkD;CACvE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CAExD,MAAM,YAAY,OAAO,eAAe,KAAK;CAC7C,OAAO,cAAc,OAAO,aAAa,cAAc;AACzD;;;ACfA,SAAgB,mBAAmB,OAA6C;CAC9E,OAAO,OAAO,OACZ,OAAO,YACL,OAAO,QAAQ,KAAK,CAAC,CAClB,QAAQ,GAAG,WAAW,UAAU,KAAA,CAAS,CAAC,CAC1C,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,sBAAsB,KAAK,KAAK,CAAC,CAAC,CACnE,CACF;AACF;AAEA,SAAS,sBAAsB,KAAa,OAAyB;CACnE,IAAI,QAAQ,SAAS,SAAS,KAAK,GACjC,OAAO,aAAa,KAAK;CAG3B,IAAI,QAAQ,SAAS,iBAAiB,KACpC,OAAO,MAAM,SAAS;CAGxB,OAAO,eAAe,KAAK;AAC7B;AAEA,SAAS,aAAa,KAA+D;CACnF,OAAO,OAAO,OACZ,OAAO,YACL,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,MAAM,gBAAgB,MAAM,CAAC,CAAC,CAC7E,CACF;AACF;AAEA,SAAS,gBAMP,QAC+C;CAC/C,OAAO,OAAO,OAAO,EAAE,GAAG,OAAO,CAAC;AACpC;AAEA,SAAS,SAAS,OAAsD;CACtE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;;;ACtBA,SAAgB,wBAGd;CACA,OAAO,IAAI,sBAAsB,CAAC,CAAC;AACrC;AAEA,MAAa,kBAAkB;CAC7B,SAAS;CACT,MAAM;AACR;AAEA,IAAa,wBAAb,MAAa,sBAMX;CACA;CAEA,YAAY,OAAqB;EAC/B,KAAK,QAAQ,mBAAmB,KAAK;CACvC;CAEA,OAAO,QAA0E;EAC/E,OAAO,KAAK,KAAK;GAAE;GAAQ,KAAK,KAAA;GAAW,UAAU,KAAA;EAAU,CAAC;CAClE;CAEA,IACE,KACA,UAAiC,CAAC,GACwB;EAC1D,OAAO,KAAK,KAAK;GACf,QAAQ,KAAA;GACR;GACA,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;EAC3D,CAAC;CACH;CAEA,KAAK,MAAkF;EACrF,OAAO,KAAK,KAAK;GAAE;GAAM,MAAM,gBAAgB,IAAI;EAAE,CAAC;CAMxD;CAEA,OACE,QAIA;EACA,OAAO,KAAK,KAAK,EAAE,OAAO,CAAC;CAM7B;CAEA,KAAK,UAAqF;EACxF,OAAO,KAAK,KAAK,EAAE,SAAS,CAAC;CAC/B;CAEA,MACE,WACA,kBAC0D;EAC1D,OAAO,KAAK,KAAK;GACf;GACA,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;EACjD,CAAC;CACH;CAEA,MACE,MACA,WAYA;EACA,MAAM,QAAQ,UAAU,KAAK,aAAa,IAAI,CAAC;EAC/C,MAAM,WACJ,OAAO,KAAK,MAAM,aAAa,YAAY,KAAK,MAAM,aAAa,OAC/D,KAAK,MAAM,WACX,CAAC;EACP,OAAO,KAAK,KAAK,EACf,UAAU;GACR,GAAG;IACF,OAAO,MAAM;EAChB,EACF,CAAC;CAOH;CAEA,IACE,QACwD;EACxD,OAAO,KAAK,KAAK,EAAE,OAAO,CAAC;CAM7B;CAsBA,IACE,MACA,QAGA;EACA,MAAM,QAAQ,OAAO,WAAW,aAAa,eAAe,MAAM,IAAK,UAAU,CAAC;EAClF,OAAO,KAAK,KAAK,EACf,KAAK;GACH,GAAG,KAAK,MAAM;IACb,OAAO;EACV,EACF,CAAC;CACH;CAEA,QAA0D;EACxD,IAAI,CAAC,KAAK,MAAM,QAAQ,CAAC,KAAK,MAAM,MAClC,MAAM,IAAI,MAAM,yCAAyC;EAG3D,IAAI,CAAC,KAAK,MAAM,QACd,MAAM,IAAI,MAAM,iDAAiD;EAGnE,OAAO,gCAAgC,KAAK,KAAY;CAM1D;CAEA,KAAa,SAAgC;EAC3C,OAAO,IAAI,sBAAyD;GAClE,GAAG,KAAK;GACR,GAAG;EACL,CAAC;CACH;CAEA,aACE,MAIA;EACA,IAAI,CAAC,KAAK,MAAM,QAAQ,CAAC,KAAK,MAAM,MAClC,MAAM,IAAI,MAAM,sDAAsD;EAGxE,MAAM,cAAc,qBAAqB,KAAK,MAAM,IAAI;EACxD,OAAO,IAAI,sBAAsB;GAC/B;GACA;GACA,MAAM,iBAAiB,KAAK,MAAM,MAAM,aAAa,IAAI;EAC3D,CAAC;CACH;AACF;AAaA,SAAS,eACP,SAC+C;CAC/C,OAAO,OAAO,OAAO,EACnB,UAAU,EAAE,OAAO,YAAY,QAAQ,YACrC,QAAQ,OAAO;EACD;EACZ;EACA;CACF,CAAC,EACL,CAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["collectionScope","normalizeSegment","collectionScope"],"sources":["../src/batch.ts","../src/collection-path.ts","../src/client-rpc.ts","../src/client-subscriptions.ts","../src/client.ts","../src/read-query.ts","../src/subsets.ts","../src/collection.ts","../src/collection-api.ts","../src/collection-type.ts","../src/definition-builder.ts"],"sourcesContent":["import type {\n ChangeMessageOrDeleteKeyMessage,\n PendingMutation,\n TransactionWithMutations,\n} from \"@tanstack/db\";\nimport type { Batch, Update } from \"./types\";\n\nexport function createBatch<T extends object>(\n collection: string,\n clientId: string,\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): Batch {\n return {\n updates: transaction.mutations.map((mutation) => toUpdate(collection, clientId, mutation)),\n };\n}\n\nfunction toUpdate<T extends object>(\n collection: string,\n clientId: string,\n mutation: PendingMutation<T>,\n): Update {\n const base = {\n id: mutation.mutationId,\n collection,\n key: mutation.key as string | number,\n type: mutation.type,\n clientId,\n createdAt: mutation.createdAt.getTime(),\n };\n\n if (mutation.type === \"delete\") {\n return {\n ...base,\n type: \"delete\",\n previousValue: mutation.original,\n };\n }\n\n if (mutation.type === \"update\") {\n return {\n ...base,\n type: \"update\",\n value: mutation.modified,\n previousValue: mutation.original,\n };\n }\n\n return {\n ...base,\n type: \"insert\",\n value: mutation.modified,\n };\n}\n\nexport function toChangeMessage<T extends object, TKey extends string | number>(\n update: Update,\n existing?: boolean,\n): ChangeMessageOrDeleteKeyMessage<T, TKey> {\n if (update.type === \"delete\") {\n return {\n type: \"delete\",\n key: update.key as TKey,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>;\n }\n\n const type =\n update.type === \"update\" && existing === false\n ? \"insert\"\n : update.type === \"insert\" && existing === true\n ? \"update\"\n : update.type;\n\n return {\n type,\n key: update.key as TKey,\n value: update.value as T,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>;\n}\n","export type CollectionScopeParams = Record<string, string | number>;\n\nexport function collectionScope(path: string, params: CollectionScopeParams): string {\n const segments = collectionPathSegments(path).map((segment) => segmentValue(segment, params));\n return `/${segments.map(normalizeSegment).join(\"/\")}/`;\n}\n\nexport function firstNewPathParam(\n childPath: string | undefined,\n parentPath: string,\n): string | undefined {\n if (!childPath) return undefined;\n\n const parentParams = new Set(pathParams(parentPath));\n return pathParams(childPath).find((param) => !parentParams.has(param));\n}\n\nexport function collectionPathSegments(path: string): Array<string> {\n return path\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n}\n\nexport function collectionPathParamName(segment: string): string | undefined {\n return (\n segment.match(/^\\{([A-Za-z_][A-Za-z0-9_]*)\\}$/)?.[1] ??\n segment.match(/^:([A-Za-z_][A-Za-z0-9_]*)$/)?.[1]\n );\n}\n\nexport function isCollectionPathParam(segment: string): boolean {\n return collectionPathParamName(segment) !== undefined;\n}\n\nfunction segmentValue(segment: string, params: CollectionScopeParams): string {\n const param = collectionPathParamName(segment);\n if (!param) return segment;\n\n const value = params[param];\n if (value === undefined) {\n throw new Error(`Missing collection path parameter: ${param}`);\n }\n\n return String(value);\n}\n\nfunction pathParams(path: string): Array<string> {\n return collectionPathSegments(path).flatMap((segment) => {\n const param = collectionPathParamName(segment);\n return param ? [param] : [];\n });\n}\n\nfunction normalizeSegment(segment: string): string {\n return encodeURIComponent(decodeURIComponent(segment));\n}\n","import type { ClientRpcRequest, RpcId } from \"@lsync/transport\";\nimport type { ApiCall, Batch, ReadQuery, SyncChangesQuery } from \"./types\";\n\nexport interface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n}\n\nexport function takePending(\n pending: Map<string, PendingRequest>,\n id: RpcId,\n): PendingRequest | undefined {\n if (id === null || id === undefined) {\n return undefined;\n }\n\n const key = String(id);\n const request = pending.get(key);\n pending.delete(key);\n return request;\n}\n\nexport function requestForOperation(\n id: string,\n op: { type: string; path: string; input: unknown },\n): ClientRpcRequest {\n if (op.type === \"mutation\" && op.path === \"push\") {\n return {\n id,\n method: \"mutation\",\n params: {\n path: \"push\",\n input: {\n json: op.input as Batch,\n },\n },\n };\n }\n\n if (op.type === \"query\" && op.path === \"read\") {\n return {\n id,\n method: \"query\",\n params: {\n path: \"read\",\n input: {\n json: op.input as ReadQuery,\n },\n },\n };\n }\n\n if (op.type === \"query\" && op.path === \"changes\") {\n return {\n id,\n method: \"query\",\n params: {\n path: \"changes\",\n input: {\n json: op.input as SyncChangesQuery,\n },\n },\n };\n }\n\n if (op.type === \"mutation\" && op.path === \"api\") {\n return {\n id,\n method: \"mutation\",\n params: {\n path: \"api\",\n input: {\n json: op.input as ApiCall,\n },\n },\n };\n }\n\n throw new Error(`Unsupported operation: ${op.type}.${op.path}`);\n}\n\nexport function collectionScope(collection: string): string {\n const segments = collection\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n return `/${segments.map(normalizeSegment).join(\"/\")}/`;\n}\n\nfunction normalizeSegment(segment: string): string {\n return encodeURIComponent(decodeURIComponent(segment));\n}\n","import { collectionScope } from \"./client-rpc\";\nimport type { Broadcast, ClientSubscription, SubscriptionControlResult } from \"./types\";\n\ntype SubscriptionListener = (broadcast: Broadcast) => void;\n\ninterface SubscriptionEntry {\n collection: string;\n listeners: Set<SubscriptionListener>;\n ready: Promise<void>;\n}\n\nexport interface SubscriptionControls {\n currentSocket(): WebSocket | undefined;\n open(): Promise<WebSocket>;\n send(\n ws: WebSocket,\n path: \"subscribe\" | \"unsubscribe\",\n collection: string,\n ): Promise<SubscriptionControlResult>;\n}\n\nexport class ClientSubscriptions {\n private readonly subscriptions = new Map<string, SubscriptionEntry>();\n\n constructor(private readonly controls: SubscriptionControls) {}\n\n subscribe(collection: string, listener: SubscriptionListener): ClientSubscription {\n const key = collectionScope(collection);\n let entry = this.subscriptions.get(key);\n const shouldSubscribe = !entry;\n\n if (!entry) {\n entry = {\n collection: key,\n listeners: new Set(),\n ready: Promise.resolve(),\n };\n this.subscriptions.set(key, entry);\n }\n\n entry.listeners.add(listener);\n if (shouldSubscribe) {\n entry.ready = this.start(entry);\n }\n\n return {\n ready: entry.ready,\n unsubscribe: () => this.unsubscribe(key, listener),\n };\n }\n\n async replay(ws: WebSocket): Promise<void> {\n await Promise.all(\n [...this.subscriptions.values()].map((entry) => this.subscribeOnSocket(ws, entry)),\n );\n }\n\n dispatch(broadcast: Broadcast): void {\n const updatesByCollection = new Map<string, Broadcast[\"updates\"]>();\n const invalidationsByCollection = new Map<string, NonNullable<Broadcast[\"invalidations\"]>>();\n\n for (const update of broadcast.updates) {\n const collection = collectionScope(update.collection);\n const updates = updatesByCollection.get(collection) ?? [];\n updates.push(update);\n updatesByCollection.set(collection, updates);\n }\n\n for (const invalidation of broadcast.invalidations ?? []) {\n const collection = collectionScope(invalidation.collection);\n const invalidations = invalidationsByCollection.get(collection) ?? [];\n invalidations.push(invalidation);\n invalidationsByCollection.set(collection, invalidations);\n }\n\n for (const entry of this.subscriptions.values()) {\n const updates = updatesByCollection.get(collectionScope(entry.collection));\n const invalidations = invalidationsByCollection.get(collectionScope(entry.collection));\n if ((!updates || updates.length === 0) && (!invalidations || invalidations.length === 0)) {\n continue;\n }\n\n const scopedBroadcast: Broadcast = {\n ...broadcast,\n ...(invalidations ? { invalidations } : {}),\n updates: updates ?? [],\n };\n for (const listener of entry.listeners) {\n listener(scopedBroadcast);\n }\n }\n }\n\n private start(entry: SubscriptionEntry): Promise<void> {\n const socket = this.controls.currentSocket();\n return socket?.readyState === WebSocket.OPEN\n ? this.subscribeOnSocket(socket, entry)\n : this.controls.open().then(() => undefined);\n }\n\n private async subscribeOnSocket(ws: WebSocket, entry: SubscriptionEntry): Promise<void> {\n if (this.subscriptions.get(collectionScope(entry.collection)) !== entry) {\n return;\n }\n\n const result = await this.controls.send(ws, \"subscribe\", entry.collection);\n entry.collection = result.collection;\n }\n\n private unsubscribe(key: string, listener: SubscriptionListener): void {\n const entry = this.subscriptions.get(key);\n if (!entry) {\n return;\n }\n\n entry.listeners.delete(listener);\n if (entry.listeners.size > 0) {\n return;\n }\n\n this.subscriptions.delete(key);\n const socket = this.controls.currentSocket();\n if (socket?.readyState === WebSocket.OPEN) {\n void this.controls.send(socket, \"unsubscribe\", entry.collection);\n }\n }\n}\n","import { createTRPCProxyClient, type TRPCLink } from \"@trpc/client\";\nimport { parseServerMessage, sendClientRpcRequest, type ClientRpcRequest } from \"@lsync/transport\";\nimport { observable } from \"@trpc/server/observable\";\nimport { ClientSubscriptions } from \"./client-subscriptions\";\nimport { requestForOperation, takePending, type PendingRequest } from \"./client-rpc\";\nimport type {\n ApiCall,\n ApiCallArgs,\n ApiContract,\n ApiOutput,\n ApiPath,\n Batch,\n Client,\n ClientOptions,\n PushResult,\n ReadQuery,\n ReadResult,\n SubscriptionControlResult,\n SyncChangesQuery,\n SyncChangesResult,\n} from \"./types\";\n\ntype Router = any;\n\ninterface SharedClientEntry {\n client: Client;\n refs: number;\n}\n\nexport interface SharedClientLease<TApi extends ApiContract = ApiContract> {\n readonly client: Client<TApi>;\n release(): void;\n}\n\nconst sharedClients = new Map<string, SharedClientEntry>();\n\nexport function createClient<TApi extends ApiContract = ApiContract>(\n options: ClientOptions,\n): Client<TApi> {\n const clientId = options.clientId ?? crypto.randomUUID();\n const pending = new Map<string, PendingRequest>();\n let nextId = 1;\n let socket: WebSocket | undefined;\n let connectPromise: Promise<WebSocket> | undefined;\n let subscriptions: ClientSubscriptions;\n\n const open = async (): Promise<WebSocket> => {\n if (socket?.readyState === WebSocket.OPEN) {\n return socket;\n }\n\n if (connectPromise) {\n return connectPromise;\n }\n\n connectPromise = new Promise((resolve, reject) => {\n const url = new URL(options.url);\n url.searchParams.set(\"clientId\", clientId);\n const ws = new WebSocket(url);\n ws.binaryType = \"arraybuffer\";\n\n ws.addEventListener(\"open\", () => {\n socket = ws;\n subscriptions\n .replay(ws)\n .then(() => {\n connectPromise = undefined;\n resolve(ws);\n })\n .catch((error) => {\n connectPromise = undefined;\n reject(error);\n });\n });\n\n ws.addEventListener(\"message\", (event) => {\n const message = parseServerMessage(event.data);\n\n if (\"method\" in message) {\n subscriptions.dispatch(message.params.input.json);\n return;\n }\n\n if (\"error\" in message) {\n const request = takePending(pending, message.id);\n\n if (!request) {\n return;\n }\n\n request.reject(new Error(message.error.message));\n return;\n }\n\n const request = takePending(pending, message.id);\n\n if (!request) {\n return;\n }\n\n request.resolve(message.result.data.json);\n });\n\n ws.addEventListener(\"close\", () => {\n socket = undefined;\n connectPromise = undefined;\n });\n\n ws.addEventListener(\"error\", () => {\n reject(new Error(\"Unable to open sync WebSocket\"));\n });\n });\n\n return connectPromise;\n };\n\n const sendRequest = <TResult>(ws: WebSocket, request: ClientRpcRequest): Promise<TResult> => {\n return new Promise((resolve, reject) => {\n const id = request.id;\n if (id === null || id === undefined) {\n reject(new Error(\"RPC request requires an id\"));\n return;\n }\n\n pending.set(String(id), {\n resolve: (value) => resolve(value as TResult),\n reject,\n });\n\n try {\n sendClientRpcRequest(ws, request);\n } catch (error) {\n pending.delete(String(id));\n reject(error);\n }\n });\n };\n\n const sendSubscriptionControl = async (\n ws: WebSocket,\n method: \"subscribe\" | \"unsubscribe\",\n collection: string,\n ): Promise<SubscriptionControlResult> => {\n const id = String(nextId++);\n return sendRequest<SubscriptionControlResult>(ws, {\n id,\n method,\n params: {\n input: {\n json: {\n collection,\n },\n },\n },\n });\n };\n\n subscriptions = new ClientSubscriptions({\n currentSocket: () => socket,\n open,\n send: sendSubscriptionControl,\n });\n\n const link: TRPCLink<Router> = () => {\n return ({ op }) =>\n observable((observer) => {\n let cancelled = false;\n\n open()\n .then((ws) => {\n if (cancelled) return;\n\n const id = String(nextId++);\n sendRequest(ws, requestForOperation(id, op))\n .then((value) => {\n observer.next({ result: { data: value } });\n observer.complete();\n })\n .catch((error) => observer.error(error as never));\n })\n .catch((error) => observer.error(error as never));\n\n return () => {\n cancelled = true;\n };\n });\n };\n\n const trpc = createTRPCProxyClient<Router>({ links: [link] }) as unknown as {\n push: {\n mutate: (batch: Batch) => Promise<PushResult>;\n };\n read: {\n query: <T = unknown>(query: ReadQuery) => Promise<ReadResult<T>>;\n };\n changes: {\n query: (query: SyncChangesQuery) => Promise<SyncChangesResult>;\n };\n api: {\n mutate: <TResult = unknown>(call: ApiCall) => Promise<TResult>;\n };\n };\n\n return {\n clientId,\n push: (batch) => trpc.push.mutate(batch),\n read: (query) => trpc.read.query(query),\n changes: (query) => trpc.changes.query(query),\n call: <TPath extends ApiPath<TApi>>(path: TPath, ...args: ApiCallArgs<TApi, TPath>) => {\n const [input] = args;\n const call = input === undefined ? { path } : { path, input };\n return trpc.api.mutate<ApiOutput<TApi, TPath>>(call);\n },\n subscribe: (collection, listener) => subscriptions.subscribe(collection, listener),\n close() {\n socket?.close();\n socket = undefined;\n },\n };\n}\n\nexport function acquireSharedClient<TApi extends ApiContract = ApiContract>(\n options: ClientOptions,\n): SharedClientLease<TApi> {\n const key = sharedClientKey(options);\n let entry = sharedClients.get(key);\n\n if (!entry) {\n entry = {\n client: createClient({\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n }),\n refs: 0,\n };\n sharedClients.set(key, entry);\n }\n\n entry.refs += 1;\n\n let released = false;\n return {\n client: entry.client as Client<TApi>,\n release() {\n if (released) {\n return;\n }\n\n released = true;\n entry.refs -= 1;\n\n if (entry.refs === 0 && sharedClients.get(key) === entry) {\n sharedClients.delete(key);\n entry.client.close();\n }\n },\n };\n}\n\nfunction sharedClientKey(options: ClientOptions): string {\n const url = new URL(options.url);\n url.searchParams.delete(\"clientId\");\n return `${url.toString()}\\0${options.clientId ?? \"\"}`;\n}\n","import type { LoadSubsetOptions } from \"@tanstack/db\";\nimport type { ReadFilter, ReadOrderBy, ReadPredicate, ReadQuery } from \"./types\";\n\nexport type ReadOptions = Omit<ReadQuery, \"collection\">;\ntype ReadComparisonPredicate = Extract<ReadPredicate, { type: \"comparison\" }>;\n\nexport function initialReadQuery(\n collection: string,\n read: false | ReadOptions | undefined,\n): ReadQuery | undefined {\n if (read === false) {\n return undefined;\n }\n\n return {\n collection,\n ...read,\n };\n}\n\nexport function subsetId(options: LoadSubsetOptions): string {\n return JSON.stringify({\n cursor: options.cursor\n ? {\n whereCurrent: toReadPredicate(options.cursor.whereCurrent),\n whereFrom: toReadPredicate(options.cursor.whereFrom),\n }\n : undefined,\n predicate: options.where ? toReadPredicate(options.where) : undefined,\n limit: options.limit,\n offset: options.offset,\n orderBy: toReadOrderByList(options.orderBy),\n });\n}\n\nexport function readQueryForSubset(\n collection: string,\n baseRead: ReadOptions | undefined,\n options: LoadSubsetOptions,\n): ReadQuery {\n const query: ReadQuery = {\n collection,\n ...baseRead,\n filters: [...(baseRead?.filters ?? [])],\n };\n\n const predicate = combinePredicates(\n baseRead?.predicate,\n options.where ? toReadPredicate(options.where) : undefined,\n );\n if (predicate) {\n query.predicate = predicate;\n }\n\n const limit = options.limit ?? baseRead?.limit;\n if (limit !== undefined) {\n query.limit = limit;\n }\n\n const offset = options.cursor ? undefined : (options.offset ?? baseRead?.offset);\n if (offset !== undefined) {\n query.offset = offset;\n }\n\n const subsetOrderBy = toReadOrderByList(options.orderBy);\n const orderBy = subsetOrderBy.length > 0 ? subsetOrderBy : baseRead?.orderBy;\n if (orderBy) {\n query.orderBy = orderBy;\n }\n\n if (options.cursor) {\n query.cursor = {\n whereCurrent: toReadPredicate(options.cursor.whereCurrent),\n whereFrom: toReadPredicate(options.cursor.whereFrom),\n ...(options.cursor.lastKey !== undefined ? { lastKey: options.cursor.lastKey } : {}),\n };\n }\n\n return query;\n}\n\nfunction combinePredicates(\n left: ReadPredicate | undefined,\n right: ReadPredicate | undefined,\n): ReadPredicate | undefined {\n if (!left) return right;\n if (!right) return left;\n return { type: \"and\", predicates: [left, right] };\n}\n\nfunction toReadPredicate(expression: unknown): ReadPredicate {\n const unwrapped = unwrapExpression(expression);\n\n if (!isFuncExpression(unwrapped)) {\n throw new Error(\"On-demand cursor predicates must be function expressions\");\n }\n\n if (unwrapped.name === \"and\" || unwrapped.name === \"or\") {\n return {\n type: unwrapped.name,\n predicates: unwrapped.args.map(toReadPredicate),\n };\n }\n\n if (unwrapped.name === \"not\") {\n return negatePredicate(toReadPredicate(unwrapped.args[0]));\n }\n\n const comparison = comparisonFromExpression(unwrapped);\n if (!comparison) {\n throw new Error(`Unsupported on-demand cursor operator: ${unwrapped.name}`);\n }\n\n return {\n type: \"comparison\",\n ...comparison,\n };\n}\n\nfunction negatePredicate(predicate: ReadPredicate): ReadPredicate {\n if (predicate.type === \"and\" || predicate.type === \"or\") {\n return {\n type: predicate.type === \"and\" ? \"or\" : \"and\",\n predicates: predicate.predicates.map(negatePredicate),\n };\n }\n\n const comparison = predicate as ReadComparisonPredicate;\n return {\n ...comparison,\n op: negateOperator(comparison.op),\n };\n}\n\nfunction negateOperator(operator: ReadComparisonPredicate[\"op\"]): ReadComparisonPredicate[\"op\"] {\n switch (operator) {\n case \"eq\":\n return \"ne\";\n case \"ne\":\n return \"eq\";\n case \"gt\":\n return \"lte\";\n case \"gte\":\n return \"lt\";\n case \"lt\":\n return \"gte\";\n case \"lte\":\n return \"gt\";\n case \"in\":\n throw new Error(\"Unsupported on-demand cursor operator: not(in)\");\n default:\n throw new Error(\"Unsupported on-demand cursor operator\");\n }\n}\n\nfunction comparisonFromExpression(\n expression: FuncExpression,\n): Omit<ReadComparisonPredicate, \"type\"> | undefined {\n const op = toReadFilterOperator(expression.name);\n const [left, right] = expression.args;\n if (!op || !isRefExpression(left) || !isValExpression(right)) {\n return undefined;\n }\n\n return {\n field: left.path.join(\".\"),\n op,\n value: right.value,\n };\n}\n\nfunction toReadOrderByList(orderBy: LoadSubsetOptions[\"orderBy\"]): Array<ReadOrderBy> {\n return (orderBy ?? []).map((sort) => {\n const expression = unwrapExpression(sort.expression);\n if (!isRefExpression(expression)) {\n throw new Error(`On-demand orderBy must be a field reference`);\n }\n\n return toReadOrderBy({\n field: expression.path,\n direction: sort.compareOptions.direction,\n });\n });\n}\n\nfunction toReadOrderBy(sort: { field: Array<string | number>; direction: \"asc\" | \"desc\" }) {\n return {\n field: sort.field.join(\".\"),\n direction: sort.direction,\n };\n}\n\nfunction toReadFilterOperator(operator: string): ReadFilter[\"op\"] | undefined {\n switch (operator) {\n case \"eq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"in\":\n return operator;\n case \"not_eq\":\n return \"ne\";\n case \"not_gt\":\n return \"lte\";\n case \"not_gte\":\n return \"lt\";\n case \"not_lt\":\n return \"gte\";\n case \"not_lte\":\n return \"gt\";\n default:\n return undefined;\n }\n}\n\ninterface Expression {\n type: \"func\" | \"ref\" | \"val\";\n name?: string;\n args?: Array<unknown>;\n path?: Array<string | number>;\n value?: unknown;\n}\n\ntype FuncExpression = Expression & { args: Array<unknown>; name: string; type: \"func\" };\ntype RefExpression = Expression & { path: Array<string | number>; type: \"ref\" };\n\nfunction unwrapExpression(value: unknown): unknown {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"expression\" in value &&\n isExpression((value as { expression: unknown }).expression)\n ) {\n return (value as { expression: unknown }).expression;\n }\n\n return value;\n}\n\nfunction isExpression(value: unknown): value is Expression {\n return typeof value === \"object\" && value !== null && \"type\" in value;\n}\n\nfunction isFuncExpression(value: unknown): value is FuncExpression {\n return (\n isExpression(value) &&\n value.type === \"func\" &&\n typeof value.name === \"string\" &&\n Array.isArray(value.args)\n );\n}\n\nfunction isRefExpression(value: unknown): value is RefExpression {\n return isExpression(value) && value.type === \"ref\" && Array.isArray(value.path);\n}\n\nfunction isValExpression(value: unknown): value is Expression {\n return isExpression(value) && value.type === \"val\";\n}\n","import { type ChangeMessageOrDeleteKeyMessage, type Collection } from \"@tanstack/db\";\nimport type { ReadFilter, ReadPredicate } from \"./types\";\n\ntype Writer<T extends object, TKey extends string | number> = (\n message: ChangeMessageOrDeleteKeyMessage<T, TKey>,\n) => void;\n\ninterface SubsetState<TKey extends string | number> {\n filters: Array<ReadFilter>;\n keys: Set<TKey>;\n loaded: boolean;\n predicate?: ReadPredicate;\n refs: number;\n}\n\nexport interface RetainResult {\n loaded: boolean;\n}\n\nexport interface TrackRowResult {\n before: boolean;\n after: boolean;\n}\n\nexport class SubsetTracker<T extends object, TKey extends string | number> {\n private readonly subsets = new Map<string, SubsetState<TKey>>();\n private readonly keyRefs = new Map<TKey, number>();\n\n constructor(private readonly getKey: (item: T) => TKey) {}\n\n replace(\n subsetId: string,\n rows: Array<T>,\n filters: Array<ReadFilter>,\n predicate?: ReadPredicate,\n ): Array<TKey> {\n const previous = this.subsets.get(subsetId);\n const refs = previous?.refs ?? 0;\n if (previous) {\n this.releaseKeys(previous.keys);\n }\n\n const keys = new Set(rows.map((row) => this.getKey(row)));\n this.addKeys(keys);\n this.subsets.set(subsetId, {\n filters,\n keys,\n loaded: true,\n ...(predicate ? { predicate } : {}),\n refs,\n });\n\n const removed: Array<TKey> = [];\n previous?.keys.forEach((key) => {\n if (!keys.has(key) && !this.keyRefs.has(key)) {\n removed.push(key);\n }\n });\n return removed;\n }\n\n retain(subsetId: string): RetainResult {\n const subset = this.subsets.get(subsetId);\n if (subset) {\n subset.refs += 1;\n return { loaded: subset.loaded };\n }\n\n this.subsets.set(subsetId, { filters: [], keys: new Set(), loaded: false, refs: 1 });\n return { loaded: false };\n }\n\n trackRow(row: T): boolean {\n const result = this.reconcileRow(row);\n return result.before || result.after;\n }\n\n reconcileRow(row: T): TrackRowResult {\n const key = this.getKey(row);\n let before = false;\n\n this.subsets.forEach((subset) => {\n const had = subset.keys.has(key);\n before ||= had;\n\n if (matchesSubset(row, subset)) {\n if (!had) {\n subset.keys.add(key);\n this.keyRefs.set(key, (this.keyRefs.get(key) ?? 0) + 1);\n }\n return;\n }\n\n if (had) {\n subset.keys.delete(key);\n this.releaseKey(key);\n }\n });\n\n return {\n before,\n after: this.keyRefs.has(key),\n };\n }\n\n deleteKey(key: TKey): boolean {\n if (!this.keyRefs.has(key)) {\n return false;\n }\n\n this.subsets.forEach((subset) => {\n subset.keys.delete(key);\n });\n this.keyRefs.delete(key);\n return true;\n }\n\n release(subsetId: string, retain = false): Array<TKey> {\n const subset = this.subsets.get(subsetId);\n if (!subset) {\n return [];\n }\n\n subset.refs -= 1;\n if (subset.refs > 0) {\n return [];\n }\n\n subset.refs = 0;\n if (retain) {\n return [];\n }\n\n return this.expire(subsetId);\n }\n\n expire(subsetId: string): Array<TKey> {\n const subset = this.subsets.get(subsetId);\n if (!subset || subset.refs > 0) {\n return [];\n }\n\n this.subsets.delete(subsetId);\n return this.releaseKeys(subset.keys);\n }\n\n clear(): Array<TKey> {\n const keys = [...this.keyRefs.keys()];\n this.subsets.clear();\n this.keyRefs.clear();\n return keys;\n }\n\n private addKeys(keys: Set<TKey>): void {\n keys.forEach((key) => {\n this.keyRefs.set(key, (this.keyRefs.get(key) ?? 0) + 1);\n });\n }\n\n private releaseKeys(keys: Set<TKey>): Array<TKey> {\n const removed: Array<TKey> = [];\n keys.forEach((key) => {\n if (this.releaseKey(key)) {\n removed.push(key);\n }\n });\n return removed;\n }\n\n private releaseKey(key: TKey): boolean {\n const refs = (this.keyRefs.get(key) ?? 0) - 1;\n if (refs <= 0) {\n this.keyRefs.delete(key);\n return true;\n }\n\n this.keyRefs.set(key, refs);\n return false;\n }\n}\n\nexport function writeRows<T extends object, TKey extends string | number>(\n collection: Collection<T, TKey>,\n rows: Array<T>,\n getKey: (item: T) => TKey,\n write: Writer<T, TKey>,\n): void {\n for (const row of rows) {\n const key = getKey(row);\n write({\n type: collection.has(key) ? \"update\" : \"insert\",\n key,\n value: row,\n } as ChangeMessageOrDeleteKeyMessage<T, TKey>);\n }\n}\n\nfunction matchesFilters(row: unknown, filters: Array<ReadFilter>): boolean {\n return filters.every((filter) => matchesFilter(row, filter));\n}\n\nfunction matchesSubset<TKey extends string | number>(\n row: unknown,\n subset: SubsetState<TKey>,\n): boolean {\n return matchesFilters(row, subset.filters) && matchesPredicate(row, subset.predicate);\n}\n\nfunction matchesPredicate(row: unknown, predicate: ReadPredicate | undefined): boolean {\n if (!predicate) {\n return true;\n }\n\n if (predicate.type === \"comparison\") {\n return matchesFilter(row, predicate);\n }\n\n if (predicate.type === \"and\") {\n return predicate.predicates.every((child) => matchesPredicate(row, child));\n }\n\n return predicate.predicates.some((child) => matchesPredicate(row, child));\n}\n\nfunction matchesFilter(row: unknown, filter: ReadFilter): boolean {\n const value = valueAtPath(row, filter.field);\n\n switch (filter.op) {\n case \"eq\":\n return value === filter.value;\n case \"ne\":\n return value !== filter.value;\n case \"gt\":\n return compareValues(value, filter.value, (left, right) => left > right);\n case \"gte\":\n return compareValues(value, filter.value, (left, right) => left >= right);\n case \"lt\":\n return compareValues(value, filter.value, (left, right) => left < right);\n case \"lte\":\n return compareValues(value, filter.value, (left, right) => left <= right);\n case \"in\":\n return Array.isArray(filter.value) && filter.value.includes(value);\n }\n\n return false;\n}\n\nfunction compareValues(\n left: unknown,\n right: unknown,\n compare: (left: number | string, right: number | string) => boolean,\n): boolean {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return compare(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n return compare(left, right);\n }\n\n return false;\n}\n\nfunction valueAtPath(row: unknown, field: string): unknown {\n return field.split(\".\").reduce<unknown>((value, segment) => {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n\n return (value as Record<string, unknown>)[segment];\n }, row);\n}\n","import type {\n CollectionConfig,\n InferSchemaOutput,\n LoadSubsetOptions,\n TransactionWithMutations,\n} from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { createBatch, toChangeMessage } from \"./batch\";\nimport { acquireSharedClient } from \"./client\";\nimport { initialReadQuery, readQueryForSubset, subsetId } from \"./read-query\";\nimport type { CollectionOptions } from \"./types\";\nimport { SubsetTracker, writeRows } from \"./subsets\";\n\nexport function collectionOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number = string | number,\n>(\n options: CollectionOptions<InferSchemaOutput<TSchema>, TKey, TSchema> & {\n schema: TSchema;\n },\n): CollectionConfig<InferSchemaOutput<TSchema>, TKey, TSchema> & {\n schema: TSchema;\n};\n\nexport function collectionOptions<T extends object, TKey extends string | number = string | number>(\n options: CollectionOptions<T, TKey, never> & {\n schema?: never;\n },\n): CollectionConfig<T, TKey, never> & {\n schema?: never;\n};\n\nexport function collectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n>(options: CollectionOptions<T, TKey, TSchema>): CollectionConfig<T, TKey, TSchema> {\n let lease: ReturnType<typeof acquireSharedClient> | undefined;\n let client = options.client;\n let activeSubsets: SubsetTracker<T, TKey> | undefined;\n\n if (!client) {\n if (!options.url) {\n throw new Error(\"collectionOptions requires either client or url\");\n }\n\n lease = acquireSharedClient({\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n client = lease.client;\n }\n\n return {\n ...(options.id ? { id: options.id } : {}),\n ...(options.gcTime !== undefined ? { gcTime: options.gcTime } : {}),\n ...(options.schema ? { schema: options.schema } : {}),\n ...(options.startSync !== undefined ? { startSync: options.startSync } : {}),\n ...(options.syncMode ? { syncMode: options.syncMode } : {}),\n ...(options.autoIndex !== undefined ? { autoIndex: options.autoIndex } : {}),\n ...(options.defaultIndexType !== undefined\n ? { defaultIndexType: options.defaultIndexType }\n : {}),\n getKey: options.getKey,\n sync: {\n sync: ({ begin, write, commit, markReady, collection }) => {\n const subsets = new SubsetTracker<T, TKey>(options.getKey);\n activeSubsets = subsets;\n const subsetGcTime = options.gcTime ?? 300000;\n const retentionTimers = new Map<string, ReturnType<typeof setTimeout>>();\n const deleteKeys = (keys: Array<TKey>) => {\n if (keys.length === 0) return;\n\n begin();\n for (const key of keys) {\n write({ type: \"delete\", key });\n }\n commit();\n };\n const cancelRetention = (id: string) => {\n const timer = retentionTimers.get(id);\n if (!timer) return;\n\n clearTimeout(timer);\n retentionTimers.delete(id);\n };\n const scheduleRetention = (id: string) => {\n if (!Number.isFinite(subsetGcTime)) {\n return;\n }\n\n if (subsetGcTime <= 0) {\n deleteKeys(subsets.expire(id));\n return;\n }\n\n cancelRetention(id);\n retentionTimers.set(\n id,\n setTimeout(() => {\n retentionTimers.delete(id);\n deleteKeys(subsets.expire(id));\n }, subsetGcTime),\n );\n };\n const subscription = client.subscribe(options.collection, (broadcast) => {\n if ((broadcast.invalidations ?? []).length > 0 && options.syncMode === \"on-demand\") {\n deleteKeys(subsets.clear());\n }\n\n const changes = broadcast.updates.flatMap((update) => {\n if (update.collection !== options.collection) return [];\n const ownUpdate = update.clientId === client.clientId;\n if ((options.ignoreOwnUpdates ?? false) && ownUpdate) {\n return [];\n }\n\n if (options.syncMode !== \"on-demand\") {\n return [toChangeMessage<T, TKey>(update, collection.has(update.key as TKey))];\n }\n\n const key = update.key as TKey;\n const exists = collection.has(key);\n if (update.type === \"delete\") {\n subsets.deleteKey(key);\n return exists ? [{ type: \"delete\" as const, key }] : [];\n }\n\n const current = collection.get(key) as T | undefined;\n const row =\n update.type === \"update\" && current\n ? ({ ...current, ...(update.value as Partial<T>) } as T)\n : (update.value as T);\n const tracked = subsets.reconcileRow(row);\n\n if (ownUpdate || exists || tracked.after) {\n return [toChangeMessage<T, TKey>(update, exists)];\n }\n\n return [];\n });\n\n if (changes.length === 0) {\n return;\n }\n\n begin();\n for (const change of changes) {\n write(change);\n }\n commit();\n });\n\n const readSubset = (subsetOptions: LoadSubsetOptions): true | Promise<void> => {\n const id = subsetId(subsetOptions);\n cancelRetention(id);\n const retained = subsets.retain(id);\n if (retained.loaded) {\n return true;\n }\n\n return (async () => {\n const query = readQueryForSubset(\n options.collection,\n options.read === false ? undefined : options.read,\n subsetOptions,\n );\n await subscription.ready;\n const result = await client.read<T>(query);\n const removedKeys = subsets.replace(\n id,\n result.rows,\n query.filters ?? [],\n query.predicate,\n );\n\n begin();\n writeRows(collection, result.rows, options.getKey, write);\n for (const key of removedKeys) {\n write({ type: \"delete\", key });\n }\n commit();\n })().catch((error: unknown) => {\n deleteKeys(subsets.release(id));\n throw error;\n });\n };\n\n if (options.syncMode === \"on-demand\") {\n markReady();\n return {\n loadSubset: readSubset,\n unloadSubset: (subsetOptions: LoadSubsetOptions) => {\n const id = subsetId(subsetOptions);\n const removedKeys = subsets.release(id, subsetGcTime !== 0);\n deleteKeys(removedKeys);\n if (removedKeys.length === 0) scheduleRetention(id);\n },\n cleanup: () => {\n retentionTimers.forEach((timer) => {\n clearTimeout(timer);\n });\n retentionTimers.clear();\n subsets.clear();\n if (activeSubsets === subsets) {\n activeSubsets = undefined;\n }\n subscription.unsubscribe();\n lease?.release();\n },\n };\n }\n\n const initialQuery = initialReadQuery(options.collection, options.read);\n if (!initialQuery) {\n void subscription.ready.then(() => {\n markReady();\n });\n } else {\n void subscription.ready\n .then(() => client.read<T>(initialQuery))\n .then((result) => {\n if (result.rows.length > 0) {\n begin();\n writeRows(collection, result.rows, options.getKey, write);\n commit();\n }\n markReady();\n });\n }\n\n return () => {\n if (activeSubsets === subsets) {\n activeSubsets = undefined;\n }\n subscription.unsubscribe();\n lease?.release();\n };\n },\n rowUpdateMode: \"partial\",\n },\n onInsert: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n onUpdate: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n onDelete: async ({ transaction }) => {\n trackLocalTransaction(activeSubsets, options.syncMode, transaction);\n return client.push(createBatch(options.collection, client.clientId, transaction));\n },\n } as CollectionConfig<T, TKey, TSchema>;\n}\n\nfunction trackLocalTransaction<T extends object, TKey extends string | number>(\n subsets: SubsetTracker<T, TKey> | undefined,\n syncMode: CollectionConfig<T, TKey>[\"syncMode\"],\n transaction: Pick<TransactionWithMutations<T>, \"mutations\">,\n): void {\n if (syncMode !== \"on-demand\" || !subsets) {\n return;\n }\n\n for (const mutation of transaction.mutations) {\n if (mutation.type === \"delete\") {\n subsets.deleteKey(mutation.key as TKey);\n continue;\n }\n\n subsets.reconcileRow(mutation.modified as T);\n }\n}\n","import { collectionPathSegments, isCollectionPathParam } from \"./collection-path\";\n\nexport function defaultCollectionApiPath(path: string, name: string): string {\n const prefix = collectionPathSegments(path)\n .filter((segment) => !isCollectionPathParam(segment))\n .join(\".\");\n\n return prefix ? `${prefix}.${name}` : name;\n}\n","import { createCollection, type Collection, type InferSchemaOutput } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { collectionScope, firstNewPathParam, type CollectionScopeParams } from \"./collection-path\";\nimport { collectionOptions } from \"./collection\";\nimport { acquireSharedClient } from \"./client\";\nimport { defaultCollectionApiPath } from \"./collection-api\";\nimport type {\n ChildCollectionTypeOptions,\n ChildManagers,\n CollectionApiMethod,\n CollectionApiMethods,\n CollectionTypeApi,\n CollectionCache,\n CollectionCacheEntry,\n CollectionEntity,\n CollectionType,\n CollectionTypeBaseOptions,\n CollectionTypeChildren,\n CollectionTypeConnection,\n CollectionTypeId,\n CollectionTypeOptions,\n CollectionUsage,\n OptionalCollectionTypeConnection,\n} from \"./collection-type-types\";\nimport type { ApiContract, Client } from \"./types\";\n\nexport type { CollectionScopeParams };\nexport type {\n ChildCollectionTypeOptions,\n CollectionApiHandler,\n CollectionApiHandlerArgs,\n CollectionApiMethod,\n CollectionApiMethods,\n CollectionTypeApi,\n CollectionEntity,\n CollectionType,\n CollectionTypeOptions,\n CollectionUsage,\n} from \"./collection-type-types\";\n\nexport function createCollectionTypeFromOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number = string | number,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<InferSchemaOutput<TSchema>, TKey> = {},\n>(\n options: CollectionTypeOptions<InferSchemaOutput<TSchema>, TKey, TSchema, TChildren, TApi> & {\n schema: TSchema;\n },\n): CollectionType<InferSchemaOutput<TSchema>, TKey, TChildren, TApi>;\n\nexport function createCollectionTypeFromOptions<\n T extends object,\n TKey extends string | number = string | number,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n>(\n options: CollectionTypeOptions<T, TKey, never, TChildren, TApi> & {\n schema?: never;\n },\n): CollectionType<T, TKey, TChildren, TApi>;\n\nexport function createCollectionTypeFromOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren = {},\n TApi extends CollectionTypeApi<T, TKey> = {},\n>(\n options: CollectionTypeOptions<T, TKey, TSchema, TChildren, TApi>,\n): CollectionType<T, TKey, TChildren, TApi> {\n const connection = connectionFrom(options);\n\n if (!connection) {\n throw new Error(\"CollectionTypes.builder requires either client or url\");\n }\n\n return new CollectionTypeManager<T, TKey, TSchema, TChildren, TApi>(\n options,\n connection,\n {},\n new Map(),\n ).api();\n}\n\nclass CollectionTypeManager<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TChildren extends CollectionTypeChildren,\n TApi extends CollectionTypeApi<T, TKey> = {},\n> {\n constructor(\n private readonly options: CollectionTypeBaseOptions<T, TKey, TSchema, TChildren, TApi>,\n private readonly connection: CollectionTypeConnection,\n private readonly params: CollectionScopeParams,\n private readonly cache: CollectionCache,\n ) {}\n\n api(): CollectionType<T, TKey, TChildren, TApi> {\n const base = {\n all: (params: CollectionScopeParams = {}) => this.all(params),\n delete: (...args: Parameters<Collection<T, TKey>[\"delete\"]>) => this.all({}).delete(...args),\n insert: (...args: Parameters<Collection<T, TKey>[\"insert\"]>) => this.all({}).insert(...args),\n with: (params: CollectionScopeParams) => this.with(params),\n withId: (id: TKey, childParam?: string) => this.withId(id, childParam),\n update: (...args: Parameters<Collection<T, TKey>[\"update\"]>) => this.all({}).update(...args),\n usage: () => this.usage(),\n };\n const withApi = withApiMethods(base, this.apiMethods());\n return withChildren(withApi, this.childManagers(this.params)) as CollectionType<\n T,\n TKey,\n TChildren,\n TApi\n >;\n }\n\n private all(params: CollectionScopeParams): Collection<T, TKey> {\n const scope = collectionScope(this.options.path, { ...this.params, ...params });\n const key = `${this.options.path}\\n${scope}`;\n const existing = this.cache.get(key) as CollectionCacheEntry<T, TKey> | undefined;\n\n if (existing) {\n existing.usage.accessCount += 1;\n existing.usage.lastAccessedAt = Date.now();\n return existing.collection;\n }\n\n const id = collectionId(this.options.id, this.options.path, scope);\n const collection = createCollection(\n collectionOptions({\n ...collectionConfig(this.options),\n ...this.connection,\n id,\n collection: scope,\n } as any),\n ) as unknown as Collection<T, TKey>;\n\n const usage = {\n id,\n path: this.options.path,\n scope,\n accessCount: 1,\n createdAt: Date.now(),\n lastAccessedAt: Date.now(),\n };\n\n this.cache.set(key, { collection, usage });\n return collection;\n }\n\n private with(params: CollectionScopeParams): CollectionType<T, TKey, TChildren, TApi> {\n return new CollectionTypeManager(\n this.options,\n this.connection,\n { ...this.params, ...params },\n this.cache,\n ).api();\n }\n\n private withId(id: TKey, childParam?: string): CollectionEntity<T, TKey, TChildren> {\n const base = {\n all: () => this.all({}),\n delete: (config?: Parameters<Collection<T, TKey>[\"delete\"]>[1]) =>\n this.all({}).delete(id, config),\n get: () => this.all({}).get(id),\n update: (...args: Array<unknown>) => this.all({}).update(id, ...(args as [any, any])),\n };\n return withChildren(\n base,\n this.childManagers(this.childParams(id, childParam)),\n ) as CollectionEntity<T, TKey, TChildren>;\n }\n\n private usage(): Array<CollectionUsage> {\n return [...this.cache.values()].map((entry) => ({ ...entry.usage }));\n }\n\n private apiMethods(): CollectionApiMethods<TApi> {\n return Object.fromEntries(\n Object.entries(this.options.api ?? {}).map(([name, method]) => [\n name,\n (...args: Array<unknown>) => this.callApi(name, method, args[0]),\n ]),\n ) as CollectionApiMethods<TApi>;\n }\n\n private async callApi(\n name: string,\n method: CollectionApiMethod<unknown, unknown, T, TKey>,\n input: unknown,\n ): Promise<unknown> {\n if (method.handler) {\n const scope = collectionScope(this.options.path, this.params);\n return method.handler({\n input,\n collection: this.all({}),\n params: this.params,\n scope,\n });\n }\n\n const path = method.path ?? defaultCollectionApiPath(this.options.path, name);\n const lease = this.connection.client ? undefined : acquireSharedClient(this.connection);\n const client = (this.connection.client ?? lease?.client) as Client<ApiContract>;\n\n try {\n return await client.call(path, input);\n } finally {\n lease?.release();\n }\n }\n\n private childManagers(params: CollectionScopeParams): ChildManagers<TChildren> {\n const children = (this.options.children ?? {}) as CollectionTypeChildren;\n return Object.fromEntries(\n Object.entries(children).map(([name, child]) => [\n name,\n new CollectionTypeManager<any, any, any, any>(\n child,\n connectionFrom(child) ?? this.connection,\n params,\n this.cache,\n ).api(),\n ]),\n ) as ChildManagers<TChildren>;\n }\n\n private childParams(id: TKey, childParam?: string): CollectionScopeParams {\n const param = childParam ?? firstChildParam(this.options);\n return param ? { ...this.params, [param]: id } : this.params;\n }\n}\n\nfunction collectionConfig<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n>(options: CollectionTypeBaseOptions<T, TKey, TSchema, any, any>) {\n const { api, children, id, name, parentParam, path, ...config } = options;\n void api;\n void children;\n void id;\n void name;\n void parentParam;\n void path;\n return config;\n}\n\nfunction withChildren<TTarget extends object, TChildren extends CollectionTypeChildren>(\n target: TTarget,\n children: ChildManagers<TChildren>,\n): TTarget & ChildManagers<TChildren> {\n return Object.assign(target, children);\n}\n\nfunction withApiMethods<TTarget extends object, TApi extends CollectionTypeApi<any, any>>(\n target: TTarget,\n api: CollectionApiMethods<TApi>,\n): TTarget & CollectionApiMethods<TApi> {\n for (const name of Object.keys(api)) {\n if (name in target) {\n throw new Error(`Collection API method conflicts with existing property: ${name}`);\n }\n }\n\n return Object.assign(target, api);\n}\n\nfunction connectionFrom(\n options: OptionalCollectionTypeConnection,\n): CollectionTypeConnection | undefined {\n if (options.client) {\n return { client: options.client };\n }\n\n if (options.url) {\n return {\n url: options.url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n };\n }\n\n return undefined;\n}\n\nfunction collectionId(id: CollectionTypeId | undefined, path: string, scope: string): string {\n return typeof id === \"function\" ? id({ path, scope }) : (id ?? scope);\n}\n\nfunction firstChildParam(\n options: CollectionTypeBaseOptions<any, any, any, any, any>,\n): string | undefined {\n const child = Object.values(options.children ?? {})[0] as\n | ChildCollectionTypeOptions<any, any, any, any, any>\n | undefined;\n return child?.parentParam ?? firstNewPathParam(child?.path, options.path);\n}\n","import type { BaseCollectionConfig } from \"@tanstack/db\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n ApiDefinition,\n CollectionAtPath,\n CollectionDefinition,\n CollectionDefinitions,\n CollectionPath,\n CollectionSet,\n} from \"@lsync/definitions\";\nimport { createCollectionTypeFromOptions } from \"./collection-type\";\nimport type {\n ChildCollectionTypeOptions,\n CollectionApiMethod,\n CollectionType,\n CollectionTypeApi,\n CollectionTypeConnection,\n} from \"./collection-type-types\";\nimport type { Client } from \"./types\";\n\ntype BuilderIndexMode = NonNullable<BaseCollectionConfig<any, any, any>[\"autoIndex\"]>;\ntype BuilderIndexType = BaseCollectionConfig<any, any, any>[\"defaultIndexType\"];\ntype BuilderSyncMode = \"eager\" | \"on-demand\";\n\nexport function collectionTypesFrom<TCollections extends CollectionDefinitions>(\n definitions: CollectionSet<TCollections>,\n): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(definitions.collections, {}, undefined);\n}\n\nexport class DefinitionCollectionTypesBuilder<TCollections extends CollectionDefinitions> {\n constructor(\n private readonly definitions: TCollections,\n private readonly overrides: Record<string, ClientCollectionOverride>,\n private readonly connection: CollectionTypeConnection | undefined,\n ) {}\n\n client(client: Client): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(this.definitions, this.overrides, { client });\n }\n\n url(\n url: string | URL,\n options: { clientId?: string } = {},\n ): DefinitionCollectionTypesBuilder<TCollections> {\n return new DefinitionCollectionTypesBuilder(this.definitions, this.overrides, {\n url,\n ...(options.clientId ? { clientId: options.clientId } : {}),\n });\n }\n\n collection<TPath extends CollectionPath<TCollections>>(\n path: TPath,\n configure: (\n collection: ClientCollectionBuilder<CollectionAtPath<TCollections, TPath>>,\n ) => ClientCollectionBuilder<CollectionAtPath<TCollections, TPath>>,\n ): DefinitionCollectionTypesBuilder<TCollections> {\n const override = configure(new ClientCollectionBuilder({})).toOverride();\n return new DefinitionCollectionTypesBuilder(\n this.definitions,\n { ...this.overrides, [path]: override },\n this.connection,\n );\n }\n\n build(): CollectionManagers<TCollections> {\n if (!this.connection) {\n throw new Error(\"CollectionTypes.from requires either client or url\");\n }\n\n return Object.fromEntries(\n Object.entries(this.definitions).map(([name, definition]) => [\n name,\n collectionTypeFromDefinition(definition, name, this.overrides, this.connection!),\n ]),\n ) as CollectionManagers<TCollections>;\n }\n}\n\nexport class ClientCollectionBuilder<TDefinition> {\n constructor(private readonly override: ClientCollectionOverride) {}\n\n sync(syncMode: BuilderSyncMode): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({ ...this.override, syncMode });\n }\n\n index(\n autoIndex: BuilderIndexMode,\n defaultIndexType?: BuilderIndexType,\n ): ClientCollectionBuilder<TDefinition> {\n return new ClientCollectionBuilder({\n ...this.override,\n autoIndex,\n ...(defaultIndexType ? { defaultIndexType } : {}),\n });\n }\n\n toOverride(): ClientCollectionOverride {\n return this.override;\n }\n}\n\nexport type CollectionManagers<TCollections extends CollectionDefinitions> = {\n [TName in keyof TCollections]: CollectionTypeForDefinition<TCollections[TName]>;\n};\n\ntype CollectionTypeForDefinition<TDefinition> =\n TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi>\n ? CollectionType<\n TRow,\n Extract<TRow[TKey], string | number>,\n ChildOptionsForDefinitions<TChildren>,\n ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>\n >\n : never;\n\ntype ChildOptionsForDefinitions<TChildren extends CollectionDefinitions> = {\n [TName in keyof TChildren]: ChildOptionForDefinition<TChildren[TName]>;\n};\n\ntype ChildOptionForDefinition<TDefinition> =\n TDefinition extends CollectionDefinition<infer TRow, infer TKey, infer TChildren, infer TApi>\n ? ChildCollectionTypeOptions<\n TRow,\n Extract<TRow[TKey], string | number>,\n StandardSchemaV1,\n ChildOptionsForDefinitions<TChildren>,\n ApiMethodsForDefinitions<TApi, TRow, Extract<TRow[TKey], string | number>>\n >\n : never;\n\ntype ApiMethodsForDefinitions<\n TApi extends Record<string, ApiDefinition<any, any>>,\n TRow extends object,\n TKey extends string | number,\n> = {\n [TName in keyof TApi]: TApi[TName] extends ApiDefinition<infer TInput, infer TOutput>\n ? CollectionApiMethod<TInput, TOutput, TRow, TKey>\n : never;\n};\n\ninterface ClientCollectionOverride {\n syncMode?: BuilderSyncMode;\n autoIndex?: BuilderIndexMode;\n defaultIndexType?: BuilderIndexType;\n}\n\nfunction collectionTypeFromDefinition(\n definition: CollectionDefinition,\n dotPath: string,\n overrides: Record<string, ClientCollectionOverride>,\n connection: CollectionTypeConnection,\n): CollectionType<any, any, any, any> {\n return createCollectionTypeFromOptions({\n ...collectionOptionsFromDefinition(definition, dotPath, overrides),\n ...connection,\n } as any);\n}\n\nfunction collectionOptionsFromDefinition(\n definition: CollectionDefinition,\n dotPath: string,\n overrides: Record<string, ClientCollectionOverride>,\n): Record<string, unknown> {\n return {\n ...overrides[dotPath],\n name: definition.name,\n path: definition.path,\n schema: definition.schema,\n getKey: (item: Record<string, unknown>) => item[definition.key],\n children: Object.fromEntries(\n Object.entries(definition.children).map(([name, child]) => [\n name,\n collectionOptionsFromDefinition(child, `${dotPath}.${name}`, overrides),\n ]),\n ),\n api: Object.fromEntries(\n Object.entries(definition.api).map(([name, api]) => [\n name,\n api.path ? { path: api.path } : {},\n ]),\n ) satisfies CollectionTypeApi<any, any>,\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lsync/client",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"homepage": "https://github.com/Myrannas/lsync#readme",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/Myrannas/lsync/issues"
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"@tanstack/db": "^0.6.14",
|
|
32
32
|
"@trpc/client": "^11.4.4",
|
|
33
33
|
"@trpc/server": "^11.4.4",
|
|
34
|
-
"@lsync/definitions": "0.0.
|
|
35
|
-
"@lsync/transport": "0.0.
|
|
34
|
+
"@lsync/definitions": "0.0.2",
|
|
35
|
+
"@lsync/transport": "0.0.2"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"typescript": "^6.0.3",
|