UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

150 lines (149 loc) • 5.38 kB
import { BaseQueryBuilder } from "./query/builder/index.js"; import { collectSourceRefs, requireCollectionSource } from "./query/ir.js"; import { isCollection } from "./live-query-adapter.js"; import { createLiveQueryCollection } from "./query/live-query-collection.js"; import { getPooledQueryIdentity, createPooledLiveQuery } from "./query/pooled-live-query.js"; import { getStableValueHash, getStableQueryBuilderHash } from "./query/ir-stable-identity.js"; import { getStringCollationIdentity } from "./query/runtime-reference-identity.js"; import { devBuild, codedMessage } from "./error-message.js"; function resumeDeferredLiveQueryCollections(collections) { const pending = Array.from(collections); collections.clear(); let firstFailure; for (const collection of pending) { try { collection._resumeSyncStart(); } catch (error) { firstFailure ??= { error }; } } if (firstFailure) throw firstFailure.error; } function createInitialQueryBuilder() { return new BaseQueryBuilder(); } function createCollectionResolver(dbClient, deferredCollections) { if (!dbClient) return void 0; return (options) => { if (!deferredCollections) { return dbClient.collection( options ); } const collection = dbClient._materializeCollectionForRender( options ); if (collection._deferSyncStart()) deferredCollections.add(collection); return collection; }; } function prepareLiveQueryValue(value, dbClient, deferredCollections) { if (typeof value === `function`) { return prepareLiveQueryValue( value(createInitialQueryBuilder()), dbClient, deferredCollections ); } if (value instanceof BaseQueryBuilder) { return value._bindCollectionSources( createCollectionResolver(dbClient, deferredCollections) ); } if (value && typeof value === `object` && !isCollection(value) && !(value instanceof BaseQueryBuilder) && `query` in value) { const { query, queryKey: _queryKey, client: _client, ...config } = value; const preparedQuery = prepareLiveQueryValue( query, dbClient, deferredCollections ); if (preparedQuery === void 0 || preparedQuery === null) { return preparedQuery; } return { ...config, query: preparedQuery }; } return value; } function getPreparedLiveQuerySources(value, onUnboundDescriptor) { if (isCollection(value)) return [value]; const query = value instanceof BaseQueryBuilder ? value : value && typeof value === `object` && `query` in value ? value.query : value; if (query instanceof BaseQueryBuilder) { return collectSourceRefs(query._getQuery()).map( (source) => source.type === `descriptorRef` ? onUnboundDescriptor ? onUnboundDescriptor(source.alias) : requireCollectionSource(source) : source.collection ); } return isCollection(query) ? [query] : []; } function getPreparedLiveQueryIdentity(value) { if (isCollection(value)) return [`collection`, value.id]; if (value instanceof BaseQueryBuilder) { const pooled = getPooledQueryIdentity(value); return pooled === void 0 ? [`query`, getStableQueryBuilderHash(value)] : [`pooled`, pooled]; } if (value && typeof value === `object` && `query` in value) { const config = value; return [ `config`, getPreparedLiveQueryIdentity(config.query), [`getKey`, config.getKey], [`schema`, config.schema], [`singleResult`, config.singleResult === true], [ `defaultStringCollation`, getStringCollationIdentity(config.defaultStringCollation) ] ]; } if (value === void 0 || value === null) return [`disabled`]; return [`value`, value]; } function getLiveQueryHash(preparedValue, queryKey) { const identity = queryKey?.length ? [`queryKey`, queryKey] : isCollection(preparedValue) ? [`collection`, preparedValue.id] : [`derived`, getPreparedLiveQueryIdentity(preparedValue)]; return getStableValueHash(identity, `queryKey`); } function poolConfig(config, gcTime) { if (!(config.query instanceof BaseQueryBuilder) || !Object.keys(config).every((key) => key === `query` || key === `gcTime`)) { return void 0; } return createPooledLiveQuery(config.query, { gcTime: config.gcTime ?? gcTime }); } function resolveLiveQueryValue(value, { gcTime, pool = true, startSync = true } = {}) { if (value === void 0 || value === null) return null; if (isCollection(value)) { value.startSyncImmediate(); return value; } if (value instanceof BaseQueryBuilder) { return (pool ? createPooledLiveQuery(value, { gcTime }) : void 0) ?? createLiveQueryCollection({ query: value, startSync, gcTime }); } if (typeof value === `object`) { const config = value; return (pool ? poolConfig(config, gcTime) : void 0) ?? createLiveQueryCollection({ startSync, gcTime, ...config }); } throw new Error( devBuild() && process.env.NODE_ENV !== `production` ? `A live query must be a QueryBuilder, LiveQueryCollectionConfig, Collection, undefined, or null. Got: ${typeof value}` : codedMessage(102, { type: typeof value }) ); } export { getLiveQueryHash, getPreparedLiveQueryIdentity, getPreparedLiveQuerySources, prepareLiveQueryValue, resolveLiveQueryValue, resumeDeferredLiveQueryCollections }; //# sourceMappingURL=live-query-options.js.map