{"version":3,"sources":["../src/index.ts","../src/auto-refetch.ts"],"sourcesContent":["export * from './auto-refetch'\n","/**\n * Pinia Colada Auto Refetch plugin.\n *\n * Automatically refreshes queries when they become stale.\n *\n * @module @pinia/colada-plugin-auto-refetch\n */\n\nimport {\n  _toValueWithArgs,\n  type PiniaColadaPlugin,\n  type UseQueryEntry,\n  type UseQueryOptions,\n  type DataState,\n  type UseQueryOptionsWithDefaults,\n} from '@pinia/colada'\nimport { toValue } from 'vue'\n\n/**\n * Options for the auto-refetch plugin.\n */\nexport interface PiniaColadaAutoRefetchOptions<\n  TData = unknown,\n  TError = unknown,\n  // TODO: should be undefined?\n  TDataInitial = unknown,\n> {\n  /**\n   * Whether to enable auto refresh by default.\n   * @default false\n   */\n  autoRefetch?:\n    | boolean\n    | number\n    // FIXME: implement without the extended type Param\n    | (<T extends DataState<TData, TError, TDataInitial>>(state: T) => boolean | number)\n  // | ((state: DataState<TData, TError, TDataInitial>) => boolean | number)\n}\n\n/**\n * To store timeouts in the entry extensions.\n *\n * @internal\n */\nconst REFETCH_TIMEOUT_KEY = Symbol()\nexport { REFETCH_TIMEOUT_KEY as _REFETCH_TIMEOUT_KEY }\n\n/**\n * Plugin that automatically refreshes queries when they become stale\n */\nexport function PiniaColadaAutoRefetch(\n  options: PiniaColadaAutoRefetchOptions = {},\n): PiniaColadaPlugin {\n  const { autoRefetch = false } = options\n\n  return ({ queryCache }) => {\n    // Skip setting auto-refetch on the server\n    if (typeof document === 'undefined') return\n\n    function scheduleRefetch(\n      // TODO: should be undefined\n      entry: UseQueryEntry<unknown, unknown, unknown>,\n      delayMs: number,\n    ) {\n      if (!entry.active) return\n\n      // Always clear existing timeout first\n      clearTimeout(entry.ext[REFETCH_TIMEOUT_KEY])\n\n      // Schedule next refetch\n      const timeout = setTimeout(() => {\n        if (entry?.active && entry.options && toValue(entry.options.enabled)) {\n          queryCache.fetch(entry).catch(console.error)\n        }\n      }, delayMs)\n\n      entry.ext[REFETCH_TIMEOUT_KEY] = timeout\n    }\n\n    queryCache.$onAction(({ name, args, after }) => {\n      /**\n       * Whether to schedule a refetch for the given entry and determine the interval\n       * Returns { shouldSchedule: boolean, interval?: number }\n       */\n      function shouldScheduleRefetch({\n        state,\n        options,\n      }: UseQueryEntry<unknown, unknown, unknown>): number | false {\n        const autoRefetchValue =\n          !!options && _toValueWithArgs(options.autoRefetch ?? autoRefetch, state.value)\n        return (\n          !!options &&\n          toValue(options.enabled) &&\n          (autoRefetchValue === true ? options.staleTime! : autoRefetchValue)\n        )\n      }\n\n      // Trigger a fetch on creation to enable auto-refetch on initial load\n      if (name === 'ensure') {\n        after((entry) => {\n          // after ensure, options are always defined\n          const interval = shouldScheduleRefetch(entry)\n          if (interval) {\n            scheduleRefetch(entry, interval)\n          }\n        })\n      }\n\n      // Set up auto-refetch on every fetch\n      if (name === 'fetch') {\n        const [entry] = args\n\n        // Clear any existing timeout before scheduling a new one\n        clearTimeout(entry.ext[REFETCH_TIMEOUT_KEY])\n\n        after(async () => {\n          if (!entry.options) return\n          const interval = shouldScheduleRefetch(entry)\n          if (interval) {\n            scheduleRefetch(entry, interval)\n          }\n        })\n      }\n\n      // Clean up timeouts when entry is removed\n      if (name === 'remove') {\n        const [entry] = args\n        clearTimeout(entry.ext[REFETCH_TIMEOUT_KEY])\n      }\n    })\n  }\n}\n\n// Add types for the new option\ndeclare module '@pinia/colada' {\n  interface UseQueryOptions<TData, TError, TDataInitial>\n    extends PiniaColadaAutoRefetchOptions<TData, TError, TDataInitial> {}\n\n  interface UseQueryOptionsGlobal extends PiniaColadaAutoRefetchOptions {}\n\n  // eslint-disable-next-line unused-imports/no-unused-vars\n  interface UseQueryEntryExtensions<TData, TError, TDataInitial> {\n    /**\n     * Used to store the timeout for the auto-refetch plugin.\n     * @internal\n     */\n    [REFETCH_TIMEOUT_KEY]?: ReturnType<typeof setTimeout>\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQA,oBAOO;AACP,iBAAwB;AA4BxB,IAAM,sBAAsB,OAAO;AAM5B,SAAS,uBACd,UAAyC,CAAC,GACvB;AACnB,QAAM,EAAE,cAAc,MAAM,IAAI;AAEhC,SAAO,CAAC,EAAE,WAAW,MAAM;AAEzB,QAAI,OAAO,aAAa,YAAa;AAErC,aAAS,gBAEP,OACA,SACA;AACA,UAAI,CAAC,MAAM,OAAQ;AAGnB,mBAAa,MAAM,IAAI,mBAAmB,CAAC;AAG3C,YAAM,UAAU,WAAW,MAAM;AAC/B,YAAI,OAAO,UAAU,MAAM,eAAW,oBAAQ,MAAM,QAAQ,OAAO,GAAG;AACpE,qBAAW,MAAM,KAAK,EAAE,MAAM,QAAQ,KAAK;AAAA,QAC7C;AAAA,MACF,GAAG,OAAO;AAEV,YAAM,IAAI,mBAAmB,IAAI;AAAA,IACnC;AAEA,eAAW,UAAU,CAAC,EAAE,MAAM,MAAM,MAAM,MAAM;AAK9C,eAAS,sBAAsB;AAAA,QAC7B;AAAA,QACA,SAAAA;AAAA,MACF,GAA6D;AAC3D,cAAM,mBACJ,CAAC,CAACA,gBAAW,gCAAiBA,SAAQ,eAAe,aAAa,MAAM,KAAK;AAC/E,eACE,CAAC,CAACA,gBACF,oBAAQA,SAAQ,OAAO,MACtB,qBAAqB,OAAOA,SAAQ,YAAa;AAAA,MAEtD;AAGA,UAAI,SAAS,UAAU;AACrB,cAAM,CAAC,UAAU;AAEf,gBAAM,WAAW,sBAAsB,KAAK;AAC5C,cAAI,UAAU;AACZ,4BAAgB,OAAO,QAAQ;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,MACH;AAGA,UAAI,SAAS,SAAS;AACpB,cAAM,CAAC,KAAK,IAAI;AAGhB,qBAAa,MAAM,IAAI,mBAAmB,CAAC;AAE3C,cAAM,YAAY;AAChB,cAAI,CAAC,MAAM,QAAS;AACpB,gBAAM,WAAW,sBAAsB,KAAK;AAC5C,cAAI,UAAU;AACZ,4BAAgB,OAAO,QAAQ;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,MACH;AAGA,UAAI,SAAS,UAAU;AACrB,cAAM,CAAC,KAAK,IAAI;AAChB,qBAAa,MAAM,IAAI,mBAAmB,CAAC;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":["options"]}