{"version":3,"file":"index.cjs","sources":["../../src/index.ts"],"sourcesContent":["import {\n  DestroyRef,\n  assertInInjectionContext,\n  computed,\n  effect,\n  inject,\n  signal,\n} from '@angular/core'\nimport { BaseQueryBuilder, createLiveQueryCollection } from '@tanstack/db'\nimport type {\n  ChangeMessage,\n  Collection,\n  CollectionConfigSingleRowOption,\n  CollectionStatus,\n  Context,\n  GetResult,\n  InferResultType,\n  InitialQueryBuilder,\n  LiveQueryCollectionConfig,\n  NonSingleResult,\n  QueryBuilder,\n  SingleResult,\n} from '@tanstack/db'\nimport type { Signal } from '@angular/core'\n\nexport * from '@tanstack/db'\n\n/**\n * The result of calling `injectLiveQuery`.\n * Contains reactive signals for the query state and data.\n */\nexport interface InjectLiveQueryResult<TContext extends Context> {\n  /** A signal containing the complete state map of results keyed by their ID */\n  state: Signal<Map<string | number, GetResult<TContext>>>\n  /** A signal containing the results as an array, or single result for findOne queries */\n  data: Signal<InferResultType<TContext>>\n  /** A signal containing the underlying collection instance (null for disabled queries) */\n  collection: Signal<Collection<\n    GetResult<TContext>,\n    string | number,\n    {}\n  > | null>\n  /** A signal containing the current status of the collection */\n  status: Signal<CollectionStatus | `disabled`>\n  /** A signal indicating whether the collection is currently loading */\n  isLoading: Signal<boolean>\n  /** A signal indicating whether the collection is ready */\n  isReady: Signal<boolean>\n  /** A signal indicating whether the collection is idle */\n  isIdle: Signal<boolean>\n  /** A signal indicating whether the collection has an error */\n  isError: Signal<boolean>\n  /** A signal indicating whether the collection has been cleaned up */\n  isCleanedUp: Signal<boolean>\n}\n\nexport interface InjectLiveQueryResultWithCollection<\n  TResult extends object = any,\n  TKey extends string | number = string | number,\n  TUtils extends Record<string, any> = {},\n> {\n  state: Signal<Map<TKey, TResult>>\n  data: Signal<Array<TResult>>\n  collection: Signal<Collection<TResult, TKey, TUtils> | null>\n  status: Signal<CollectionStatus | `disabled`>\n  isLoading: Signal<boolean>\n  isReady: Signal<boolean>\n  isIdle: Signal<boolean>\n  isError: Signal<boolean>\n  isCleanedUp: Signal<boolean>\n}\n\nexport interface InjectLiveQueryResultWithSingleResultCollection<\n  TResult extends object = any,\n  TKey extends string | number = string | number,\n  TUtils extends Record<string, any> = {},\n> {\n  state: Signal<Map<TKey, TResult>>\n  data: Signal<TResult | undefined>\n  collection: Signal<(Collection<TResult, TKey, TUtils> & SingleResult) | null>\n  status: Signal<CollectionStatus | `disabled`>\n  isLoading: Signal<boolean>\n  isReady: Signal<boolean>\n  isIdle: Signal<boolean>\n  isError: Signal<boolean>\n  isCleanedUp: Signal<boolean>\n}\n\nexport function injectLiveQuery<\n  TContext extends Context,\n  TParams extends any,\n>(options: {\n  params: () => TParams\n  query: (args: {\n    params: TParams\n    q: InitialQueryBuilder\n  }) => QueryBuilder<TContext>\n}): InjectLiveQueryResult<TContext>\nexport function injectLiveQuery<\n  TContext extends Context,\n  TParams extends any,\n>(options: {\n  params: () => TParams\n  query: (args: {\n    params: TParams\n    q: InitialQueryBuilder\n  }) => QueryBuilder<TContext> | undefined | null\n}): InjectLiveQueryResult<TContext>\nexport function injectLiveQuery<TContext extends Context>(\n  queryFn: (q: InitialQueryBuilder) => QueryBuilder<TContext>,\n): InjectLiveQueryResult<TContext>\nexport function injectLiveQuery<TContext extends Context>(\n  queryFn: (\n    q: InitialQueryBuilder,\n  ) => QueryBuilder<TContext> | undefined | null,\n): InjectLiveQueryResult<TContext>\nexport function injectLiveQuery<TContext extends Context>(\n  config: LiveQueryCollectionConfig<TContext>,\n): InjectLiveQueryResult<TContext>\n// Pre-created collection without singleResult\nexport function injectLiveQuery<\n  TResult extends object,\n  TKey extends string | number,\n  TUtils extends Record<string, any>,\n>(\n  liveQueryCollection: Collection<TResult, TKey, TUtils> & NonSingleResult,\n): InjectLiveQueryResultWithCollection<TResult, TKey, TUtils>\n// Pre-created collection with singleResult\nexport function injectLiveQuery<\n  TResult extends object,\n  TKey extends string | number,\n  TUtils extends Record<string, any>,\n>(\n  liveQueryCollection: Collection<TResult, TKey, TUtils> & SingleResult,\n): InjectLiveQueryResultWithSingleResultCollection<TResult, TKey, TUtils>\nexport function injectLiveQuery(opts: any) {\n  assertInInjectionContext(injectLiveQuery)\n  const destroyRef = inject(DestroyRef)\n\n  const collection = computed(() => {\n    // Check if it's an existing collection\n    const isExistingCollection =\n      opts &&\n      typeof opts === `object` &&\n      typeof opts.subscribeChanges === `function` &&\n      typeof opts.startSyncImmediate === `function` &&\n      typeof opts.id === `string`\n\n    if (isExistingCollection) {\n      return opts\n    }\n\n    if (typeof opts === `function`) {\n      // Check if query function returns null/undefined (disabled query)\n      const queryBuilder = new BaseQueryBuilder() as InitialQueryBuilder\n      const result = opts(queryBuilder)\n\n      if (result === undefined || result === null) {\n        // Disabled query - return null\n        return null\n      }\n\n      return createLiveQueryCollection({\n        query: opts,\n        startSync: true,\n        gcTime: 0,\n      })\n    }\n\n    // Check if it's reactive query options\n    const isReactiveQueryOptions =\n      opts &&\n      typeof opts === `object` &&\n      typeof opts.query === `function` &&\n      typeof opts.params === `function`\n\n    if (isReactiveQueryOptions) {\n      const { params, query } = opts\n      const currentParams = params()\n\n      // Check if query function returns null/undefined (disabled query)\n      const queryBuilder = new BaseQueryBuilder() as InitialQueryBuilder\n      const result = query({ params: currentParams, q: queryBuilder })\n\n      if (result === undefined || result === null) {\n        // Disabled query - return null\n        return null\n      }\n\n      return createLiveQueryCollection({\n        query: () => result,\n        startSync: true,\n        gcTime: 0,\n      })\n    }\n\n    // Handle LiveQueryCollectionConfig objects\n    if (opts && typeof opts === `object` && typeof opts.query === `function`) {\n      return createLiveQueryCollection(opts)\n    }\n\n    throw new Error(`Invalid options provided to injectLiveQuery`)\n  })\n\n  const state = signal(new Map<string | number, any>())\n  const internalData = signal<Array<any>>([])\n  const status = signal<CollectionStatus | `disabled`>(\n    collection() ? `idle` : `disabled`,\n  )\n\n  // Returns single item for singleResult collections, array otherwise\n  const data = computed(() => {\n    const currentCollection = collection()\n    if (!currentCollection) {\n      return internalData()\n    }\n    const config = currentCollection.config as\n      | CollectionConfigSingleRowOption<any, any, any>\n      | undefined\n    return config?.singleResult ? internalData()[0] : internalData()\n  })\n\n  const syncDataFromCollection = (\n    currentCollection: Collection<any, any, any>,\n  ) => {\n    const newState = new Map(currentCollection.entries())\n    const newData = Array.from(currentCollection.values())\n\n    state.set(newState)\n    internalData.set(newData)\n    status.set(currentCollection.status)\n  }\n\n  let unsub: (() => void) | null = null\n  const cleanup = () => {\n    unsub?.()\n    unsub = null\n  }\n\n  effect((onCleanup) => {\n    const currentCollection = collection()\n\n    // Handle null collection (disabled query)\n    if (!currentCollection) {\n      status.set(`disabled` as const)\n      state.set(new Map())\n      internalData.set([])\n      cleanup()\n      return\n    }\n\n    cleanup()\n\n    // Initialize immediately with current state\n    syncDataFromCollection(currentCollection)\n\n    // Start sync if idle\n    if (currentCollection.status === `idle`) {\n      currentCollection.startSyncImmediate()\n      // Update status after starting sync\n      status.set(currentCollection.status)\n    }\n\n    // Subscribe to changes\n    const subscription = currentCollection.subscribeChanges(\n      (_: Array<ChangeMessage<any>>) => {\n        syncDataFromCollection(currentCollection)\n      },\n    )\n    unsub = subscription.unsubscribe.bind(subscription)\n\n    // Handle ready state\n    currentCollection.onFirstReady(() => {\n      status.set(currentCollection.status)\n    })\n\n    onCleanup(cleanup)\n  })\n\n  destroyRef.onDestroy(cleanup)\n\n  return {\n    state,\n    data,\n    collection,\n    status,\n    isLoading: computed(() => status() === `loading`),\n    isReady: computed(() => status() === `ready` || status() === `disabled`),\n    isIdle: computed(() => status() === `idle`),\n    isError: computed(() => status() === `error`),\n    isCleanedUp: computed(() => status() === `cleaned-up`),\n  }\n}\n"],"names":["assertInInjectionContext","inject","DestroyRef","computed","BaseQueryBuilder","createLiveQueryCollection","signal","effect"],"mappings":"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"}