@tanstack/db
Version:
A reactive client store for building super fast apps on sync
220 lines (219 loc) • 9.15 kB
JavaScript
;
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