@lsync/client 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +10 -0
- package/dist/index.d.mts +233 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1206 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +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":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lsync/client",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"homepage": "https://github.com/Myrannas/lsync#readme",
|
|
5
|
+
"bugs": {
|
|
6
|
+
"url": "https://github.com/Myrannas/lsync/issues"
|
|
7
|
+
},
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/Myrannas/lsync.git",
|
|
12
|
+
"directory": "packages/tanstack-db"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"type": "module",
|
|
18
|
+
"sideEffects": false,
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.mts",
|
|
22
|
+
"import": "./dist/index.mjs"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public",
|
|
27
|
+
"registry": "https://registry.npmjs.org/"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@standard-schema/spec": "^1.0.0",
|
|
31
|
+
"@tanstack/db": "^0.6.14",
|
|
32
|
+
"@trpc/client": "^11.4.4",
|
|
33
|
+
"@trpc/server": "^11.4.4",
|
|
34
|
+
"@lsync/definitions": "0.0.1",
|
|
35
|
+
"@lsync/transport": "0.0.1"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"typescript": "^6.0.3",
|
|
39
|
+
"vite": "npm:@voidzero-dev/vite-plus-core@0.2.2",
|
|
40
|
+
"vite-plus": "0.2.2",
|
|
41
|
+
"zod": "^4.4.3"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "vp pack"
|
|
45
|
+
}
|
|
46
|
+
}
|