UNPKG

@tanstack/angular-db

Version:

Angular integration for @tanstack/db

117 lines (116 loc) 3.99 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const core = require("@angular/core"); const db = require("@tanstack/db"); function injectLiveQuery(opts) { core.assertInInjectionContext(injectLiveQuery); const destroyRef = core.inject(core.DestroyRef); const collection = core.computed(() => { const isExistingCollection = opts && typeof opts === `object` && typeof opts.subscribeChanges === `function` && typeof opts.startSyncImmediate === `function` && typeof opts.id === `string`; if (isExistingCollection) { return opts; } if (typeof opts === `function`) { const queryBuilder = new db.BaseQueryBuilder(); const result = opts(queryBuilder); if (result === void 0 || result === null) { return null; } return db.createLiveQueryCollection({ query: opts, startSync: true, gcTime: 0 }); } const isReactiveQueryOptions = opts && typeof opts === `object` && typeof opts.query === `function` && typeof opts.params === `function`; if (isReactiveQueryOptions) { const { params, query } = opts; const currentParams = params(); const queryBuilder = new db.BaseQueryBuilder(); const result = query({ params: currentParams, q: queryBuilder }); if (result === void 0 || result === null) { return null; } return db.createLiveQueryCollection({ query: () => result, startSync: true, gcTime: 0 }); } if (opts && typeof opts === `object` && typeof opts.query === `function`) { return db.createLiveQueryCollection(opts); } throw new Error(`Invalid options provided to injectLiveQuery`); }); const state = core.signal(/* @__PURE__ */ new Map()); const internalData = core.signal([]); const status = core.signal( collection() ? `idle` : `disabled` ); const data = core.computed(() => { const currentCollection = collection(); if (!currentCollection) { return internalData(); } const config = currentCollection.config; return config?.singleResult ? internalData()[0] : internalData(); }); const syncDataFromCollection = (currentCollection) => { const newState = new Map(currentCollection.entries()); const newData = Array.from(currentCollection.values()); state.set(newState); internalData.set(newData); status.set(currentCollection.status); }; let unsub = null; const cleanup = () => { unsub?.(); unsub = null; }; core.effect((onCleanup) => { const currentCollection = collection(); if (!currentCollection) { status.set(`disabled`); state.set(/* @__PURE__ */ new Map()); internalData.set([]); cleanup(); return; } cleanup(); syncDataFromCollection(currentCollection); if (currentCollection.status === `idle`) { currentCollection.startSyncImmediate(); status.set(currentCollection.status); } const subscription = currentCollection.subscribeChanges( (_) => { syncDataFromCollection(currentCollection); } ); unsub = subscription.unsubscribe.bind(subscription); currentCollection.onFirstReady(() => { status.set(currentCollection.status); }); onCleanup(cleanup); }); destroyRef.onDestroy(cleanup); return { state, data, collection, status, isLoading: core.computed(() => status() === `loading`), isReady: core.computed(() => status() === `ready` || status() === `disabled`), isIdle: core.computed(() => status() === `idle`), isError: core.computed(() => status() === `error`), isCleanedUp: core.computed(() => status() === `cleaned-up`) }; } exports.injectLiveQuery = injectLiveQuery; Object.keys(db).forEach((k) => { if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, { enumerable: true, get: () => db[k] }); }); //# sourceMappingURL=index.cjs.map