UNPKG

@tanstack/db

Version:

A reactive client store for building super fast apps on sync

220 lines (219 loc) • 9.15 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const index = require("./query/builder/index.cjs"); const ir = require("./query/ir.cjs"); const liveQueryPrimitives = require("./live-query-primitives.cjs"); const lifecycle = require("./collection/lifecycle.cjs"); const liveQueryCollection = require("./query/live-query-collection.cjs"); const internal = require("./query/live/internal.cjs"); const collectionRegistry = require("./query/live/collection-registry.cjs"); const irStableIdentity = require("./query/ir-stable-identity.cjs"); const runtimeReferenceIdentity = require("./query/runtime-reference-identity.cjs"); const errorMessage = require("./error-message.cjs"); const errors = require("./errors.cjs"); function configPool(config) { const { pool } = config; if (pool !== void 0 && typeof pool?.createPooledLiveQuery !== `function`) throw new errors.InvalidPoolOptionError(); return pool; } function rejectLiveQueryInput(collections, rejection) { try { if (collections) resumeDeferredLiveQueryCollections(collections); } catch { } throw rejection; } function releaseDeferredOnReclaim(liveQuery, deferredCollections) { if (deferredCollections.size === 0) return void 0; const pending = new Set(deferredCollections); const release = () => { try { resumeDeferredLiveQueryCollections(pending); } catch { } }; const gcTime = liveQuery.config.gcTime ?? lifecycle.DEFAULT_GC_TIME_MS; if (gcTime > 0 && Number.isFinite(gcTime) && liveQuery.status !== `idle`) { return liveQuery.once(`status:cleaned-up`, release); } const timer = setTimeout(release, lifecycle.UNSUBSCRIBED_GC_FLOOR_MS); return () => clearTimeout(timer); } function resumeDeferredLiveQueryCollections(collections, reportSourceErrors = false) { const pending = Array.from(collections); collections.clear(); let firstFailure; for (const collection of pending) { try { collection._resumeSyncStart(); if (reportSourceErrors && liveQueryPrimitives.isFailedStatus(collection.status)) { throw collection._lifecycle.getSyncError(); } } catch (error) { firstFailure ??= { error }; } } if (firstFailure) throw firstFailure.error; } function createInitialQueryBuilder() { return new index.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 index.BaseQueryBuilder) { return value._bindCollectionSources( createCollectionResolver(dbClient, deferredCollections) ); } if (value && typeof value === `object` && !liveQueryPrimitives.isCollection(value) && !(value instanceof index.BaseQueryBuilder) && `query` in value) { const pool = configPool(value); const { query, queryKey: _queryKey, client: _client, pool: _pool, ...config } = value; const preparedQuery = prepareLiveQueryValue( query, dbClient, deferredCollections ); if (preparedQuery === void 0 || preparedQuery === null) { return preparedQuery; } return { ...config, // A DbClient query never pools, so its identity must not depend on // pool: a server preload and a client hook must hash alike. ...pool && !dbClient ? { pool } : {}, query: preparedQuery }; } return value; } function getPreparedLiveQuerySources(value, onUnboundDescriptor) { if (liveQueryPrimitives.isCollection(value)) return [value]; const query = value instanceof index.BaseQueryBuilder ? value : value && typeof value === `object` && `query` in value ? value.query : value; if (query instanceof index.BaseQueryBuilder) { return ir.collectSourceRefs(query._getQuery()).map( (source) => source.type === `descriptorRef` ? onUnboundDescriptor ? onUnboundDescriptor(source.alias) : ir.requireCollectionSource(source) : source.collection ); } return liveQueryPrimitives.isCollection(query) ? [query] : []; } function getLiveQueryRowOptions(value) { if (liveQueryPrimitives.isCollection(value)) { const { config: config2 } = value; const internal$1 = config2.utils?.[internal.LIVE_QUERY_INTERNAL]; return [ internal$1?.hasCustomGetKey ? config2.getKey : void 0, config2.schema ]; } const config = value; return [config?.getKey, config?.schema]; } function getPreparedLiveQueryIdentity(value, pool) { if (liveQueryPrimitives.isCollection(value)) return [`collection`, value.id]; if (value instanceof index.BaseQueryBuilder) { const pooled = pool?.getPooledQueryIdentity(value); return pooled === void 0 ? [`query`, irStableIdentity.getStableQueryBuilderHash(value)] : [`pooled`, pooled]; } if (value && typeof value === `object` && `query` in value) { const config = value; return [ // getKey and schema bind for this query identity. Inline options must // not turn a normal framework render into a new Collection. `config`, getPreparedLiveQueryIdentity(config.query, configPool(config)), [`singleResult`, config.singleResult === true], [ `defaultStringCollation`, runtimeReferenceIdentity.getStringCollationIdentity(config.defaultStringCollation) ] ]; } if (value === void 0 || value === null) return [`disabled`]; return [`value`, value]; } function getLiveQueryHash(preparedValue, queryKey) { if (queryKey?.length) { const query = preparedValue instanceof index.BaseQueryBuilder ? preparedValue : preparedValue && typeof preparedValue === `object` && `query` in preparedValue ? preparedValue.query : void 0; const ir2 = liveQueryPrimitives.isCollection(preparedValue) ? collectionRegistry.getBuilderFromConfig(preparedValue.config)?.getWindow() : query instanceof index.BaseQueryBuilder ? query._getQuery() : void 0; const window = ir2 && (ir2.limit !== void 0 || (ir2.offset ?? 0) !== 0) ? [{ limit: ir2.limit, offset: ir2.offset ?? 0 }] : []; return irStableIdentity.getStableValueHash([`queryKey`, queryKey, ...window], `queryKey`); } const identity = liveQueryPrimitives.isCollection(preparedValue) ? [`collection`, preparedValue.id] : [`derived`, getPreparedLiveQueryIdentity(preparedValue)]; return irStableIdentity.getStableValueHash(identity, `queryKey`); } function poolConfig(config, gcTime, pool) { if (!(config.query instanceof index.BaseQueryBuilder) || !Object.keys(config).every((key) => key === `query` || key === `gcTime`)) { return void 0; } return pool.createPooledLiveQuery(config.query, { gcTime: config.gcTime ?? gcTime }); } function resolveLiveQueryValue(value, { gcTime, pool, startSync = true } = {}) { if (value === void 0 || value === null) return null; if (liveQueryPrimitives.isCollection(value)) { value.startSyncImmediate(); return value; } if (value instanceof index.BaseQueryBuilder) { return (pool ? pool.createPooledLiveQuery(value, { gcTime }) : void 0) ?? liveQueryCollection.createLiveQueryCollection({ query: value, startSync, gcTime }); } if (typeof value === `object`) { const requested = configPool(value); const { pool: _pool, ...given } = value; const pooling = pool === false ? void 0 : requested ?? pool; const built = pooling && typeof given.query === `function` ? given.query(createInitialQueryBuilder()) : void 0; const config = built instanceof index.BaseQueryBuilder ? { ...given, query: built } : given; return (pooling ? poolConfig(config, gcTime, pooling) : void 0) ?? liveQueryCollection.createLiveQueryCollection({ ...config, startSync: config.startSync ?? startSync, gcTime: config.gcTime ?? gcTime }); } throw new Error( errorMessage.devBuild() && process.env.NODE_ENV !== `production` ? `A live query must be a QueryBuilder, LiveQueryCollectionConfig, Collection, undefined, or null. Got: ${typeof value}` : errorMessage.codedMessage(102, { type: typeof value }) ); } exports.configPool = configPool; exports.getLiveQueryHash = getLiveQueryHash; exports.getLiveQueryRowOptions = getLiveQueryRowOptions; exports.getPreparedLiveQueryIdentity = getPreparedLiveQueryIdentity; exports.getPreparedLiveQuerySources = getPreparedLiveQuerySources; exports.prepareLiveQueryValue = prepareLiveQueryValue; exports.rejectLiveQueryInput = rejectLiveQueryInput; exports.releaseDeferredOnReclaim = releaseDeferredOnReclaim; exports.resolveLiveQueryValue = resolveLiveQueryValue; exports.resumeDeferredLiveQueryCollections = resumeDeferredLiveQueryCollections; //# sourceMappingURL=live-query-options.cjs.map