UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

1 lines • 8.96 kB
{"version":3,"file":"live-query-options.cjs","sources":["../../src/live-query-options.ts"],"sourcesContent":["import { BaseQueryBuilder } from './query/builder/index.js'\nimport { isCollection } from './live-query-adapter.js'\nimport { createLiveQueryCollection } from './query/live-query-collection.js'\nimport {\n createPooledLiveQuery,\n getPooledQueryIdentity,\n} from './query/pooled-live-query.js'\nimport {\n getStableQueryBuilderHash,\n getStableValueHash,\n} from './query/ir-stable-identity.js'\nimport { getStringCollationIdentity } from './query/runtime-reference-identity.js'\nimport type { Collection, CollectionImpl } from './collection/index.js'\nimport type { CollectionOptionsIdentity } from './collection-options.js'\nimport type { CollectionOptions, DbClient } from './client.js'\nimport type {\n Context,\n InitialQueryBuilder,\n LiveQueryCollectionConfig,\n QueryBuilder,\n} from './query/index.js'\n\nexport type LiveQueryKey = ReadonlyArray<unknown>\n\nexport type LiveQueryOptions = LiveQueryCollectionConfig<any> & {\n queryKey?: LiveQueryKey\n}\n\nexport type DeferredLiveQueryCollections = Set<\n CollectionImpl<any, string | number, any, any, any>\n>\n\ntype PreparedLiveQueryConfigInput = Omit<\n LiveQueryCollectionConfig<Context>,\n `query`\n> & {\n query:\n | QueryBuilder<Context>\n | ((q: InitialQueryBuilder) => QueryBuilder<Context> | undefined | null)\n queryKey?: LiveQueryKey\n client?: DbClient\n}\n\nfunction createInitialQueryBuilder(\n dbClient: DbClient | undefined,\n deferredCollections: DeferredLiveQueryCollections,\n): InitialQueryBuilder {\n return new BaseQueryBuilder(\n {},\n dbClient\n ? (\n options: CollectionOptionsIdentity<\n any,\n string | number,\n any,\n any,\n any\n >,\n ) => {\n const collection = dbClient._materializeCollectionForRender(\n options as CollectionOptions<any, string | number, any, any>,\n ) as CollectionImpl<any, string | number, any, any, any>\n if (collection._deferSyncStart()) deferredCollections.add(collection)\n return collection\n }\n : undefined,\n ) as InitialQueryBuilder\n}\n\nexport function prepareLiveQueryValue(\n value: unknown,\n dbClient: DbClient | undefined,\n deferredCollections: DeferredLiveQueryCollections,\n): unknown {\n if (typeof value === `function`) {\n return prepareLiveQueryValue(\n value(createInitialQueryBuilder(dbClient, deferredCollections)),\n dbClient,\n deferredCollections,\n )\n }\n\n if (\n value &&\n typeof value === `object` &&\n !isCollection(value) &&\n !(value instanceof BaseQueryBuilder) &&\n `query` in value\n ) {\n const {\n query,\n queryKey: _queryKey,\n client: _client,\n ...config\n } = value as PreparedLiveQueryConfigInput\n\n const preparedQuery =\n typeof query === `function`\n ? query(createInitialQueryBuilder(dbClient, deferredCollections))\n : query\n\n if (preparedQuery === undefined || preparedQuery === null) {\n return preparedQuery\n }\n\n return {\n ...config,\n query: preparedQuery,\n }\n }\n\n return value\n}\n\nexport function getPreparedLiveQueryIdentity(value: unknown): unknown {\n if (isCollection(value)) return [`collection`, value.id]\n if (value instanceof BaseQueryBuilder) {\n // A pooled query's fields and literals identify its rows without\n // canonicalizing its whole IR on every render.\n const pooled = getPooledQueryIdentity(value)\n return pooled === undefined\n ? [`query`, getStableQueryBuilderHash(value)]\n : [`pooled`, pooled]\n }\n if (value && typeof value === `object` && `query` in value) {\n const config = value as LiveQueryCollectionConfig<any>\n return [\n `config`,\n getPreparedLiveQueryIdentity(config.query),\n [`getKey`, config.getKey],\n [`schema`, config.schema],\n [`singleResult`, config.singleResult === true],\n [\n `defaultStringCollation`,\n getStringCollationIdentity(config.defaultStringCollation),\n ],\n ]\n }\n if (value === undefined || value === null) return [`disabled`]\n return [`value`, value]\n}\n\nexport function getLiveQueryHash(\n preparedValue: unknown,\n queryKey?: LiveQueryKey,\n): string {\n const identity = queryKey?.length\n ? [`queryKey`, queryKey]\n : isCollection(preparedValue)\n ? [`collection`, preparedValue.id]\n : [`derived`, getPreparedLiveQueryIdentity(preparedValue)]\n\n return getStableValueHash(identity, `queryKey`)\n}\n\n/**\n * Resolve an adapter's query value to what its observer watches: `null` for a\n * disabled query, an existing Collection with sync started, or a live query.\n * A query builder whose shape a shared partition can serve gets a pooled view\n * instead of its own live-query Collection.\n */\n// A config that names only its query and lifetime describes the same live\n// query as its builder. Any other option shapes its Collection, so compiles.\nfunction poolConfig(\n config: LiveQueryCollectionConfig<any>,\n gcTime: number | undefined,\n): Collection<any, any, any> | undefined {\n if (\n !(config.query instanceof BaseQueryBuilder) ||\n !Object.keys(config).every((key) => key === `query` || key === `gcTime`)\n ) {\n return undefined\n }\n return createPooledLiveQuery(config.query, {\n gcTime: config.gcTime ?? gcTime,\n })\n}\n\nexport function resolveLiveQueryValue(\n value: unknown,\n { gcTime, pool = true }: { gcTime?: number; pool?: boolean } = {},\n): Collection<any, any, any> | null {\n if (value === undefined || value === null) return null\n if (isCollection(value)) {\n value.startSyncImmediate()\n return value\n }\n if (value instanceof BaseQueryBuilder) {\n return (\n (pool ? createPooledLiveQuery(value, { gcTime }) : undefined) ??\n createLiveQueryCollection({ query: value, startSync: true, gcTime })\n )\n }\n if (typeof value === `object`) {\n const config = value as LiveQueryCollectionConfig<any>\n return (\n (pool ? poolConfig(config, gcTime) : undefined) ??\n createLiveQueryCollection({ startSync: true, gcTime, ...config })\n )\n }\n throw new Error(\n `A live query must be a QueryBuilder, LiveQueryCollectionConfig, Collection, undefined, or null. Got: ${typeof value}`,\n )\n}\n"],"names":["BaseQueryBuilder","isCollection","getPooledQueryIdentity","getStableQueryBuilderHash","getStringCollationIdentity","getStableValueHash","createPooledLiveQuery","createLiveQueryCollection"],"mappings":"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"}