From d634f621f064d72fc4584ba25a46e8ce727d253f Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Tue, 5 Aug 2025 13:53:40 -0500 Subject: [PATCH 01/50] start on retry feature --- packages/pacer/src/async-batcher.ts | 20 +- packages/pacer/src/async-debouncer.ts | 20 +- packages/pacer/src/async-queuer.ts | 18 +- packages/pacer/src/async-rate-limiter.ts | 20 +- packages/pacer/src/async-retryer.ts | 442 ++++++++++++++ packages/pacer/src/async-throttler.ts | 20 +- packages/pacer/src/batcher.ts | 2 +- packages/pacer/src/debouncer.ts | 2 +- packages/pacer/src/queuer.ts | 2 +- packages/pacer/src/rate-limiter.ts | 2 +- packages/pacer/src/throttler.ts | 2 +- packages/pacer/tests/async-retryer.test.ts | 578 ++++++++++++++++++ .../src/async-batcher/useAsyncBatcher.ts | 1 + .../src/async-debouncer/useAsyncDebouncer.ts | 1 + .../src/async-queuer/useAsyncQueuer.ts | 1 + .../async-rate-limiter/useAsyncRateLimiter.ts | 1 + .../src/async-throttler/useAsyncThrottler.ts | 3 + .../react-pacer/src/batcher/useBatcher.ts | 1 + .../react-pacer/src/debouncer/useDebouncer.ts | 1 + packages/react-pacer/src/queuer/useQueuer.ts | 1 + .../src/rate-limiter/useRateLimiter.ts | 1 + .../react-pacer/src/throttler/useThrottler.ts | 1 + 22 files changed, 1122 insertions(+), 18 deletions(-) create mode 100644 packages/pacer/src/async-retryer.ts create mode 100644 packages/pacer/tests/async-retryer.test.ts diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 026cf077..a0339c25 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -1,5 +1,7 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { AsyncRetryer } from './async-retryer' +import type { AsyncRetryerOptions } from './async-retryer' import type { OptionalKeys } from './types' export interface AsyncBatcherState { @@ -79,6 +81,12 @@ function getDefaultAsyncBatcherState(): AsyncBatcherState { * Options for configuring an AsyncBatcher instance */ export interface AsyncBatcherOptions { + /** + * Options for configuring the underlying async retryer + */ + asyncRetryerOptions?: AsyncRetryerOptions< + (items: Array) => Promise + > /** * Custom function to determine if a batch should be processed * Return true to process the batch immediately @@ -148,6 +156,9 @@ type AsyncBatcherOptionsWithOptionalCallbacks = OptionalKeys< > const defaultOptions: AsyncBatcherOptionsWithOptionalCallbacks = { + asyncRetryerOptions: { + maxAttempts: 1, + }, getShouldExecute: () => false, maxSize: Infinity, started: true, @@ -221,10 +232,11 @@ export class AsyncBatcher { getDefaultAsyncBatcherState(), ) options: AsyncBatcherOptionsWithOptionalCallbacks + asyncRetryer: AsyncRetryer #timeoutId: NodeJS.Timeout | null = null constructor( - private fn: (items: Array) => Promise, + public fn: (items: Array) => Promise, initialOptions: AsyncBatcherOptions, ) { this.options = { @@ -232,6 +244,10 @@ export class AsyncBatcher { ...initialOptions, throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } + this.asyncRetryer = new AsyncRetryer( + this.fn, + this.options.asyncRetryerOptions, + ) this.#setState(this.options.initialState ?? {}) } @@ -317,7 +333,7 @@ export class AsyncBatcher { this.#setState({ isExecuting: true }) try { - const result = await this.fn(batch) // EXECUTE + const result = await this.asyncRetryer.execute(batch) // EXECUTE this.#setState({ totalItemsProcessed: this.store.state.totalItemsProcessed + batch.length, diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index f89523c5..43ac4ece 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -1,5 +1,7 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { AsyncRetryer } from './async-retryer' +import type { AsyncRetryerOptions } from './async-retryer' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncDebouncerState { @@ -61,6 +63,10 @@ function getDefaultAsyncDebouncerState< * Options for configuring an async debounced function */ export interface AsyncDebouncerOptions { + /** + * Options for configuring the underlying async retryer + */ + asyncRetryerOptions?: AsyncRetryerOptions /** * Whether the debouncer is enabled. When disabled, maybeExecute will not trigger any executions. * Can be a boolean or a function that returns a boolean. @@ -123,6 +129,9 @@ type AsyncDebouncerOptionsWithOptionalCallbacks = OptionalKeys< > const defaultOptions: AsyncDebouncerOptionsWithOptionalCallbacks = { + asyncRetryerOptions: { + maxAttempts: 1, + }, enabled: true, leading: false, trailing: true, @@ -179,6 +188,7 @@ export class AsyncDebouncer { AsyncDebouncerState >(getDefaultAsyncDebouncerState()) options: AsyncDebouncerOptions + asyncRetryer: AsyncRetryer #abortController: AbortController | null = null #timeoutId: NodeJS.Timeout | null = null #resolvePreviousPromise: @@ -186,7 +196,7 @@ export class AsyncDebouncer { | null = null constructor( - private fn: TFn, + public fn: TFn, initialOptions: AsyncDebouncerOptions, ) { this.options = { @@ -194,6 +204,10 @@ export class AsyncDebouncer { ...initialOptions, throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } + this.asyncRetryer = new AsyncRetryer( + this.fn, + this.options.asyncRetryerOptions, + ) this.#setState(this.options.initialState ?? {}) } @@ -306,12 +320,12 @@ export class AsyncDebouncer { this.#abortController = new AbortController() try { this.#setState({ isExecuting: true }) - const result = await this.fn(...args) // EXECUTE! + const result = await this.asyncRetryer.execute(...args) // EXECUTE! this.#setState({ lastResult: result, successCount: this.store.state.successCount + 1, }) - this.options.onSuccess?.(result, args, this) + this.options.onSuccess?.(result as ReturnType, args, this) } catch (error) { this.#setState({ errorCount: this.store.state.errorCount + 1, diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index dbf48c98..ab54428e 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -1,5 +1,7 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { AsyncRetryer } from './async-retryer' +import type { AsyncRetryerOptions } from './async-retryer' import type { OptionalKeys } from './types' import type { QueuePosition } from './queuer' @@ -92,6 +94,10 @@ function getDefaultAsyncQueuerState(): AsyncQueuerState { } export interface AsyncQueuerOptions { + /** + * Options for configuring the underlying async retryer + */ + asyncRetryerOptions?: AsyncRetryerOptions<(item: TValue) => Promise> /** * Default position to add items to the queuer * @default 'back' @@ -194,6 +200,9 @@ type AsyncQueuerOptionsWithOptionalCallbacks = OptionalKeys< const defaultOptions: AsyncQueuerOptionsWithOptionalCallbacks = { addItemsTo: 'back', + asyncRetryerOptions: { + maxAttempts: 1, + }, concurrency: 1, expirationDuration: Infinity, getIsExpired: () => false, @@ -261,10 +270,11 @@ export class AsyncQueuer { AsyncQueuerState >(getDefaultAsyncQueuerState()) options: AsyncQueuerOptions + asyncRetryer: AsyncRetryer<(item: TValue) => Promise> #timeoutIds: Set = new Set() constructor( - private fn: (item: TValue) => Promise, + public fn: (item: TValue) => Promise, initialOptions: AsyncQueuerOptions = {}, ) { this.options = { @@ -272,6 +282,10 @@ export class AsyncQueuer { ...initialOptions, throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } + this.asyncRetryer = new AsyncRetryer( + this.fn, + this.options.asyncRetryerOptions, + ) const isInitiallyRunning = this.options.initialState?.isRunning ?? this.options.started ?? true this.#setState({ @@ -527,7 +541,7 @@ export class AsyncQueuer { const item = this.getNextItem(position) if (item !== undefined) { try { - const lastResult = await this.fn(item) // EXECUTE! + const lastResult = await this.asyncRetryer.execute(item) // EXECUTE! this.#setState({ successCount: this.store.state.successCount + 1, lastResult, diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index 38ca3020..994d9c29 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -1,5 +1,7 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { AsyncRetryer } from './async-retryer' +import type { AsyncRetryerOptions } from './async-retryer' import type { AnyAsyncFunction } from './types' export interface AsyncRateLimiterState { @@ -61,6 +63,10 @@ function getDefaultAsyncRateLimiterState< * Options for configuring an async rate-limited function */ export interface AsyncRateLimiterOptions { + /** + * Options for configuring the underlying async retryer + */ + asyncRetryerOptions?: AsyncRetryerOptions /** * Whether the rate limiter is enabled. When disabled, maybeExecute will not trigger any executions. * Can be a boolean or a function that returns a boolean. @@ -129,6 +135,9 @@ const defaultOptions: Omit< Required>, 'initialState' | 'onError' | 'onReject' | 'onSettled' | 'onSuccess' > = { + asyncRetryerOptions: { + maxAttempts: 1, + }, enabled: true, limit: 1, window: 0, @@ -207,10 +216,11 @@ export class AsyncRateLimiter { AsyncRateLimiterState >(getDefaultAsyncRateLimiterState()) options: AsyncRateLimiterOptions + asyncRetryer: AsyncRetryer #timeoutIds: Set = new Set() constructor( - private fn: TFn, + public fn: TFn, initialOptions: AsyncRateLimiterOptions, ) { this.options = { @@ -218,6 +228,10 @@ export class AsyncRateLimiter { ...initialOptions, throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } + this.asyncRetryer = new AsyncRetryer( + this.fn, + this.options.asyncRetryerOptions, + ) this.#setState(this.options.initialState ?? {}) for (const executionTime of this.#getExecutionTimesInWindow()) { this.#setCleanupTimeout(executionTime) @@ -331,13 +345,13 @@ export class AsyncRateLimiter { }) try { - const result = await this.fn(...args) // EXECUTE! + const result = await this.asyncRetryer.execute(...args) // EXECUTE! this.#setCleanupTimeout(now) this.#setState({ successCount: this.store.state.successCount + 1, lastResult: result, }) - this.options.onSuccess?.(result, args, this) + this.options.onSuccess?.(result as ReturnType, args, this) } catch (error) { this.#setState({ errorCount: this.store.state.errorCount + 1, diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts new file mode 100644 index 00000000..f273d4db --- /dev/null +++ b/packages/pacer/src/async-retryer.ts @@ -0,0 +1,442 @@ +import { Store } from '@tanstack/store' +import { parseFunctionOrValue } from './utils' +import type { AnyAsyncFunction } from './types' + +export interface AsyncRetryerState { + /** + * The current retry attempt number (0 when not executing) + */ + currentAttempt: number + /** + * Total number of completed executions (successful or failed) + */ + executionCount: number + /** + * Whether the retryer is currently executing the function + */ + isExecuting: boolean + /** + * The most recent error encountered during execution + */ + lastError: Error | undefined + /** + * Timestamp of the last execution completion in milliseconds + */ + lastExecutionTime: number + /** + * The result from the most recent successful execution + */ + lastResult: ReturnType | undefined + /** + * Current execution status - 'disabled' when not enabled, 'idle' when ready, 'executing' when running + */ + status: 'disabled' | 'idle' | 'executing' | 'retrying' + /** + * Total time spent executing (including retries) in milliseconds + */ + totalExecutionTime: number +} + +/** + * Creates the default initial state for an AsyncRetryer instance + * @returns The default state with all values reset to initial values + */ +function getDefaultAsyncRetryerState< + TFn extends AnyAsyncFunction, +>(): AsyncRetryerState { + return structuredClone({ + currentAttempt: 0, + executionCount: 0, + isExecuting: false, + lastError: undefined, + lastExecutionTime: 0, + lastResult: undefined, + status: 'idle', + totalExecutionTime: 0, + }) +} + +export interface AsyncRetryerOptions { + /** + * The backoff strategy for retry delays: + * - 'exponential': Wait time doubles with each attempt (1s, 2s, 4s, ...) + * - 'linear': Wait time increases linearly (1s, 2s, 3s, ...) + * - 'fixed': Same wait time for all attempts + * @default 'exponential' + */ + backoff?: 'linear' | 'exponential' | 'fixed' + /** + * Base wait time in milliseconds between retries, or a function that returns the wait time + * @default 1000 + */ + baseWait?: number | ((retryer: AsyncRetryer) => number) + /** + * Whether the retryer is enabled, or a function that determines if it's enabled + * @default true + */ + enabled?: boolean | ((retryer: AsyncRetryer) => boolean) + /** + * Initial state to merge with the default state + */ + initialState?: Partial> + /** + * Maximum number of retry attempts, or a function that returns the max attempts + * @default 3 + */ + maxAttempts?: number | ((retryer: AsyncRetryer) => number) + /** + * Callback invoked when any error occurs during execution (including retries) + */ + onError?: ( + error: unknown, + args: Parameters, + retryer: AsyncRetryer, + ) => void + /** + * Callback invoked when the final error occurs after all retries are exhausted + */ + onLastError?: (error: Error, retryer: AsyncRetryer) => void + /** + * Callback invoked before each retry attempt + */ + onRetry?: (attempt: number, error: Error, retryer: AsyncRetryer) => void + /** + * Callback invoked after execution completes (success or failure) + */ + onSettled?: (args: Parameters, retryer: AsyncRetryer) => void + /** + * Callback invoked when execution succeeds + */ + onSuccess?: ( + result: ReturnType, + args: Parameters, + retryer: AsyncRetryer, + ) => void + /** + * Controls when errors are thrown: + * - 'last': Only throw the final error after all retries are exhausted + * - true: Throw every error immediately (disables retrying) + * - false: Never throw errors, return undefined instead + * @default 'last' + */ + throwOnError?: boolean | 'last' +} + +const defaultOptions: Omit< + Required>, + | 'initialState' + | 'onError' + | 'onLastError' + | 'onRetry' + | 'onSettled' + | 'onSuccess' +> = { + backoff: 'exponential', + baseWait: 1000, + enabled: true, + maxAttempts: 3, + throwOnError: 'last', +} + +/** + * Provides robust retry functionality for asynchronous functions, supporting configurable backoff strategies, + * attempt limits, and detailed state management. The AsyncRetryer class is designed to help you reliably + * execute async operations that may fail intermittently, such as network requests or database operations, + * by automatically retrying them according to your chosen policy. + * + * ## Retrying Concepts + * + * - **Retrying**: Automatically re-executes a failed async function up to a specified number of attempts. + * Useful for handling transient errors (e.g., network flakiness, rate limits, temporary server issues). + * - **Backoff Strategies**: Controls the delay between retry attempts (default: `'exponential'`): + * - `'exponential'`: Wait time doubles with each attempt (1s, 2s, 4s, ...) - **DEFAULT** + * - `'linear'`: Wait time increases linearly (1s, 2s, 3s, ...) + * - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt + * - **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. If cancelled, retries are stopped. + * - **State Management**: Tracks execution status, current attempt, last error, and result using TanStack Store. + * - **Callbacks**: Provides hooks for handling success, error, retry, and settled events. + * + * ## State Management + * - Uses TanStack Store for fine-grained reactivity. + * - State includes: `isExecuting`, `currentAttempt`, `lastError`, `lastResult`, and `status` (`idle`, `executing`, `retrying`, `disabled`). + * - State can be accessed via the `store.state` property. + * + * ## Error Handling + * The `throwOnError` option controls when errors are thrown (default: `'last'`): + * - `'last'`: Only throws the final error after all retries are exhausted - **DEFAULT** + * - `true`: Throws every error immediately (no retries) + * - `false`: Never throws errors, returns `undefined` instead + * + * Additional error handling: + * - `onError`: Called for every error (including during retries) + * - `onLastError`: Called only for the final error after all retries fail + * - If `onError` is provided but `throwOnError` is not specified, defaults to `'last'` + * + * ## Usage + * - Use for async operations that may fail transiently and benefit from retrying. + * - Configure `maxAttempts`, `backoff`, and `baseWait` to control retry behavior. + * - Use `onRetry`, `onSuccess`, `onError`, and `onSettled` for custom side effects. + * + * @example + * ```typescript + * // Retry a fetch operation up to 5 times with exponential backoff + * const retryer = new AsyncRetryer(fetchData, { + * maxAttempts: 5, + * backoff: 'exponential', + * baseWait: 1000, + * onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), + * onSuccess: (result) => console.log('Success:', result), + * onError: (error) => console.error('Error:', error), + * onLastError: (error) => console.error('All retries failed:', error), + * }) + * + * const result = await retryer.execute(userId) + * ``` + * + * @template TFn The async function type to be retried. + */ +export class AsyncRetryer { + readonly store: Store>> = new Store( + getDefaultAsyncRetryerState(), + ) + options: AsyncRetryerOptions & typeof defaultOptions + #abortController: AbortController | null = null + + /** + * Creates a new AsyncRetryer instance + * @param fn The async function to retry + * @param initialOptions Configuration options for the retryer + */ + constructor( + public fn: TFn, + initialOptions: AsyncRetryerOptions = {}, + ) { + this.options = { + ...defaultOptions, + ...initialOptions, + throwOnError: + initialOptions.throwOnError ?? + (initialOptions.onError ? false : defaultOptions.throwOnError), + } + this.#setState(this.options.initialState ?? {}) + } + + /** + * Updates the retryer options + * @param newOptions Partial options to merge with existing options + */ + setOptions = (newOptions: Partial>): void => { + this.options = { ...this.options, ...newOptions } + } + + #setState = (newState: Partial>): void => { + this.store.setState((state) => { + const combinedState = { + ...state, + ...newState, + } + const { isExecuting, currentAttempt } = combinedState + return { + ...combinedState, + status: !this.#getEnabled() + ? 'disabled' + : isExecuting && currentAttempt === 1 + ? 'executing' + : isExecuting && currentAttempt > 1 + ? 'retrying' + : 'idle', + } + }) + } + + #getEnabled = (): boolean => { + return !!parseFunctionOrValue(this.options.enabled, this) + } + + #getMaxAttempts = (): number => { + return parseFunctionOrValue(this.options.maxAttempts, this) + } + + #getBaseWait = (): number => { + return parseFunctionOrValue(this.options.baseWait, this) + } + + #calculateWait = (attempt: number): number => { + const baseWait = this.#getBaseWait() + + switch (this.options.backoff) { + case 'linear': + return baseWait * attempt + case 'exponential': + return baseWait * Math.pow(2, attempt - 1) + case 'fixed': + default: + return baseWait + } + } + + /** + * Executes the function with retry logic + * @param args Arguments to pass to the function + * @returns The function result, or undefined if disabled or all retries failed (when throwOnError is false) + * @throws The last error if throwOnError is true and all retries fail + */ + execute = async ( + ...args: Parameters + ): Promise | undefined> => { + if (!this.#getEnabled()) { + return undefined + } + + // Cancel any existing execution + this.cancel() + + const startTime = Date.now() + let lastError: Error | undefined + let result: ReturnType | undefined + + this.#abortController = new AbortController() + const signal = this.#abortController.signal + + this.#setState({ + isExecuting: true, + currentAttempt: 0, + lastError: undefined, + }) + + try { + let isLastAttempt = false + for (let attempt = 1; attempt <= this.#getMaxAttempts(); attempt++) { + isLastAttempt = attempt === this.#getMaxAttempts() + this.#setState({ currentAttempt: attempt }) + + try { + // Check if cancelled before executing + if (signal.aborted) { + throw new Error('Retry cancelled') + } + + result = (await this.fn(...args)) as ReturnType + + const totalTime = Date.now() - startTime + this.#setState({ + executionCount: this.store.state.executionCount + 1, + isExecuting: false, + lastExecutionTime: Date.now(), + totalExecutionTime: totalTime, + currentAttempt: 0, + lastResult: result, + }) + + this.options.onSuccess?.(result, args, this) + + return result + } catch (error) { + lastError = error instanceof Error ? error : new Error(String(error)) + this.#setState({ lastError }) + + if (attempt < this.#getMaxAttempts()) { + this.options.onRetry?.(attempt, lastError, this) + + const wait = this.#calculateWait(attempt) + if (wait > 0) { + await new Promise((resolve, reject) => { + const timeout = setTimeout(resolve, wait) + signal.addEventListener('abort', () => { + clearTimeout(timeout) + reject(new Error('Retry cancelled')) + }) + }) + } + } + } finally { + this.options.onSettled?.(args, this) + } + } + + this.#setState({ + isExecuting: false, + currentAttempt: 0, + }) + + this.options.onLastError?.(lastError!, this) + this.options.onError?.(lastError!, args, this) + this.options.onSettled?.(args, this) + + if ( + (this.options.throwOnError === 'last' && isLastAttempt) || + this.options.throwOnError === true + ) { + throw lastError + } + + return undefined as any + } catch (error) { + // Don't rethrow if the error was from cancellation + if (error instanceof Error && error.message === 'Retry cancelled') { + return undefined + } + + this.#setState({ + isExecuting: false, + currentAttempt: 0, + }) + + const errorToHandle = + error instanceof Error ? error : new Error(String(error)) + this.options.onError?.(errorToHandle, args, this) + this.options.onSettled?.(args, this) + + throw error + } finally { + this.#abortController = null + } + } + + /** + * Cancels the current execution and any pending retries + */ + cancel = (): void => { + if (this.#abortController) { + this.#abortController.abort() + this.#abortController = null + this.#setState({ + isExecuting: false, + currentAttempt: 0, + }) + } + } + + /** + * Resets the retryer to its initial state and cancels any ongoing execution + */ + reset = (): void => { + this.cancel() + this.#setState(getDefaultAsyncRetryerState()) + } +} + +/** + * Creates a retry-enabled version of an async function + * + * @param fn The async function to add retry functionality to + * @param initialOptions Configuration options for the retry behavior + * @returns A new function that executes the original with retry logic + * + * @example + * ```typescript + * const retryFetch = asyncRetry(fetch, { + * maxAttempts: 3, + * backoff: 'exponential' + * }) + * + * const response = await retryFetch('/api/data') + * ``` + */ +export function asyncRetry( + fn: TFn, + initialOptions: AsyncRetryerOptions = {}, +): (...args: Parameters) => Promise | undefined> { + const retryer = new AsyncRetryer(fn, initialOptions) + return retryer.execute +} diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index a6018403..3d523d78 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -1,5 +1,7 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { AsyncRetryer } from './async-retryer' +import type { AsyncRetryerOptions } from './async-retryer' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncThrottlerState { @@ -66,6 +68,10 @@ function getDefaultAsyncThrottlerState< * Options for configuring an async throttled function */ export interface AsyncThrottlerOptions { + /** + * Options for configuring the underlying async retryer + */ + asyncRetryerOptions?: AsyncRetryerOptions /** * Whether the throttler is enabled. When disabled, maybeExecute will not trigger any executions. * Can be a boolean or a function that returns a boolean. @@ -131,6 +137,9 @@ type AsyncThrottlerOptionsWithOptionalCallbacks = OptionalKeys< > const defaultOptions: AsyncThrottlerOptionsWithOptionalCallbacks = { + asyncRetryerOptions: { + maxAttempts: 1, + }, enabled: true, leading: true, trailing: true, @@ -190,6 +199,7 @@ export class AsyncThrottler { AsyncThrottlerState >(getDefaultAsyncThrottlerState()) options: AsyncThrottlerOptions + asyncRetryer: AsyncRetryer #abortController: AbortController | null = null #timeoutId: NodeJS.Timeout | null = null #resolvePreviousPromise: @@ -197,7 +207,7 @@ export class AsyncThrottler { | null = null constructor( - private fn: TFn, + public fn: TFn, initialOptions: AsyncThrottlerOptions, ) { this.options = { @@ -205,6 +215,10 @@ export class AsyncThrottler { ...initialOptions, throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } + this.asyncRetryer = new AsyncRetryer( + this.fn, + this.options.asyncRetryerOptions, + ) this.#setState(this.options.initialState ?? {}) } @@ -330,12 +344,12 @@ export class AsyncThrottler { this.#abortController = new AbortController() try { this.#setState({ isExecuting: true }) - const result = await this.fn(...args) // EXECUTE! + const result = await this.asyncRetryer.execute(...args) // EXECUTE! this.#setState({ lastResult: result, successCount: this.store.state.successCount + 1, }) - this.options.onSuccess?.(result, args, this) + this.options.onSuccess?.(result as ReturnType, args, this) } catch (error) { this.#setState({ errorCount: this.store.state.errorCount + 1, diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index b2687257..01239ebb 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -143,7 +143,7 @@ export class Batcher { #timeoutId: NodeJS.Timeout | null = null constructor( - private fn: (items: Array) => void, + public fn: (items: Array) => void, initialOptions: BatcherOptions, ) { this.options = { diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index 1652680c..8f28d8f4 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -123,7 +123,7 @@ export class Debouncer { #timeoutId: NodeJS.Timeout | undefined constructor( - private fn: TFn, + public fn: TFn, initialOptions: DebouncerOptions, ) { this.options = { diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index 375d8a2c..30c4a96e 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -248,7 +248,7 @@ export class Queuer { #timeoutId: NodeJS.Timeout | null = null constructor( - private fn: (item: TValue) => void, + public fn: (item: TValue) => void, initialOptions: QueuerOptions = {}, ) { this.options = { diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index 98dede16..fec03b33 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -136,7 +136,7 @@ export class RateLimiter { #timeoutIds: Set = new Set() constructor( - private fn: TFn, + public fn: TFn, initialOptions: RateLimiterOptions, ) { this.options = { diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index cf9053f9..e17a422d 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -131,7 +131,7 @@ export class Throttler { #timeoutId: NodeJS.Timeout | undefined constructor( - private fn: TFn, + public fn: TFn, initialOptions: ThrottlerOptions, ) { this.options = { diff --git a/packages/pacer/tests/async-retryer.test.ts b/packages/pacer/tests/async-retryer.test.ts new file mode 100644 index 00000000..fdc1e883 --- /dev/null +++ b/packages/pacer/tests/async-retryer.test.ts @@ -0,0 +1,578 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { AsyncRetryer, asyncRetry } from '../src/async-retryer' + +describe('AsyncRetryer', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + + describe('Constructor and Defaults', () => { + it('should create with default options', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn) + + expect(retryer.options.backoff).toBe('exponential') + expect(retryer.options.baseWait).toBe(1000) + expect(retryer.options.enabled).toBe(true) + expect(retryer.options.maxAttempts).toBe(3) + expect(retryer.options.throwOnError).toBe('last') + }) + + it('should merge custom options with defaults', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 5, + backoff: 'linear', + baseWait: 500, + }) + + expect(retryer.options.maxAttempts).toBe(5) + expect(retryer.options.backoff).toBe('linear') + expect(retryer.options.baseWait).toBe(500) + expect(retryer.options.enabled).toBe(true) // Still default + }) + + it('should initialize with default state', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn) + + expect(retryer.store.state).toEqual({ + currentAttempt: 0, + executionCount: 0, + isExecuting: false, + lastError: undefined, + lastExecutionTime: 0, + lastResult: undefined, + status: 'idle', + totalExecutionTime: 0, + }) + }) + + it('should merge initial state', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { + initialState: { executionCount: 5 }, + }) + + expect(retryer.store.state.executionCount).toBe(5) + expect(retryer.store.state.currentAttempt).toBe(0) // Other defaults preserved + }) + }) + + describe('Successful Execution', () => { + it('should execute function successfully on first attempt', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn) + + const result = await retryer.execute('arg1', 'arg2') + + expect(result).toBe('success') + expect(mockFn).toHaveBeenCalledTimes(1) + expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2') + expect(retryer.store.state.executionCount).toBe(1) + expect(retryer.store.state.lastResult).toBe('success') + expect(retryer.store.state.status).toBe('idle') + expect(retryer.store.state.currentAttempt).toBe(0) + }) + + it('should call onSuccess callback', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const onSuccess = vi.fn() + const retryer = new AsyncRetryer(mockFn, { onSuccess }) + + await retryer.execute('arg1') + + expect(onSuccess).toHaveBeenCalledTimes(1) + expect(onSuccess).toHaveBeenCalledWith('success', ['arg1'], retryer) + }) + + it('should update execution time and timestamp', async () => { + const mockFn = vi.fn().mockImplementation(async () => { + vi.advanceTimersByTime(100) + return 'success' + }) + const retryer = new AsyncRetryer(mockFn) + + const beforeTime = Date.now() + await retryer.execute() + const afterTime = Date.now() + + expect(retryer.store.state.totalExecutionTime).toBeGreaterThan(0) + expect(retryer.store.state.lastExecutionTime).toBeGreaterThanOrEqual(beforeTime) + expect(retryer.store.state.lastExecutionTime).toBeLessThanOrEqual(afterTime) + }) + }) + + describe('Retry Logic', () => { + it('should retry on failure and succeed on second attempt', async () => { + const mockFn = vi + .fn() + .mockRejectedValueOnce(new Error('First failure')) + .mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { baseWait: 100, throwOnError: 'last' }) + + const result = await retryer.execute('arg1') + + expect(result).toBe('success') + expect(mockFn).toHaveBeenCalledTimes(2) + expect(retryer.store.state.executionCount).toBe(1) + expect(retryer.store.state.lastResult).toBe('success') + expect(retryer.store.state.status).toBe('idle') + }) + + it('should call onRetry callback for each retry', async () => { + const mockFn = vi + .fn() + .mockRejectedValueOnce(new Error('First failure')) + .mockRejectedValueOnce(new Error('Second failure')) + .mockResolvedValue('success') + const onRetry = vi.fn() + const retryer = new AsyncRetryer(mockFn, { onRetry, baseWait: 100 }) + + const executePromise = retryer.execute() + + // Let first retry happen + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + + // Let second retry happen + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(200) // Exponential backoff: 100 * 2^1 + + await executePromise + + expect(onRetry).toHaveBeenCalledTimes(2) + expect(onRetry).toHaveBeenNthCalledWith(1, 1, expect.any(Error), retryer) + expect(onRetry).toHaveBeenNthCalledWith(2, 2, expect.any(Error), retryer) + }) + + it('should fail after exhausting all retries', async () => { + const error = new Error('Persistent failure') + const mockFn = vi.fn().mockRejectedValue(error) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 100, + throwOnError: 'last' + }) + + const executePromise = retryer.execute() + + // Complete first retry + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + + await expect(executePromise).rejects.toThrow('Persistent failure') + expect(mockFn).toHaveBeenCalledTimes(2) + expect(retryer.store.state.lastError).toBe(error) + expect(retryer.store.state.status).toBe('idle') + }) + }) + + describe('Backoff Strategies', () => { + it('should use exponential backoff by default', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 3, + baseWait: 100, + throwOnError: false + }) + + const result = await retryer.execute() + + expect(result).toBeUndefined() + expect(mockFn).toHaveBeenCalledTimes(3) + }) + + it('should use linear backoff', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 3, + baseWait: 100, + backoff: 'linear', + throwOnError: false + }) + + const executePromise = retryer.execute() + + // First retry should wait 100ms (100 * 1) + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + + // Second retry should wait 200ms (100 * 2) + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(200) + + await executePromise + expect(mockFn).toHaveBeenCalledTimes(3) + }) + + it('should use fixed backoff', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 3, + baseWait: 150, + backoff: 'fixed', + throwOnError: false + }) + + const executePromise = retryer.execute() + + // Both retries should wait 150ms + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(150) + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(150) + + await executePromise + expect(mockFn).toHaveBeenCalledTimes(3) + }) + }) + + describe('Error Handling', () => { + it('should throw on last error by default', async () => { + const error = new Error('Test error') + const mockFn = vi.fn().mockRejectedValue(error) + const retryer = new AsyncRetryer(mockFn, { maxAttempts: 1 }) + + await expect(retryer.execute()).rejects.toThrow('Test error') + }) + + it('should not throw when throwOnError is false', async () => { + const error = new Error('Test error') + const mockFn = vi.fn().mockRejectedValue(error) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 1, + throwOnError: false + }) + + const result = await retryer.execute() + expect(result).toBeUndefined() + }) + + it('should throw after retries when throwOnError is true', async () => { + const error = new Error('Test error') + const mockFn = vi.fn().mockRejectedValue(error) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 3, + baseWait: 100, + throwOnError: true + }) + + const executePromise = retryer.execute() + + // Advance through all retries + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) // First retry + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(200) // Second retry + + await expect(executePromise).rejects.toThrow('Test error') + expect(mockFn).toHaveBeenCalledTimes(3) // Should still retry but throw at end + }) + + it('should call onError for every error', async () => { + const error = new Error('Test error') + const mockFn = vi.fn().mockRejectedValue(error) + const onError = vi.fn() + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 100, + onError, + throwOnError: false + }) + + const executePromise = retryer.execute('arg1') + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + await executePromise + + expect(onError).toHaveBeenCalledTimes(1) // Only called once at the end after all retries fail + expect(onError).toHaveBeenCalledWith(error, ['arg1'], retryer) + }) + + it('should call onLastError only for final error', async () => { + const error = new Error('Test error') + const mockFn = vi.fn().mockRejectedValue(error) + const onLastError = vi.fn() + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 100, + onLastError, + throwOnError: false + }) + + const executePromise = retryer.execute() + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + await executePromise + + expect(onLastError).toHaveBeenCalledTimes(1) + expect(onLastError).toHaveBeenCalledWith(error, retryer) + }) + }) + + describe('State Management', () => { + it('should track execution state correctly', async () => { + const mockFn = vi.fn().mockImplementation(async () => { + vi.advanceTimersByTime(50) + return 'success' + }) + const retryer = new AsyncRetryer(mockFn) + + expect(retryer.store.state.status).toBe('idle') + expect(retryer.store.state.isExecuting).toBe(false) + + const executePromise = retryer.execute() + + // Should be executing now + expect(retryer.store.state.status).toBe('executing') + expect(retryer.store.state.isExecuting).toBe(true) + expect(retryer.store.state.currentAttempt).toBe(1) + + await executePromise + + expect(retryer.store.state.status).toBe('idle') + expect(retryer.store.state.isExecuting).toBe(false) + expect(retryer.store.state.currentAttempt).toBe(0) + }) + + it('should show retrying status during retries', async () => { + const mockFn = vi + .fn() + .mockRejectedValueOnce(new Error('Failure')) + .mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { baseWait: 100, throwOnError: false }) + + const result = await retryer.execute() + + expect(retryer.store.state.status).toBe('idle') + }) + + it('should show disabled status when not enabled', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { enabled: false }) + + expect(retryer.store.state.status).toBe('disabled') + + const result = await retryer.execute() + expect(result).toBeUndefined() + expect(mockFn).not.toHaveBeenCalled() + }) + }) + + describe('Callbacks', () => { + it('should call onSettled after every execution attempt', async () => { + const mockFn = vi + .fn() + .mockRejectedValueOnce(new Error('Failure')) + .mockResolvedValue('success') + const onSettled = vi.fn() + const retryer = new AsyncRetryer(mockFn, { onSettled, baseWait: 100 }) + + const executePromise = retryer.execute('arg1') + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + await executePromise + + // Called after each attempt (failed + successful) + expect(onSettled).toHaveBeenCalledTimes(2) + expect(onSettled).toHaveBeenCalledWith(['arg1'], retryer) + }) + }) + + describe('Dynamic Options', () => { + it('should support function-based maxAttempts', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const maxAttemptsFn = vi.fn().mockReturnValue(2) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: maxAttemptsFn, + baseWait: 100, + throwOnError: false + }) + + const executePromise = retryer.execute() + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + await executePromise + + expect(maxAttemptsFn).toHaveBeenCalledWith(retryer) + expect(mockFn).toHaveBeenCalledTimes(2) + }) + + it('should support function-based baseWait', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const baseWaitFn = vi.fn().mockReturnValue(200) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: baseWaitFn, + throwOnError: false + }) + + const executePromise = retryer.execute() + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(200) // Should use function return value + await executePromise + + expect(baseWaitFn).toHaveBeenCalledWith(retryer) + }) + + it('should support function-based enabled', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const enabledFn = vi.fn().mockReturnValue(false) + const retryer = new AsyncRetryer(mockFn, { enabled: enabledFn }) + + const result = await retryer.execute() + + expect(enabledFn).toHaveBeenCalledWith(retryer) + expect(result).toBeUndefined() + expect(mockFn).not.toHaveBeenCalled() + }) + }) + + describe('Cancellation', () => { + it('should allow new executions after cancel', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn) + + // Start and immediately cancel + const executePromise1 = retryer.execute() + retryer.cancel() + + const result1 = await executePromise1 + + // Should be able to execute again after cancel + const result2 = await retryer.execute() + + expect(result2).toBe('success') + expect(retryer.store.state.isExecuting).toBe(false) + }) + + it('should cancel retry delays', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { baseWait: 1000, throwOnError: false }) + + const executePromise = retryer.execute() + + // Wait for first attempt to fail + await vi.runOnlyPendingTimersAsync() + + // Cancel during retry delay + retryer.cancel() + + const result = await executePromise + expect(result).toBeUndefined() + expect(mockFn).toHaveBeenCalledTimes(1) // Only first attempt + }) + }) + + describe('Reset', () => { + it('should reset to initial state', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn) + + await retryer.execute() + expect(retryer.store.state.executionCount).toBe(1) + expect(retryer.store.state.lastResult).toBe('success') + + retryer.reset() + + expect(retryer.store.state).toEqual({ + currentAttempt: 0, + executionCount: 0, + isExecuting: false, + lastError: undefined, + lastExecutionTime: 0, + lastResult: undefined, + status: 'idle', + totalExecutionTime: 0, + }) + }) + + it('should cancel ongoing execution when resetting', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { baseWait: 1000, throwOnError: false }) + + const executePromise = retryer.execute() + + // Wait for first attempt to fail and retry delay to start + await vi.runOnlyPendingTimersAsync() + + retryer.reset() + + const result = await executePromise + expect(result).toBeUndefined() + expect(mockFn).toHaveBeenCalledTimes(1) // Only first attempt before reset + }) + }) + + describe('setOptions', () => { + it('should update options', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { maxAttempts: 3 }) + + expect(retryer.options.maxAttempts).toBe(3) + + retryer.setOptions({ maxAttempts: 5, backoff: 'linear' }) + + expect(retryer.options.maxAttempts).toBe(5) + expect(retryer.options.backoff).toBe('linear') + expect(retryer.options.baseWait).toBe(1000) // Unchanged + }) + }) +}) + +describe('asyncRetry utility function', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + + it('should create a retry-enabled function', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryFn = asyncRetry(mockFn, { maxAttempts: 2 }) + + const result = await retryFn('arg1', 'arg2') + + expect(result).toBe('success') + expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2') + }) + + it('should retry on failure', async () => { + const mockFn = vi + .fn() + .mockRejectedValueOnce(new Error('Failure')) + .mockResolvedValue('success') + const retryFn = asyncRetry(mockFn, { baseWait: 100, throwOnError: 'last' }) + + const executePromise = retryFn() + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + const result = await executePromise + + expect(result).toBe('success') + expect(mockFn).toHaveBeenCalledTimes(2) + }) + + it('should use default options', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryFn = asyncRetry(mockFn, { throwOnError: false }) + + const executePromise = retryFn() + + // Should retry 3 times by default + vi.advanceTimersByTime(1000) // First retry: 1000ms + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(2000) // Second retry: 2000ms + await vi.runOnlyPendingTimersAsync() + + const result = await executePromise + expect(result).toBeUndefined() + expect(mockFn).toHaveBeenCalledTimes(3) // Default maxAttempts + }) +}) \ No newline at end of file diff --git a/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts b/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts index ac4b408f..ec9aa342 100644 --- a/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts +++ b/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts @@ -174,6 +174,7 @@ export function useAsyncBatcher( const state = useStore(asyncBatcher.store, selector) + asyncBatcher.fn = fn asyncBatcher.setOptions(options) return useMemo( diff --git a/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts b/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts index ac025570..86637757 100644 --- a/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts +++ b/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts @@ -156,6 +156,7 @@ export function useAsyncDebouncer( const state = useStore(asyncDebouncer.store, selector) + asyncDebouncer.fn = fn asyncDebouncer.setOptions(options) useEffect(() => { diff --git a/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts b/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts index 094a3f24..2e925fd7 100644 --- a/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts +++ b/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts @@ -174,6 +174,7 @@ export function useAsyncQueuer( const state = useStore(asyncQueuer.store, selector) + asyncQueuer.fn = fn asyncQueuer.setOptions(options) return useMemo( diff --git a/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts b/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts index 6d804054..179a8277 100644 --- a/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts +++ b/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts @@ -190,6 +190,7 @@ export function useAsyncRateLimiter< const state = useStore(asyncRateLimiter.store, selector) + asyncRateLimiter.fn = fn asyncRateLimiter.setOptions(options) return useMemo( diff --git a/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts b/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts index 8bc7cd9c..08f083b8 100644 --- a/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts +++ b/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts @@ -167,6 +167,9 @@ export function useAsyncThrottler( const state = useStore(asyncThrottler.store, selector) + asyncThrottler.fn = fn + asyncThrottler.setOptions(options) + useEffect(() => { return () => asyncThrottler.cancel() }, [asyncThrottler]) diff --git a/packages/react-pacer/src/batcher/useBatcher.ts b/packages/react-pacer/src/batcher/useBatcher.ts index 0ab43d92..2709d6d0 100644 --- a/packages/react-pacer/src/batcher/useBatcher.ts +++ b/packages/react-pacer/src/batcher/useBatcher.ts @@ -128,6 +128,7 @@ export function useBatcher( const state = useStore(batcher.store, selector) + batcher.fn = fn batcher.setOptions(options) return useMemo( diff --git a/packages/react-pacer/src/debouncer/useDebouncer.ts b/packages/react-pacer/src/debouncer/useDebouncer.ts index 5f43608f..24674b64 100644 --- a/packages/react-pacer/src/debouncer/useDebouncer.ts +++ b/packages/react-pacer/src/debouncer/useDebouncer.ts @@ -108,6 +108,7 @@ export function useDebouncer( const state = useStore(debouncer.store, selector) + debouncer.fn = fn debouncer.setOptions(options) useEffect(() => { diff --git a/packages/react-pacer/src/queuer/useQueuer.ts b/packages/react-pacer/src/queuer/useQueuer.ts index d490486a..dec8992b 100644 --- a/packages/react-pacer/src/queuer/useQueuer.ts +++ b/packages/react-pacer/src/queuer/useQueuer.ts @@ -138,6 +138,7 @@ export function useQueuer( const state = useStore(queuer.store, selector) + queuer.fn = fn queuer.setOptions(options) return useMemo( diff --git a/packages/react-pacer/src/rate-limiter/useRateLimiter.ts b/packages/react-pacer/src/rate-limiter/useRateLimiter.ts index 2e43de2f..8bf4442f 100644 --- a/packages/react-pacer/src/rate-limiter/useRateLimiter.ts +++ b/packages/react-pacer/src/rate-limiter/useRateLimiter.ts @@ -147,6 +147,7 @@ export function useRateLimiter( const state = useStore(rateLimiter.store, selector) + rateLimiter.fn = fn rateLimiter.setOptions(options) return useMemo( diff --git a/packages/react-pacer/src/throttler/useThrottler.ts b/packages/react-pacer/src/throttler/useThrottler.ts index e164db6e..3bed9bef 100644 --- a/packages/react-pacer/src/throttler/useThrottler.ts +++ b/packages/react-pacer/src/throttler/useThrottler.ts @@ -113,6 +113,7 @@ export function useThrottler( const state = useStore(throttler.store, selector) + throttler.fn = fn throttler.setOptions(options) useEffect(() => { From d03fe2b10e718b728c8ead3566aa76334f8aa3f4 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Wed, 6 Aug 2025 18:46:52 -0500 Subject: [PATCH 02/50] add retry example --- .../react/useAsyncDebouncer/src/index.tsx | 1 - examples/react/useAsyncRetryer/.eslintrc.cjs | 13 ++ examples/react/useAsyncRetryer/.gitignore | 27 +++ examples/react/useAsyncRetryer/README.md | 6 + examples/react/useAsyncRetryer/index.html | 16 ++ examples/react/useAsyncRetryer/package.json | 34 ++++ .../useAsyncRetryer/public/emblem-light.svg | 13 ++ examples/react/useAsyncRetryer/src/index.tsx | 137 +++++++++++++ examples/react/useAsyncRetryer/tsconfig.json | 23 +++ examples/react/useAsyncRetryer/vite.config.ts | 13 ++ packages/pacer/package.json | 10 + packages/pacer/src/async-retryer.ts | 132 +++++-------- packages/pacer/src/index.ts | 1 + packages/pacer/tests/async-retryer.test.ts | 38 +++- packages/react-pacer/package.json | 10 + .../react-pacer/src/async-retryer/index.ts | 1 + .../src/async-retryer/useAsyncRetryer.ts | 180 ++++++++++++++++++ packages/react-pacer/src/index.ts | 3 + packages/react-pacer/vite.config.ts | 1 + pnpm-lock.yaml | 25 +++ 20 files changed, 598 insertions(+), 86 deletions(-) create mode 100644 examples/react/useAsyncRetryer/.eslintrc.cjs create mode 100644 examples/react/useAsyncRetryer/.gitignore create mode 100644 examples/react/useAsyncRetryer/README.md create mode 100644 examples/react/useAsyncRetryer/index.html create mode 100644 examples/react/useAsyncRetryer/package.json create mode 100644 examples/react/useAsyncRetryer/public/emblem-light.svg create mode 100644 examples/react/useAsyncRetryer/src/index.tsx create mode 100644 examples/react/useAsyncRetryer/tsconfig.json create mode 100644 examples/react/useAsyncRetryer/vite.config.ts create mode 100644 packages/react-pacer/src/async-retryer/index.ts create mode 100644 packages/react-pacer/src/async-retryer/useAsyncRetryer.ts diff --git a/examples/react/useAsyncDebouncer/src/index.tsx b/examples/react/useAsyncDebouncer/src/index.tsx index 956aded5..cf7cea5a 100644 --- a/examples/react/useAsyncDebouncer/src/index.tsx +++ b/examples/react/useAsyncDebouncer/src/index.tsx @@ -23,7 +23,6 @@ function App() { // The function that will become debounced const handleSearch = async (term: string) => { - throw new Error('Test error') if (!term) { setResults([]) return diff --git a/examples/react/useAsyncRetryer/.eslintrc.cjs b/examples/react/useAsyncRetryer/.eslintrc.cjs new file mode 100644 index 00000000..9ff0b9fc --- /dev/null +++ b/examples/react/useAsyncRetryer/.eslintrc.cjs @@ -0,0 +1,13 @@ +// @ts-check + +/** @type {import('eslint').Linter.Config} */ +const config = { + settings: { + extends: ['plugin:react/recommended', 'plugin:react-hooks/recommended'], + rules: { + 'react/no-children-prop': 'off', + }, + }, +} + +module.exports = config diff --git a/examples/react/useAsyncRetryer/.gitignore b/examples/react/useAsyncRetryer/.gitignore new file mode 100644 index 00000000..4673b022 --- /dev/null +++ b/examples/react/useAsyncRetryer/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +pnpm-lock.yaml +yarn.lock +package-lock.json + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/examples/react/useAsyncRetryer/README.md b/examples/react/useAsyncRetryer/README.md new file mode 100644 index 00000000..1cf88926 --- /dev/null +++ b/examples/react/useAsyncRetryer/README.md @@ -0,0 +1,6 @@ +# Example + +To run this example: + +- `npm install` +- `npm run dev` diff --git a/examples/react/useAsyncRetryer/index.html b/examples/react/useAsyncRetryer/index.html new file mode 100644 index 00000000..701aa26e --- /dev/null +++ b/examples/react/useAsyncRetryer/index.html @@ -0,0 +1,16 @@ + + + + + + + + + TanStack Pacer Example + + + +
+ + + diff --git a/examples/react/useAsyncRetryer/package.json b/examples/react/useAsyncRetryer/package.json new file mode 100644 index 00000000..99d2327e --- /dev/null +++ b/examples/react/useAsyncRetryer/package.json @@ -0,0 +1,34 @@ +{ + "name": "@tanstack/pacer-example-react-use-async-retryer", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3005", + "build": "vite build", + "preview": "vite preview", + "test:types": "tsc" + }, + "dependencies": { + "@tanstack/react-pacer": "^0.14.0", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@types/react": "^19.1.9", + "@types/react-dom": "^19.1.7", + "@vitejs/plugin-react": "^4.7.0", + "vite": "^7.0.6" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/examples/react/useAsyncRetryer/public/emblem-light.svg b/examples/react/useAsyncRetryer/public/emblem-light.svg new file mode 100644 index 00000000..a58e69ad --- /dev/null +++ b/examples/react/useAsyncRetryer/public/emblem-light.svg @@ -0,0 +1,13 @@ + + + + emblem-light + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/examples/react/useAsyncRetryer/src/index.tsx b/examples/react/useAsyncRetryer/src/index.tsx new file mode 100644 index 00000000..44d839c2 --- /dev/null +++ b/examples/react/useAsyncRetryer/src/index.tsx @@ -0,0 +1,137 @@ +import { useState } from 'react' +import ReactDOM from 'react-dom/client' +import { useAsyncRetryer } from '@tanstack/react-pacer/async-retryer' + +interface UserData { + id: number + name: string + email: string +} + +// Simulate API call with fake data that fails randomly +const fakeApi = async (userId: string): Promise => { + await new Promise((resolve) => setTimeout(resolve, 800)) // Simulate network delay + + // Randomly fail 60% of the time to demonstrate retry functionality + if (Math.random() < 0.6) { + throw new Error(`Network error fetching user ${userId}`) + } + + return { + id: parseInt(userId), + name: `User ${userId}`, + email: `user${userId}@example.com` + } +} + +function App() { + const [userId, setUserId] = useState('123') + const [userData, setUserData] = useState(null) + + // The function that will be retried + const fetchUser = async (id: string) => { + const data = await fakeApi(id) + setUserData(data) + return data + } + + // hook that gives you an async retryer instance + const asyncRetryer = useAsyncRetryer( + fetchUser, + { + maxAttempts: 5, // Retry up to 5 times + backoff: 'exponential', // Exponential backoff (1s, 2s, 4s, 8s, 16s) + baseWait: 1000, // Start with 1 second wait + onRetry: (attempt, error) => { + console.log(`Retry attempt ${attempt} after error:`, error.message) + }, + onError: (error) => { + console.error('Request failed:', error.message) + }, + onLastError: (error) => { + console.error('All retries failed:', error.message) + setUserData(null) + }, + onSuccess: (result) => { + console.log('Request succeeded:', result) + }, + }, + // Optional Selector function to pick the state you want to track and use + (state) => ({ + isExecuting: state.isExecuting, + currentAttempt: state.currentAttempt, + executionCount: state.executionCount, + lastError: state.lastError, + status: state.status, + }), + ) + + // get and name our retry function + const handleFetchUser = asyncRetryer.execute + + // event handler that calls the retry function + async function onFetchUser() { + const result = await handleFetchUser(userId) // optionally await result if you need to + console.log('Final result:', result) + } + + return ( +
+

TanStack Pacer useAsyncRetryer Example

+
+ setUserId(e.target.value)} + placeholder="Enter user ID..." + style={{ marginRight: '10px' }} + /> + +
+ +
+ + +
+ +
+

Status: {asyncRetryer.state.status}

+ {asyncRetryer.state.currentAttempt > 0 && ( +

Current Attempt: {asyncRetryer.state.currentAttempt}

+ )} +

Total Executions: {asyncRetryer.state.executionCount}

+ {asyncRetryer.state.lastError && ( +

Last Error: {asyncRetryer.state.lastError.message}

+ )} +
+ + {userData && ( +
+

User Data:

+

ID: {userData.id}

+

Name: {userData.name}

+

Email: {userData.email}

+
+ )} + +
+        {JSON.stringify(asyncRetryer.store.state, null, 2)}
+      
+
+ ) +} + +const root = ReactDOM.createRoot(document.getElementById('root')!) + +let mounted = true +root.render() + +// demo unmounting and cancellation +document.addEventListener('keydown', (e) => { + if (e.shiftKey && e.key === 'Enter') { + mounted = !mounted + root.render(mounted ? : null) + } +}) diff --git a/examples/react/useAsyncRetryer/tsconfig.json b/examples/react/useAsyncRetryer/tsconfig.json new file mode 100644 index 00000000..6e9088d6 --- /dev/null +++ b/examples/react/useAsyncRetryer/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "vite.config.ts"] +} diff --git a/examples/react/useAsyncRetryer/vite.config.ts b/examples/react/useAsyncRetryer/vite.config.ts new file mode 100644 index 00000000..4e194366 --- /dev/null +++ b/examples/react/useAsyncRetryer/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + react({ + // babel: { + // plugins: [['babel-plugin-react-compiler', { target: '19' }]], + // }, + }), + ], +}) diff --git a/packages/pacer/package.json b/packages/pacer/package.json index ccb7fbfa..6d0d117e 100644 --- a/packages/pacer/package.json +++ b/packages/pacer/package.json @@ -77,6 +77,16 @@ "default": "./dist/cjs/async-rate-limiter.cjs" } }, + "./async-retryer": { + "import": { + "types": "./dist/esm/async-retryer.d.ts", + "default": "./dist/esm/async-retryer.js" + }, + "require": { + "types": "./dist/cjs/async-retryer.d.cts", + "default": "./dist/cjs/async-retryer.cjs" + } + }, "./async-throttler": { "import": { "types": "./dist/esm/async-throttler.d.ts", diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts index f273d4db..9c57763a 100644 --- a/packages/pacer/src/async-retryer.ts +++ b/packages/pacer/src/async-retryer.ts @@ -304,93 +304,65 @@ export class AsyncRetryer { lastError: undefined, }) - try { - let isLastAttempt = false - for (let attempt = 1; attempt <= this.#getMaxAttempts(); attempt++) { - isLastAttempt = attempt === this.#getMaxAttempts() - this.#setState({ currentAttempt: attempt }) - - try { - // Check if cancelled before executing - if (signal.aborted) { - throw new Error('Retry cancelled') - } - - result = (await this.fn(...args)) as ReturnType - - const totalTime = Date.now() - startTime - this.#setState({ - executionCount: this.store.state.executionCount + 1, - isExecuting: false, - lastExecutionTime: Date.now(), - totalExecutionTime: totalTime, - currentAttempt: 0, - lastResult: result, - }) - - this.options.onSuccess?.(result, args, this) - - return result - } catch (error) { - lastError = error instanceof Error ? error : new Error(String(error)) - this.#setState({ lastError }) - - if (attempt < this.#getMaxAttempts()) { - this.options.onRetry?.(attempt, lastError, this) - - const wait = this.#calculateWait(attempt) - if (wait > 0) { - await new Promise((resolve, reject) => { - const timeout = setTimeout(resolve, wait) - signal.addEventListener('abort', () => { - clearTimeout(timeout) - reject(new Error('Retry cancelled')) - }) + let isLastAttempt = false + for (let attempt = 1; attempt <= this.#getMaxAttempts(); attempt++) { + isLastAttempt = attempt === this.#getMaxAttempts() + this.#setState({ currentAttempt: attempt }) + + try { + result = (await this.fn(...args)) as ReturnType + + const totalTime = Date.now() - startTime + this.#setState({ + executionCount: this.store.state.executionCount + 1, + isExecuting: false, + lastExecutionTime: Date.now(), + totalExecutionTime: totalTime, + currentAttempt: 0, + lastResult: result, + }) + + this.options.onSuccess?.(result, args, this) + + return result + } catch (error) { + lastError = error instanceof Error ? error : new Error(String(error)) + this.#setState({ lastError }) + + if (attempt < this.#getMaxAttempts()) { + this.options.onRetry?.(attempt, lastError, this) + + const wait = this.#calculateWait(attempt) + if (wait > 0) { + await new Promise((resolve, reject) => { + const timeout = setTimeout(resolve, wait) + signal.addEventListener('abort', () => { + clearTimeout(timeout) + reject(new Error('Retry cancelled')) }) - } + }) } - } finally { - this.options.onSettled?.(args, this) } + } finally { + this.options.onSettled?.(args, this) + this.#setState({ + isExecuting: false, + }) } + } - this.#setState({ - isExecuting: false, - currentAttempt: 0, - }) - - this.options.onLastError?.(lastError!, this) - this.options.onError?.(lastError!, args, this) - this.options.onSettled?.(args, this) - - if ( - (this.options.throwOnError === 'last' && isLastAttempt) || - this.options.throwOnError === true - ) { - throw lastError - } - - return undefined as any - } catch (error) { - // Don't rethrow if the error was from cancellation - if (error instanceof Error && error.message === 'Retry cancelled') { - return undefined - } - - this.#setState({ - isExecuting: false, - currentAttempt: 0, - }) - - const errorToHandle = - error instanceof Error ? error : new Error(String(error)) - this.options.onError?.(errorToHandle, args, this) - this.options.onSettled?.(args, this) + this.options.onLastError?.(lastError!, this) + this.options.onError?.(lastError!, args, this) + this.options.onSettled?.(args, this) - throw error - } finally { - this.#abortController = null + if ( + (this.options.throwOnError === 'last' && isLastAttempt) || + this.options.throwOnError === true + ) { + throw lastError } + + return undefined as any } /** diff --git a/packages/pacer/src/index.ts b/packages/pacer/src/index.ts index 194ea6f7..280f82f4 100644 --- a/packages/pacer/src/index.ts +++ b/packages/pacer/src/index.ts @@ -2,6 +2,7 @@ export * from './async-batcher' export * from './async-debouncer' export * from './async-queuer' export * from './async-rate-limiter' +export * from './async-retryer' export * from './async-throttler' export * from './batcher' export * from './debouncer' diff --git a/packages/pacer/tests/async-retryer.test.ts b/packages/pacer/tests/async-retryer.test.ts index fdc1e883..81409086 100644 --- a/packages/pacer/tests/async-retryer.test.ts +++ b/packages/pacer/tests/async-retryer.test.ts @@ -111,7 +111,13 @@ describe('AsyncRetryer', () => { .mockResolvedValue('success') const retryer = new AsyncRetryer(mockFn, { baseWait: 100, throwOnError: 'last' }) - const result = await retryer.execute('arg1') + const executePromise = retryer.execute('arg1') + + // Let the retry timer run + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + + const result = await executePromise expect(result).toBe('success') expect(mockFn).toHaveBeenCalledTimes(2) @@ -177,10 +183,21 @@ describe('AsyncRetryer', () => { throwOnError: false }) - const result = await retryer.execute() - - expect(result).toBeUndefined() + const executePromise = retryer.execute() + + // First retry: wait 100ms (100 * 2^0) + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) + + // Second retry: wait 200ms (100 * 2^1) + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(200) + + // Third attempt will not retry, just finish + await executePromise + expect(mockFn).toHaveBeenCalledTimes(3) + expect(retryer.store.state.currentAttempt).toBe(3) }) it('should use linear backoff', async () => { @@ -346,8 +363,19 @@ describe('AsyncRetryer', () => { .mockResolvedValue('success') const retryer = new AsyncRetryer(mockFn, { baseWait: 100, throwOnError: false }) - const result = await retryer.execute() + // Start execution but do not await yet + const executePromise = retryer.execute() + + // After first rejection, status should be 'retrying' + // Fast-forward timers to trigger retry wait + await vi.runOnlyPendingTimersAsync() + expect(retryer.store.state.status).toBe('retrying') + + // Fast-forward the retry wait time + vi.advanceTimersByTime(100) + await executePromise + // After completion, status should be 'idle' expect(retryer.store.state.status).toBe('idle') }) diff --git a/packages/react-pacer/package.json b/packages/react-pacer/package.json index 57ef5374..baa62f7f 100644 --- a/packages/react-pacer/package.json +++ b/packages/react-pacer/package.json @@ -77,6 +77,16 @@ "default": "./dist/cjs/async-rate-limiter/index.cjs" } }, + "./async-retryer": { + "import": { + "types": "./dist/esm/async-retryer/index.d.ts", + "default": "./dist/esm/async-retryer/index.js" + }, + "require": { + "types": "./dist/cjs/async-retryer/index.d.cts", + "default": "./dist/cjs/async-retryer/index.cjs" + } + }, "./async-throttler": { "import": { "types": "./dist/esm/async-throttler/index.d.ts", diff --git a/packages/react-pacer/src/async-retryer/index.ts b/packages/react-pacer/src/async-retryer/index.ts new file mode 100644 index 00000000..c3c6a39d --- /dev/null +++ b/packages/react-pacer/src/async-retryer/index.ts @@ -0,0 +1 @@ +export * from './useAsyncRetryer' \ No newline at end of file diff --git a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts new file mode 100644 index 00000000..7981b11d --- /dev/null +++ b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts @@ -0,0 +1,180 @@ +import { useEffect, useMemo, useState } from 'react' +import { AsyncRetryer } from '@tanstack/pacer/async-retryer' +import { useStore } from '@tanstack/react-store' +import type { Store } from '@tanstack/react-store' +import type { AnyAsyncFunction } from '@tanstack/pacer/types' +import type { + AsyncRetryerOptions, + AsyncRetryerState, +} from '@tanstack/pacer/async-retryer' + +export interface ReactAsyncRetryer< + TFn extends AnyAsyncFunction, + TSelected = {}, +> extends Omit, 'store'> { + /** + * Reactive state that will be updated and re-rendered when the retryer state changes + * + * Use this instead of `retryer.store.state` + */ + readonly state: Readonly + /** + * @deprecated Use `retryer.state` instead of `retryer.store.state` if you want to read reactive state. + * The state on the store object is not reactive, as it has not been wrapped in a `useStore` hook internally. + * Although, you can make the state reactive by using the `useStore` in your own usage. + */ + readonly store: Store>> +} + +/** + * A low-level React hook that creates an `AsyncRetryer` instance to retry execution of an async function. + * + * This hook is designed to be flexible and state-management agnostic - it simply returns a retryer instance that + * you can integrate with any state management solution (useState, Redux, Zustand, Jotai, etc). + * + * Async retrying automatically re-executes a failed async function up to a specified number of attempts with + * configurable backoff strategies. This is useful for handling transient errors like network failures, temporary + * server issues, or rate limiting where you want to automatically retry the operation. + * + * Error Handling: + * - If an `onError` handler is provided, it will be called for every error during execution + * - If an `onLastError` handler is provided, it will be called only for the final error after all retries fail + * - If `throwOnError` is 'last' (default), only the final error after all retries will be thrown + * - If `throwOnError` is true, every error will be thrown immediately (disables retrying) + * - If `throwOnError` is false, errors are never thrown and undefined is returned instead + * + * ## State Management and Selector + * + * The hook uses TanStack Store for reactive state management. The `selector` parameter allows you + * to specify which state changes will trigger a re-render, optimizing performance by preventing + * unnecessary re-renders when irrelevant state changes occur. + * + * **By default, there will be no reactive state subscriptions** and you must opt-in to state + * tracking by providing a selector function. This prevents unnecessary re-renders and gives you + * full control over when your component updates. Only when you provide a selector will the + * component re-render when the selected state values change. + * + * Available state properties: + * - `currentAttempt`: The current retry attempt number (0 when not executing) + * - `executionCount`: Total number of completed executions (successful or failed) + * - `isExecuting`: Whether the retryer is currently executing the function + * - `lastError`: The most recent error encountered during execution + * - `lastExecutionTime`: Timestamp of the last execution completion in milliseconds + * - `lastResult`: The result from the most recent successful execution + * - `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') + * - `totalExecutionTime`: Total time spent executing (including retries) in milliseconds + * + * @example + * ```tsx + * // Default behavior - no reactive state subscriptions + * const apiRetryer = useAsyncRetryer( + * async (userId: string) => { + * const response = await fetch(`/api/users/${userId}`); + * if (!response.ok) throw new Error('Failed to fetch user'); + * return response.json(); + * }, + * { maxAttempts: 3, backoff: 'exponential' } + * ); + * + * // Opt-in to re-render when execution state changes (optimized for loading indicators) + * const apiRetryer = useAsyncRetryer( + * async (userId: string) => { + * const response = await fetch(`/api/users/${userId}`); + * if (!response.ok) throw new Error('Failed to fetch user'); + * return response.json(); + * }, + * { maxAttempts: 3, backoff: 'exponential' }, + * (state) => ({ + * isExecuting: state.isExecuting, + * currentAttempt: state.currentAttempt + * }) + * ); + * + * // Opt-in to re-render when results are available (optimized for data display) + * const apiRetryer = useAsyncRetryer( + * async (userId: string) => { + * const response = await fetch(`/api/users/${userId}`); + * if (!response.ok) throw new Error('Failed to fetch user'); + * return response.json(); + * }, + * { maxAttempts: 3, backoff: 'exponential' }, + * (state) => ({ + * lastResult: state.lastResult, + * executionCount: state.executionCount + * }) + * ); + * + * // Opt-in to re-render when error state changes (optimized for error handling) + * const apiRetryer = useAsyncRetryer( + * async (userId: string) => { + * const response = await fetch(`/api/users/${userId}`); + * if (!response.ok) throw new Error('Failed to fetch user'); + * return response.json(); + * }, + * { + * maxAttempts: 3, + * backoff: 'exponential', + * onError: (error) => console.error('API call failed:', error), + * onLastError: (error) => console.error('All retries failed:', error) + * }, + * (state) => ({ + * lastError: state.lastError, + * status: state.status + * }) + * ); + * + * // With state management + * const [userData, setUserData] = useState(null); + * const { execute, state } = useAsyncRetryer( + * async (userId) => { + * const response = await fetch(`/api/users/${userId}`); + * if (!response.ok) throw new Error('Failed to fetch user'); + * const data = await response.json(); + * setUserData(data); + * return data; + * }, + * { + * maxAttempts: 5, + * backoff: 'exponential', + * baseWait: 1000, + * onRetry: (attempt, error) => { + * console.log(`Retry attempt ${attempt} after error:`, error); + * }, + * onError: (error) => { + * console.error('Request failed:', error); + * } + * } + * ); + * + * // Access the selected state (will be empty object {} unless selector provided) + * const { isExecuting, currentAttempt } = state; + * ``` + */ +export function useAsyncRetryer( + fn: TFn, + options: AsyncRetryerOptions, + selector: (state: AsyncRetryerState) => TSelected = () => + ({}) as TSelected, +): ReactAsyncRetryer { + const [asyncRetryer] = useState(() => new AsyncRetryer(fn, options)) + + const state = useStore(asyncRetryer.store, selector) + + asyncRetryer.fn = fn + asyncRetryer.setOptions(options) + + useEffect(() => { + return () => { + asyncRetryer.cancel() + } + }, [asyncRetryer]) + + return useMemo( + () => + ({ + ...asyncRetryer, + state, + }) as ReactAsyncRetryer, // omit `store` in favor of `state` + [asyncRetryer, state], + ) +} \ No newline at end of file diff --git a/packages/react-pacer/src/index.ts b/packages/react-pacer/src/index.ts index 49344428..ac8d7af4 100644 --- a/packages/react-pacer/src/index.ts +++ b/packages/react-pacer/src/index.ts @@ -21,6 +21,9 @@ export * from './async-queuer/useAsyncQueuedState' export * from './async-rate-limiter/useAsyncRateLimiter' export * from './async-rate-limiter/useAsyncRateLimitedCallback' +// async-retryer +export * from './async-retryer/useAsyncRetryer' + // async-throttler export * from './async-throttler/useAsyncThrottler' export * from './async-throttler/useAsyncThrottledCallback' diff --git a/packages/react-pacer/vite.config.ts b/packages/react-pacer/vite.config.ts index 2657f80b..663acd9a 100644 --- a/packages/react-pacer/vite.config.ts +++ b/packages/react-pacer/vite.config.ts @@ -23,6 +23,7 @@ export default mergeConfig( './src/async-debouncer/index.ts', './src/async-queuer/index.ts', './src/async-rate-limiter/index.ts', + './src/async-retryer/index.ts', './src/async-throttler/index.ts', './src/batcher/index.ts', './src/debouncer/index.ts', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99843150..3ad50443 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -602,6 +602,31 @@ importers: specifier: ^7.0.6 version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + examples/react/useAsyncRetryer: + dependencies: + '@tanstack/react-pacer': + specifier: ^0.14.0 + version: link:../../../packages/react-pacer + react: + specifier: ^19.1.1 + version: 19.1.1 + react-dom: + specifier: ^19.1.1 + version: 19.1.1(react@19.1.1) + devDependencies: + '@types/react': + specifier: ^19.1.9 + version: 19.1.9 + '@types/react-dom': + specifier: ^19.1.7 + version: 19.1.7(@types/react@19.1.9) + '@vitejs/plugin-react': + specifier: ^4.7.0 + version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + vite: + specifier: ^7.0.6 + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + examples/react/useAsyncThrottler: dependencies: '@tanstack/react-pacer': From 338db04c57ad796d5648e0dd86c1867ba9bdda87 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Sun, 10 Aug 2025 09:38:48 -0500 Subject: [PATCH 03/50] aborts through async-retryer only --- examples/react/useAsyncRetryer/src/index.tsx | 60 +++++-- packages/pacer/src/async-debouncer.ts | 8 +- packages/pacer/src/async-retryer.ts | 46 ++++- packages/pacer/src/async-throttler.ts | 8 +- packages/pacer/tests/async-retryer.test.ts | 162 ++++++++++-------- .../react-pacer/src/async-retryer/index.ts | 2 +- .../src/async-retryer/useAsyncRetryer.ts | 8 +- 7 files changed, 182 insertions(+), 112 deletions(-) diff --git a/examples/react/useAsyncRetryer/src/index.tsx b/examples/react/useAsyncRetryer/src/index.tsx index 44d839c2..b295750b 100644 --- a/examples/react/useAsyncRetryer/src/index.tsx +++ b/examples/react/useAsyncRetryer/src/index.tsx @@ -11,16 +11,16 @@ interface UserData { // Simulate API call with fake data that fails randomly const fakeApi = async (userId: string): Promise => { await new Promise((resolve) => setTimeout(resolve, 800)) // Simulate network delay - + // Randomly fail 60% of the time to demonstrate retry functionality if (Math.random() < 0.6) { throw new Error(`Network error fetching user ${userId}`) } - + return { id: parseInt(userId), name: `User ${userId}`, - email: `user${userId}@example.com` + email: `user${userId}@example.com`, } } @@ -90,33 +90,65 @@ function App() { {asyncRetryer.state.isExecuting ? 'Fetching...' : 'Fetch User'} - +
- +
-

Status: {asyncRetryer.state.status}

+

+ Status: {asyncRetryer.state.status} +

{asyncRetryer.state.currentAttempt > 0 && ( -

Current Attempt: {asyncRetryer.state.currentAttempt}

+

+ Current Attempt:{' '} + {asyncRetryer.state.currentAttempt} +

)} -

Total Executions: {asyncRetryer.state.executionCount}

+

+ Total Executions: {asyncRetryer.state.executionCount} +

{asyncRetryer.state.lastError && ( -

Last Error: {asyncRetryer.state.lastError.message}

+

+ Last Error: {asyncRetryer.state.lastError.message} +

)}
{userData && ( -
+

User Data:

-

ID: {userData.id}

-

Name: {userData.name}

-

Email: {userData.email}

+

+ ID: {userData.id} +

+

+ Name: {userData.name} +

+

+ Email: {userData.email} +

)} -
+      
         {JSON.stringify(asyncRetryer.store.state, null, 2)}
       
diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index 503708b2..3311d240 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -189,7 +189,6 @@ export class AsyncDebouncer { >(getDefaultAsyncDebouncerState()) options: AsyncDebouncerOptions asyncRetryer: AsyncRetryer - #abortController: AbortController | null = null #timeoutId: NodeJS.Timeout | null = null #resolvePreviousPromise: | ((value?: ReturnType | undefined) => void) @@ -317,7 +316,6 @@ export class AsyncDebouncer { ...args: Parameters ): Promise | undefined> => { if (!this.#getEnabled()) return undefined - this.#abortController = new AbortController() try { this.#setState({ isExecuting: true }) const result = await this.asyncRetryer.execute(...args) // EXECUTE! @@ -341,7 +339,6 @@ export class AsyncDebouncer { lastArgs: undefined, settleCount: this.store.state.settleCount + 1, }) - this.#abortController = null this.options.onSettled?.(args, this) } return this.store.state.lastResult @@ -389,10 +386,7 @@ export class AsyncDebouncer { } #abortExecution = (): void => { - if (this.#abortController) { - this.#abortController.abort() - this.#abortController = null - } + this.asyncRetryer.cancel() } /** diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts index 9c57763a..36f3274a 100644 --- a/packages/pacer/src/async-retryer.ts +++ b/packages/pacer/src/async-retryer.ts @@ -298,6 +298,12 @@ export class AsyncRetryer { this.#abortController = new AbortController() const signal = this.#abortController.signal + const createAbortError = (): Error => { + const error = new Error('Aborted') + ;(error as any).name = 'AbortError' + return error + } + this.#setState({ isExecuting: true, currentAttempt: 0, @@ -310,8 +316,15 @@ export class AsyncRetryer { this.#setState({ currentAttempt: attempt }) try { + if (signal.aborted) { + return undefined as any + } result = (await this.fn(...args)) as ReturnType + if (signal.aborted) { + return undefined as any + } + const totalTime = Date.now() - startTime this.#setState({ executionCount: this.store.state.executionCount + 1, @@ -326,6 +339,10 @@ export class AsyncRetryer { return result } catch (error) { + // Treat abort as a non-error cancellation outcome + if ((error as any)?.name === 'AbortError') { + return undefined as any + } lastError = error instanceof Error ? error : new Error(String(error)) this.#setState({ lastError }) @@ -334,23 +351,36 @@ export class AsyncRetryer { const wait = this.#calculateWait(attempt) if (wait > 0) { - await new Promise((resolve, reject) => { - const timeout = setTimeout(resolve, wait) - signal.addEventListener('abort', () => { + // Eagerly reflect retrying status during the wait window + this.#setState({ isExecuting: true, currentAttempt: attempt + 1 }) + await new Promise((resolve) => { + const timeout = setTimeout(() => { + signal.removeEventListener('abort', onAbort) + resolve() + }, wait) + const onAbort = () => { clearTimeout(timeout) - reject(new Error('Retry cancelled')) - }) + signal.removeEventListener('abort', onAbort) + resolve() + } + signal.addEventListener('abort', onAbort) }) + if (signal.aborted) { + // When cancelled during retry wait, surface the last error exactly once + if (lastError) { + this.options.onError?.(lastError, args, this) + } + return undefined as any + } } } } finally { this.options.onSettled?.(args, this) - this.#setState({ - isExecuting: false, - }) } } + // Exhausted retries - finalize state + this.#setState({ isExecuting: false }) this.options.onLastError?.(lastError!, this) this.options.onError?.(lastError!, args, this) this.options.onSettled?.(args, this) diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index 4b59260a..5e89eaeb 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -200,7 +200,6 @@ export class AsyncThrottler { >(getDefaultAsyncThrottlerState()) options: AsyncThrottlerOptions asyncRetryer: AsyncRetryer - #abortController: AbortController | null = null #timeoutId: NodeJS.Timeout | null = null #resolvePreviousPromise: | ((value?: ReturnType | undefined) => void) @@ -341,7 +340,6 @@ export class AsyncThrottler { ...args: Parameters ): Promise | undefined> => { if (!this.#getEnabled() || this.store.state.isExecuting) return undefined - this.#abortController = new AbortController() try { this.#setState({ isExecuting: true }) const result = await this.asyncRetryer.execute(...args) // EXECUTE! @@ -368,7 +366,6 @@ export class AsyncThrottler { lastExecutionTime, nextExecutionTime, }) - this.#abortController = null this.options.onSettled?.(args, this) setTimeout(() => { if (!this.store.state.isPending) { @@ -424,10 +421,7 @@ export class AsyncThrottler { } #abortExecution = (): void => { - if (this.#abortController) { - this.#abortController.abort() - this.#abortController = null - } + this.asyncRetryer.cancel() } /** diff --git a/packages/pacer/tests/async-retryer.test.ts b/packages/pacer/tests/async-retryer.test.ts index 81409086..8fbb81c3 100644 --- a/packages/pacer/tests/async-retryer.test.ts +++ b/packages/pacer/tests/async-retryer.test.ts @@ -98,8 +98,12 @@ describe('AsyncRetryer', () => { const afterTime = Date.now() expect(retryer.store.state.totalExecutionTime).toBeGreaterThan(0) - expect(retryer.store.state.lastExecutionTime).toBeGreaterThanOrEqual(beforeTime) - expect(retryer.store.state.lastExecutionTime).toBeLessThanOrEqual(afterTime) + expect(retryer.store.state.lastExecutionTime).toBeGreaterThanOrEqual( + beforeTime, + ) + expect(retryer.store.state.lastExecutionTime).toBeLessThanOrEqual( + afterTime, + ) }) }) @@ -109,7 +113,10 @@ describe('AsyncRetryer', () => { .fn() .mockRejectedValueOnce(new Error('First failure')) .mockResolvedValue('success') - const retryer = new AsyncRetryer(mockFn, { baseWait: 100, throwOnError: 'last' }) + const retryer = new AsyncRetryer(mockFn, { + baseWait: 100, + throwOnError: 'last', + }) const executePromise = retryer.execute('arg1') @@ -136,15 +143,15 @@ describe('AsyncRetryer', () => { const retryer = new AsyncRetryer(mockFn, { onRetry, baseWait: 100 }) const executePromise = retryer.execute() - + // Let first retry happen await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) - + // Let second retry happen await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(200) // Exponential backoff: 100 * 2^1 - + await executePromise expect(onRetry).toHaveBeenCalledTimes(2) @@ -155,18 +162,18 @@ describe('AsyncRetryer', () => { it('should fail after exhausting all retries', async () => { const error = new Error('Persistent failure') const mockFn = vi.fn().mockRejectedValue(error) - const retryer = new AsyncRetryer(mockFn, { - maxAttempts: 2, + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, baseWait: 100, - throwOnError: 'last' + throwOnError: 'last', }) const executePromise = retryer.execute() - + // Complete first retry await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) - + await expect(executePromise).rejects.toThrow('Persistent failure') expect(mockFn).toHaveBeenCalledTimes(2) expect(retryer.store.state.lastError).toBe(error) @@ -177,10 +184,10 @@ describe('AsyncRetryer', () => { describe('Backoff Strategies', () => { it('should use exponential backoff by default', async () => { const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) - const retryer = new AsyncRetryer(mockFn, { - maxAttempts: 3, + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 3, baseWait: 100, - throwOnError: false + throwOnError: false, }) const executePromise = retryer.execute() @@ -202,45 +209,45 @@ describe('AsyncRetryer', () => { it('should use linear backoff', async () => { const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) - const retryer = new AsyncRetryer(mockFn, { - maxAttempts: 3, + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 3, baseWait: 100, backoff: 'linear', - throwOnError: false + throwOnError: false, }) const executePromise = retryer.execute() - + // First retry should wait 100ms (100 * 1) await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) - + // Second retry should wait 200ms (100 * 2) await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(200) - + await executePromise expect(mockFn).toHaveBeenCalledTimes(3) }) it('should use fixed backoff', async () => { const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) - const retryer = new AsyncRetryer(mockFn, { - maxAttempts: 3, + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 3, baseWait: 150, backoff: 'fixed', - throwOnError: false + throwOnError: false, }) const executePromise = retryer.execute() - + // Both retries should wait 150ms await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(150) - + await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(150) - + await executePromise expect(mockFn).toHaveBeenCalledTimes(3) }) @@ -258,9 +265,9 @@ describe('AsyncRetryer', () => { it('should not throw when throwOnError is false', async () => { const error = new Error('Test error') const mockFn = vi.fn().mockRejectedValue(error) - const retryer = new AsyncRetryer(mockFn, { + const retryer = new AsyncRetryer(mockFn, { maxAttempts: 1, - throwOnError: false + throwOnError: false, }) const result = await retryer.execute() @@ -270,20 +277,20 @@ describe('AsyncRetryer', () => { it('should throw after retries when throwOnError is true', async () => { const error = new Error('Test error') const mockFn = vi.fn().mockRejectedValue(error) - const retryer = new AsyncRetryer(mockFn, { + const retryer = new AsyncRetryer(mockFn, { maxAttempts: 3, baseWait: 100, - throwOnError: true + throwOnError: true, }) const executePromise = retryer.execute() - + // Advance through all retries await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) // First retry await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(200) // Second retry - + await expect(executePromise).rejects.toThrow('Test error') expect(mockFn).toHaveBeenCalledTimes(3) // Should still retry but throw at end }) @@ -292,15 +299,15 @@ describe('AsyncRetryer', () => { const error = new Error('Test error') const mockFn = vi.fn().mockRejectedValue(error) const onError = vi.fn() - const retryer = new AsyncRetryer(mockFn, { + const retryer = new AsyncRetryer(mockFn, { maxAttempts: 2, baseWait: 100, onError, - throwOnError: false + throwOnError: false, }) const executePromise = retryer.execute('arg1') - + await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) await executePromise @@ -313,15 +320,15 @@ describe('AsyncRetryer', () => { const error = new Error('Test error') const mockFn = vi.fn().mockRejectedValue(error) const onLastError = vi.fn() - const retryer = new AsyncRetryer(mockFn, { + const retryer = new AsyncRetryer(mockFn, { maxAttempts: 2, baseWait: 100, onLastError, - throwOnError: false + throwOnError: false, }) const executePromise = retryer.execute() - + await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) await executePromise @@ -343,8 +350,8 @@ describe('AsyncRetryer', () => { expect(retryer.store.state.isExecuting).toBe(false) const executePromise = retryer.execute() - - // Should be executing now + + // Should be executing now expect(retryer.store.state.status).toBe('executing') expect(retryer.store.state.isExecuting).toBe(true) expect(retryer.store.state.currentAttempt).toBe(1) @@ -361,14 +368,17 @@ describe('AsyncRetryer', () => { .fn() .mockRejectedValueOnce(new Error('Failure')) .mockResolvedValue('success') - const retryer = new AsyncRetryer(mockFn, { baseWait: 100, throwOnError: false }) + const retryer = new AsyncRetryer(mockFn, { + baseWait: 100, + throwOnError: false, + }) // Start execution but do not await yet const executePromise = retryer.execute() // After first rejection, status should be 'retrying' - // Fast-forward timers to trigger retry wait - await vi.runOnlyPendingTimersAsync() + // Allow microtasks to schedule the retry wait without advancing timers + await Promise.resolve() expect(retryer.store.state.status).toBe('retrying') // Fast-forward the retry wait time @@ -401,7 +411,7 @@ describe('AsyncRetryer', () => { const retryer = new AsyncRetryer(mockFn, { onSettled, baseWait: 100 }) const executePromise = retryer.execute('arg1') - + await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) await executePromise @@ -416,14 +426,14 @@ describe('AsyncRetryer', () => { it('should support function-based maxAttempts', async () => { const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) const maxAttemptsFn = vi.fn().mockReturnValue(2) - const retryer = new AsyncRetryer(mockFn, { + const retryer = new AsyncRetryer(mockFn, { maxAttempts: maxAttemptsFn, baseWait: 100, - throwOnError: false + throwOnError: false, }) const executePromise = retryer.execute() - + await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) await executePromise @@ -435,14 +445,14 @@ describe('AsyncRetryer', () => { it('should support function-based baseWait', async () => { const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) const baseWaitFn = vi.fn().mockReturnValue(200) - const retryer = new AsyncRetryer(mockFn, { + const retryer = new AsyncRetryer(mockFn, { maxAttempts: 2, baseWait: baseWaitFn, - throwOnError: false + throwOnError: false, }) const executePromise = retryer.execute() - + await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(200) // Should use function return value await executePromise @@ -464,38 +474,47 @@ describe('AsyncRetryer', () => { }) describe('Cancellation', () => { - it('should allow new executions after cancel', async () => { + it('should allow new executions after cancel and resolve undefined without error', async () => { const mockFn = vi.fn().mockResolvedValue('success') - const retryer = new AsyncRetryer(mockFn) + const onError = vi.fn() + const retryer = new AsyncRetryer(mockFn, { onError, throwOnError: false }) // Start and immediately cancel const executePromise1 = retryer.execute() retryer.cancel() - + const result1 = await executePromise1 - + expect(result1).toBeUndefined() + expect(onError).not.toHaveBeenCalled() + // Should be able to execute again after cancel const result2 = await retryer.execute() - + expect(result2).toBe('success') expect(retryer.store.state.isExecuting).toBe(false) }) - it('should cancel retry delays', async () => { + it('should cancel retry delays without error', async () => { const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) - const retryer = new AsyncRetryer(mockFn, { baseWait: 1000, throwOnError: false }) + const onError = vi.fn() + const retryer = new AsyncRetryer(mockFn, { + baseWait: 1000, + throwOnError: false, + onError, + }) const executePromise = retryer.execute() - - // Wait for first attempt to fail - await vi.runOnlyPendingTimersAsync() - + + // Wait for first attempt to fail and retry wait to be scheduled + await Promise.resolve() + // Cancel during retry delay retryer.cancel() const result = await executePromise expect(result).toBeUndefined() expect(mockFn).toHaveBeenCalledTimes(1) // Only first attempt + expect(onError).toHaveBeenCalledTimes(1) // only final onError after loop completion before cancel }) }) @@ -524,13 +543,16 @@ describe('AsyncRetryer', () => { it('should cancel ongoing execution when resetting', async () => { const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) - const retryer = new AsyncRetryer(mockFn, { baseWait: 1000, throwOnError: false }) + const retryer = new AsyncRetryer(mockFn, { + baseWait: 1000, + throwOnError: false, + }) const executePromise = retryer.execute() - - // Wait for first attempt to fail and retry delay to start - await vi.runOnlyPendingTimersAsync() - + + // Wait for first attempt to fail and retry wait to be scheduled + await Promise.resolve() + retryer.reset() const result = await executePromise @@ -578,7 +600,7 @@ describe('asyncRetry utility function', () => { const retryFn = asyncRetry(mockFn, { baseWait: 100, throwOnError: 'last' }) const executePromise = retryFn() - + await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(100) const result = await executePromise @@ -592,15 +614,15 @@ describe('asyncRetry utility function', () => { const retryFn = asyncRetry(mockFn, { throwOnError: false }) const executePromise = retryFn() - + // Should retry 3 times by default vi.advanceTimersByTime(1000) // First retry: 1000ms await vi.runOnlyPendingTimersAsync() vi.advanceTimersByTime(2000) // Second retry: 2000ms await vi.runOnlyPendingTimersAsync() - + const result = await executePromise expect(result).toBeUndefined() expect(mockFn).toHaveBeenCalledTimes(3) // Default maxAttempts }) -}) \ No newline at end of file +}) diff --git a/packages/react-pacer/src/async-retryer/index.ts b/packages/react-pacer/src/async-retryer/index.ts index c3c6a39d..6ec6da8e 100644 --- a/packages/react-pacer/src/async-retryer/index.ts +++ b/packages/react-pacer/src/async-retryer/index.ts @@ -1 +1 @@ -export * from './useAsyncRetryer' \ No newline at end of file +export * from './useAsyncRetryer' diff --git a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts index 7981b11d..9b7b5380 100644 --- a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts +++ b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts @@ -8,10 +8,8 @@ import type { AsyncRetryerState, } from '@tanstack/pacer/async-retryer' -export interface ReactAsyncRetryer< - TFn extends AnyAsyncFunction, - TSelected = {}, -> extends Omit, 'store'> { +export interface ReactAsyncRetryer + extends Omit, 'store'> { /** * Reactive state that will be updated and re-rendered when the retryer state changes * @@ -177,4 +175,4 @@ export function useAsyncRetryer( }) as ReactAsyncRetryer, // omit `store` in favor of `state` [asyncRetryer, state], ) -} \ No newline at end of file +} From 0f16e6c3122f0ee12eaa4515e47bcbae4b81d7ec Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Sun, 10 Aug 2025 12:29:35 -0500 Subject: [PATCH 04/50] add an optional pacer provider --- packages/pacer/src/async-retryer.ts | 6 -- packages/react-pacer/package.json | 10 +++ .../src/async-batcher/useAsyncBatcher.ts | 14 ++++- .../src/async-debouncer/useAsyncDebouncer.ts | 14 ++++- .../src/async-queuer/useAsyncQueuer.ts | 14 ++++- .../async-rate-limiter/useAsyncRateLimiter.ts | 14 +++-- .../src/async-retryer/useAsyncRetryer.ts | 14 ++++- .../src/async-throttler/useAsyncThrottler.ts | 14 ++++- .../react-pacer/src/batcher/useBatcher.ts | 12 +++- .../react-pacer/src/debouncer/useDebouncer.ts | 12 +++- packages/react-pacer/src/index.ts | 3 + .../src/provider/PacerProvider.tsx | 62 +++++++++++++++++++ packages/react-pacer/src/provider/index.ts | 1 + packages/react-pacer/src/queuer/useQueuer.ts | 12 +++- .../src/rate-limiter/useRateLimiter.ts | 12 +++- .../react-pacer/src/throttler/useThrottler.ts | 12 +++- packages/react-pacer/vite.config.ts | 1 + 17 files changed, 187 insertions(+), 40 deletions(-) create mode 100644 packages/react-pacer/src/provider/PacerProvider.tsx create mode 100644 packages/react-pacer/src/provider/index.ts diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts index 36f3274a..f1a905f3 100644 --- a/packages/pacer/src/async-retryer.ts +++ b/packages/pacer/src/async-retryer.ts @@ -298,12 +298,6 @@ export class AsyncRetryer { this.#abortController = new AbortController() const signal = this.#abortController.signal - const createAbortError = (): Error => { - const error = new Error('Aborted') - ;(error as any).name = 'AbortError' - return error - } - this.#setState({ isExecuting: true, currentAttempt: 0, diff --git a/packages/react-pacer/package.json b/packages/react-pacer/package.json index 177b1aa6..b66c5a91 100644 --- a/packages/react-pacer/package.json +++ b/packages/react-pacer/package.json @@ -137,6 +137,16 @@ "default": "./dist/cjs/rate-limiter/index.cjs" } }, + "./provider": { + "import": { + "types": "./dist/esm/provider/index.d.ts", + "default": "./dist/esm/provider/index.js" + }, + "require": { + "types": "./dist/cjs/provider/index.d.cts", + "default": "./dist/cjs/provider/index.cjs" + } + }, "./throttler": { "import": { "types": "./dist/esm/throttler/index.d.ts", diff --git a/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts b/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts index ec9aa342..c008aead 100644 --- a/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts +++ b/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts @@ -6,6 +6,7 @@ import type { AsyncBatcherOptions, AsyncBatcherState, } from '@tanstack/pacer/async-batcher' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncBatcher extends Omit, 'store'> { @@ -170,12 +171,19 @@ export function useAsyncBatcher( selector: (state: AsyncBatcherState) => TSelected = () => ({}) as TSelected, ): ReactAsyncBatcher { - const [asyncBatcher] = useState(() => new AsyncBatcher(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().asyncBatcher, + ...options, + } as AsyncBatcherOptions - const state = useStore(asyncBatcher.store, selector) + const [asyncBatcher] = useState( + () => new AsyncBatcher(fn, mergedOptions), + ) asyncBatcher.fn = fn - asyncBatcher.setOptions(options) + asyncBatcher.setOptions(mergedOptions) + + const state = useStore(asyncBatcher.store, selector) return useMemo( () => diff --git a/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts b/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts index 86637757..162ca21d 100644 --- a/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts +++ b/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts @@ -7,6 +7,7 @@ import type { AsyncDebouncerOptions, AsyncDebouncerState, } from '@tanstack/pacer/async-debouncer' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncDebouncer< TFn extends AnyAsyncFunction, @@ -152,12 +153,19 @@ export function useAsyncDebouncer( selector: (state: AsyncDebouncerState) => TSelected = () => ({}) as TSelected, ): ReactAsyncDebouncer { - const [asyncDebouncer] = useState(() => new AsyncDebouncer(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().asyncDebouncer, + ...options, + } as AsyncDebouncerOptions - const state = useStore(asyncDebouncer.store, selector) + const [asyncDebouncer] = useState( + () => new AsyncDebouncer(fn, mergedOptions), + ) asyncDebouncer.fn = fn - asyncDebouncer.setOptions(options) + asyncDebouncer.setOptions(mergedOptions) + + const state = useStore(asyncDebouncer.store, selector) useEffect(() => { return () => { diff --git a/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts b/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts index 2e925fd7..4a3c2dc9 100644 --- a/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts +++ b/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts @@ -6,6 +6,7 @@ import type { AsyncQueuerOptions, AsyncQueuerState, } from '@tanstack/pacer/async-queuer' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncQueuer extends Omit, 'store'> { @@ -170,12 +171,19 @@ export function useAsyncQueuer( selector: (state: AsyncQueuerState) => TSelected = () => ({}) as TSelected, ): ReactAsyncQueuer { - const [asyncQueuer] = useState(() => new AsyncQueuer(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().asyncQueuer, + ...options, + } as AsyncQueuerOptions - const state = useStore(asyncQueuer.store, selector) + const [asyncQueuer] = useState( + () => new AsyncQueuer(fn, mergedOptions), + ) asyncQueuer.fn = fn - asyncQueuer.setOptions(options) + asyncQueuer.setOptions(mergedOptions) + + const state = useStore(asyncQueuer.store, selector) return useMemo( () => diff --git a/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts b/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts index 179a8277..ecb2a3ad 100644 --- a/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts +++ b/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts @@ -7,6 +7,7 @@ import type { AsyncRateLimiterOptions, AsyncRateLimiterState, } from '@tanstack/pacer/async-rate-limiter' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncRateLimiter< TFn extends AnyAsyncFunction, @@ -184,14 +185,19 @@ export function useAsyncRateLimiter< selector: (state: AsyncRateLimiterState) => TSelected = () => ({}) as TSelected, ): ReactAsyncRateLimiter { + const mergedOptions = { + ...useDefaultPacerOptions().asyncRateLimiter, + ...options, + } as AsyncRateLimiterOptions + const [asyncRateLimiter] = useState( - () => new AsyncRateLimiter(fn, options), + () => new AsyncRateLimiter(fn, mergedOptions), ) - const state = useStore(asyncRateLimiter.store, selector) - asyncRateLimiter.fn = fn - asyncRateLimiter.setOptions(options) + asyncRateLimiter.setOptions(mergedOptions) + + const state = useStore(asyncRateLimiter.store, selector) return useMemo( () => diff --git a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts index 9b7b5380..77fd5743 100644 --- a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts +++ b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts @@ -7,6 +7,7 @@ import type { AsyncRetryerOptions, AsyncRetryerState, } from '@tanstack/pacer/async-retryer' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncRetryer extends Omit, 'store'> { @@ -154,12 +155,19 @@ export function useAsyncRetryer( selector: (state: AsyncRetryerState) => TSelected = () => ({}) as TSelected, ): ReactAsyncRetryer { - const [asyncRetryer] = useState(() => new AsyncRetryer(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().asyncRetryer, + ...options, + } as AsyncRetryerOptions - const state = useStore(asyncRetryer.store, selector) + const [asyncRetryer] = useState( + () => new AsyncRetryer(fn, mergedOptions), + ) asyncRetryer.fn = fn - asyncRetryer.setOptions(options) + asyncRetryer.setOptions(mergedOptions) + + const state = useStore(asyncRetryer.store, selector) useEffect(() => { return () => { diff --git a/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts b/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts index 08f083b8..c4590cbb 100644 --- a/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts +++ b/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts @@ -7,6 +7,7 @@ import type { AsyncThrottlerOptions, AsyncThrottlerState, } from '@tanstack/pacer/async-throttler' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncThrottler< TFn extends AnyAsyncFunction, @@ -163,12 +164,19 @@ export function useAsyncThrottler( selector: (state: AsyncThrottlerState) => TSelected = () => ({}) as TSelected, ): ReactAsyncThrottler { - const [asyncThrottler] = useState(() => new AsyncThrottler(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().asyncThrottler, + ...options, + } as AsyncThrottlerOptions - const state = useStore(asyncThrottler.store, selector) + const [asyncThrottler] = useState( + () => new AsyncThrottler(fn, mergedOptions), + ) asyncThrottler.fn = fn - asyncThrottler.setOptions(options) + asyncThrottler.setOptions(mergedOptions) + + const state = useStore(asyncThrottler.store, selector) useEffect(() => { return () => asyncThrottler.cancel() diff --git a/packages/react-pacer/src/batcher/useBatcher.ts b/packages/react-pacer/src/batcher/useBatcher.ts index 2709d6d0..13df5bae 100644 --- a/packages/react-pacer/src/batcher/useBatcher.ts +++ b/packages/react-pacer/src/batcher/useBatcher.ts @@ -3,6 +3,7 @@ import { Batcher } from '@tanstack/pacer/batcher' import { useStore } from '@tanstack/react-store' import type { Store } from '@tanstack/react-store' import type { BatcherOptions, BatcherState } from '@tanstack/pacer/batcher' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactBatcher extends Omit, 'store'> { @@ -124,12 +125,17 @@ export function useBatcher( selector: (state: BatcherState) => TSelected = () => ({}) as TSelected, ): ReactBatcher { - const [batcher] = useState(() => new Batcher(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().batcher, + ...options, + } as BatcherOptions - const state = useStore(batcher.store, selector) + const [batcher] = useState(() => new Batcher(fn, mergedOptions)) batcher.fn = fn - batcher.setOptions(options) + batcher.setOptions(mergedOptions) + + const state = useStore(batcher.store, selector) return useMemo( () => diff --git a/packages/react-pacer/src/debouncer/useDebouncer.ts b/packages/react-pacer/src/debouncer/useDebouncer.ts index 24674b64..9c984fe3 100644 --- a/packages/react-pacer/src/debouncer/useDebouncer.ts +++ b/packages/react-pacer/src/debouncer/useDebouncer.ts @@ -7,6 +7,7 @@ import type { DebouncerState, } from '@tanstack/pacer/debouncer' import type { AnyFunction } from '@tanstack/pacer/types' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactDebouncer extends Omit, 'store'> { @@ -104,12 +105,15 @@ export function useDebouncer( options: DebouncerOptions, selector: (state: DebouncerState) => TSelected = () => ({}) as TSelected, ): ReactDebouncer { - const [debouncer] = useState(() => new Debouncer(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().debouncer, + ...options, + } as DebouncerOptions - const state = useStore(debouncer.store, selector) + const [debouncer] = useState(() => new Debouncer(fn, mergedOptions)) debouncer.fn = fn - debouncer.setOptions(options) + debouncer.setOptions(mergedOptions) useEffect(() => { return () => { @@ -117,6 +121,8 @@ export function useDebouncer( } }, [debouncer]) + const state = useStore(debouncer.store, selector) + return useMemo( () => ({ diff --git a/packages/react-pacer/src/index.ts b/packages/react-pacer/src/index.ts index ac8d7af4..5ba57315 100644 --- a/packages/react-pacer/src/index.ts +++ b/packages/react-pacer/src/index.ts @@ -1,6 +1,9 @@ // re-export everything from the core pacer package export * from '@tanstack/pacer' +// provider +export * from './provider/PacerProvider' + /** * Export every hook individually - DON'T export from barrel files */ diff --git a/packages/react-pacer/src/provider/PacerProvider.tsx b/packages/react-pacer/src/provider/PacerProvider.tsx new file mode 100644 index 00000000..c6f24d5c --- /dev/null +++ b/packages/react-pacer/src/provider/PacerProvider.tsx @@ -0,0 +1,62 @@ +import React, { createContext, useContext, ReactNode } from 'react' +import type { + AnyAsyncFunction, + AnyFunction, + AsyncBatcherOptions, + AsyncDebouncerOptions, + AsyncQueuerOptions, + AsyncRateLimiterOptions, + AsyncRetryerOptions, + AsyncThrottlerOptions, + BatcherOptions, + DebouncerOptions, + QueuerOptions, + RateLimiterOptions, + ThrottlerOptions, +} from '@tanstack/pacer' + +export interface PacerProviderOptions { + asyncBatcher?: Partial> + asyncDebouncer?: Partial> + asyncQueuer?: Partial> + asyncRateLimiter?: Partial> + asyncRetryer?: Partial> + asyncThrottler?: Partial> + batcher?: Partial> + debouncer?: Partial> + queuer?: Partial> + rateLimiter?: Partial> + throttler?: Partial> +} + +interface PacerContextValue { + options: PacerProviderOptions +} + +const PacerContext = createContext(null) + +export interface PacerProviderProps { + children: ReactNode + options?: PacerProviderOptions +} + +export function PacerProvider({ children, options = {} }: PacerProviderProps) { + const contextValue: PacerContextValue = { + options, + } + + return ( + + {children} + + ) +} + +export function usePacerContext() { + return useContext(PacerContext) +} + +export function useDefaultPacerOptions() { + const context = useContext(PacerContext) + return context?.options ?? {} +} diff --git a/packages/react-pacer/src/provider/index.ts b/packages/react-pacer/src/provider/index.ts new file mode 100644 index 00000000..5f4fe385 --- /dev/null +++ b/packages/react-pacer/src/provider/index.ts @@ -0,0 +1 @@ +export * from './PacerProvider' diff --git a/packages/react-pacer/src/queuer/useQueuer.ts b/packages/react-pacer/src/queuer/useQueuer.ts index dec8992b..11d1cc40 100644 --- a/packages/react-pacer/src/queuer/useQueuer.ts +++ b/packages/react-pacer/src/queuer/useQueuer.ts @@ -3,6 +3,7 @@ import { Queuer } from '@tanstack/pacer/queuer' import { useStore } from '@tanstack/react-store' import type { Store } from '@tanstack/react-store' import type { QueuerOptions, QueuerState } from '@tanstack/pacer/queuer' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactQueuer extends Omit, 'store'> { @@ -134,12 +135,17 @@ export function useQueuer( options: QueuerOptions = {}, selector: (state: QueuerState) => TSelected = () => ({}) as TSelected, ): ReactQueuer { - const [queuer] = useState(() => new Queuer(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().queuer, + ...options, + } as QueuerOptions - const state = useStore(queuer.store, selector) + const [queuer] = useState(() => new Queuer(fn, mergedOptions)) queuer.fn = fn - queuer.setOptions(options) + queuer.setOptions(mergedOptions) + + const state = useStore(queuer.store, selector) return useMemo( () => diff --git a/packages/react-pacer/src/rate-limiter/useRateLimiter.ts b/packages/react-pacer/src/rate-limiter/useRateLimiter.ts index 8bf4442f..9b0d0b5c 100644 --- a/packages/react-pacer/src/rate-limiter/useRateLimiter.ts +++ b/packages/react-pacer/src/rate-limiter/useRateLimiter.ts @@ -7,6 +7,7 @@ import type { RateLimiterState, } from '@tanstack/pacer/rate-limiter' import type { AnyFunction } from '@tanstack/pacer/types' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactRateLimiter extends Omit, 'store'> { @@ -143,12 +144,17 @@ export function useRateLimiter( options: RateLimiterOptions, selector: (state: RateLimiterState) => TSelected = () => ({}) as TSelected, ): ReactRateLimiter { - const [rateLimiter] = useState(() => new RateLimiter(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().rateLimiter, + ...options, + } as RateLimiterOptions - const state = useStore(rateLimiter.store, selector) + const [rateLimiter] = useState(() => new RateLimiter(fn, mergedOptions)) rateLimiter.fn = fn - rateLimiter.setOptions(options) + rateLimiter.setOptions(mergedOptions) + + const state = useStore(rateLimiter.store, selector) return useMemo( () => diff --git a/packages/react-pacer/src/throttler/useThrottler.ts b/packages/react-pacer/src/throttler/useThrottler.ts index 3bed9bef..ade211c0 100644 --- a/packages/react-pacer/src/throttler/useThrottler.ts +++ b/packages/react-pacer/src/throttler/useThrottler.ts @@ -7,6 +7,7 @@ import type { ThrottlerOptions, ThrottlerState, } from '@tanstack/pacer/throttler' +import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactThrottler extends Omit, 'store'> { @@ -109,12 +110,17 @@ export function useThrottler( options: ThrottlerOptions, selector: (state: ThrottlerState) => TSelected = () => ({}) as TSelected, ): ReactThrottler { - const [throttler] = useState(() => new Throttler(fn, options)) + const mergedOptions = { + ...useDefaultPacerOptions().throttler, + ...options, + } as ThrottlerOptions - const state = useStore(throttler.store, selector) + const [throttler] = useState(() => new Throttler(fn, mergedOptions)) throttler.fn = fn - throttler.setOptions(options) + throttler.setOptions(mergedOptions) + + const state = useStore(throttler.store, selector) useEffect(() => { return () => { diff --git a/packages/react-pacer/vite.config.ts b/packages/react-pacer/vite.config.ts index 663acd9a..4d8e77bf 100644 --- a/packages/react-pacer/vite.config.ts +++ b/packages/react-pacer/vite.config.ts @@ -28,6 +28,7 @@ export default mergeConfig( './src/batcher/index.ts', './src/debouncer/index.ts', './src/index.ts', + './src/provider/index.ts', './src/queuer/index.ts', './src/rate-limiter/index.ts', './src/throttler/index.ts', From 3b86df9154708a9afe52f254cd0f3d4af7482701 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Sun, 10 Aug 2025 20:11:19 -0500 Subject: [PATCH 05/50] add providers to main examples --- examples/react/useAsyncBatcher/src/index.tsx | 14 ++++++++- .../react/useAsyncDebouncer/src/index.tsx | 29 +++++++++++++++++-- examples/react/useAsyncQueuer/src/index.tsx | 14 ++++++++- .../react/useAsyncRateLimiter/src/index.tsx | 29 +++++++++++++++++-- .../react/useAsyncThrottler/src/index.tsx | 29 +++++++++++++++++-- examples/react/useBatcher/src/index.tsx | 18 +++++++++--- examples/react/useDebouncer/src/index.tsx | 25 +++++++++++----- examples/react/useQueuer/src/index.tsx | 20 +++++++++---- examples/react/useRateLimiter/src/index.tsx | 24 ++++++++++----- examples/react/useThrottler/src/index.tsx | 24 ++++++++++----- 10 files changed, 188 insertions(+), 38 deletions(-) diff --git a/examples/react/useAsyncBatcher/src/index.tsx b/examples/react/useAsyncBatcher/src/index.tsx index c7ea201b..af588817 100644 --- a/examples/react/useAsyncBatcher/src/index.tsx +++ b/examples/react/useAsyncBatcher/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useAsyncBatcher } from '@tanstack/react-pacer/async-batcher' +import { PacerProvider } from '@tanstack/react-pacer/provider' const fakeProcessingTime = 1000 @@ -215,4 +216,15 @@ function App() { } const root = ReactDOM.createRoot(document.getElementById('root')!) -root.render() +root.render( + // optionally, provide default options to an optional PacerProvider + + + , +) diff --git a/examples/react/useAsyncDebouncer/src/index.tsx b/examples/react/useAsyncDebouncer/src/index.tsx index cf7cea5a..5a342fa6 100644 --- a/examples/react/useAsyncDebouncer/src/index.tsx +++ b/examples/react/useAsyncDebouncer/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useAsyncDebouncer } from '@tanstack/react-pacer/async-debouncer' +import { PacerProvider } from '@tanstack/react-pacer/provider' interface SearchResult { id: number @@ -106,12 +107,36 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('root')!) let mounted = true -root.render() +root.render( + // optionally, provide default options to an optional PacerProvider + + + , +) // demo unmounting and cancellation document.addEventListener('keydown', (e) => { if (e.shiftKey && e.key === 'Enter') { mounted = !mounted - root.render(mounted ? : null) + root.render( + mounted ? ( + // optionally, provide default options to an optional PacerProvider + + + + ) : null, + ) } }) diff --git a/examples/react/useAsyncQueuer/src/index.tsx b/examples/react/useAsyncQueuer/src/index.tsx index 28899e78..6ae40ca7 100644 --- a/examples/react/useAsyncQueuer/src/index.tsx +++ b/examples/react/useAsyncQueuer/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useAsyncQueuer } from '@tanstack/react-pacer/async-queuer' +import { PacerProvider } from '@tanstack/react-pacer/provider' const fakeWaitTime = 500 @@ -142,4 +143,15 @@ function App() { } const root = ReactDOM.createRoot(document.getElementById('root')!) -root.render() +root.render( + // optionally, provide default options to an optional PacerProvider + + + , +) diff --git a/examples/react/useAsyncRateLimiter/src/index.tsx b/examples/react/useAsyncRateLimiter/src/index.tsx index e88ef1e3..ec8f77c1 100644 --- a/examples/react/useAsyncRateLimiter/src/index.tsx +++ b/examples/react/useAsyncRateLimiter/src/index.tsx @@ -1,6 +1,7 @@ import { useEffect, useState } from 'react' import ReactDOM from 'react-dom/client' import { useAsyncRateLimiter } from '@tanstack/react-pacer/async-rate-limiter' +import { PacerProvider } from '@tanstack/react-pacer/provider' interface SearchResult { id: number @@ -165,12 +166,36 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('root')!) let mounted = true -root.render() +root.render( + // optionally, provide default options to an optional PacerProvider + + + , +) // demo unmounting and cancellation document.addEventListener('keydown', (e) => { if (e.key === 'Enter') { mounted = !mounted - root.render(mounted ? : null) + root.render( + mounted ? ( + // optionally, provide default options to an optional PacerProvider + + + + ) : null, + ) } }) diff --git a/examples/react/useAsyncThrottler/src/index.tsx b/examples/react/useAsyncThrottler/src/index.tsx index 2ef4878a..75b78299 100644 --- a/examples/react/useAsyncThrottler/src/index.tsx +++ b/examples/react/useAsyncThrottler/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useAsyncThrottler } from '@tanstack/react-pacer/async-throttler' +import { PacerProvider } from '@tanstack/react-pacer/provider' interface SearchResult { id: number @@ -115,12 +116,36 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('root')!) let mounted = true -root.render() +root.render( + // optionally, provide default options to an optional PacerProvider + + + , +) // demo unmounting and cancellation document.addEventListener('keydown', (e) => { if (e.shiftKey && e.key === 'Enter') { mounted = !mounted - root.render(mounted ? : null) + root.render( + mounted ? ( + // optionally, provide default options to an optional PacerProvider + + + + ) : null, + ) } }) diff --git a/examples/react/useBatcher/src/index.tsx b/examples/react/useBatcher/src/index.tsx index 03e9bd8b..e6bc1067 100644 --- a/examples/react/useBatcher/src/index.tsx +++ b/examples/react/useBatcher/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useBatcher } from '@tanstack/react-pacer/batcher' +import { PacerProvider } from '@tanstack/react-pacer/provider' function App1() { // Use your state management library of choice @@ -83,8 +84,17 @@ function App1() { const root = ReactDOM.createRoot(document.getElementById('root')!) root.render( -
- -
-
, + // optionally, provide default options to an optional PacerProvider + +
+ +
+
+
, ) diff --git a/examples/react/useDebouncer/src/index.tsx b/examples/react/useDebouncer/src/index.tsx index 575945e7..88f3f309 100644 --- a/examples/react/useDebouncer/src/index.tsx +++ b/examples/react/useDebouncer/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useDebouncer } from '@tanstack/react-pacer/debouncer' +import { PacerProvider } from '@tanstack/react-pacer/provider' function App1() { // Use your state management library of choice @@ -254,11 +255,21 @@ function App3() { const root = ReactDOM.createRoot(document.getElementById('root')!) root.render( -
- -
- -
- -
, + // optionally, provide default options to an optional PacerProvider + +
+ +
+ +
+ +
+ , +
, ) diff --git a/examples/react/useQueuer/src/index.tsx b/examples/react/useQueuer/src/index.tsx index 31196fca..c1682678 100644 --- a/examples/react/useQueuer/src/index.tsx +++ b/examples/react/useQueuer/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useQueuer } from '@tanstack/react-pacer/queuer' +import { PacerProvider } from '@tanstack/react-pacer/provider' function App1() { // The function that we will be queuing @@ -228,9 +229,18 @@ function App2() { const root = ReactDOM.createRoot(document.getElementById('root')!) root.render( -
- -
- -
, + // optionally, provide default options to an optional PacerProvider + +
+ +
+ +
+
, ) diff --git a/examples/react/useRateLimiter/src/index.tsx b/examples/react/useRateLimiter/src/index.tsx index 5ca429a6..308bbd06 100644 --- a/examples/react/useRateLimiter/src/index.tsx +++ b/examples/react/useRateLimiter/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useRateLimiter } from '@tanstack/react-pacer/rate-limiter' +import { PacerProvider } from '@tanstack/react-pacer/provider' function App1() { const [windowType, setWindowType] = useState<'fixed' | 'sliding'>('fixed') @@ -310,11 +311,20 @@ function App3() { const root = ReactDOM.createRoot(document.getElementById('root')!) root.render( -
- -
- -
- -
, + // optionally, provide default options to an optional PacerProvider + +
+ +
+ +
+ +
+
, ) diff --git a/examples/react/useThrottler/src/index.tsx b/examples/react/useThrottler/src/index.tsx index 991b77f1..963f4042 100644 --- a/examples/react/useThrottler/src/index.tsx +++ b/examples/react/useThrottler/src/index.tsx @@ -1,6 +1,7 @@ import { useState } from 'react' import ReactDOM from 'react-dom/client' import { useThrottler } from '@tanstack/react-pacer/throttler' +import { PacerProvider } from '@tanstack/react-pacer/provider' function App1() { // Use your state management library of choice @@ -226,11 +227,20 @@ function App3() { const root = ReactDOM.createRoot(document.getElementById('root')!) root.render( -
- -
- -
- -
, + // optionally, provide default options to an optional PacerProvider + +
+ +
+ +
+ +
+
, ) From a59452923054ed328bf7facb78079f8e3c20e05d Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Mon, 11 Aug 2025 11:15:00 +0200 Subject: [PATCH 06/50] feat: add initial setup for devtools --- examples/react/queue/package.json | 4 +- examples/react/queue/src/index.tsx | 8 + package.json | 7 +- packages/pacer-devtools/eslint.config.js | 10 + packages/pacer-devtools/package.json | 69 +++++ .../src/context/context-provider.tsx | 60 ++++ .../pacer-devtools/src/context/context.ts | 31 ++ .../src/context/use-context-hooks.ts | 13 + packages/pacer-devtools/src/core.tsx | 44 +++ packages/pacer-devtools/src/devtools.tsx | 21 ++ packages/pacer-devtools/src/index.ts | 2 + packages/pacer-devtools/tests/test-setup.ts | 1 + packages/pacer-devtools/tsconfig.docs.json | 4 + packages/pacer-devtools/tsconfig.json | 8 + packages/pacer-devtools/vite.config.ts | 24 ++ .../pacer-react-devtools/eslint.config.js | 10 + packages/pacer-react-devtools/package.json | 75 +++++ .../pacer-react-devtools/src/devtools.tsx | 26 ++ packages/pacer-react-devtools/src/index.ts | 1 + .../pacer-react-devtools/tests/test-setup.ts | 1 + .../pacer-react-devtools/tsconfig.docs.json | 4 + packages/pacer-react-devtools/tsconfig.json | 7 + packages/pacer-react-devtools/vite.config.ts | 24 ++ .../pacer-solid-devtools/eslint.config.js | 10 + packages/pacer-solid-devtools/package.json | 69 +++++ .../pacer-solid-devtools/src/devtools.tsx | 28 ++ packages/pacer-solid-devtools/src/index.ts | 1 + .../pacer-solid-devtools/tests/test-setup.ts | 1 + .../pacer-solid-devtools/tsconfig.docs.json | 4 + packages/pacer-solid-devtools/tsconfig.json | 8 + packages/pacer-solid-devtools/vite.config.ts | 24 ++ packages/pacer/package.json | 13 +- packages/pacer/src/async-batcher.ts | 7 +- packages/pacer/src/async-debouncer.ts | 7 +- packages/pacer/src/async-queuer.ts | 8 +- packages/pacer/src/async-rate-limiter.ts | 7 +- packages/pacer/src/async-throttler.ts | 7 +- packages/pacer/src/batcher.ts | 8 +- packages/pacer/src/debouncer.ts | 7 +- packages/pacer/src/event-client.ts | 37 +++ packages/pacer/src/index.ts | 1 + packages/pacer/src/queuer.ts | 8 +- packages/pacer/src/rate-limiter.ts | 7 +- packages/pacer/src/throttler.ts | 7 +- pnpm-lock.yaml | 272 ++++++++++++++++-- 45 files changed, 953 insertions(+), 42 deletions(-) create mode 100644 packages/pacer-devtools/eslint.config.js create mode 100644 packages/pacer-devtools/package.json create mode 100644 packages/pacer-devtools/src/context/context-provider.tsx create mode 100644 packages/pacer-devtools/src/context/context.ts create mode 100644 packages/pacer-devtools/src/context/use-context-hooks.ts create mode 100644 packages/pacer-devtools/src/core.tsx create mode 100644 packages/pacer-devtools/src/devtools.tsx create mode 100644 packages/pacer-devtools/src/index.ts create mode 100644 packages/pacer-devtools/tests/test-setup.ts create mode 100644 packages/pacer-devtools/tsconfig.docs.json create mode 100644 packages/pacer-devtools/tsconfig.json create mode 100644 packages/pacer-devtools/vite.config.ts create mode 100644 packages/pacer-react-devtools/eslint.config.js create mode 100644 packages/pacer-react-devtools/package.json create mode 100644 packages/pacer-react-devtools/src/devtools.tsx create mode 100644 packages/pacer-react-devtools/src/index.ts create mode 100644 packages/pacer-react-devtools/tests/test-setup.ts create mode 100644 packages/pacer-react-devtools/tsconfig.docs.json create mode 100644 packages/pacer-react-devtools/tsconfig.json create mode 100644 packages/pacer-react-devtools/vite.config.ts create mode 100644 packages/pacer-solid-devtools/eslint.config.js create mode 100644 packages/pacer-solid-devtools/package.json create mode 100644 packages/pacer-solid-devtools/src/devtools.tsx create mode 100644 packages/pacer-solid-devtools/src/index.ts create mode 100644 packages/pacer-solid-devtools/tests/test-setup.ts create mode 100644 packages/pacer-solid-devtools/tsconfig.docs.json create mode 100644 packages/pacer-solid-devtools/tsconfig.json create mode 100644 packages/pacer-solid-devtools/vite.config.ts create mode 100644 packages/pacer/src/event-client.ts diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index ac17376b..fbf100a9 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -17,6 +17,8 @@ "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^4.7.0", + "@tanstack/pacer-react-devtools": "0.14.0", + "@tanstack/react-devtools": "0.2.2", "vite": "^7.0.6" }, "browserslist": { @@ -31,4 +33,4 @@ "last 1 safari version" ] } -} +} \ No newline at end of file diff --git a/examples/react/queue/src/index.tsx b/examples/react/queue/src/index.tsx index 66853232..36f2921c 100644 --- a/examples/react/queue/src/index.tsx +++ b/examples/react/queue/src/index.tsx @@ -1,5 +1,7 @@ import { useCallback, useState } from 'react' import ReactDOM from 'react-dom/client' +import { PacerDevtoolsPanel } from "@tanstack/pacer-react-devtools" +import { TanstackDevtools } from "@tanstack/react-devtools" import { queue } from '@tanstack/react-pacer/queuer' function App1() { @@ -210,5 +212,11 @@ root.render(
+ + } + ]} /> , ) diff --git a/package.json b/package.json index 4d87d3b8..9629cf10 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,9 @@ "overrides": { "@tanstack/pacer": "workspace:*", "@tanstack/react-pacer": "workspace:*", - "@tanstack/solid-pacer": "workspace:*" + "@tanstack/solid-pacer": "workspace:*", + "@tanstack/pacer-devtools": "workspace:*", + "@tanstack/pacer-solid-devtools": "workspace:*", + "@tanstack/pacer-react-devtools": "workspace:*" } -} +} \ No newline at end of file diff --git a/packages/pacer-devtools/eslint.config.js b/packages/pacer-devtools/eslint.config.js new file mode 100644 index 00000000..e472c69e --- /dev/null +++ b/packages/pacer-devtools/eslint.config.js @@ -0,0 +1,10 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + rules: {}, + }, +] diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json new file mode 100644 index 00000000..771738de --- /dev/null +++ b/packages/pacer-devtools/package.json @@ -0,0 +1,69 @@ +{ + "name": "@tanstack/pacer-devtools", + "version": "0.14.0", + "description": "Devtools for Pacer.", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/pacer.git", + "directory": "packages/pacer" + }, + "homepage": "https://tanstack.com/pacer", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "debounce", + "throttle", + "rate-limit", + "queuer", + "queue", + "pacer" + ], + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "engines": { + "node": ">=18" + }, + "files": [ + "dist/", + "src" + ], + "scripts": { + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc", + "test:build": "publint --strict", + "build": "vite build" + }, + "peerDependencies": { + "@tanstack/pacer": ">=0.14.0" + }, + "dependencies": { + "solid-js": "^1.9.7" + }, + "devDependencies": { + "vite-plugin-solid": "^2.11.6" + } +} \ No newline at end of file diff --git a/packages/pacer-devtools/src/context/context-provider.tsx b/packages/pacer-devtools/src/context/context-provider.tsx new file mode 100644 index 00000000..da3fb154 --- /dev/null +++ b/packages/pacer-devtools/src/context/context-provider.tsx @@ -0,0 +1,60 @@ + + +import { createStore } from "solid-js/store" +import { createEffect, onCleanup } from "solid-js" +import { pacerEventClient } from "@tanstack/pacer" +import { PacerContext, initialStore, } from "./context" +import type { PacerContextType } from "./context" + +export function PacerContextProvider(props: { children: any }) { + const [store, setStore] = createStore(initialStore) + const updateStore = (newState: Partial) => { + + setStore((prev) => ({ ...prev, ...newState })) + } + createEffect(() => { + const cleanup = pacerEventClient.onAllPluginEvents(e => { + switch (e.type) { + case "pacer:async-batcher-state": + updateStore({ asyncBatcherState: e.payload }) + break; + case "pacer:async-debouncer-state": + updateStore({ asyncDebouncerState: e.payload }) + break; + case "pacer:async-queuer-state": + updateStore({ asyncQueuerState: e.payload }) + break; + case "pacer:async-rate-limiter-state": + updateStore({ asyncRateLimiterState: e.payload }) + break; + case "pacer:async-throttler-state": + updateStore({ asyncThrottlerState: e.payload }) + break; + case "pacer:batcher-state": + updateStore({ batcherState: e.payload }) + break; + case "pacer:debouncer-state": + updateStore({ debouncerState: e.payload }) + break; + case "pacer:queuer-state": + updateStore({ queuerState: e.payload }) + break; + case "pacer:rate-limiter-state": + updateStore({ rateLimiterState: e.payload }) + break; + case "pacer:throttler-state": + updateStore({ throttlerState: e.payload }) + break; + } + + }) + onCleanup(cleanup) + }) + return ( + + {props.children} + + ) +} + + diff --git a/packages/pacer-devtools/src/context/context.ts b/packages/pacer-devtools/src/context/context.ts new file mode 100644 index 00000000..ff1d9460 --- /dev/null +++ b/packages/pacer-devtools/src/context/context.ts @@ -0,0 +1,31 @@ + +import { createContext } from "solid-js"; +import type { AsyncBatcherState, AsyncDebouncerState, AsyncQueuerState, AsyncRateLimiterState, AsyncThrottlerState, BatcherState, DebouncerState, QueuerState, RateLimiterState, ThrottlerState } from "@tanstack/pacer"; + +export interface PacerContextType { + asyncBatcherState: AsyncBatcherState | undefined + asyncDebouncerState: AsyncDebouncerState | undefined + asyncQueuerState: AsyncQueuerState | undefined + asyncRateLimiterState: AsyncRateLimiterState | undefined + asyncThrottlerState: AsyncThrottlerState | undefined + batcherState: BatcherState | undefined + debouncerState: DebouncerState | undefined + queuerState: QueuerState | undefined + rateLimiterState: RateLimiterState | undefined + throttlerState: ThrottlerState | undefined +} + +export const initialStore = { + asyncBatcherState: undefined, + asyncDebouncerState: undefined, + asyncQueuerState: undefined, + asyncRateLimiterState: undefined, + asyncThrottlerState: undefined, + batcherState: undefined, + debouncerState: undefined, + queuerState: undefined, + rateLimiterState: undefined, + throttlerState: undefined +} + +export const PacerContext = createContext<[PacerContextType, (newState: Partial) => void]>([initialStore, () => { }]) diff --git a/packages/pacer-devtools/src/context/use-context-hooks.ts b/packages/pacer-devtools/src/context/use-context-hooks.ts new file mode 100644 index 00000000..d25ac386 --- /dev/null +++ b/packages/pacer-devtools/src/context/use-context-hooks.ts @@ -0,0 +1,13 @@ +import { useContext } from "solid-js" +import { PacerContext } from "./context" + +export const usePacerContext = () => { + const context = useContext(PacerContext) + + return context +} + +export const usePacerState = () => { + const [state] = usePacerContext() + return state +} \ No newline at end of file diff --git a/packages/pacer-devtools/src/core.tsx b/packages/pacer-devtools/src/core.tsx new file mode 100644 index 00000000..73304cac --- /dev/null +++ b/packages/pacer-devtools/src/core.tsx @@ -0,0 +1,44 @@ +import { lazy } from 'solid-js' +import { Portal, render } from 'solid-js/web' + +export interface PacerDevtoolsInit { + +} + +export class PacerDevtoolsCore { + #isMounted = false + #dispose?: () => void + #Component: any + + + constructor(_init?: PacerDevtoolsInit | undefined) { } + + mount(el: T) { + if (this.#isMounted) { + throw new Error('Devtools is already mounted') + } + const mountTo = el + const dispose = render(() => { + this.#Component = lazy(() => import('./devtools')) + const Devtools = this.#Component + + return ( + + + + ) + }, mountTo) + + this.#isMounted = true + this.#dispose = dispose + } + + unmount() { + if (!this.#isMounted) { + throw new Error('Devtools is not mounted') + } + + this.#dispose?.() + this.#isMounted = false + } +} diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/devtools.tsx new file mode 100644 index 00000000..a6cafe54 --- /dev/null +++ b/packages/pacer-devtools/src/devtools.tsx @@ -0,0 +1,21 @@ + +import { usePacerState } from "./context/use-context-hooks" +import { PacerContextProvider } from "./context/context-provider" + +function Shell() { + const state = usePacerState() + return ( +
+ Pacer state is: +
{JSON.stringify(state, null, 2)}
+
+ ) +} + +export default function Devtools() { + return ( + + + + ) +} \ No newline at end of file diff --git a/packages/pacer-devtools/src/index.ts b/packages/pacer-devtools/src/index.ts new file mode 100644 index 00000000..3b1603f1 --- /dev/null +++ b/packages/pacer-devtools/src/index.ts @@ -0,0 +1,2 @@ +export { PacerDevtoolsCore } from "./core" +export type { PacerDevtoolsInit } from "./core" \ No newline at end of file diff --git a/packages/pacer-devtools/tests/test-setup.ts b/packages/pacer-devtools/tests/test-setup.ts new file mode 100644 index 00000000..a9d0dd31 --- /dev/null +++ b/packages/pacer-devtools/tests/test-setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom/vitest' diff --git a/packages/pacer-devtools/tsconfig.docs.json b/packages/pacer-devtools/tsconfig.docs.json new file mode 100644 index 00000000..2880b4df --- /dev/null +++ b/packages/pacer-devtools/tsconfig.docs.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["tests", "src"] +} diff --git a/packages/pacer-devtools/tsconfig.json b/packages/pacer-devtools/tsconfig.json new file mode 100644 index 00000000..4add0559 --- /dev/null +++ b/packages/pacer-devtools/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "eslint.config.js", "vite.config.ts", "tests"], + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "solid-js", + } +} diff --git a/packages/pacer-devtools/vite.config.ts b/packages/pacer-devtools/vite.config.ts new file mode 100644 index 00000000..67121f71 --- /dev/null +++ b/packages/pacer-devtools/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import solid from "vite-plugin-solid"; +import packageJson from './package.json' + +const config = defineConfig({ + plugins: [solid()], + test: { + name: packageJson.name, + dir: './', + watch: false, + environment: 'jsdom', + setupFiles: ['./tests/test-setup.ts'], + globals: true, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/pacer-react-devtools/eslint.config.js b/packages/pacer-react-devtools/eslint.config.js new file mode 100644 index 00000000..e472c69e --- /dev/null +++ b/packages/pacer-react-devtools/eslint.config.js @@ -0,0 +1,10 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + rules: {}, + }, +] diff --git a/packages/pacer-react-devtools/package.json b/packages/pacer-react-devtools/package.json new file mode 100644 index 00000000..6b536fce --- /dev/null +++ b/packages/pacer-react-devtools/package.json @@ -0,0 +1,75 @@ +{ + "name": "@tanstack/pacer-react-devtools", + "version": "0.14.0", + "description": "React adapter for devtools for Pacer.", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/pacer.git", + "directory": "packages/pacer" + }, + "homepage": "https://tanstack.com/pacer", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "debounce", + "throttle", + "rate-limit", + "queuer", + "queue", + "pacer" + ], + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "engines": { + "node": ">=18" + }, + "files": [ + "dist/", + "src" + ], + "scripts": { + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc", + "test:build": "publint --strict", + "build": "vite build" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "@types/react-dom": ">=16.8", + "react": ">=16.8", + "react-dom": ">=16.8" + }, + "dependencies": { + "@tanstack/pacer-devtools": "workspace:*" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.7.0", + "@eslint-react/eslint-plugin": "^1.48.5", + "eslint-plugin-react-compiler": "19.1.0-rc.1", + "eslint-plugin-react-hooks": "^5.2.0" + } +} \ No newline at end of file diff --git a/packages/pacer-react-devtools/src/devtools.tsx b/packages/pacer-react-devtools/src/devtools.tsx new file mode 100644 index 00000000..0097fbd2 --- /dev/null +++ b/packages/pacer-react-devtools/src/devtools.tsx @@ -0,0 +1,26 @@ +import React, { useEffect, useRef, useState } from 'react' +import { + PacerDevtoolsCore, +} from '@tanstack/pacer-devtools' + +export interface PacerDevtoolsReactInit { + +} + + +export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { + const devToolRef = useRef(null) + + const [devtools] = useState(() => new PacerDevtoolsCore({}),) + useEffect(() => { + if (devToolRef.current) { + devtools.mount(devToolRef.current) + } + + return () => devtools.unmount() + }, [devtools]) + + return ( +
+ ) +} diff --git a/packages/pacer-react-devtools/src/index.ts b/packages/pacer-react-devtools/src/index.ts new file mode 100644 index 00000000..d94438d3 --- /dev/null +++ b/packages/pacer-react-devtools/src/index.ts @@ -0,0 +1 @@ +export { PacerDevtoolsPanel } from "./devtools" \ No newline at end of file diff --git a/packages/pacer-react-devtools/tests/test-setup.ts b/packages/pacer-react-devtools/tests/test-setup.ts new file mode 100644 index 00000000..a9d0dd31 --- /dev/null +++ b/packages/pacer-react-devtools/tests/test-setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom/vitest' diff --git a/packages/pacer-react-devtools/tsconfig.docs.json b/packages/pacer-react-devtools/tsconfig.docs.json new file mode 100644 index 00000000..2880b4df --- /dev/null +++ b/packages/pacer-react-devtools/tsconfig.docs.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["tests", "src"] +} diff --git a/packages/pacer-react-devtools/tsconfig.json b/packages/pacer-react-devtools/tsconfig.json new file mode 100644 index 00000000..ec5879b1 --- /dev/null +++ b/packages/pacer-react-devtools/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "eslint.config.js", "vite.config.ts", "tests"], + "compilerOptions": { + "jsx": "react", + } +} diff --git a/packages/pacer-react-devtools/vite.config.ts b/packages/pacer-react-devtools/vite.config.ts new file mode 100644 index 00000000..d3b7a81d --- /dev/null +++ b/packages/pacer-react-devtools/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import react from "@vitejs/plugin-react"; +import packageJson from './package.json' + +const config = defineConfig({ + plugins: [react()], + test: { + name: packageJson.name, + dir: './', + watch: false, + environment: 'jsdom', + setupFiles: ['./tests/test-setup.ts'], + globals: true, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/pacer-solid-devtools/eslint.config.js b/packages/pacer-solid-devtools/eslint.config.js new file mode 100644 index 00000000..e472c69e --- /dev/null +++ b/packages/pacer-solid-devtools/eslint.config.js @@ -0,0 +1,10 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + rules: {}, + }, +] diff --git a/packages/pacer-solid-devtools/package.json b/packages/pacer-solid-devtools/package.json new file mode 100644 index 00000000..5efcf22f --- /dev/null +++ b/packages/pacer-solid-devtools/package.json @@ -0,0 +1,69 @@ +{ + "name": "@tanstack/pacer-solid-devtools", + "version": "0.14.0", + "description": "Solid adapter for devtools for Pacer.", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/pacer.git", + "directory": "packages/pacer" + }, + "homepage": "https://tanstack.com/pacer", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "debounce", + "throttle", + "rate-limit", + "queuer", + "queue", + "pacer" + ], + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "engines": { + "node": ">=18" + }, + "files": [ + "dist/", + "src" + ], + "scripts": { + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc", + "test:build": "publint --strict", + "build": "vite build" + }, + "peerDependencies": { + "solid-js": ">=1.9.7" + }, + "dependencies": { + "@tanstack/pacer-devtools": "workspace:*" + }, + "devDependencies": { + "vite-plugin-solid": "^2.11.8" + } +} \ No newline at end of file diff --git a/packages/pacer-solid-devtools/src/devtools.tsx b/packages/pacer-solid-devtools/src/devtools.tsx new file mode 100644 index 00000000..92046cec --- /dev/null +++ b/packages/pacer-solid-devtools/src/devtools.tsx @@ -0,0 +1,28 @@ + +import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' +import { createSignal, onCleanup, onMount } from 'solid-js' + +export interface PacerDevtoolsSolidInit { + +} + +export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { + let devToolRef: HTMLDivElement | undefined + const [devtools] = createSignal( + new PacerDevtoolsCore({}), + + ) + onMount(() => { + if (devToolRef) { + devtools().mount(devToolRef) + + onCleanup(() => { + devtools().unmount() + }) + } + }) + + return ( +
+ ) +} diff --git a/packages/pacer-solid-devtools/src/index.ts b/packages/pacer-solid-devtools/src/index.ts new file mode 100644 index 00000000..d94438d3 --- /dev/null +++ b/packages/pacer-solid-devtools/src/index.ts @@ -0,0 +1 @@ +export { PacerDevtoolsPanel } from "./devtools" \ No newline at end of file diff --git a/packages/pacer-solid-devtools/tests/test-setup.ts b/packages/pacer-solid-devtools/tests/test-setup.ts new file mode 100644 index 00000000..a9d0dd31 --- /dev/null +++ b/packages/pacer-solid-devtools/tests/test-setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom/vitest' diff --git a/packages/pacer-solid-devtools/tsconfig.docs.json b/packages/pacer-solid-devtools/tsconfig.docs.json new file mode 100644 index 00000000..2880b4df --- /dev/null +++ b/packages/pacer-solid-devtools/tsconfig.docs.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["tests", "src"] +} diff --git a/packages/pacer-solid-devtools/tsconfig.json b/packages/pacer-solid-devtools/tsconfig.json new file mode 100644 index 00000000..4add0559 --- /dev/null +++ b/packages/pacer-solid-devtools/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "eslint.config.js", "vite.config.ts", "tests"], + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "solid-js", + } +} diff --git a/packages/pacer-solid-devtools/vite.config.ts b/packages/pacer-solid-devtools/vite.config.ts new file mode 100644 index 00000000..67121f71 --- /dev/null +++ b/packages/pacer-solid-devtools/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import solid from "vite-plugin-solid"; +import packageJson from './package.json' + +const config = defineConfig({ + plugins: [solid()], + test: { + name: packageJson.name, + dir: './', + watch: false, + environment: 'jsdom', + setupFiles: ['./tests/test-setup.ts'], + globals: true, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/pacer/package.json b/packages/pacer/package.json index 2afc23b5..c2f90d8c 100644 --- a/packages/pacer/package.json +++ b/packages/pacer/package.json @@ -150,6 +150,16 @@ "default": "./dist/cjs/utils.cjs" } }, + "./event-client": { + "import": { + "types": "./dist/esm/event-client.d.ts", + "default": "./dist/esm/event-client.js" + }, + "require": { + "types": "./dist/cjs/event-client.d.cts", + "default": "./dist/cjs/event-client.cjs" + } + }, "./package.json": "./package.json" }, "sideEffects": false, @@ -171,6 +181,7 @@ "build": "vite build" }, "dependencies": { + "@tanstack/devtools-event-client": "^0.2.1", "@tanstack/store": "^0.7.2" } -} +} \ No newline at end of file diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index df12d60f..793c82c6 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { OptionalKeys } from './types' export interface AsyncBatcherState { @@ -251,7 +252,7 @@ export class AsyncBatcher { const { isExecuting, isPending, items } = combinedState const size = items.length const isEmpty = size === 0 - return { + const finalState = { ...combinedState, isEmpty, size, @@ -262,7 +263,9 @@ export class AsyncBatcher { : isEmpty ? 'idle' : 'populated', - } + } as const + pacerEventClient.emit("async-batcher-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index c3554b03..5ecff13e 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncDebouncerState { @@ -216,7 +217,7 @@ export class AsyncDebouncer { ...newState, } const { isPending, isExecuting, settleCount } = combinedState - return { + const finalState = { ...combinedState, status: !this.#getEnabled() ? 'disabled' @@ -227,7 +228,9 @@ export class AsyncDebouncer { : settleCount > 0 ? 'settled' : 'idle', - } + } as const + pacerEventClient.emit("async-debouncer-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index 6f0cd3db..71a7de50 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { OptionalKeys } from './types' import type { QueuePosition } from './queuer' @@ -314,15 +315,16 @@ export class AsyncQueuer { const isIdle = isRunning && isEmpty && activeItems.length === 0 const status = isIdle ? 'idle' : isRunning ? 'running' : 'stopped' - - return { + const finalState = { ...combinedState, isEmpty, isFull, isIdle, size, status, - } + } as const + pacerEventClient.emit("async-queuer-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index a76ef7b7..8f280e84 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { AnyAsyncFunction } from './types' export interface AsyncRateLimiterState { @@ -245,11 +246,13 @@ export class AsyncRateLimiter { : isExceeded ? 'exceeded' : 'idle' - return { + const finalState = { ...combinedState, isExceeded, status, - } + } as const + pacerEventClient.emit("async-rate-limiter-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index b6143fed..e7c36901 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncThrottlerState { @@ -227,7 +228,7 @@ export class AsyncThrottler { ...newState, } const { isPending, isExecuting, settleCount } = combinedState - return { + const finalState = { ...combinedState, status: !this.#getEnabled() ? 'disabled' @@ -238,7 +239,9 @@ export class AsyncThrottler { : settleCount > 0 ? 'settled' : 'idle', - } + } as const + pacerEventClient.emit("async-throttler-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index 01239ebb..f25c7481 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { OptionalKeys } from './types' export interface BatcherState { @@ -169,12 +170,15 @@ export class Batcher { const { isPending, items } = combinedState const size = items.length const isEmpty = size === 0 - return { + const finalState = { ...combinedState, isEmpty, size, status: isPending ? 'pending' : 'idle', - } + } as const + + pacerEventClient.emit("batcher-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index 14a77a68..33029c30 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { AnyFunction } from './types' export interface DebouncerState { @@ -152,14 +153,16 @@ export class Debouncer { ...newState, } const { isPending } = combinedState - return { + const finalState = { ...combinedState, status: !this.#getEnabled() ? 'disabled' : isPending ? 'pending' : 'idle', - } + } as const + pacerEventClient.emit("debouncer-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/event-client.ts b/packages/pacer/src/event-client.ts new file mode 100644 index 00000000..754a1c46 --- /dev/null +++ b/packages/pacer/src/event-client.ts @@ -0,0 +1,37 @@ +import { EventClient } from "@tanstack/devtools-event-client" +import type { AsyncBatcherState } from "./async-batcher" +import type { AsyncDebouncerState } from "./async-debouncer" +import type { AsyncQueuerState } from "./async-queuer" +import type { AsyncRateLimiterState } from "./async-rate-limiter" +import type { AsyncThrottlerState } from "./async-throttler" +import type { DebouncerState } from "./debouncer" +import type { BatcherState } from "./batcher" +import type { QueuerState } from "./queuer" +import type { RateLimiterState } from "./rate-limiter" +import type { ThrottlerState } from "./throttler" + +export interface PacerEventMap { + "pacer:async-batcher-state": AsyncBatcherState + "pacer:async-debouncer-state": AsyncDebouncerState + "pacer:async-queuer-state": AsyncQueuerState + "pacer:async-rate-limiter-state": AsyncRateLimiterState + "pacer:async-throttler-state": AsyncThrottlerState + "pacer:batcher-state": BatcherState + "pacer:debouncer-state": DebouncerState + "pacer:queuer-state": QueuerState + "pacer:rate-limiter-state": RateLimiterState + "pacer:throttler-state": ThrottlerState +} + +export class PacerEventClient extends EventClient { + constructor(props?: { + debug: boolean + }) { + super({ + pluginId: "pacer", + debug: props?.debug + }) + } +} + +export const pacerEventClient = new PacerEventClient() \ No newline at end of file diff --git a/packages/pacer/src/index.ts b/packages/pacer/src/index.ts index 194ea6f7..c599f9e8 100644 --- a/packages/pacer/src/index.ts +++ b/packages/pacer/src/index.ts @@ -10,3 +10,4 @@ export * from './rate-limiter' export * from './throttler' export * from './types' export * from './utils' +export * from './event-client' \ No newline at end of file diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index 30c4a96e..e9216751 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' export interface QueuerState { /** @@ -297,15 +298,16 @@ export class Queuer { const isIdle = isRunning && isEmpty const status = isIdle ? 'idle' : isRunning ? 'running' : 'stopped' - - return { + const finalState = { ...combinedState, isEmpty, isFull, isIdle, size, status, - } + } as const + pacerEventClient.emit("queuer-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index ec9c802f..675df875 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { AnyFunction } from './types' export interface RateLimiterState { @@ -168,11 +169,13 @@ export class RateLimiter { : isExceeded ? 'exceeded' : 'idle' - return { + const finalState = { ...combinedState, isExceeded, status, - } + } as const + pacerEventClient.emit("rate-limiter-state", finalState) + return finalState }) } diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index 8537a680..265eae5b 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -1,5 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' +import { pacerEventClient } from './event-client' import type { AnyFunction } from './types' export interface ThrottlerState { @@ -160,14 +161,16 @@ export class Throttler { ...newState, } const { isPending } = combinedState - return { + const finalState = { ...combinedState, status: !this.#getEnabled() ? 'disabled' : isPending ? 'pending' : 'idle', - } + } as const + pacerEventClient.emit("throttler-state", finalState) + return finalState }) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dafca221..c922fce1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -240,6 +240,12 @@ importers: specifier: ^19.1.1 version: 19.1.1(react@19.1.1) devDependencies: + '@tanstack/pacer-react-devtools': + specifier: 0.14.0 + version: link:../../../packages/pacer-react-devtools + '@tanstack/react-devtools': + specifier: 0.2.2 + version: 0.2.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.7) '@types/react': specifier: ^19.1.9 version: 19.1.9 @@ -1541,10 +1547,70 @@ importers: packages/pacer: dependencies: + '@tanstack/devtools-event-client': + specifier: ^0.2.1 + version: 0.2.1 '@tanstack/store': specifier: ^0.7.2 version: 0.7.2 + packages/pacer-devtools: + dependencies: + '@tanstack/pacer': + specifier: '>=0.14.0' + version: link:../pacer + solid-js: + specifier: ^1.9.7 + version: 1.9.7 + devDependencies: + vite-plugin-solid: + specifier: ^2.11.6 + version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + + packages/pacer-react-devtools: + dependencies: + '@tanstack/pacer-devtools': + specifier: workspace:* + version: link:../pacer-devtools + '@types/react': + specifier: '>=16.8' + version: 19.1.9 + '@types/react-dom': + specifier: '>=16.8' + version: 19.1.7(@types/react@19.1.9) + react: + specifier: '>=16.8' + version: 19.1.1 + react-dom: + specifier: '>=16.8' + version: 19.1.1(react@19.1.1) + devDependencies: + '@eslint-react/eslint-plugin': + specifier: ^1.48.5 + version: 1.52.3(eslint@9.32.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + '@vitejs/plugin-react': + specifier: ^4.7.0 + version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + eslint-plugin-react-compiler: + specifier: 19.1.0-rc.1 + version: 19.1.0-rc.1(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) + + packages/pacer-solid-devtools: + dependencies: + '@tanstack/pacer-devtools': + specifier: workspace:* + version: link:../pacer-devtools + solid-js: + specifier: '>=1.9.7' + version: 1.9.7 + devDependencies: + vite-plugin-solid: + specifier: ^2.11.8 + version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + packages/react-pacer: dependencies: '@tanstack/pacer': @@ -1744,11 +1810,6 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.9': - resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.27.0': resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} @@ -2544,6 +2605,26 @@ packages: peerDependencies: size-limit: 11.2.0 + '@solid-primitives/event-listener@2.4.3': + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/keyboard@1.3.3': + resolution: {integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/rootless@1.5.2': + resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/utils@6.3.2': + resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} + peerDependencies: + solid-js: ^1.6.12 + '@stylistic/eslint-plugin@5.2.0': resolution: {integrity: sha512-RCEdbREv9EBiToUBQTlRhVYKG093I6ZnnQ990j08eJ6uRZh71DXkOnoxtTLfDQ6utVCVQzrhZFHZP0zfrfOIjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2563,6 +2644,26 @@ packages: resolution: {integrity: sha512-q6P0aYj7X65biWDKkKFQ4feQoxF8Bcxd3U3CU5zjBt9sgUrc/w8kEfHoGy0cHtgsTSMLfPrzaAtvp6hTbofZmw==} engines: {node: '>=18'} + '@tanstack/devtools-event-bus@0.2.1': + resolution: {integrity: sha512-JMq3AmrQR2LH9P8Rcj1MTq8Iq/mPk/PyuqSw1L0hO2Wl8G1oz5ue31fS8u8lIgOCVR/mGdJah18p+Pj5OosRJA==} + engines: {node: '>=18'} + + '@tanstack/devtools-event-client@0.2.1': + resolution: {integrity: sha512-78AAfg9KfSDE+pQLRJo20bxX3A40ea14kFqNmzuMb7zFJNfR5L87kAEOju6QXu7cbk9r2r7EEV2a8PgHOsD7Kg==} + engines: {node: '>=18'} + + '@tanstack/devtools-ui@0.2.2': + resolution: {integrity: sha512-G2gRyoGpjtr25w9BqQzPbefiJ9WALWYLOVxVr+NoqOLDA680nUO5KJjp7oLZMfnKssWxACgulaQ3DUmGGJuysQ==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + + '@tanstack/devtools@0.3.0': + resolution: {integrity: sha512-uxj3MM2/ZlQDlhnBoUSlJC8oneJ+sPh6hK0kgiKZAEgrlUvZfUNgKGhrmMHZaAGl/WEglhZoxXwvvo9HAFT8yw==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + '@tanstack/eslint-config@0.3.0': resolution: {integrity: sha512-7OsrYscWEPojIRqh9byyyv2W+jm/3WaDckVnuQgf7a86YPhtN93fHa3hsKquJE/IbMX/FK0EDHi+DPAXwvZ5ZA==} engines: {node: '>=18'} @@ -2581,6 +2682,15 @@ packages: '@tanstack/query-devtools@5.84.0': resolution: {integrity: sha512-fbF3n+z1rqhvd9EoGp5knHkv3p5B2Zml1yNRjh7sNXklngYI5RVIWUrUjZ1RIcEoscarUb0+bOvIs5x9dwzOXQ==} + '@tanstack/react-devtools@0.2.2': + resolution: {integrity: sha512-Ig8ZYqUPJ+nwRvF/RpkQHPbgEkrL3b2PjeYBgXgT5OemyRUlmG12UutvMBV+bJuBsSOKHrNf29IvzC0Vw9Bt1A==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': '>=16.8' + '@types/react-dom': '>=16.8' + react: '>=16.8' + react-dom: '>=16.8' + '@tanstack/react-persister@0.1.1': resolution: {integrity: sha512-bERMba9+dDOWKJLV5dR6+pKq+xRYyuCsK1Te5Ygs2WiXdvAVLMnNjJIOkIhZ9uihbQvyBIbYPAlb9sCfSgvYWg==} engines: {node: '>=18'} @@ -3392,6 +3502,12 @@ packages: peerDependencies: eslint: ^9.0.0 + eslint-plugin-react-compiler@19.1.0-rc.1: + resolution: {integrity: sha512-3umw5eqZXapBl7aQGmvcjheKhUbsElb9jTETxRZg371e1LG4EPs/zCHt2JzP+wNcdaZWzjU/R730zPUJblY2zw==} + engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + peerDependencies: + eslint: '>=7' + eslint-plugin-react-compiler@19.1.0-rc.2: resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} @@ -3710,6 +3826,11 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + goober@2.1.16: + resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} + peerDependencies: + csstype: ^3.0.10 + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -5033,6 +5154,18 @@ packages: utf-8-validate: optional: true + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -5169,7 +5302,7 @@ snapshots: '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.9 + '@babel/parser': 7.28.0 '@babel/types': 7.26.9 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 @@ -5177,7 +5310,7 @@ snapshots: '@babel/generator@7.27.0': dependencies: - '@babel/parser': 7.27.0 + '@babel/parser': 7.28.0 '@babel/types': 7.27.0 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 @@ -5224,6 +5357,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.28.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.27.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} '@babel/helper-member-expression-to-functions@7.25.9': @@ -5286,6 +5432,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.26.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: '@babel/traverse': 7.27.0 @@ -5315,10 +5470,6 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.0 - '@babel/parser@7.26.9': - dependencies: - '@babel/types': 7.26.9 - '@babel/parser@7.27.0': dependencies: '@babel/types': 7.27.0 @@ -5335,6 +5486,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -5357,13 +5516,13 @@ snapshots: '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.9 + '@babel/parser': 7.28.0 '@babel/types': 7.26.9 '@babel/template@7.27.0': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 + '@babel/parser': 7.28.0 '@babel/types': 7.27.0 '@babel/template@7.27.2': @@ -5376,7 +5535,7 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 + '@babel/parser': 7.28.0 '@babel/template': 7.26.9 '@babel/types': 7.26.9 debug: 4.4.1 @@ -5388,7 +5547,7 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 + '@babel/parser': 7.28.0 '@babel/template': 7.27.0 '@babel/types': 7.27.0 debug: 4.4.1 @@ -6183,6 +6342,27 @@ snapshots: '@size-limit/file': 11.2.0(size-limit@11.2.0) size-limit: 11.2.0 + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/keyboard@1.3.3(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/rootless@1.5.2(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/utils@6.3.2(solid-js@1.9.7)': + dependencies: + solid-js: 1.9.7 + '@stylistic/eslint-plugin@5.2.0(eslint@9.32.0(jiti@2.4.2))': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) @@ -6220,6 +6400,35 @@ snapshots: - typescript - vite + '@tanstack/devtools-event-bus@0.2.1': + dependencies: + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@tanstack/devtools-event-client@0.2.1': {} + + '@tanstack/devtools-ui@0.2.2(csstype@3.1.3)(solid-js@1.9.7)': + dependencies: + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.7 + transitivePeerDependencies: + - csstype + + '@tanstack/devtools@0.3.0(csstype@3.1.3)(solid-js@1.9.7)': + dependencies: + '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.7) + '@tanstack/devtools-event-bus': 0.2.1 + '@tanstack/devtools-ui': 0.2.2(csstype@3.1.3)(solid-js@1.9.7) + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.7 + transitivePeerDependencies: + - bufferutil + - csstype + - utf-8-validate + '@tanstack/eslint-config@0.3.0(@typescript-eslint/utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@eslint/js': 9.31.0 @@ -6254,6 +6463,19 @@ snapshots: '@tanstack/query-devtools@5.84.0': {} + '@tanstack/react-devtools@0.2.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.7)': + dependencies: + '@tanstack/devtools': 0.3.0(csstype@3.1.3)(solid-js@1.9.7) + '@types/react': 19.1.9 + '@types/react-dom': 19.1.7(@types/react@19.1.9) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + transitivePeerDependencies: + - bufferutil + - csstype + - solid-js + - utf-8-validate + '@tanstack/react-persister@0.1.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/persister': 0.1.1 @@ -6341,7 +6563,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 + '@babel/parser': 7.28.0 '@babel/types': 7.27.0 '@types/babel__traverse@7.20.6': @@ -7149,6 +7371,18 @@ snapshots: tinyglobby: 0.2.14 yaml-eslint-parser: 1.3.0 + eslint-plugin-react-compiler@19.1.0-rc.1(eslint@9.32.0(jiti@2.4.2)): + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.0) + eslint: 9.32.0(jiti@2.4.2) + hermes-parser: 0.25.1 + zod: 3.25.72 + zod-validation-error: 3.4.0(zod@3.25.72) + transitivePeerDependencies: + - supports-color + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.32.0(jiti@2.4.2)): dependencies: '@babel/core': 7.26.10 @@ -7544,6 +7778,10 @@ snapshots: globrex@0.1.2: {} + goober@2.1.16(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -8852,6 +9090,8 @@ snapshots: ws@8.18.1: {} + ws@8.18.3: {} + xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} From 4584821984a25d5cc571b14390a2e55a1f11c93e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 09:18:26 +0000 Subject: [PATCH 07/50] ci: apply automated fixes --- docs/reference/classes/asyncbatcher.md | 24 +- docs/reference/classes/asyncdebouncer.md | 20 +- docs/reference/classes/asyncqueuer.md | 38 ++-- docs/reference/classes/asyncratelimiter.md | 20 +- docs/reference/classes/asyncthrottler.md | 20 +- docs/reference/classes/batcher.md | 22 +- docs/reference/classes/debouncer.md | 20 +- docs/reference/classes/pacereventclient.md | 214 ++++++++++++++++++ docs/reference/classes/queuer.md | 34 +-- docs/reference/classes/ratelimiter.md | 20 +- docs/reference/classes/throttler.md | 20 +- docs/reference/functions/asyncbatch.md | 2 +- docs/reference/functions/asyncdebounce.md | 2 +- docs/reference/functions/asyncqueue.md | 2 +- docs/reference/functions/asyncratelimit.md | 2 +- docs/reference/functions/asyncthrottle.md | 2 +- docs/reference/functions/batch.md | 2 +- docs/reference/functions/debounce.md | 2 +- docs/reference/functions/isfunction.md | 2 +- .../functions/parsefunctionorvalue.md | 2 +- docs/reference/functions/queue.md | 2 +- docs/reference/functions/ratelimit.md | 2 +- docs/reference/functions/throttle.md | 2 +- docs/reference/index.md | 6 + .../interfaces/asyncbatcheroptions.md | 22 +- .../reference/interfaces/asyncbatcherstate.md | 28 +-- .../interfaces/asyncdebounceroptions.md | 20 +- .../interfaces/asyncdebouncerstate.md | 22 +- .../interfaces/asyncqueueroptions.md | 38 ++-- docs/reference/interfaces/asyncqueuerstate.md | 34 +-- .../interfaces/asyncratelimiteroptions.md | 22 +- .../interfaces/asyncratelimiterstate.md | 22 +- .../interfaces/asyncthrottleroptions.md | 20 +- .../interfaces/asyncthrottlerstate.md | 24 +- docs/reference/interfaces/batcheroptions.md | 16 +- docs/reference/interfaces/batcherstate.md | 16 +- docs/reference/interfaces/debounceroptions.md | 14 +- docs/reference/interfaces/debouncerstate.md | 14 +- docs/reference/interfaces/pacereventmap.md | 110 +++++++++ docs/reference/interfaces/queueroptions.md | 30 +-- docs/reference/interfaces/queuerstate.md | 26 +-- .../interfaces/ratelimiteroptions.md | 16 +- docs/reference/interfaces/ratelimiterstate.md | 14 +- docs/reference/interfaces/throttleroptions.md | 14 +- docs/reference/interfaces/throttlerstate.md | 16 +- .../type-aliases/anyasyncfunction.md | 2 +- docs/reference/type-aliases/anyfunction.md | 2 +- docs/reference/type-aliases/optionalkeys.md | 2 +- docs/reference/type-aliases/queueposition.md | 2 +- docs/reference/variables/pacereventclient.md | 14 ++ examples/react/queue/package.json | 2 +- examples/react/queue/src/index.tsx | 15 +- package.json | 2 +- packages/pacer-devtools/package.json | 2 +- .../src/context/context-provider.tsx | 58 +++-- .../pacer-devtools/src/context/context.ts | 22 +- .../src/context/use-context-hooks.ts | 6 +- packages/pacer-devtools/src/core.tsx | 7 +- packages/pacer-devtools/src/devtools.tsx | 7 +- packages/pacer-devtools/src/index.ts | 4 +- packages/pacer-devtools/tsconfig.json | 2 +- packages/pacer-devtools/vite.config.ts | 2 +- packages/pacer-react-devtools/package.json | 2 +- .../pacer-react-devtools/src/devtools.tsx | 15 +- packages/pacer-react-devtools/src/index.ts | 2 +- packages/pacer-react-devtools/tsconfig.json | 2 +- packages/pacer-react-devtools/vite.config.ts | 2 +- packages/pacer-solid-devtools/package.json | 2 +- .../pacer-solid-devtools/src/devtools.tsx | 14 +- packages/pacer-solid-devtools/src/index.ts | 2 +- packages/pacer-solid-devtools/tsconfig.json | 2 +- packages/pacer-solid-devtools/vite.config.ts | 2 +- packages/pacer/package.json | 2 +- packages/pacer/src/async-batcher.ts | 2 +- packages/pacer/src/async-debouncer.ts | 2 +- packages/pacer/src/async-queuer.ts | 2 +- packages/pacer/src/async-rate-limiter.ts | 4 +- packages/pacer/src/async-throttler.ts | 2 +- packages/pacer/src/batcher.ts | 4 +- packages/pacer/src/debouncer.ts | 2 +- packages/pacer/src/event-client.ts | 52 ++--- packages/pacer/src/index.ts | 2 +- packages/pacer/src/queuer.ts | 4 +- packages/pacer/src/rate-limiter.ts | 2 +- packages/pacer/src/throttler.ts | 2 +- 85 files changed, 814 insertions(+), 484 deletions(-) create mode 100644 docs/reference/classes/pacereventclient.md create mode 100644 docs/reference/interfaces/pacereventmap.md create mode 100644 docs/reference/variables/pacereventclient.md diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index 72e66ddf..e94aa1b4 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -7,7 +7,7 @@ title: AsyncBatcher # Class: AsyncBatcher\ -Defined in: [async-batcher.ts:219](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L219) +Defined in: [packages/pacer/src/async-batcher.ts:220](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L220) A class that collects items and processes them in batches asynchronously. @@ -82,7 +82,7 @@ batcher.addItem(2); new AsyncBatcher(fn, initialOptions): AsyncBatcher ``` -Defined in: [async-batcher.ts:226](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L226) +Defined in: [packages/pacer/src/async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L227) #### Parameters @@ -106,7 +106,7 @@ Defined in: [async-batcher.ts:226](https://github.com/TanStack/pacer/blob/main/p fn: (items) => Promise; ``` -Defined in: [async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L227) +Defined in: [packages/pacer/src/async-batcher.ts:228](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L228) #### Parameters @@ -126,7 +126,7 @@ Defined in: [async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/p options: AsyncBatcherOptionsWithOptionalCallbacks; ``` -Defined in: [async-batcher.ts:223](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L223) +Defined in: [packages/pacer/src/async-batcher.ts:224](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L224) *** @@ -136,7 +136,7 @@ Defined in: [async-batcher.ts:223](https://github.com/TanStack/pacer/blob/main/p readonly store: Store>>; ``` -Defined in: [async-batcher.ts:220](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L220) +Defined in: [packages/pacer/src/async-batcher.ts:221](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L221) ## Methods @@ -146,7 +146,7 @@ Defined in: [async-batcher.ts:220](https://github.com/TanStack/pacer/blob/main/p addItem(item): void ``` -Defined in: [async-batcher.ts:277](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L277) +Defined in: [packages/pacer/src/async-batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L280) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -169,7 +169,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [async-batcher.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L378) +Defined in: [packages/pacer/src/async-batcher.ts:381](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L381) Removes all items from the async batcher @@ -185,7 +185,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [async-batcher.ts:352](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L352) +Defined in: [packages/pacer/src/async-batcher.ts:355](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L355) Processes the current batch of items immediately @@ -201,7 +201,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [async-batcher.ts:360](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L360) +Defined in: [packages/pacer/src/async-batcher.ts:363](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L363) Returns a copy of all items in the async batcher @@ -217,7 +217,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [async-batcher.ts:364](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L364) +Defined in: [packages/pacer/src/async-batcher.ts:367](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L367) #### Returns @@ -231,7 +231,7 @@ Defined in: [async-batcher.ts:364](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:385](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L385) +Defined in: [packages/pacer/src/async-batcher.ts:388](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L388) Resets the async batcher state to its default values @@ -247,7 +247,7 @@ Resets the async batcher state to its default values setOptions(newOptions): void ``` -Defined in: [async-batcher.ts:241](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L241) +Defined in: [packages/pacer/src/async-batcher.ts:242](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L242) Updates the async batcher options diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index 4be9dab3..297ffe50 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -7,7 +7,7 @@ title: AsyncDebouncer # Class: AsyncDebouncer\ -Defined in: [async-debouncer.ts:177](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L177) +Defined in: [packages/pacer/src/async-debouncer.ts:178](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L178) A class that creates an async debounced function. @@ -66,7 +66,7 @@ const results = await asyncDebouncer.maybeExecute(inputElement.value); new AsyncDebouncer(fn, initialOptions): AsyncDebouncer ``` -Defined in: [async-debouncer.ts:188](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L188) +Defined in: [packages/pacer/src/async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L189) #### Parameters @@ -90,7 +90,7 @@ Defined in: [async-debouncer.ts:188](https://github.com/TanStack/pacer/blob/main fn: TFn; ``` -Defined in: [async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L189) +Defined in: [packages/pacer/src/async-debouncer.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L190) *** @@ -100,7 +100,7 @@ Defined in: [async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main options: AsyncDebouncerOptions; ``` -Defined in: [async-debouncer.ts:181](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L181) +Defined in: [packages/pacer/src/async-debouncer.ts:182](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L182) *** @@ -110,7 +110,7 @@ Defined in: [async-debouncer.ts:181](https://github.com/TanStack/pacer/blob/main readonly store: Store>>; ``` -Defined in: [async-debouncer.ts:178](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L178) +Defined in: [packages/pacer/src/async-debouncer.ts:179](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L179) ## Methods @@ -120,7 +120,7 @@ Defined in: [async-debouncer.ts:178](https://github.com/TanStack/pacer/blob/main cancel(): void ``` -Defined in: [async-debouncer.ts:387](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L387) +Defined in: [packages/pacer/src/async-debouncer.ts:390](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L390) Cancels any pending execution or aborts any execution in progress @@ -136,7 +136,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-debouncer.ts:339](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L339) +Defined in: [packages/pacer/src/async-debouncer.ts:342](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L342) Processes the current pending execution immediately @@ -152,7 +152,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-debouncer.ts:262](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L262) +Defined in: [packages/pacer/src/async-debouncer.ts:265](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L265) Attempts to execute the debounced function. If a call is already in progress, it will be queued. @@ -188,7 +188,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [async-debouncer.ts:396](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L396) +Defined in: [packages/pacer/src/async-debouncer.ts:399](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L399) Resets the debouncer state to its default values @@ -204,7 +204,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-debouncer.ts:203](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L203) +Defined in: [packages/pacer/src/async-debouncer.ts:204](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L204) Updates the async debouncer options diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index 797f7e4f..0d09aa38 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -7,7 +7,7 @@ title: AsyncQueuer # Class: AsyncQueuer\ -Defined in: [async-queuer.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L259) +Defined in: [packages/pacer/src/async-queuer.ts:260](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L260) A flexible asynchronous queue for processing tasks with configurable concurrency, priority, and expiration. @@ -71,7 +71,7 @@ asyncQueuer.start(); new AsyncQueuer(fn, initialOptions): AsyncQueuer ``` -Defined in: [async-queuer.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L266) +Defined in: [packages/pacer/src/async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L267) #### Parameters @@ -95,7 +95,7 @@ Defined in: [async-queuer.ts:266](https://github.com/TanStack/pacer/blob/main/pa fn: (item) => Promise; ``` -Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L267) +Defined in: [packages/pacer/src/async-queuer.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L268) #### Parameters @@ -115,7 +115,7 @@ Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/pa options: AsyncQueuerOptions; ``` -Defined in: [async-queuer.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L263) +Defined in: [packages/pacer/src/async-queuer.ts:264](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L264) *** @@ -125,7 +125,7 @@ Defined in: [async-queuer.ts:263](https://github.com/TanStack/pacer/blob/main/pa readonly store: Store>>; ``` -Defined in: [async-queuer.ts:260](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L260) +Defined in: [packages/pacer/src/async-queuer.ts:261](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L261) ## Methods @@ -138,7 +138,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [async-queuer.ts:400](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L400) +Defined in: [packages/pacer/src/async-queuer.ts:402](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L402) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -176,7 +176,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [async-queuer.ts:704](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L704) +Defined in: [packages/pacer/src/async-queuer.ts:706](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L706) Removes all pending items from the queue. Does not affect active tasks. @@ -192,7 +192,7 @@ Removes all pending items from the queue. Does not affect active tasks. execute(position?): Promise ``` -Defined in: [async-queuer.ts:526](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L526) +Defined in: [packages/pacer/src/async-queuer.ts:528](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L528) Removes and returns the next item from the queue and executes the task function with it. @@ -222,7 +222,7 @@ queuer.execute('back'); flush(numberOfItems, position?): Promise ``` -Defined in: [async-queuer.ts:561](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L561) +Defined in: [packages/pacer/src/async-queuer.ts:563](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L563) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -249,7 +249,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): Promise ``` -Defined in: [async-queuer.ts:575](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L575) +Defined in: [packages/pacer/src/async-queuer.ts:577](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L577) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -272,7 +272,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:479](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L479) +Defined in: [packages/pacer/src/async-queuer.ts:481](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L481) Removes and returns the next item from the queue without executing the task function. Use for manual queue management. Normally, use execute() to process items. @@ -304,7 +304,7 @@ queuer.getNextItem('back'); peekActiveItems(): TValue[] ``` -Defined in: [async-queuer.ts:667](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L667) +Defined in: [packages/pacer/src/async-queuer.ts:669](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L669) Returns the items currently being processed (active tasks). @@ -320,7 +320,7 @@ Returns the items currently being processed (active tasks). peekAllItems(): TValue[] ``` -Defined in: [async-queuer.ts:660](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L660) +Defined in: [packages/pacer/src/async-queuer.ts:662](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L662) Returns a copy of all items in the queue, including active and pending items. @@ -336,7 +336,7 @@ Returns a copy of all items in the queue, including active and pending items. peekNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:650](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L650) +Defined in: [packages/pacer/src/async-queuer.ts:652](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L652) Returns the next item in the queue without removing it. @@ -365,7 +365,7 @@ queuer.peekNextItem('back'); // back peekPendingItems(): TValue[] ``` -Defined in: [async-queuer.ts:674](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L674) +Defined in: [packages/pacer/src/async-queuer.ts:676](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L676) Returns the items waiting to be processed (pending tasks). @@ -381,7 +381,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [async-queuer.ts:712](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L712) +Defined in: [packages/pacer/src/async-queuer.ts:714](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L714) Resets the queuer state to its default values @@ -397,7 +397,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [async-queuer.ts:298](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L298) +Defined in: [packages/pacer/src/async-queuer.ts:299](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L299) Updates the queuer options. New options are merged with existing options. @@ -419,7 +419,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [async-queuer.ts:681](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L681) +Defined in: [packages/pacer/src/async-queuer.ts:683](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L683) Starts processing items in the queue. If already running, does nothing. @@ -435,7 +435,7 @@ Starts processing items in the queue. If already running, does nothing. stop(): void ``` -Defined in: [async-queuer.ts:691](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L691) +Defined in: [packages/pacer/src/async-queuer.ts:693](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L693) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index 9e1c68cd..c950b595 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -7,7 +7,7 @@ title: AsyncRateLimiter # Class: AsyncRateLimiter\ -Defined in: [async-rate-limiter.ts:205](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L205) +Defined in: [packages/pacer/src/async-rate-limiter.ts:206](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L206) A class that creates an async rate-limited function. @@ -87,7 +87,7 @@ const data = await rateLimiter.maybeExecute('123'); new AsyncRateLimiter(fn, initialOptions): AsyncRateLimiter ``` -Defined in: [async-rate-limiter.ts:212](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L212) +Defined in: [packages/pacer/src/async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L213) #### Parameters @@ -111,7 +111,7 @@ Defined in: [async-rate-limiter.ts:212](https://github.com/TanStack/pacer/blob/m fn: TFn; ``` -Defined in: [async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L213) +Defined in: [packages/pacer/src/async-rate-limiter.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L214) *** @@ -121,7 +121,7 @@ Defined in: [async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/m options: AsyncRateLimiterOptions; ``` -Defined in: [async-rate-limiter.ts:209](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L209) +Defined in: [packages/pacer/src/async-rate-limiter.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L210) *** @@ -131,7 +131,7 @@ Defined in: [async-rate-limiter.ts:209](https://github.com/TanStack/pacer/blob/m readonly store: Store>>; ``` -Defined in: [async-rate-limiter.ts:206](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L206) +Defined in: [packages/pacer/src/async-rate-limiter.ts:207](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L207) ## Methods @@ -141,7 +141,7 @@ Defined in: [async-rate-limiter.ts:206](https://github.com/TanStack/pacer/blob/m getMsUntilNextWindow(): number ``` -Defined in: [async-rate-limiter.ts:433](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L433) +Defined in: [packages/pacer/src/async-rate-limiter.ts:436](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L436) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -159,7 +159,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [async-rate-limiter.ts:423](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L423) +Defined in: [packages/pacer/src/async-rate-limiter.ts:426](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L426) Returns the number of remaining executions allowed in the current window @@ -175,7 +175,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [async-rate-limiter.ts:302](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L302) +Defined in: [packages/pacer/src/async-rate-limiter.ts:305](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L305) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -223,7 +223,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [async-rate-limiter.ts:444](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L444) +Defined in: [packages/pacer/src/async-rate-limiter.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L447) Resets the rate limiter state @@ -239,7 +239,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [async-rate-limiter.ts:230](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L230) +Defined in: [packages/pacer/src/async-rate-limiter.ts:231](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L231) Updates the async rate limiter options diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index cd73bfeb..6bd6f919 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -7,7 +7,7 @@ title: AsyncThrottler # Class: AsyncThrottler\ -Defined in: [async-throttler.ts:188](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L188) +Defined in: [packages/pacer/src/async-throttler.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L189) A class that creates an async throttled function. @@ -69,7 +69,7 @@ const result = await throttler.maybeExecute(inputElement.value); new AsyncThrottler(fn, initialOptions): AsyncThrottler ``` -Defined in: [async-throttler.ts:199](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L199) +Defined in: [packages/pacer/src/async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L200) #### Parameters @@ -93,7 +93,7 @@ Defined in: [async-throttler.ts:199](https://github.com/TanStack/pacer/blob/main fn: TFn; ``` -Defined in: [async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L200) +Defined in: [packages/pacer/src/async-throttler.ts:201](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L201) *** @@ -103,7 +103,7 @@ Defined in: [async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main options: AsyncThrottlerOptions; ``` -Defined in: [async-throttler.ts:192](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L192) +Defined in: [packages/pacer/src/async-throttler.ts:193](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L193) *** @@ -113,7 +113,7 @@ Defined in: [async-throttler.ts:192](https://github.com/TanStack/pacer/blob/main readonly store: Store>>; ``` -Defined in: [async-throttler.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L189) +Defined in: [packages/pacer/src/async-throttler.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L190) ## Methods @@ -123,7 +123,7 @@ Defined in: [async-throttler.ts:189](https://github.com/TanStack/pacer/blob/main cancel(): void ``` -Defined in: [async-throttler.ts:422](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L422) +Defined in: [packages/pacer/src/async-throttler.ts:425](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L425) Cancels any pending execution or aborts any execution in progress @@ -139,7 +139,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-throttler.ts:371](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L371) +Defined in: [packages/pacer/src/async-throttler.ts:374](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L374) Processes the current pending execution immediately @@ -155,7 +155,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-throttler.ts:281](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L281) +Defined in: [packages/pacer/src/async-throttler.ts:284](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L284) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -197,7 +197,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [async-throttler.ts:430](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L430) +Defined in: [packages/pacer/src/async-throttler.ts:433](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L433) Resets the debouncer state to its default values @@ -213,7 +213,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-throttler.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L214) +Defined in: [packages/pacer/src/async-throttler.ts:215](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L215) Updates the async throttler options diff --git a/docs/reference/classes/batcher.md b/docs/reference/classes/batcher.md index aba88063..57a9ffb3 100644 --- a/docs/reference/classes/batcher.md +++ b/docs/reference/classes/batcher.md @@ -7,7 +7,7 @@ title: Batcher # Class: Batcher\ -Defined in: [batcher.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L138) +Defined in: [packages/pacer/src/batcher.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L139) A class that collects items and processes them in batches. @@ -59,7 +59,7 @@ batcher.addItem(2); new Batcher(fn, initialOptions): Batcher ``` -Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L145) +Defined in: [packages/pacer/src/batcher.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L146) #### Parameters @@ -83,7 +83,7 @@ Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/package fn: (items) => void; ``` -Defined in: [batcher.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L146) +Defined in: [packages/pacer/src/batcher.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L147) #### Parameters @@ -103,7 +103,7 @@ Defined in: [batcher.ts:146](https://github.com/TanStack/pacer/blob/main/package options: BatcherOptionsWithOptionalCallbacks; ``` -Defined in: [batcher.ts:142](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L142) +Defined in: [packages/pacer/src/batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L143) *** @@ -113,7 +113,7 @@ Defined in: [batcher.ts:142](https://github.com/TanStack/pacer/blob/main/package readonly store: Store>>; ``` -Defined in: [batcher.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L139) +Defined in: [packages/pacer/src/batcher.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L140) ## Methods @@ -123,7 +123,7 @@ Defined in: [batcher.ts:139](https://github.com/TanStack/pacer/blob/main/package addItem(item): void ``` -Defined in: [batcher.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L189) +Defined in: [packages/pacer/src/batcher.ts:193](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L193) Adds an item to the batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -146,7 +146,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [batcher.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L259) +Defined in: [packages/pacer/src/batcher.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L263) Removes all items from the batcher @@ -162,7 +162,7 @@ Removes all items from the batcher flush(): void ``` -Defined in: [batcher.ts:237](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L237) +Defined in: [packages/pacer/src/batcher.ts:241](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L241) Processes the current batch of items immediately @@ -178,7 +178,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [batcher.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L245) +Defined in: [packages/pacer/src/batcher.ts:249](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L249) Returns a copy of all items in the batcher @@ -194,7 +194,7 @@ Returns a copy of all items in the batcher reset(): void ``` -Defined in: [batcher.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L266) +Defined in: [packages/pacer/src/batcher.ts:270](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L270) Resets the batcher state to its default values @@ -210,7 +210,7 @@ Resets the batcher state to its default values setOptions(newOptions): void ``` -Defined in: [batcher.ts:159](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L159) +Defined in: [packages/pacer/src/batcher.ts:160](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L160) Updates the batcher options diff --git a/docs/reference/classes/debouncer.md b/docs/reference/classes/debouncer.md index f4163ccd..3579c252 100644 --- a/docs/reference/classes/debouncer.md +++ b/docs/reference/classes/debouncer.md @@ -7,7 +7,7 @@ title: Debouncer # Class: Debouncer\ -Defined in: [debouncer.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L118) +Defined in: [packages/pacer/src/debouncer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L119) A class that creates a debounced function. @@ -52,7 +52,7 @@ inputElement.addEventListener('input', () => { new Debouncer(fn, initialOptions): Debouncer ``` -Defined in: [debouncer.ts:125](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L125) +Defined in: [packages/pacer/src/debouncer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L126) #### Parameters @@ -76,7 +76,7 @@ Defined in: [debouncer.ts:125](https://github.com/TanStack/pacer/blob/main/packa fn: TFn; ``` -Defined in: [debouncer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L126) +Defined in: [packages/pacer/src/debouncer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L127) *** @@ -86,7 +86,7 @@ Defined in: [debouncer.ts:126](https://github.com/TanStack/pacer/blob/main/packa options: DebouncerOptions; ``` -Defined in: [debouncer.ts:122](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L122) +Defined in: [packages/pacer/src/debouncer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L123) *** @@ -96,7 +96,7 @@ Defined in: [debouncer.ts:122](https://github.com/TanStack/pacer/blob/main/packa readonly store: Store>>; ``` -Defined in: [debouncer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L119) +Defined in: [packages/pacer/src/debouncer.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L120) ## Methods @@ -106,7 +106,7 @@ Defined in: [debouncer.ts:119](https://github.com/TanStack/pacer/blob/main/packa cancel(): void ``` -Defined in: [debouncer.ts:243](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L243) +Defined in: [packages/pacer/src/debouncer.ts:246](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L246) Cancels any pending execution @@ -122,7 +122,7 @@ Cancels any pending execution flush(): void ``` -Defined in: [debouncer.ts:226](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L226) +Defined in: [packages/pacer/src/debouncer.ts:229](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L229) Processes the current pending execution immediately @@ -138,7 +138,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [debouncer.ts:184](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L184) +Defined in: [packages/pacer/src/debouncer.ts:187](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L187) Attempts to execute the debounced function If a call is already in progress, it will be queued @@ -161,7 +161,7 @@ If a call is already in progress, it will be queued reset(): void ``` -Defined in: [debouncer.ts:254](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L254) +Defined in: [packages/pacer/src/debouncer.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L257) Resets the debouncer state to its default values @@ -177,7 +177,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [debouncer.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L139) +Defined in: [packages/pacer/src/debouncer.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L140) Updates the debouncer options diff --git a/docs/reference/classes/pacereventclient.md b/docs/reference/classes/pacereventclient.md new file mode 100644 index 00000000..c9a25ca9 --- /dev/null +++ b/docs/reference/classes/pacereventclient.md @@ -0,0 +1,214 @@ +--- +id: PacerEventClient +title: PacerEventClient +--- + + + +# Class: PacerEventClient + +Defined in: [packages/pacer/src/event-client.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L26) + +## Extends + +- `EventClient`\<[`PacerEventMap`](../../interfaces/pacereventmap.md)\> + +## Constructors + +### new PacerEventClient() + +```ts +new PacerEventClient(props?): PacerEventClient +``` + +Defined in: [packages/pacer/src/event-client.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L27) + +#### Parameters + +##### props? + +###### debug + +`boolean` + +#### Returns + +[`PacerEventClient`](../pacereventclient.md) + +#### Overrides + +```ts +EventClient.constructor +``` + +## Methods + +### emit() + +```ts +emit(eventSuffix, payload): number | void +``` + +Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:24 + +#### Type Parameters + +• **TSuffix** *extends* + \| `"async-batcher-state"` + \| `"async-debouncer-state"` + \| `"async-queuer-state"` + \| `"async-rate-limiter-state"` + \| `"async-throttler-state"` + \| `"batcher-state"` + \| `"debouncer-state"` + \| `"queuer-state"` + \| `"rate-limiter-state"` + \| `"throttler-state"` + +#### Parameters + +##### eventSuffix + +`TSuffix` + +##### payload + +[`PacerEventMap`](../../interfaces/pacereventmap.md)\[`` `pacer:${TSuffix}` ``\] + +#### Returns + +`number` \| `void` + +#### Inherited from + +```ts +EventClient.emit +``` + +*** + +### getPluginId() + +```ts +getPluginId(): "pacer" +``` + +Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:22 + +#### Returns + +`"pacer"` + +#### Inherited from + +```ts +EventClient.getPluginId +``` + +*** + +### on() + +```ts +on(eventSuffix, cb): () => void +``` + +Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:25 + +#### Type Parameters + +• **TSuffix** *extends* + \| `"async-batcher-state"` + \| `"async-debouncer-state"` + \| `"async-queuer-state"` + \| `"async-rate-limiter-state"` + \| `"async-throttler-state"` + \| `"batcher-state"` + \| `"debouncer-state"` + \| `"queuer-state"` + \| `"rate-limiter-state"` + \| `"throttler-state"` + +#### Parameters + +##### eventSuffix + +`TSuffix` + +##### cb + +(`event`) => `void` + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Inherited from + +```ts +EventClient.on +``` + +*** + +### onAll() + +```ts +onAll(cb): () => void +``` + +Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:26 + +#### Parameters + +##### cb + +(`event`) => `void` + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Inherited from + +```ts +EventClient.onAll +``` + +*** + +### onAllPluginEvents() + +```ts +onAllPluginEvents(cb): () => void +``` + +Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:27 + +#### Parameters + +##### cb + +(`event`) => `void` + +#### Returns + +`Function` + +##### Returns + +`void` + +#### Inherited from + +```ts +EventClient.onAllPluginEvents +``` diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index 12adc38d..ce191fdb 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -7,7 +7,7 @@ title: Queuer # Class: Queuer\ -Defined in: [queuer.ts:243](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L243) +Defined in: [packages/pacer/src/queuer.ts:244](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L244) A flexible queue that processes items with configurable wait times, expiration, and priority. @@ -92,7 +92,7 @@ manualQueue.getNextItem(); // returns 2, queue is empty new Queuer(fn, initialOptions): Queuer ``` -Defined in: [queuer.ts:250](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L250) +Defined in: [packages/pacer/src/queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L251) #### Parameters @@ -116,7 +116,7 @@ Defined in: [queuer.ts:250](https://github.com/TanStack/pacer/blob/main/packages fn: (item) => void; ``` -Defined in: [queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L251) +Defined in: [packages/pacer/src/queuer.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L252) #### Parameters @@ -136,7 +136,7 @@ Defined in: [queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages options: QueuerOptions; ``` -Defined in: [queuer.ts:247](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L247) +Defined in: [packages/pacer/src/queuer.ts:248](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L248) *** @@ -146,7 +146,7 @@ Defined in: [queuer.ts:247](https://github.com/TanStack/pacer/blob/main/packages readonly store: Store>>; ``` -Defined in: [queuer.ts:244](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L244) +Defined in: [packages/pacer/src/queuer.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L245) ## Methods @@ -159,7 +159,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [queuer.ts:364](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L364) +Defined in: [packages/pacer/src/queuer.ts:366](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L366) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -198,7 +198,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [queuer.ts:637](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L637) +Defined in: [packages/pacer/src/queuer.ts:639](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L639) Removes all pending items from the queue. Does not affect items being processed. @@ -214,7 +214,7 @@ Removes all pending items from the queue. Does not affect items being processed. execute(position?): undefined | TValue ``` -Defined in: [queuer.ts:491](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L491) +Defined in: [packages/pacer/src/queuer.ts:493](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L493) Removes and returns the next item from the queue and processes it using the provided function. @@ -243,7 +243,7 @@ queuer.execute('back'); flush(numberOfItems, position?): void ``` -Defined in: [queuer.ts:507](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L507) +Defined in: [packages/pacer/src/queuer.ts:509](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L509) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -270,7 +270,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [queuer.ts:522](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L522) +Defined in: [packages/pacer/src/queuer.ts:524](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L524) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -293,7 +293,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:444](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L444) +Defined in: [packages/pacer/src/queuer.ts:446](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L446) Removes and returns the next item from the queue without executing the function. Use for manual queue management. Normally, use execute() to process items. @@ -324,7 +324,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [queuer.ts:605](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L605) +Defined in: [packages/pacer/src/queuer.ts:607](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L607) Returns a copy of all items in the queue. @@ -340,7 +340,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:595](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L595) +Defined in: [packages/pacer/src/queuer.ts:597](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L597) Returns the next item in the queue without removing it. @@ -368,7 +368,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [queuer.ts:645](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L645) +Defined in: [packages/pacer/src/queuer.ts:647](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L647) Resets the queuer state to its default values @@ -384,7 +384,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [queuer.ts:281](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L281) +Defined in: [packages/pacer/src/queuer.ts:282](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L282) Updates the queuer options. New options are merged with existing options. @@ -406,7 +406,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [queuer.ts:612](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L612) +Defined in: [packages/pacer/src/queuer.ts:614](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L614) Starts processing items in the queue. If already isRunning, does nothing. @@ -422,7 +422,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [queuer.ts:622](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L622) +Defined in: [packages/pacer/src/queuer.ts:624](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L624) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/ratelimiter.md b/docs/reference/classes/ratelimiter.md index f5a9b71c..f45a0e9c 100644 --- a/docs/reference/classes/ratelimiter.md +++ b/docs/reference/classes/ratelimiter.md @@ -7,7 +7,7 @@ title: RateLimiter # Class: RateLimiter\ -Defined in: [rate-limiter.ts:132](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L132) +Defined in: [packages/pacer/src/rate-limiter.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L133) A class that creates a rate-limited function. @@ -65,7 +65,7 @@ rateLimiter.maybeExecute('123'); new RateLimiter(fn, initialOptions): RateLimiter ``` -Defined in: [rate-limiter.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L138) +Defined in: [packages/pacer/src/rate-limiter.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L139) #### Parameters @@ -89,7 +89,7 @@ Defined in: [rate-limiter.ts:138](https://github.com/TanStack/pacer/blob/main/pa fn: TFn; ``` -Defined in: [rate-limiter.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L139) +Defined in: [packages/pacer/src/rate-limiter.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L140) *** @@ -99,7 +99,7 @@ Defined in: [rate-limiter.ts:139](https://github.com/TanStack/pacer/blob/main/pa options: RateLimiterOptions; ``` -Defined in: [rate-limiter.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L135) +Defined in: [packages/pacer/src/rate-limiter.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L136) *** @@ -109,7 +109,7 @@ Defined in: [rate-limiter.ts:135](https://github.com/TanStack/pacer/blob/main/pa readonly store: Store>; ``` -Defined in: [rate-limiter.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L133) +Defined in: [packages/pacer/src/rate-limiter.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L134) ## Methods @@ -119,7 +119,7 @@ Defined in: [rate-limiter.ts:133](https://github.com/TanStack/pacer/blob/main/pa getMsUntilNextWindow(): number ``` -Defined in: [rate-limiter.ts:317](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L317) +Defined in: [packages/pacer/src/rate-limiter.ts:320](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L320) Returns the number of milliseconds until the next execution will be possible @@ -135,7 +135,7 @@ Returns the number of milliseconds until the next execution will be possible getRemainingInWindow(): number ``` -Defined in: [rate-limiter.ts:309](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L309) +Defined in: [packages/pacer/src/rate-limiter.ts:312](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L312) Returns the number of remaining executions allowed in the current window @@ -151,7 +151,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): boolean ``` -Defined in: [rate-limiter.ts:215](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L215) +Defined in: [packages/pacer/src/rate-limiter.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L218) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -186,7 +186,7 @@ rateLimiter.maybeExecute('arg1', 'arg2'); // false reset(): void ``` -Defined in: [rate-limiter.ts:328](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L328) +Defined in: [packages/pacer/src/rate-limiter.ts:331](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L331) Resets the rate limiter state @@ -202,7 +202,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [rate-limiter.ts:155](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L155) +Defined in: [packages/pacer/src/rate-limiter.ts:156](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L156) Updates the rate limiter options diff --git a/docs/reference/classes/throttler.md b/docs/reference/classes/throttler.md index c81c9fba..71d90dc3 100644 --- a/docs/reference/classes/throttler.md +++ b/docs/reference/classes/throttler.md @@ -7,7 +7,7 @@ title: Throttler # Class: Throttler\ -Defined in: [throttler.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L126) +Defined in: [packages/pacer/src/throttler.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L127) A class that creates a throttled function. @@ -56,7 +56,7 @@ throttler.maybeExecute('123'); // Throttled new Throttler(fn, initialOptions): Throttler ``` -Defined in: [throttler.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L133) +Defined in: [packages/pacer/src/throttler.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L134) #### Parameters @@ -80,7 +80,7 @@ Defined in: [throttler.ts:133](https://github.com/TanStack/pacer/blob/main/packa fn: TFn; ``` -Defined in: [throttler.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L134) +Defined in: [packages/pacer/src/throttler.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L135) *** @@ -90,7 +90,7 @@ Defined in: [throttler.ts:134](https://github.com/TanStack/pacer/blob/main/packa options: ThrottlerOptions; ``` -Defined in: [throttler.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L130) +Defined in: [packages/pacer/src/throttler.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L131) *** @@ -100,7 +100,7 @@ Defined in: [throttler.ts:130](https://github.com/TanStack/pacer/blob/main/packa readonly store: Store>>; ``` -Defined in: [throttler.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L127) +Defined in: [packages/pacer/src/throttler.ts:128](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L128) ## Methods @@ -110,7 +110,7 @@ Defined in: [throttler.ts:127](https://github.com/TanStack/pacer/blob/main/packa cancel(): void ``` -Defined in: [throttler.ts:281](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L281) +Defined in: [packages/pacer/src/throttler.ts:284](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L284) Cancels any pending trailing execution and clears internal state. @@ -132,7 +132,7 @@ Has no effect if there is no pending execution. flush(): void ``` -Defined in: [throttler.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L259) +Defined in: [packages/pacer/src/throttler.ts:262](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L262) Processes the current pending execution immediately @@ -148,7 +148,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [throttler.ts:204](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L204) +Defined in: [packages/pacer/src/throttler.ts:207](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L207) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -190,7 +190,7 @@ throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [throttler.ts:292](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L292) +Defined in: [packages/pacer/src/throttler.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L295) Resets the throttler state to its default values @@ -206,7 +206,7 @@ Resets the throttler state to its default values setOptions(newOptions): void ``` -Defined in: [throttler.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L147) +Defined in: [packages/pacer/src/throttler.ts:148](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L148) Updates the throttler options diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index c97f6e49..9d6078f3 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,7 +11,7 @@ title: asyncBatch function asyncBatch(fn, options): (item) => void ``` -Defined in: [async-batcher.ts:440](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L440) +Defined in: [packages/pacer/src/async-batcher.ts:443](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L443) Creates an async batcher that processes items in batches diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index c1b269ac..2792a773 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,7 +11,7 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-debouncer.ts:445](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L445) +Defined in: [packages/pacer/src/async-debouncer.ts:448](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L448) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index fe62c082..ffead6df 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,7 +11,7 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [async-queuer.ts:751](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L751) +Defined in: [packages/pacer/src/async-queuer.ts:753](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L753) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index 4810dfee..e85faaaa 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,7 +11,7 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-rate-limiter.ts:515](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L515) +Defined in: [packages/pacer/src/async-rate-limiter.ts:518](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L518) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index 5e83fd7d..77f5c6ad 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,7 +11,7 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-throttler.ts:478](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L478) +Defined in: [packages/pacer/src/async-throttler.ts:481](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L481) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md index 60d6b35a..78ccafbc 100644 --- a/docs/reference/functions/batch.md +++ b/docs/reference/functions/batch.md @@ -11,7 +11,7 @@ title: batch function batch(fn, options): (item) => void ``` -Defined in: [batcher.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L290) +Defined in: [packages/pacer/src/batcher.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L294) Creates a batcher that processes items in batches diff --git a/docs/reference/functions/debounce.md b/docs/reference/functions/debounce.md index e492cff1..9b932c63 100644 --- a/docs/reference/functions/debounce.md +++ b/docs/reference/functions/debounce.md @@ -11,7 +11,7 @@ title: debounce function debounce(fn, initialOptions): (...args) => void ``` -Defined in: [debouncer.ts:287](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L287) +Defined in: [packages/pacer/src/debouncer.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L290) Creates a debounced function that delays invoking the provided function until after a specified wait time. Multiple calls during the wait period will cancel previous pending invocations and reset the timer. diff --git a/docs/reference/functions/isfunction.md b/docs/reference/functions/isfunction.md index 96879e1e..9cbdfafd 100644 --- a/docs/reference/functions/isfunction.md +++ b/docs/reference/functions/isfunction.md @@ -11,7 +11,7 @@ title: isFunction function isFunction(value): value is T ``` -Defined in: [utils.ts:3](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L3) +Defined in: [packages/pacer/src/utils.ts:3](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L3) ## Type Parameters diff --git a/docs/reference/functions/parsefunctionorvalue.md b/docs/reference/functions/parsefunctionorvalue.md index 1629cd6c..7d0685c7 100644 --- a/docs/reference/functions/parsefunctionorvalue.md +++ b/docs/reference/functions/parsefunctionorvalue.md @@ -11,7 +11,7 @@ title: parseFunctionOrValue function parseFunctionOrValue(value, ...args): T ``` -Defined in: [utils.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L7) +Defined in: [packages/pacer/src/utils.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L7) ## Type Parameters diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index 739c87e7..35556f2b 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -11,7 +11,7 @@ title: queue function queue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [queuer.ts:688](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L688) +Defined in: [packages/pacer/src/queuer.ts:690](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L690) Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. diff --git a/docs/reference/functions/ratelimit.md b/docs/reference/functions/ratelimit.md index e146efd8..0d3918b5 100644 --- a/docs/reference/functions/ratelimit.md +++ b/docs/reference/functions/ratelimit.md @@ -11,7 +11,7 @@ title: rateLimit function rateLimit(fn, initialOptions): (...args) => boolean ``` -Defined in: [rate-limiter.ts:380](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L380) +Defined in: [packages/pacer/src/rate-limiter.ts:383](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L383) Creates a rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/throttle.md b/docs/reference/functions/throttle.md index bcb11b62..d17e3390 100644 --- a/docs/reference/functions/throttle.md +++ b/docs/reference/functions/throttle.md @@ -11,7 +11,7 @@ title: throttle function throttle(fn, initialOptions): (...args) => void ``` -Defined in: [throttler.ts:331](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L331) +Defined in: [packages/pacer/src/throttler.ts:334](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L334) Creates a throttled function that limits how often the provided function can execute. diff --git a/docs/reference/index.md b/docs/reference/index.md index a592ae55..bb332f65 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -16,6 +16,7 @@ title: "@tanstack/pacer" - [AsyncThrottler](../classes/asyncthrottler.md) - [Batcher](../classes/batcher.md) - [Debouncer](../classes/debouncer.md) +- [PacerEventClient](../classes/pacereventclient.md) - [Queuer](../classes/queuer.md) - [RateLimiter](../classes/ratelimiter.md) - [Throttler](../classes/throttler.md) @@ -36,6 +37,7 @@ title: "@tanstack/pacer" - [BatcherState](../interfaces/batcherstate.md) - [DebouncerOptions](../interfaces/debounceroptions.md) - [DebouncerState](../interfaces/debouncerstate.md) +- [PacerEventMap](../interfaces/pacereventmap.md) - [QueuerOptions](../interfaces/queueroptions.md) - [QueuerState](../interfaces/queuerstate.md) - [RateLimiterOptions](../interfaces/ratelimiteroptions.md) @@ -50,6 +52,10 @@ title: "@tanstack/pacer" - [OptionalKeys](../type-aliases/optionalkeys.md) - [QueuePosition](../type-aliases/queueposition.md) +## Variables + +- [pacerEventClient](../variables/pacereventclient.md) + ## Functions - [asyncBatch](../functions/asyncbatch.md) diff --git a/docs/reference/interfaces/asyncbatcheroptions.md b/docs/reference/interfaces/asyncbatcheroptions.md index 78b35a21..2b999ffb 100644 --- a/docs/reference/interfaces/asyncbatcheroptions.md +++ b/docs/reference/interfaces/asyncbatcheroptions.md @@ -7,7 +7,7 @@ title: AsyncBatcherOptions # Interface: AsyncBatcherOptions\ -Defined in: [async-batcher.ts:81](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L81) +Defined in: [packages/pacer/src/async-batcher.ts:82](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L82) Options for configuring an AsyncBatcher instance @@ -23,7 +23,7 @@ Options for configuring an AsyncBatcher instance optional getShouldExecute: (items, batcher) => boolean; ``` -Defined in: [async-batcher.ts:86](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L86) +Defined in: [packages/pacer/src/async-batcher.ts:87](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L87) Custom function to determine if a batch should be processed Return true to process the batch immediately @@ -50,7 +50,7 @@ Return true to process the batch immediately optional initialState: Partial>; ``` -Defined in: [async-batcher.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L93) +Defined in: [packages/pacer/src/async-batcher.ts:94](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L94) Initial state for the async batcher @@ -62,7 +62,7 @@ Initial state for the async batcher optional maxSize: number; ``` -Defined in: [async-batcher.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L98) +Defined in: [packages/pacer/src/async-batcher.ts:99](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L99) Maximum number of items in a batch @@ -80,7 +80,7 @@ Infinity optional onError: (error, batch, batcher) => void; ``` -Defined in: [async-batcher.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L104) +Defined in: [packages/pacer/src/async-batcher.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L105) Optional error handler for when the batch function throws. If provided, the handler will be called with the error, the batch of items that failed, and batcher instance. @@ -112,7 +112,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onItemsChange: (batcher) => void; ``` -Defined in: [async-batcher.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L112) +Defined in: [packages/pacer/src/async-batcher.ts:113](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L113) Callback fired after items are added to the batcher @@ -134,7 +134,7 @@ Callback fired after items are added to the batcher optional onSettled: (batch, batcher) => void; ``` -Defined in: [async-batcher.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L116) +Defined in: [packages/pacer/src/async-batcher.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L117) Optional callback to call when a batch is settled (completed or failed) @@ -160,7 +160,7 @@ Optional callback to call when a batch is settled (completed or failed) optional onSuccess: (result, batch, batcher) => void; ``` -Defined in: [async-batcher.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L120) +Defined in: [packages/pacer/src/async-batcher.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L121) Optional callback to call when a batch succeeds @@ -190,7 +190,7 @@ Optional callback to call when a batch succeeds optional started: boolean; ``` -Defined in: [async-batcher.ts:129](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L129) +Defined in: [packages/pacer/src/async-batcher.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L130) Whether the batcher should start processing immediately @@ -208,7 +208,7 @@ true optional throwOnError: boolean; ``` -Defined in: [async-batcher.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L135) +Defined in: [packages/pacer/src/async-batcher.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L136) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -222,7 +222,7 @@ Can be explicitly set to override these defaults. optional wait: number | (asyncBatcher) => number; ``` -Defined in: [async-batcher.ts:142](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L142) +Defined in: [packages/pacer/src/async-batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L143) Maximum time in milliseconds to wait before processing a batch. If the wait duration has elapsed, the batch will be processed. diff --git a/docs/reference/interfaces/asyncbatcherstate.md b/docs/reference/interfaces/asyncbatcherstate.md index 6a3a6970..6b0b2ac2 100644 --- a/docs/reference/interfaces/asyncbatcherstate.md +++ b/docs/reference/interfaces/asyncbatcherstate.md @@ -7,7 +7,7 @@ title: AsyncBatcherState # Interface: AsyncBatcherState\ -Defined in: [async-batcher.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L5) +Defined in: [packages/pacer/src/async-batcher.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-batcher.ts:5](https://github.com/TanStack/pacer/blob/main/pac errorCount: number; ``` -Defined in: [async-batcher.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L9) +Defined in: [packages/pacer/src/async-batcher.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L10) Number of batch executions that have resulted in errors @@ -33,7 +33,7 @@ Number of batch executions that have resulted in errors failedItems: TValue[]; ``` -Defined in: [async-batcher.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L13) +Defined in: [packages/pacer/src/async-batcher.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L14) Array of items that failed during batch processing @@ -45,7 +45,7 @@ Array of items that failed during batch processing isEmpty: boolean; ``` -Defined in: [async-batcher.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L17) +Defined in: [packages/pacer/src/async-batcher.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L18) Whether the batcher has no items to process (items array is empty) @@ -57,7 +57,7 @@ Whether the batcher has no items to process (items array is empty) isExecuting: boolean; ``` -Defined in: [async-batcher.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L21) +Defined in: [packages/pacer/src/async-batcher.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L22) Whether a batch is currently being processed asynchronously @@ -69,7 +69,7 @@ Whether a batch is currently being processed asynchronously isPending: boolean; ``` -Defined in: [async-batcher.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L25) +Defined in: [packages/pacer/src/async-batcher.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L26) Whether the batcher is waiting for the timeout to trigger batch processing @@ -81,7 +81,7 @@ Whether the batcher is waiting for the timeout to trigger batch processing items: TValue[]; ``` -Defined in: [async-batcher.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L29) +Defined in: [packages/pacer/src/async-batcher.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L30) Array of items currently queued for batch processing @@ -93,7 +93,7 @@ Array of items currently queued for batch processing lastResult: any; ``` -Defined in: [async-batcher.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L33) +Defined in: [packages/pacer/src/async-batcher.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L34) The result from the most recent batch execution @@ -105,7 +105,7 @@ The result from the most recent batch execution settleCount: number; ``` -Defined in: [async-batcher.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L37) +Defined in: [packages/pacer/src/async-batcher.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L38) Number of batch executions that have completed (either successfully or with errors) @@ -117,7 +117,7 @@ Number of batch executions that have completed (either successfully or with erro size: number; ``` -Defined in: [async-batcher.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L41) +Defined in: [packages/pacer/src/async-batcher.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L42) Number of items currently in the batch queue @@ -129,7 +129,7 @@ Number of items currently in the batch queue status: "idle" | "pending" | "executing" | "populated"; ``` -Defined in: [async-batcher.ts:45](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L45) +Defined in: [packages/pacer/src/async-batcher.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L46) Current processing status - 'idle' when not processing, 'pending' when waiting for timeout, 'executing' when processing, 'populated' when items are present, but no wait is configured @@ -141,7 +141,7 @@ Current processing status - 'idle' when not processing, 'pending' when waiting f successCount: number; ``` -Defined in: [async-batcher.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L49) +Defined in: [packages/pacer/src/async-batcher.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L50) Number of batch executions that have completed successfully @@ -153,7 +153,7 @@ Number of batch executions that have completed successfully totalItemsFailed: number; ``` -Defined in: [async-batcher.ts:53](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L53) +Defined in: [packages/pacer/src/async-batcher.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L54) Total number of items that have failed processing across all batches @@ -165,6 +165,6 @@ Total number of items that have failed processing across all batches totalItemsProcessed: number; ``` -Defined in: [async-batcher.ts:57](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L57) +Defined in: [packages/pacer/src/async-batcher.ts:58](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L58) Total number of items that have been processed across all batches diff --git a/docs/reference/interfaces/asyncdebounceroptions.md b/docs/reference/interfaces/asyncdebounceroptions.md index b9f62cc1..cb5191ca 100644 --- a/docs/reference/interfaces/asyncdebounceroptions.md +++ b/docs/reference/interfaces/asyncdebounceroptions.md @@ -7,7 +7,7 @@ title: AsyncDebouncerOptions # Interface: AsyncDebouncerOptions\ -Defined in: [async-debouncer.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L63) +Defined in: [packages/pacer/src/async-debouncer.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L64) Options for configuring an async debounced function @@ -23,7 +23,7 @@ Options for configuring an async debounced function optional enabled: boolean | (debouncer) => boolean; ``` -Defined in: [async-debouncer.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L69) +Defined in: [packages/pacer/src/async-debouncer.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L70) Whether the debouncer is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [async-debouncer.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L73) +Defined in: [packages/pacer/src/async-debouncer.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L74) Initial state for the async debouncer @@ -49,7 +49,7 @@ Initial state for the async debouncer optional leading: boolean; ``` -Defined in: [async-debouncer.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L78) +Defined in: [packages/pacer/src/async-debouncer.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L79) Whether to execute on the leading edge of the timeout. Defaults to false. @@ -62,7 +62,7 @@ Defaults to false. optional onError: (error, args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L84) +Defined in: [packages/pacer/src/async-debouncer.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L85) Optional error handler for when the debounced function throws. If provided, the handler will be called with the error and debouncer instance. @@ -94,7 +94,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onSettled: (args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:92](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L92) +Defined in: [packages/pacer/src/async-debouncer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L93) Optional callback to call when the debounced function is executed @@ -120,7 +120,7 @@ Optional callback to call when the debounced function is executed optional onSuccess: (result, args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:96](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L96) +Defined in: [packages/pacer/src/async-debouncer.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L97) Optional callback to call when the debounced function is executed @@ -150,7 +150,7 @@ Optional callback to call when the debounced function is executed optional throwOnError: boolean; ``` -Defined in: [async-debouncer.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L106) +Defined in: [packages/pacer/src/async-debouncer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L107) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -164,7 +164,7 @@ Can be explicitly set to override these defaults. optional trailing: boolean; ``` -Defined in: [async-debouncer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L111) +Defined in: [packages/pacer/src/async-debouncer.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L112) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -177,7 +177,7 @@ Defaults to true. wait: number | (debouncer) => number; ``` -Defined in: [async-debouncer.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L117) +Defined in: [packages/pacer/src/async-debouncer.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L118) Delay in milliseconds to wait after the last call before executing. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncdebouncerstate.md b/docs/reference/interfaces/asyncdebouncerstate.md index 78e91133..513b4101 100644 --- a/docs/reference/interfaces/asyncdebouncerstate.md +++ b/docs/reference/interfaces/asyncdebouncerstate.md @@ -7,7 +7,7 @@ title: AsyncDebouncerState # Interface: AsyncDebouncerState\ -Defined in: [async-debouncer.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L5) +Defined in: [packages/pacer/src/async-debouncer.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-debouncer.ts:5](https://github.com/TanStack/pacer/blob/main/p canLeadingExecute: boolean; ``` -Defined in: [async-debouncer.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L9) +Defined in: [packages/pacer/src/async-debouncer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L10) Whether the debouncer can execute on the leading edge of the timeout @@ -33,7 +33,7 @@ Whether the debouncer can execute on the leading edge of the timeout errorCount: number; ``` -Defined in: [async-debouncer.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L13) +Defined in: [packages/pacer/src/async-debouncer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L14) Number of function executions that have resulted in errors @@ -45,7 +45,7 @@ Number of function executions that have resulted in errors isExecuting: boolean; ``` -Defined in: [async-debouncer.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L17) +Defined in: [packages/pacer/src/async-debouncer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L18) Whether the debounced function is currently executing asynchronously @@ -57,7 +57,7 @@ Whether the debounced function is currently executing asynchronously isPending: boolean; ``` -Defined in: [async-debouncer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L21) +Defined in: [packages/pacer/src/async-debouncer.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L22) Whether the debouncer is waiting for the timeout to trigger execution @@ -69,7 +69,7 @@ Whether the debouncer is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [async-debouncer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L25) +Defined in: [packages/pacer/src/async-debouncer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L26) The arguments from the most recent call to maybeExecute @@ -81,7 +81,7 @@ The arguments from the most recent call to maybeExecute lastResult: undefined | ReturnType; ``` -Defined in: [async-debouncer.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L29) +Defined in: [packages/pacer/src/async-debouncer.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L30) The result from the most recent successful function execution @@ -93,7 +93,7 @@ The result from the most recent successful function execution settleCount: number; ``` -Defined in: [async-debouncer.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L33) +Defined in: [packages/pacer/src/async-debouncer.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L34) Number of function executions that have completed (either successfully or with errors) @@ -102,10 +102,10 @@ Number of function executions that have completed (either successfully or with e ### status ```ts -status: "idle" | "pending" | "executing" | "disabled" | "settled"; +status: "disabled" | "idle" | "pending" | "executing" | "settled"; ``` -Defined in: [async-debouncer.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L37) +Defined in: [packages/pacer/src/async-debouncer.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L38) Current execution status - 'idle' when not active, 'pending' when waiting, 'executing' when running, 'settled' when completed @@ -117,6 +117,6 @@ Current execution status - 'idle' when not active, 'pending' when waiting, 'exec successCount: number; ``` -Defined in: [async-debouncer.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L41) +Defined in: [packages/pacer/src/async-debouncer.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L42) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/asyncqueueroptions.md b/docs/reference/interfaces/asyncqueueroptions.md index 92c61d43..dd99dce3 100644 --- a/docs/reference/interfaces/asyncqueueroptions.md +++ b/docs/reference/interfaces/asyncqueueroptions.md @@ -7,7 +7,7 @@ title: AsyncQueuerOptions # Interface: AsyncQueuerOptions\ -Defined in: [async-queuer.ts:94](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L94) +Defined in: [packages/pacer/src/async-queuer.ts:95](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L95) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-queuer.ts:94](https://github.com/TanStack/pacer/blob/main/pac optional addItemsTo: QueuePosition; ``` -Defined in: [async-queuer.ts:99](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L99) +Defined in: [packages/pacer/src/async-queuer.ts:100](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L100) Default position to add items to the queuer @@ -39,7 +39,7 @@ Default position to add items to the queuer optional concurrency: number | (queuer) => number; ``` -Defined in: [async-queuer.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L105) +Defined in: [packages/pacer/src/async-queuer.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L106) Maximum number of concurrent tasks to process. Can be a number or a function that returns a number. @@ -58,7 +58,7 @@ Can be a number or a function that returns a number. optional expirationDuration: number; ``` -Defined in: [async-queuer.ts:110](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L110) +Defined in: [packages/pacer/src/async-queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L111) Maximum time in milliseconds that an item can stay in the queue If not provided, items will never expire @@ -71,7 +71,7 @@ If not provided, items will never expire optional getIsExpired: (item, addedAt) => boolean; ``` -Defined in: [async-queuer.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L115) +Defined in: [packages/pacer/src/async-queuer.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L116) Function to determine if an item has expired If provided, this overrides the expirationDuration behavior @@ -98,7 +98,7 @@ If provided, this overrides the expirationDuration behavior optional getItemsFrom: QueuePosition; ``` -Defined in: [async-queuer.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L120) +Defined in: [packages/pacer/src/async-queuer.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L121) Default position to get items from during processing @@ -116,7 +116,7 @@ Default position to get items from during processing optional getPriority: (item) => number; ``` -Defined in: [async-queuer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L126) +Defined in: [packages/pacer/src/async-queuer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L127) Function to determine priority of items in the queuer Higher priority items will be processed first @@ -140,7 +140,7 @@ If not provided, will use static priority values attached to tasks optional initialItems: TValue[]; ``` -Defined in: [async-queuer.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L130) +Defined in: [packages/pacer/src/async-queuer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L131) Initial items to populate the queuer with @@ -152,7 +152,7 @@ Initial items to populate the queuer with optional initialState: Partial>; ``` -Defined in: [async-queuer.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L134) +Defined in: [packages/pacer/src/async-queuer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L135) Initial state for the async queuer @@ -164,7 +164,7 @@ Initial state for the async queuer optional maxSize: number; ``` -Defined in: [async-queuer.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L138) +Defined in: [packages/pacer/src/async-queuer.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L139) Maximum number of items allowed in the queuer @@ -176,7 +176,7 @@ Maximum number of items allowed in the queuer optional onError: (error, item, queuer) => void; ``` -Defined in: [async-queuer.ts:144](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L144) +Defined in: [packages/pacer/src/async-queuer.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L145) Optional error handler for when a task throws. If provided, the handler will be called with the error and queuer instance. @@ -208,7 +208,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onExpire: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:148](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L148) +Defined in: [packages/pacer/src/async-queuer.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L149) Callback fired whenever an item expires in the queuer @@ -234,7 +234,7 @@ Callback fired whenever an item expires in the queuer optional onItemsChange: (queuer) => void; ``` -Defined in: [async-queuer.ts:152](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L152) +Defined in: [packages/pacer/src/async-queuer.ts:153](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L153) Callback fired whenever an item is added or removed from the queuer @@ -256,7 +256,7 @@ Callback fired whenever an item is added or removed from the queuer optional onReject: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:156](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L156) +Defined in: [packages/pacer/src/async-queuer.ts:157](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L157) Callback fired whenever an item is rejected from being added to the queuer @@ -282,7 +282,7 @@ Callback fired whenever an item is rejected from being added to the queuer optional onSettled: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:160](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L160) +Defined in: [packages/pacer/src/async-queuer.ts:161](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L161) Optional callback to call when a task is settled @@ -308,7 +308,7 @@ Optional callback to call when a task is settled optional onSuccess: (result, item, queuer) => void; ``` -Defined in: [async-queuer.ts:164](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L164) +Defined in: [packages/pacer/src/async-queuer.ts:165](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L165) Optional callback to call when a task succeeds @@ -338,7 +338,7 @@ Optional callback to call when a task succeeds optional started: boolean; ``` -Defined in: [async-queuer.ts:168](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L168) +Defined in: [packages/pacer/src/async-queuer.ts:169](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L169) Whether the queuer should start processing tasks immediately or not. @@ -350,7 +350,7 @@ Whether the queuer should start processing tasks immediately or not. optional throwOnError: boolean; ``` -Defined in: [async-queuer.ts:174](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L174) +Defined in: [packages/pacer/src/async-queuer.ts:175](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L175) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -364,7 +364,7 @@ Can be explicitly set to override these defaults. optional wait: number | (queuer) => number; ``` -Defined in: [async-queuer.ts:180](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L180) +Defined in: [packages/pacer/src/async-queuer.ts:181](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L181) Time in milliseconds to wait between processing items. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncqueuerstate.md b/docs/reference/interfaces/asyncqueuerstate.md index 5edf5fa5..f7aca665 100644 --- a/docs/reference/interfaces/asyncqueuerstate.md +++ b/docs/reference/interfaces/asyncqueuerstate.md @@ -7,7 +7,7 @@ title: AsyncQueuerState # Interface: AsyncQueuerState\ -Defined in: [async-queuer.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L6) +Defined in: [packages/pacer/src/async-queuer.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L7) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-queuer.ts:6](https://github.com/TanStack/pacer/blob/main/pack activeItems: TValue[]; ``` -Defined in: [async-queuer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L10) +Defined in: [packages/pacer/src/async-queuer.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L11) Items currently being processed by the queuer @@ -33,7 +33,7 @@ Items currently being processed by the queuer errorCount: number; ``` -Defined in: [async-queuer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L14) +Defined in: [packages/pacer/src/async-queuer.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L15) Number of task executions that have resulted in errors @@ -45,7 +45,7 @@ Number of task executions that have resulted in errors expirationCount: number; ``` -Defined in: [async-queuer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L18) +Defined in: [packages/pacer/src/async-queuer.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L19) Number of items that have been removed from the queue due to expiration @@ -57,7 +57,7 @@ Number of items that have been removed from the queue due to expiration isEmpty: boolean; ``` -Defined in: [async-queuer.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L22) +Defined in: [packages/pacer/src/async-queuer.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L23) Whether the queuer has no items to process (items array is empty) @@ -69,7 +69,7 @@ Whether the queuer has no items to process (items array is empty) isFull: boolean; ``` -Defined in: [async-queuer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L26) +Defined in: [packages/pacer/src/async-queuer.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L27) Whether the queuer has reached its maximum capacity @@ -81,7 +81,7 @@ Whether the queuer has reached its maximum capacity isIdle: boolean; ``` -Defined in: [async-queuer.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L30) +Defined in: [packages/pacer/src/async-queuer.ts:31](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L31) Whether the queuer is not currently processing any items @@ -93,7 +93,7 @@ Whether the queuer is not currently processing any items isRunning: boolean; ``` -Defined in: [async-queuer.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L34) +Defined in: [packages/pacer/src/async-queuer.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L35) Whether the queuer is active and will process items automatically @@ -105,7 +105,7 @@ Whether the queuer is active and will process items automatically items: TValue[]; ``` -Defined in: [async-queuer.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L38) +Defined in: [packages/pacer/src/async-queuer.ts:39](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L39) Array of items currently waiting to be processed @@ -117,7 +117,7 @@ Array of items currently waiting to be processed itemTimestamps: number[]; ``` -Defined in: [async-queuer.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L42) +Defined in: [packages/pacer/src/async-queuer.ts:43](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L43) Timestamps when items were added to the queue for expiration tracking @@ -129,7 +129,7 @@ Timestamps when items were added to the queue for expiration tracking lastResult: any; ``` -Defined in: [async-queuer.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L46) +Defined in: [packages/pacer/src/async-queuer.ts:47](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L47) The result from the most recent task execution @@ -141,7 +141,7 @@ The result from the most recent task execution pendingTick: boolean; ``` -Defined in: [async-queuer.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L50) +Defined in: [packages/pacer/src/async-queuer.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L51) Whether the queuer has a pending timeout for processing the next item @@ -153,7 +153,7 @@ Whether the queuer has a pending timeout for processing the next item rejectionCount: number; ``` -Defined in: [async-queuer.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L54) +Defined in: [packages/pacer/src/async-queuer.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L55) Number of items that have been rejected from being added to the queue @@ -165,7 +165,7 @@ Number of items that have been rejected from being added to the queue settledCount: number; ``` -Defined in: [async-queuer.ts:58](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L58) +Defined in: [packages/pacer/src/async-queuer.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L59) Number of task executions that have completed (either successfully or with errors) @@ -177,7 +177,7 @@ Number of task executions that have completed (either successfully or with error size: number; ``` -Defined in: [async-queuer.ts:62](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L62) +Defined in: [packages/pacer/src/async-queuer.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L63) Number of items currently in the queue @@ -189,7 +189,7 @@ Number of items currently in the queue status: "idle" | "running" | "stopped"; ``` -Defined in: [async-queuer.ts:66](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L66) +Defined in: [packages/pacer/src/async-queuer.ts:67](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L67) Current processing status - 'idle' when not processing, 'running' when active, 'stopped' when paused @@ -201,6 +201,6 @@ Current processing status - 'idle' when not processing, 'running' when active, ' successCount: number; ``` -Defined in: [async-queuer.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L70) +Defined in: [packages/pacer/src/async-queuer.ts:71](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L71) Number of task executions that have completed successfully diff --git a/docs/reference/interfaces/asyncratelimiteroptions.md b/docs/reference/interfaces/asyncratelimiteroptions.md index 9bb807f6..6de7abfe 100644 --- a/docs/reference/interfaces/asyncratelimiteroptions.md +++ b/docs/reference/interfaces/asyncratelimiteroptions.md @@ -7,7 +7,7 @@ title: AsyncRateLimiterOptions # Interface: AsyncRateLimiterOptions\ -Defined in: [async-rate-limiter.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L63) +Defined in: [packages/pacer/src/async-rate-limiter.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L64) Options for configuring an async rate-limited function @@ -23,7 +23,7 @@ Options for configuring an async rate-limited function optional enabled: boolean | (rateLimiter) => boolean; ``` -Defined in: [async-rate-limiter.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L69) +Defined in: [packages/pacer/src/async-rate-limiter.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L70) Whether the rate limiter is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [async-rate-limiter.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L73) +Defined in: [packages/pacer/src/async-rate-limiter.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L74) Initial state for the rate limiter @@ -49,7 +49,7 @@ Initial state for the rate limiter limit: number | (rateLimiter) => number; ``` -Defined in: [async-rate-limiter.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L78) +Defined in: [packages/pacer/src/async-rate-limiter.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L79) Maximum number of executions allowed within the time window. Can be a number or a function that returns a number. @@ -62,7 +62,7 @@ Can be a number or a function that returns a number. optional onError: (error, args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L84) +Defined in: [packages/pacer/src/async-rate-limiter.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L85) Optional error handler for when the rate-limited function throws. If provided, the handler will be called with the error and rate limiter instance. @@ -94,7 +94,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onReject: (args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:92](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L92) +Defined in: [packages/pacer/src/async-rate-limiter.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L93) Optional callback function that is called when an execution is rejected due to rate limiting @@ -120,7 +120,7 @@ Optional callback function that is called when an execution is rejected due to r optional onSettled: (args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:96](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L96) +Defined in: [packages/pacer/src/async-rate-limiter.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L97) Optional function to call when the rate-limited function is executed @@ -146,7 +146,7 @@ Optional function to call when the rate-limited function is executed optional onSuccess: (result, args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L103) +Defined in: [packages/pacer/src/async-rate-limiter.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L104) Optional function to call when the rate-limited function is executed @@ -176,7 +176,7 @@ Optional function to call when the rate-limited function is executed optional throwOnError: boolean; ``` -Defined in: [async-rate-limiter.ts:113](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L113) +Defined in: [packages/pacer/src/async-rate-limiter.ts:114](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L114) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -190,7 +190,7 @@ Can be explicitly set to override these defaults. window: number | (rateLimiter) => number; ``` -Defined in: [async-rate-limiter.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L118) +Defined in: [packages/pacer/src/async-rate-limiter.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L119) Time window in milliseconds within which the limit applies. Can be a number or a function that returns a number. @@ -203,7 +203,7 @@ Can be a number or a function that returns a number. optional windowType: "fixed" | "sliding"; ``` -Defined in: [async-rate-limiter.ts:125](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L125) +Defined in: [packages/pacer/src/async-rate-limiter.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L126) Type of window to use for rate limiting - 'fixed': Uses a fixed window that resets after the window period diff --git a/docs/reference/interfaces/asyncratelimiterstate.md b/docs/reference/interfaces/asyncratelimiterstate.md index 8e7cc64e..dabae5fe 100644 --- a/docs/reference/interfaces/asyncratelimiterstate.md +++ b/docs/reference/interfaces/asyncratelimiterstate.md @@ -7,7 +7,7 @@ title: AsyncRateLimiterState # Interface: AsyncRateLimiterState\ -Defined in: [async-rate-limiter.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L5) +Defined in: [packages/pacer/src/async-rate-limiter.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-rate-limiter.ts:5](https://github.com/TanStack/pacer/blob/mai errorCount: number; ``` -Defined in: [async-rate-limiter.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L9) +Defined in: [packages/pacer/src/async-rate-limiter.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L10) Number of function executions that have resulted in errors @@ -33,7 +33,7 @@ Number of function executions that have resulted in errors executionTimes: number[]; ``` -Defined in: [async-rate-limiter.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L13) +Defined in: [packages/pacer/src/async-rate-limiter.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L14) Array of timestamps when executions occurred for rate limiting calculations @@ -45,7 +45,7 @@ Array of timestamps when executions occurred for rate limiting calculations isExceeded: boolean; ``` -Defined in: [async-rate-limiter.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L17) +Defined in: [packages/pacer/src/async-rate-limiter.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L18) Whether the rate limiter has exceeded the limit @@ -57,7 +57,7 @@ Whether the rate limiter has exceeded the limit isExecuting: boolean; ``` -Defined in: [async-rate-limiter.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L21) +Defined in: [packages/pacer/src/async-rate-limiter.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L22) Whether the rate-limited function is currently executing asynchronously @@ -69,7 +69,7 @@ Whether the rate-limited function is currently executing asynchronously lastResult: undefined | ReturnType; ``` -Defined in: [async-rate-limiter.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L25) +Defined in: [packages/pacer/src/async-rate-limiter.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L26) The result from the most recent successful function execution @@ -81,7 +81,7 @@ The result from the most recent successful function execution rejectionCount: number; ``` -Defined in: [async-rate-limiter.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L29) +Defined in: [packages/pacer/src/async-rate-limiter.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L30) Number of function executions that have been rejected due to rate limiting @@ -93,7 +93,7 @@ Number of function executions that have been rejected due to rate limiting settleCount: number; ``` -Defined in: [async-rate-limiter.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L33) +Defined in: [packages/pacer/src/async-rate-limiter.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L34) Number of function executions that have completed (either successfully or with errors) @@ -102,10 +102,10 @@ Number of function executions that have completed (either successfully or with e ### status ```ts -status: "idle" | "executing" | "disabled" | "exceeded"; +status: "disabled" | "idle" | "executing" | "exceeded"; ``` -Defined in: [async-rate-limiter.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L37) +Defined in: [packages/pacer/src/async-rate-limiter.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L38) Current execution status - 'disabled' when not active, 'executing' when executing, 'idle' when not executing, 'exceeded' when rate limit is exceeded @@ -117,6 +117,6 @@ Current execution status - 'disabled' when not active, 'executing' when executin successCount: number; ``` -Defined in: [async-rate-limiter.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L41) +Defined in: [packages/pacer/src/async-rate-limiter.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L42) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/asyncthrottleroptions.md b/docs/reference/interfaces/asyncthrottleroptions.md index 6bd5b084..7fa793f1 100644 --- a/docs/reference/interfaces/asyncthrottleroptions.md +++ b/docs/reference/interfaces/asyncthrottleroptions.md @@ -7,7 +7,7 @@ title: AsyncThrottlerOptions # Interface: AsyncThrottlerOptions\ -Defined in: [async-throttler.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L68) +Defined in: [packages/pacer/src/async-throttler.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L69) Options for configuring an async throttled function @@ -23,7 +23,7 @@ Options for configuring an async throttled function optional enabled: boolean | (throttler) => boolean; ``` -Defined in: [async-throttler.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L74) +Defined in: [packages/pacer/src/async-throttler.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L75) Whether the throttler is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [async-throttler.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L78) +Defined in: [packages/pacer/src/async-throttler.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L79) Initial state for the async throttler @@ -49,7 +49,7 @@ Initial state for the async throttler optional leading: boolean; ``` -Defined in: [async-throttler.ts:83](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L83) +Defined in: [packages/pacer/src/async-throttler.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L84) Whether to execute the function immediately when called Defaults to true @@ -62,7 +62,7 @@ Defaults to true optional onError: (error, args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:89](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L89) +Defined in: [packages/pacer/src/async-throttler.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L90) Optional error handler for when the throttled function throws. If provided, the handler will be called with the error and throttler instance. @@ -94,7 +94,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onSettled: (args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L97) +Defined in: [packages/pacer/src/async-throttler.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L98) Optional function to call when the throttled function is executed @@ -120,7 +120,7 @@ Optional function to call when the throttled function is executed optional onSuccess: (result, args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L104) +Defined in: [packages/pacer/src/async-throttler.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L105) Optional function to call when the throttled function is executed @@ -150,7 +150,7 @@ Optional function to call when the throttled function is executed optional throwOnError: boolean; ``` -Defined in: [async-throttler.ts:114](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L114) +Defined in: [packages/pacer/src/async-throttler.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L115) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -164,7 +164,7 @@ Can be explicitly set to override these defaults. optional trailing: boolean; ``` -Defined in: [async-throttler.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L119) +Defined in: [packages/pacer/src/async-throttler.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L120) Whether to execute the function on the trailing edge of the wait period Defaults to true @@ -177,7 +177,7 @@ Defaults to true wait: number | (throttler) => number; ``` -Defined in: [async-throttler.ts:125](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L125) +Defined in: [packages/pacer/src/async-throttler.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L126) Time window in milliseconds during which the function can only be executed once. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncthrottlerstate.md b/docs/reference/interfaces/asyncthrottlerstate.md index 148bae3c..bf3c5d98 100644 --- a/docs/reference/interfaces/asyncthrottlerstate.md +++ b/docs/reference/interfaces/asyncthrottlerstate.md @@ -7,7 +7,7 @@ title: AsyncThrottlerState # Interface: AsyncThrottlerState\ -Defined in: [async-throttler.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L5) +Defined in: [packages/pacer/src/async-throttler.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-throttler.ts:5](https://github.com/TanStack/pacer/blob/main/p errorCount: number; ``` -Defined in: [async-throttler.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L9) +Defined in: [packages/pacer/src/async-throttler.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L10) Number of function executions that have resulted in errors @@ -33,7 +33,7 @@ Number of function executions that have resulted in errors isExecuting: boolean; ``` -Defined in: [async-throttler.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L13) +Defined in: [packages/pacer/src/async-throttler.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L14) Whether the throttled function is currently executing asynchronously @@ -45,7 +45,7 @@ Whether the throttled function is currently executing asynchronously isPending: boolean; ``` -Defined in: [async-throttler.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L17) +Defined in: [packages/pacer/src/async-throttler.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L18) Whether the throttler is waiting for the timeout to trigger execution @@ -57,7 +57,7 @@ Whether the throttler is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [async-throttler.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L21) +Defined in: [packages/pacer/src/async-throttler.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L22) The arguments from the most recent call to maybeExecute @@ -69,7 +69,7 @@ The arguments from the most recent call to maybeExecute lastExecutionTime: number; ``` -Defined in: [async-throttler.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L25) +Defined in: [packages/pacer/src/async-throttler.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L26) Timestamp of the last function execution in milliseconds @@ -81,7 +81,7 @@ Timestamp of the last function execution in milliseconds lastResult: undefined | ReturnType; ``` -Defined in: [async-throttler.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L29) +Defined in: [packages/pacer/src/async-throttler.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L30) The result from the most recent successful function execution @@ -93,7 +93,7 @@ The result from the most recent successful function execution nextExecutionTime: undefined | number; ``` -Defined in: [async-throttler.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L33) +Defined in: [packages/pacer/src/async-throttler.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L34) Timestamp when the next execution can occur in milliseconds @@ -105,7 +105,7 @@ Timestamp when the next execution can occur in milliseconds settleCount: number; ``` -Defined in: [async-throttler.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L37) +Defined in: [packages/pacer/src/async-throttler.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L38) Number of function executions that have completed (either successfully or with errors) @@ -114,10 +114,10 @@ Number of function executions that have completed (either successfully or with e ### status ```ts -status: "idle" | "pending" | "executing" | "disabled" | "settled"; +status: "disabled" | "idle" | "pending" | "executing" | "settled"; ``` -Defined in: [async-throttler.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L41) +Defined in: [packages/pacer/src/async-throttler.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L42) Current execution status - 'idle' when not active, 'pending' when waiting, 'executing' when running, 'settled' when completed @@ -129,6 +129,6 @@ Current execution status - 'idle' when not active, 'pending' when waiting, 'exec successCount: number; ``` -Defined in: [async-throttler.ts:45](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L45) +Defined in: [packages/pacer/src/async-throttler.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L46) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/batcheroptions.md b/docs/reference/interfaces/batcheroptions.md index 32421ca7..9577326e 100644 --- a/docs/reference/interfaces/batcheroptions.md +++ b/docs/reference/interfaces/batcheroptions.md @@ -7,7 +7,7 @@ title: BatcherOptions # Interface: BatcherOptions\ -Defined in: [batcher.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L51) +Defined in: [packages/pacer/src/batcher.ts:52](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L52) Options for configuring a Batcher instance @@ -23,7 +23,7 @@ Options for configuring a Batcher instance optional getShouldExecute: (items, batcher) => boolean; ``` -Defined in: [batcher.ts:56](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L56) +Defined in: [packages/pacer/src/batcher.ts:57](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L57) Custom function to determine if a batch should be processed Return true to process the batch immediately @@ -50,7 +50,7 @@ Return true to process the batch immediately optional initialState: Partial>; ``` -Defined in: [batcher.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L60) +Defined in: [packages/pacer/src/batcher.ts:61](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L61) Initial state for the batcher @@ -62,7 +62,7 @@ Initial state for the batcher optional maxSize: number; ``` -Defined in: [batcher.ts:65](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L65) +Defined in: [packages/pacer/src/batcher.ts:66](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L66) Maximum number of items in a batch @@ -80,7 +80,7 @@ Infinity optional onExecute: (batch, batcher) => void; ``` -Defined in: [batcher.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L69) +Defined in: [packages/pacer/src/batcher.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L70) Callback fired after a batch is processed @@ -106,7 +106,7 @@ Callback fired after a batch is processed optional onItemsChange: (batcher) => void; ``` -Defined in: [batcher.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L73) +Defined in: [packages/pacer/src/batcher.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L74) Callback fired after items are added to the batcher @@ -128,7 +128,7 @@ Callback fired after items are added to the batcher optional started: boolean; ``` -Defined in: [batcher.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L78) +Defined in: [packages/pacer/src/batcher.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L79) Whether the batcher should start processing immediately @@ -146,7 +146,7 @@ true optional wait: number | (batcher) => number; ``` -Defined in: [batcher.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L85) +Defined in: [packages/pacer/src/batcher.ts:86](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L86) Maximum time in milliseconds to wait before processing a batch. If the wait duration has elapsed, the batch will be processed. diff --git a/docs/reference/interfaces/batcherstate.md b/docs/reference/interfaces/batcherstate.md index e76588cf..a4fba1d1 100644 --- a/docs/reference/interfaces/batcherstate.md +++ b/docs/reference/interfaces/batcherstate.md @@ -7,7 +7,7 @@ title: BatcherState # Interface: BatcherState\ -Defined in: [batcher.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L5) +Defined in: [packages/pacer/src/batcher.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [batcher.ts:5](https://github.com/TanStack/pacer/blob/main/packages/ executionCount: number; ``` -Defined in: [batcher.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L9) +Defined in: [packages/pacer/src/batcher.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L10) Number of batch executions that have been completed @@ -33,7 +33,7 @@ Number of batch executions that have been completed isEmpty: boolean; ``` -Defined in: [batcher.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L13) +Defined in: [packages/pacer/src/batcher.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L14) Whether the batcher has no items to process (items array is empty) @@ -45,7 +45,7 @@ Whether the batcher has no items to process (items array is empty) isPending: boolean; ``` -Defined in: [batcher.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L17) +Defined in: [packages/pacer/src/batcher.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L18) Whether the batcher is waiting for the timeout to trigger batch processing @@ -57,7 +57,7 @@ Whether the batcher is waiting for the timeout to trigger batch processing items: TValue[]; ``` -Defined in: [batcher.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L21) +Defined in: [packages/pacer/src/batcher.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L22) Array of items currently queued for batch processing @@ -69,7 +69,7 @@ Array of items currently queued for batch processing size: number; ``` -Defined in: [batcher.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L25) +Defined in: [packages/pacer/src/batcher.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L26) Number of items currently in the batch queue @@ -81,7 +81,7 @@ Number of items currently in the batch queue status: "idle" | "pending"; ``` -Defined in: [batcher.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L29) +Defined in: [packages/pacer/src/batcher.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L30) Current processing status - 'idle' when not processing, 'pending' when waiting for timeout @@ -93,6 +93,6 @@ Current processing status - 'idle' when not processing, 'pending' when waiting f totalItemsProcessed: number; ``` -Defined in: [batcher.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L33) +Defined in: [packages/pacer/src/batcher.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L34) Total number of items that have been processed across all batches diff --git a/docs/reference/interfaces/debounceroptions.md b/docs/reference/interfaces/debounceroptions.md index 162800ed..63fbc3d3 100644 --- a/docs/reference/interfaces/debounceroptions.md +++ b/docs/reference/interfaces/debounceroptions.md @@ -7,7 +7,7 @@ title: DebouncerOptions # Interface: DebouncerOptions\ -Defined in: [debouncer.ts:43](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L43) +Defined in: [packages/pacer/src/debouncer.ts:44](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L44) Options for configuring a debounced function @@ -23,7 +23,7 @@ Options for configuring a debounced function optional enabled: boolean | (debouncer) => boolean; ``` -Defined in: [debouncer.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L49) +Defined in: [packages/pacer/src/debouncer.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L50) Whether the debouncer is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [debouncer.ts:53](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L53) +Defined in: [packages/pacer/src/debouncer.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L54) Initial state for the debouncer @@ -49,7 +49,7 @@ Initial state for the debouncer optional leading: boolean; ``` -Defined in: [debouncer.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L59) +Defined in: [packages/pacer/src/debouncer.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L60) Whether to execute on the leading edge of the timeout. The first call will execute immediately and the rest will wait the delay. @@ -63,7 +63,7 @@ Defaults to false. optional onExecute: (args, debouncer) => void; ``` -Defined in: [debouncer.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L63) +Defined in: [packages/pacer/src/debouncer.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L64) Callback function that is called after the function is executed @@ -89,7 +89,7 @@ Callback function that is called after the function is executed optional trailing: boolean; ``` -Defined in: [debouncer.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L68) +Defined in: [packages/pacer/src/debouncer.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L69) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -102,7 +102,7 @@ Defaults to true. wait: number | (debouncer) => number; ``` -Defined in: [debouncer.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L74) +Defined in: [packages/pacer/src/debouncer.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L75) Delay in milliseconds before executing the function. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/debouncerstate.md b/docs/reference/interfaces/debouncerstate.md index 3b2a70a4..5cabe467 100644 --- a/docs/reference/interfaces/debouncerstate.md +++ b/docs/reference/interfaces/debouncerstate.md @@ -7,7 +7,7 @@ title: DebouncerState # Interface: DebouncerState\ -Defined in: [debouncer.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L5) +Defined in: [packages/pacer/src/debouncer.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [debouncer.ts:5](https://github.com/TanStack/pacer/blob/main/package canLeadingExecute: boolean; ``` -Defined in: [debouncer.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L9) +Defined in: [packages/pacer/src/debouncer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L10) Whether the debouncer can execute on the leading edge of the timeout @@ -33,7 +33,7 @@ Whether the debouncer can execute on the leading edge of the timeout executionCount: number; ``` -Defined in: [debouncer.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L13) +Defined in: [packages/pacer/src/debouncer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L14) Number of function executions that have been completed @@ -45,7 +45,7 @@ Number of function executions that have been completed isPending: boolean; ``` -Defined in: [debouncer.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L17) +Defined in: [packages/pacer/src/debouncer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L18) Whether the debouncer is waiting for the timeout to trigger execution @@ -57,7 +57,7 @@ Whether the debouncer is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [debouncer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L21) +Defined in: [packages/pacer/src/debouncer.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L22) The arguments from the most recent call to maybeExecute @@ -66,9 +66,9 @@ The arguments from the most recent call to maybeExecute ### status ```ts -status: "idle" | "pending" | "disabled"; +status: "disabled" | "idle" | "pending"; ``` -Defined in: [debouncer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L25) +Defined in: [packages/pacer/src/debouncer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L26) Current execution status - 'idle' when not active, 'pending' when waiting for timeout diff --git a/docs/reference/interfaces/pacereventmap.md b/docs/reference/interfaces/pacereventmap.md new file mode 100644 index 00000000..24757832 --- /dev/null +++ b/docs/reference/interfaces/pacereventmap.md @@ -0,0 +1,110 @@ +--- +id: PacerEventMap +title: PacerEventMap +--- + + + +# Interface: PacerEventMap + +Defined in: [packages/pacer/src/event-client.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L13) + +## Properties + +### pacer:async-batcher-state + +```ts +pacer:async-batcher-state: AsyncBatcherState; +``` + +Defined in: [packages/pacer/src/event-client.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L14) + +*** + +### pacer:async-debouncer-state + +```ts +pacer:async-debouncer-state: AsyncDebouncerState; +``` + +Defined in: [packages/pacer/src/event-client.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L15) + +*** + +### pacer:async-queuer-state + +```ts +pacer:async-queuer-state: AsyncQueuerState; +``` + +Defined in: [packages/pacer/src/event-client.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L16) + +*** + +### pacer:async-rate-limiter-state + +```ts +pacer:async-rate-limiter-state: AsyncRateLimiterState; +``` + +Defined in: [packages/pacer/src/event-client.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L17) + +*** + +### pacer:async-throttler-state + +```ts +pacer:async-throttler-state: AsyncThrottlerState; +``` + +Defined in: [packages/pacer/src/event-client.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L18) + +*** + +### pacer:batcher-state + +```ts +pacer:batcher-state: BatcherState; +``` + +Defined in: [packages/pacer/src/event-client.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L19) + +*** + +### pacer:debouncer-state + +```ts +pacer:debouncer-state: DebouncerState; +``` + +Defined in: [packages/pacer/src/event-client.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L20) + +*** + +### pacer:queuer-state + +```ts +pacer:queuer-state: QueuerState; +``` + +Defined in: [packages/pacer/src/event-client.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L21) + +*** + +### pacer:rate-limiter-state + +```ts +pacer:rate-limiter-state: RateLimiterState; +``` + +Defined in: [packages/pacer/src/event-client.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L22) + +*** + +### pacer:throttler-state + +```ts +pacer:throttler-state: ThrottlerState; +``` + +Defined in: [packages/pacer/src/event-client.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L23) diff --git a/docs/reference/interfaces/queueroptions.md b/docs/reference/interfaces/queueroptions.md index 00d47952..8e2ab82f 100644 --- a/docs/reference/interfaces/queueroptions.md +++ b/docs/reference/interfaces/queueroptions.md @@ -7,7 +7,7 @@ title: QueuerOptions # Interface: QueuerOptions\ -Defined in: [queuer.ts:77](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L77) +Defined in: [packages/pacer/src/queuer.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L78) Options for configuring a Queuer instance. @@ -25,7 +25,7 @@ These options control queue behavior, item expiration, callbacks, and more. optional addItemsTo: QueuePosition; ``` -Defined in: [queuer.ts:82](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L82) +Defined in: [packages/pacer/src/queuer.ts:83](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L83) Default position to add items to the queuer @@ -43,7 +43,7 @@ Default position to add items to the queuer optional expirationDuration: number; ``` -Defined in: [queuer.ts:87](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L87) +Defined in: [packages/pacer/src/queuer.ts:88](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L88) Maximum time in milliseconds that an item can stay in the queue If not provided, items will never expire @@ -56,7 +56,7 @@ If not provided, items will never expire optional getIsExpired: (item, addedAt) => boolean; ``` -Defined in: [queuer.ts:92](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L92) +Defined in: [packages/pacer/src/queuer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L93) Function to determine if an item has expired If provided, this overrides the expirationDuration behavior @@ -83,7 +83,7 @@ If provided, this overrides the expirationDuration behavior optional getItemsFrom: QueuePosition; ``` -Defined in: [queuer.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L97) +Defined in: [packages/pacer/src/queuer.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L98) Default position to get items from during processing @@ -101,7 +101,7 @@ Default position to get items from during processing optional getPriority: (item) => number; ``` -Defined in: [queuer.ts:102](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L102) +Defined in: [packages/pacer/src/queuer.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L103) Function to determine priority of items in the queuer Higher priority items will be processed first @@ -124,7 +124,7 @@ Higher priority items will be processed first optional initialItems: TValue[]; ``` -Defined in: [queuer.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L106) +Defined in: [packages/pacer/src/queuer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L107) Initial items to populate the queuer with @@ -136,7 +136,7 @@ Initial items to populate the queuer with optional initialState: Partial>; ``` -Defined in: [queuer.ts:110](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L110) +Defined in: [packages/pacer/src/queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L111) Initial state for the queuer @@ -148,7 +148,7 @@ Initial state for the queuer optional maxSize: number; ``` -Defined in: [queuer.ts:114](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L114) +Defined in: [packages/pacer/src/queuer.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L115) Maximum number of items allowed in the queuer @@ -160,7 +160,7 @@ Maximum number of items allowed in the queuer optional onExecute: (item, queuer) => void; ``` -Defined in: [queuer.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L118) +Defined in: [packages/pacer/src/queuer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L119) Callback fired whenever an item is removed from the queuer @@ -186,7 +186,7 @@ Callback fired whenever an item is removed from the queuer optional onExpire: (item, queuer) => void; ``` -Defined in: [queuer.ts:122](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L122) +Defined in: [packages/pacer/src/queuer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L123) Callback fired whenever an item expires in the queuer @@ -212,7 +212,7 @@ Callback fired whenever an item expires in the queuer optional onItemsChange: (queuer) => void; ``` -Defined in: [queuer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L126) +Defined in: [packages/pacer/src/queuer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L127) Callback fired whenever an item is added or removed from the queuer @@ -234,7 +234,7 @@ Callback fired whenever an item is added or removed from the queuer optional onReject: (item, queuer) => void; ``` -Defined in: [queuer.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L130) +Defined in: [packages/pacer/src/queuer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L131) Callback fired whenever an item is rejected from being added to the queuer @@ -260,7 +260,7 @@ Callback fired whenever an item is rejected from being added to the queuer optional started: boolean; ``` -Defined in: [queuer.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L134) +Defined in: [packages/pacer/src/queuer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L135) Whether the queuer should start processing tasks immediately @@ -272,7 +272,7 @@ Whether the queuer should start processing tasks immediately optional wait: number | (queuer) => number; ``` -Defined in: [queuer.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L140) +Defined in: [packages/pacer/src/queuer.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L141) Time in milliseconds to wait between processing items. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/queuerstate.md b/docs/reference/interfaces/queuerstate.md index fda09691..accb2e89 100644 --- a/docs/reference/interfaces/queuerstate.md +++ b/docs/reference/interfaces/queuerstate.md @@ -7,7 +7,7 @@ title: QueuerState # Interface: QueuerState\ -Defined in: [queuer.ts:4](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L4) +Defined in: [packages/pacer/src/queuer.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L5) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [queuer.ts:4](https://github.com/TanStack/pacer/blob/main/packages/p executionCount: number; ``` -Defined in: [queuer.ts:8](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L8) +Defined in: [packages/pacer/src/queuer.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L9) Number of items that have been processed by the queuer @@ -33,7 +33,7 @@ Number of items that have been processed by the queuer expirationCount: number; ``` -Defined in: [queuer.ts:12](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L12) +Defined in: [packages/pacer/src/queuer.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L13) Number of items that have been removed from the queue due to expiration @@ -45,7 +45,7 @@ Number of items that have been removed from the queue due to expiration isEmpty: boolean; ``` -Defined in: [queuer.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L16) +Defined in: [packages/pacer/src/queuer.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L17) Whether the queuer has no items to process (items array is empty) @@ -57,7 +57,7 @@ Whether the queuer has no items to process (items array is empty) isFull: boolean; ``` -Defined in: [queuer.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L20) +Defined in: [packages/pacer/src/queuer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L21) Whether the queuer has reached its maximum capacity @@ -69,7 +69,7 @@ Whether the queuer has reached its maximum capacity isIdle: boolean; ``` -Defined in: [queuer.ts:24](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L24) +Defined in: [packages/pacer/src/queuer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L25) Whether the queuer is not currently processing any items @@ -81,7 +81,7 @@ Whether the queuer is not currently processing any items isRunning: boolean; ``` -Defined in: [queuer.ts:28](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L28) +Defined in: [packages/pacer/src/queuer.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L29) Whether the queuer is active and will process items automatically @@ -93,7 +93,7 @@ Whether the queuer is active and will process items automatically items: TValue[]; ``` -Defined in: [queuer.ts:32](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L32) +Defined in: [packages/pacer/src/queuer.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L33) Array of items currently waiting to be processed @@ -105,7 +105,7 @@ Array of items currently waiting to be processed itemTimestamps: number[]; ``` -Defined in: [queuer.ts:36](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L36) +Defined in: [packages/pacer/src/queuer.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L37) Timestamps when items were added to the queue for expiration tracking @@ -117,7 +117,7 @@ Timestamps when items were added to the queue for expiration tracking pendingTick: boolean; ``` -Defined in: [queuer.ts:40](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L40) +Defined in: [packages/pacer/src/queuer.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L41) Whether the queuer has a pending timeout for processing the next item @@ -129,7 +129,7 @@ Whether the queuer has a pending timeout for processing the next item rejectionCount: number; ``` -Defined in: [queuer.ts:44](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L44) +Defined in: [packages/pacer/src/queuer.ts:45](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L45) Number of items that have been rejected from being added to the queue @@ -141,7 +141,7 @@ Number of items that have been rejected from being added to the queue size: number; ``` -Defined in: [queuer.ts:48](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L48) +Defined in: [packages/pacer/src/queuer.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L49) Number of items currently in the queue @@ -153,6 +153,6 @@ Number of items currently in the queue status: "idle" | "running" | "stopped"; ``` -Defined in: [queuer.ts:52](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L52) +Defined in: [packages/pacer/src/queuer.ts:53](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L53) Current processing status - 'idle' when not processing, 'running' when active, 'stopped' when paused diff --git a/docs/reference/interfaces/ratelimiteroptions.md b/docs/reference/interfaces/ratelimiteroptions.md index 479f6033..c435536f 100644 --- a/docs/reference/interfaces/ratelimiteroptions.md +++ b/docs/reference/interfaces/ratelimiteroptions.md @@ -7,7 +7,7 @@ title: RateLimiterOptions # Interface: RateLimiterOptions\ -Defined in: [rate-limiter.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L41) +Defined in: [packages/pacer/src/rate-limiter.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L42) Options for configuring a rate-limited function @@ -23,7 +23,7 @@ Options for configuring a rate-limited function optional enabled: boolean | (rateLimiter) => boolean; ``` -Defined in: [rate-limiter.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L46) +Defined in: [packages/pacer/src/rate-limiter.ts:47](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L47) Whether the rate limiter is enabled. When disabled, maybeExecute will not trigger any executions. Defaults to true. @@ -36,7 +36,7 @@ Defaults to true. optional initialState: Partial; ``` -Defined in: [rate-limiter.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L50) +Defined in: [packages/pacer/src/rate-limiter.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L51) Initial state for the rate limiter @@ -48,7 +48,7 @@ Initial state for the rate limiter limit: number | (rateLimiter) => number; ``` -Defined in: [rate-limiter.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L55) +Defined in: [packages/pacer/src/rate-limiter.ts:56](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L56) Maximum number of executions allowed within the time window. Can be a number or a callback function that receives the rate limiter instance and returns a number. @@ -61,7 +61,7 @@ Can be a number or a callback function that receives the rate limiter instance a optional onExecute: (args, rateLimiter) => void; ``` -Defined in: [rate-limiter.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L59) +Defined in: [packages/pacer/src/rate-limiter.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L60) Callback function that is called after the function is executed @@ -87,7 +87,7 @@ Callback function that is called after the function is executed optional onReject: (rateLimiter) => void; ``` -Defined in: [rate-limiter.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L63) +Defined in: [packages/pacer/src/rate-limiter.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L64) Optional callback function that is called when an execution is rejected due to rate limiting @@ -109,7 +109,7 @@ Optional callback function that is called when an execution is rejected due to r window: number | (rateLimiter) => number; ``` -Defined in: [rate-limiter.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L68) +Defined in: [packages/pacer/src/rate-limiter.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L69) Time window in milliseconds within which the limit applies. Can be a number or a callback function that receives the rate limiter instance and returns a number. @@ -122,7 +122,7 @@ Can be a number or a callback function that receives the rate limiter instance a optional windowType: "fixed" | "sliding"; ``` -Defined in: [rate-limiter.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L75) +Defined in: [packages/pacer/src/rate-limiter.ts:76](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L76) Type of window to use for rate limiting - 'fixed': Uses a fixed window that resets after the window period diff --git a/docs/reference/interfaces/ratelimiterstate.md b/docs/reference/interfaces/ratelimiterstate.md index bb165047..05b9bef8 100644 --- a/docs/reference/interfaces/ratelimiterstate.md +++ b/docs/reference/interfaces/ratelimiterstate.md @@ -7,7 +7,7 @@ title: RateLimiterState # Interface: RateLimiterState -Defined in: [rate-limiter.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L5) +Defined in: [packages/pacer/src/rate-limiter.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L6) ## Properties @@ -17,7 +17,7 @@ Defined in: [rate-limiter.ts:5](https://github.com/TanStack/pacer/blob/main/pack executionCount: number; ``` -Defined in: [rate-limiter.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L9) +Defined in: [packages/pacer/src/rate-limiter.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L10) Number of function executions that have been completed @@ -29,7 +29,7 @@ Number of function executions that have been completed executionTimes: number[]; ``` -Defined in: [rate-limiter.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L13) +Defined in: [packages/pacer/src/rate-limiter.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L14) Array of timestamps when executions occurred for rate limiting calculations @@ -41,7 +41,7 @@ Array of timestamps when executions occurred for rate limiting calculations isExceeded: boolean; ``` -Defined in: [rate-limiter.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L17) +Defined in: [packages/pacer/src/rate-limiter.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L18) Whether the rate limiter has exceeded the limit @@ -53,7 +53,7 @@ Whether the rate limiter has exceeded the limit rejectionCount: number; ``` -Defined in: [rate-limiter.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L21) +Defined in: [packages/pacer/src/rate-limiter.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L22) Number of function executions that have been rejected due to rate limiting @@ -62,9 +62,9 @@ Number of function executions that have been rejected due to rate limiting ### status ```ts -status: "idle" | "disabled" | "exceeded"; +status: "disabled" | "idle" | "exceeded"; ``` -Defined in: [rate-limiter.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L25) +Defined in: [packages/pacer/src/rate-limiter.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L26) Current execution status - 'disabled' when not active, 'executing' when executing, 'idle' when not executing, 'exceeded' when rate limit is exceeded diff --git a/docs/reference/interfaces/throttleroptions.md b/docs/reference/interfaces/throttleroptions.md index aa45a5ef..43e3c376 100644 --- a/docs/reference/interfaces/throttleroptions.md +++ b/docs/reference/interfaces/throttleroptions.md @@ -7,7 +7,7 @@ title: ThrottlerOptions # Interface: ThrottlerOptions\ -Defined in: [throttler.ts:48](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L48) +Defined in: [packages/pacer/src/throttler.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L49) Options for configuring a throttled function @@ -23,7 +23,7 @@ Options for configuring a throttled function optional enabled: boolean | (throttler) => boolean; ``` -Defined in: [throttler.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L54) +Defined in: [packages/pacer/src/throttler.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L55) Whether the throttler is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [throttler.ts:58](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L58) +Defined in: [packages/pacer/src/throttler.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L59) Initial state for the throttler @@ -49,7 +49,7 @@ Initial state for the throttler optional leading: boolean; ``` -Defined in: [throttler.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L63) +Defined in: [packages/pacer/src/throttler.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L64) Whether to execute on the leading edge of the timeout. Defaults to true. @@ -62,7 +62,7 @@ Defaults to true. optional onExecute: (args, throttler) => void; ``` -Defined in: [throttler.ts:67](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L67) +Defined in: [packages/pacer/src/throttler.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L68) Callback function that is called after the function is executed @@ -88,7 +88,7 @@ Callback function that is called after the function is executed optional trailing: boolean; ``` -Defined in: [throttler.ts:72](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L72) +Defined in: [packages/pacer/src/throttler.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L73) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -101,7 +101,7 @@ Defaults to true. wait: number | (throttler) => number; ``` -Defined in: [throttler.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L78) +Defined in: [packages/pacer/src/throttler.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L79) Time window in milliseconds during which the function can only be executed once. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/throttlerstate.md b/docs/reference/interfaces/throttlerstate.md index d2c4a654..e10d6d0a 100644 --- a/docs/reference/interfaces/throttlerstate.md +++ b/docs/reference/interfaces/throttlerstate.md @@ -7,7 +7,7 @@ title: ThrottlerState # Interface: ThrottlerState\ -Defined in: [throttler.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L5) +Defined in: [packages/pacer/src/throttler.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [throttler.ts:5](https://github.com/TanStack/pacer/blob/main/package executionCount: number; ``` -Defined in: [throttler.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L9) +Defined in: [packages/pacer/src/throttler.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L10) Number of function executions that have been completed @@ -33,7 +33,7 @@ Number of function executions that have been completed isPending: boolean; ``` -Defined in: [throttler.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L13) +Defined in: [packages/pacer/src/throttler.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L14) Whether the throttler is waiting for the timeout to trigger execution @@ -45,7 +45,7 @@ Whether the throttler is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [throttler.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L17) +Defined in: [packages/pacer/src/throttler.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L18) The arguments from the most recent call to maybeExecute @@ -57,7 +57,7 @@ The arguments from the most recent call to maybeExecute lastExecutionTime: number; ``` -Defined in: [throttler.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L21) +Defined in: [packages/pacer/src/throttler.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L22) Timestamp of the last function execution in milliseconds @@ -69,7 +69,7 @@ Timestamp of the last function execution in milliseconds nextExecutionTime: undefined | number; ``` -Defined in: [throttler.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L25) +Defined in: [packages/pacer/src/throttler.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L26) Timestamp when the next execution can occur in milliseconds @@ -78,9 +78,9 @@ Timestamp when the next execution can occur in milliseconds ### status ```ts -status: "idle" | "pending" | "disabled"; +status: "disabled" | "idle" | "pending"; ``` -Defined in: [throttler.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L29) +Defined in: [packages/pacer/src/throttler.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L30) Current execution status - 'idle' when not active, 'pending' when waiting for timeout diff --git a/docs/reference/type-aliases/anyasyncfunction.md b/docs/reference/type-aliases/anyasyncfunction.md index 19b6a17d..8d277867 100644 --- a/docs/reference/type-aliases/anyasyncfunction.md +++ b/docs/reference/type-aliases/anyasyncfunction.md @@ -11,7 +11,7 @@ title: AnyAsyncFunction type AnyAsyncFunction = (...args) => Promise; ``` -Defined in: [types.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L9) +Defined in: [packages/pacer/src/types.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L9) Represents an asynchronous function that can be called with any arguments and returns a promise. diff --git a/docs/reference/type-aliases/anyfunction.md b/docs/reference/type-aliases/anyfunction.md index 039ac0e6..a05f98cc 100644 --- a/docs/reference/type-aliases/anyfunction.md +++ b/docs/reference/type-aliases/anyfunction.md @@ -11,7 +11,7 @@ title: AnyFunction type AnyFunction = (...args) => any; ``` -Defined in: [types.ts:4](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L4) +Defined in: [packages/pacer/src/types.ts:4](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L4) Represents a function that can be called with any arguments and returns any value. diff --git a/docs/reference/type-aliases/optionalkeys.md b/docs/reference/type-aliases/optionalkeys.md index e09cbfd2..f35b429c 100644 --- a/docs/reference/type-aliases/optionalkeys.md +++ b/docs/reference/type-aliases/optionalkeys.md @@ -11,7 +11,7 @@ title: OptionalKeys type OptionalKeys = Omit & Partial>; ``` -Defined in: [types.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L11) +Defined in: [packages/pacer/src/types.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L11) ## Type Parameters diff --git a/docs/reference/type-aliases/queueposition.md b/docs/reference/type-aliases/queueposition.md index 4bd7fef2..0e1000a2 100644 --- a/docs/reference/type-aliases/queueposition.md +++ b/docs/reference/type-aliases/queueposition.md @@ -11,7 +11,7 @@ title: QueuePosition type QueuePosition = "front" | "back"; ``` -Defined in: [queuer.ts:169](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L169) +Defined in: [packages/pacer/src/queuer.ts:170](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L170) Position type for addItem and getNextItem operations. diff --git a/docs/reference/variables/pacereventclient.md b/docs/reference/variables/pacereventclient.md new file mode 100644 index 00000000..a6659a46 --- /dev/null +++ b/docs/reference/variables/pacereventclient.md @@ -0,0 +1,14 @@ +--- +id: pacerEventClient +title: pacerEventClient +--- + + + +# Variable: pacerEventClient + +```ts +const pacerEventClient: PacerEventClient; +``` + +Defined in: [packages/pacer/src/event-client.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L35) diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index fbf100a9..01d48f25 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -33,4 +33,4 @@ "last 1 safari version" ] } -} \ No newline at end of file +} diff --git a/examples/react/queue/src/index.tsx b/examples/react/queue/src/index.tsx index 36f2921c..d1aace63 100644 --- a/examples/react/queue/src/index.tsx +++ b/examples/react/queue/src/index.tsx @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import ReactDOM from 'react-dom/client' -import { PacerDevtoolsPanel } from "@tanstack/pacer-react-devtools" -import { TanstackDevtools } from "@tanstack/react-devtools" +import { PacerDevtoolsPanel } from '@tanstack/pacer-react-devtools' +import { TanstackDevtools } from '@tanstack/react-devtools' import { queue } from '@tanstack/react-pacer/queuer' function App1() { @@ -213,10 +213,11 @@ root.render(
- } - ]} /> + }]} + />
, ) diff --git a/package.json b/package.json index 9629cf10..b8ea335a 100644 --- a/package.json +++ b/package.json @@ -84,4 +84,4 @@ "@tanstack/pacer-solid-devtools": "workspace:*", "@tanstack/pacer-react-devtools": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json index 771738de..76e56a33 100644 --- a/packages/pacer-devtools/package.json +++ b/packages/pacer-devtools/package.json @@ -66,4 +66,4 @@ "devDependencies": { "vite-plugin-solid": "^2.11.6" } -} \ No newline at end of file +} diff --git a/packages/pacer-devtools/src/context/context-provider.tsx b/packages/pacer-devtools/src/context/context-provider.tsx index da3fb154..5be12b52 100644 --- a/packages/pacer-devtools/src/context/context-provider.tsx +++ b/packages/pacer-devtools/src/context/context-provider.tsx @@ -1,52 +1,48 @@ - - -import { createStore } from "solid-js/store" -import { createEffect, onCleanup } from "solid-js" -import { pacerEventClient } from "@tanstack/pacer" -import { PacerContext, initialStore, } from "./context" -import type { PacerContextType } from "./context" +import { createStore } from 'solid-js/store' +import { createEffect, onCleanup } from 'solid-js' +import { pacerEventClient } from '@tanstack/pacer' +import { PacerContext, initialStore } from './context' +import type { PacerContextType } from './context' export function PacerContextProvider(props: { children: any }) { const [store, setStore] = createStore(initialStore) const updateStore = (newState: Partial) => { - setStore((prev) => ({ ...prev, ...newState })) } createEffect(() => { - const cleanup = pacerEventClient.onAllPluginEvents(e => { + const cleanup = pacerEventClient.onAllPluginEvents((e) => { switch (e.type) { - case "pacer:async-batcher-state": + case 'pacer:async-batcher-state': updateStore({ asyncBatcherState: e.payload }) - break; - case "pacer:async-debouncer-state": + break + case 'pacer:async-debouncer-state': updateStore({ asyncDebouncerState: e.payload }) - break; - case "pacer:async-queuer-state": + break + case 'pacer:async-queuer-state': updateStore({ asyncQueuerState: e.payload }) - break; - case "pacer:async-rate-limiter-state": + break + case 'pacer:async-rate-limiter-state': updateStore({ asyncRateLimiterState: e.payload }) - break; - case "pacer:async-throttler-state": + break + case 'pacer:async-throttler-state': updateStore({ asyncThrottlerState: e.payload }) - break; - case "pacer:batcher-state": + break + case 'pacer:batcher-state': updateStore({ batcherState: e.payload }) - break; - case "pacer:debouncer-state": + break + case 'pacer:debouncer-state': updateStore({ debouncerState: e.payload }) - break; - case "pacer:queuer-state": + break + case 'pacer:queuer-state': updateStore({ queuerState: e.payload }) - break; - case "pacer:rate-limiter-state": + break + case 'pacer:rate-limiter-state': updateStore({ rateLimiterState: e.payload }) - break; - case "pacer:throttler-state": + break + case 'pacer:throttler-state': updateStore({ throttlerState: e.payload }) - break; + break } - }) onCleanup(cleanup) }) @@ -56,5 +52,3 @@ export function PacerContextProvider(props: { children: any }) { ) } - - diff --git a/packages/pacer-devtools/src/context/context.ts b/packages/pacer-devtools/src/context/context.ts index ff1d9460..e2aac766 100644 --- a/packages/pacer-devtools/src/context/context.ts +++ b/packages/pacer-devtools/src/context/context.ts @@ -1,6 +1,16 @@ - -import { createContext } from "solid-js"; -import type { AsyncBatcherState, AsyncDebouncerState, AsyncQueuerState, AsyncRateLimiterState, AsyncThrottlerState, BatcherState, DebouncerState, QueuerState, RateLimiterState, ThrottlerState } from "@tanstack/pacer"; +import { createContext } from 'solid-js' +import type { + AsyncBatcherState, + AsyncDebouncerState, + AsyncQueuerState, + AsyncRateLimiterState, + AsyncThrottlerState, + BatcherState, + DebouncerState, + QueuerState, + RateLimiterState, + ThrottlerState, +} from '@tanstack/pacer' export interface PacerContextType { asyncBatcherState: AsyncBatcherState | undefined @@ -25,7 +35,9 @@ export const initialStore = { debouncerState: undefined, queuerState: undefined, rateLimiterState: undefined, - throttlerState: undefined + throttlerState: undefined, } -export const PacerContext = createContext<[PacerContextType, (newState: Partial) => void]>([initialStore, () => { }]) +export const PacerContext = createContext< + [PacerContextType, (newState: Partial) => void] +>([initialStore, () => {}]) diff --git a/packages/pacer-devtools/src/context/use-context-hooks.ts b/packages/pacer-devtools/src/context/use-context-hooks.ts index d25ac386..995dd54c 100644 --- a/packages/pacer-devtools/src/context/use-context-hooks.ts +++ b/packages/pacer-devtools/src/context/use-context-hooks.ts @@ -1,5 +1,5 @@ -import { useContext } from "solid-js" -import { PacerContext } from "./context" +import { useContext } from 'solid-js' +import { PacerContext } from './context' export const usePacerContext = () => { const context = useContext(PacerContext) @@ -10,4 +10,4 @@ export const usePacerContext = () => { export const usePacerState = () => { const [state] = usePacerContext() return state -} \ No newline at end of file +} diff --git a/packages/pacer-devtools/src/core.tsx b/packages/pacer-devtools/src/core.tsx index 73304cac..af026f1c 100644 --- a/packages/pacer-devtools/src/core.tsx +++ b/packages/pacer-devtools/src/core.tsx @@ -1,17 +1,14 @@ import { lazy } from 'solid-js' import { Portal, render } from 'solid-js/web' -export interface PacerDevtoolsInit { - -} +export interface PacerDevtoolsInit {} export class PacerDevtoolsCore { #isMounted = false #dispose?: () => void #Component: any - - constructor(_init?: PacerDevtoolsInit | undefined) { } + constructor(_init?: PacerDevtoolsInit | undefined) {} mount(el: T) { if (this.#isMounted) { diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/devtools.tsx index a6cafe54..3daff91e 100644 --- a/packages/pacer-devtools/src/devtools.tsx +++ b/packages/pacer-devtools/src/devtools.tsx @@ -1,6 +1,5 @@ - -import { usePacerState } from "./context/use-context-hooks" -import { PacerContextProvider } from "./context/context-provider" +import { usePacerState } from './context/use-context-hooks' +import { PacerContextProvider } from './context/context-provider' function Shell() { const state = usePacerState() @@ -18,4 +17,4 @@ export default function Devtools() { ) -} \ No newline at end of file +} diff --git a/packages/pacer-devtools/src/index.ts b/packages/pacer-devtools/src/index.ts index 3b1603f1..e5a55ba4 100644 --- a/packages/pacer-devtools/src/index.ts +++ b/packages/pacer-devtools/src/index.ts @@ -1,2 +1,2 @@ -export { PacerDevtoolsCore } from "./core" -export type { PacerDevtoolsInit } from "./core" \ No newline at end of file +export { PacerDevtoolsCore } from './core' +export type { PacerDevtoolsInit } from './core' diff --git a/packages/pacer-devtools/tsconfig.json b/packages/pacer-devtools/tsconfig.json index 4add0559..3ee4c951 100644 --- a/packages/pacer-devtools/tsconfig.json +++ b/packages/pacer-devtools/tsconfig.json @@ -3,6 +3,6 @@ "include": ["src", "eslint.config.js", "vite.config.ts", "tests"], "compilerOptions": { "jsx": "preserve", - "jsxImportSource": "solid-js", + "jsxImportSource": "solid-js" } } diff --git a/packages/pacer-devtools/vite.config.ts b/packages/pacer-devtools/vite.config.ts index 67121f71..e4e39edc 100644 --- a/packages/pacer-devtools/vite.config.ts +++ b/packages/pacer-devtools/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' -import solid from "vite-plugin-solid"; +import solid from 'vite-plugin-solid' import packageJson from './package.json' const config = defineConfig({ diff --git a/packages/pacer-react-devtools/package.json b/packages/pacer-react-devtools/package.json index 6b536fce..fd1d583e 100644 --- a/packages/pacer-react-devtools/package.json +++ b/packages/pacer-react-devtools/package.json @@ -72,4 +72,4 @@ "eslint-plugin-react-compiler": "19.1.0-rc.1", "eslint-plugin-react-hooks": "^5.2.0" } -} \ No newline at end of file +} diff --git a/packages/pacer-react-devtools/src/devtools.tsx b/packages/pacer-react-devtools/src/devtools.tsx index 0097fbd2..d4a1eef3 100644 --- a/packages/pacer-react-devtools/src/devtools.tsx +++ b/packages/pacer-react-devtools/src/devtools.tsx @@ -1,17 +1,12 @@ import React, { useEffect, useRef, useState } from 'react' -import { - PacerDevtoolsCore, -} from '@tanstack/pacer-devtools' - -export interface PacerDevtoolsReactInit { - -} +import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' +export interface PacerDevtoolsReactInit {} export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { const devToolRef = useRef(null) - const [devtools] = useState(() => new PacerDevtoolsCore({}),) + const [devtools] = useState(() => new PacerDevtoolsCore({})) useEffect(() => { if (devToolRef.current) { devtools.mount(devToolRef.current) @@ -20,7 +15,5 @@ export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { return () => devtools.unmount() }, [devtools]) - return ( -
- ) + return
} diff --git a/packages/pacer-react-devtools/src/index.ts b/packages/pacer-react-devtools/src/index.ts index d94438d3..550256c8 100644 --- a/packages/pacer-react-devtools/src/index.ts +++ b/packages/pacer-react-devtools/src/index.ts @@ -1 +1 @@ -export { PacerDevtoolsPanel } from "./devtools" \ No newline at end of file +export { PacerDevtoolsPanel } from './devtools' diff --git a/packages/pacer-react-devtools/tsconfig.json b/packages/pacer-react-devtools/tsconfig.json index ec5879b1..bf8f85d3 100644 --- a/packages/pacer-react-devtools/tsconfig.json +++ b/packages/pacer-react-devtools/tsconfig.json @@ -2,6 +2,6 @@ "extends": "../../tsconfig.json", "include": ["src", "eslint.config.js", "vite.config.ts", "tests"], "compilerOptions": { - "jsx": "react", + "jsx": "react" } } diff --git a/packages/pacer-react-devtools/vite.config.ts b/packages/pacer-react-devtools/vite.config.ts index d3b7a81d..ca307b89 100644 --- a/packages/pacer-react-devtools/vite.config.ts +++ b/packages/pacer-react-devtools/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' -import react from "@vitejs/plugin-react"; +import react from '@vitejs/plugin-react' import packageJson from './package.json' const config = defineConfig({ diff --git a/packages/pacer-solid-devtools/package.json b/packages/pacer-solid-devtools/package.json index 5efcf22f..d36b4058 100644 --- a/packages/pacer-solid-devtools/package.json +++ b/packages/pacer-solid-devtools/package.json @@ -66,4 +66,4 @@ "devDependencies": { "vite-plugin-solid": "^2.11.8" } -} \ No newline at end of file +} diff --git a/packages/pacer-solid-devtools/src/devtools.tsx b/packages/pacer-solid-devtools/src/devtools.tsx index 92046cec..598ad0ca 100644 --- a/packages/pacer-solid-devtools/src/devtools.tsx +++ b/packages/pacer-solid-devtools/src/devtools.tsx @@ -1,17 +1,11 @@ - import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' import { createSignal, onCleanup, onMount } from 'solid-js' -export interface PacerDevtoolsSolidInit { - -} +export interface PacerDevtoolsSolidInit {} export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { let devToolRef: HTMLDivElement | undefined - const [devtools] = createSignal( - new PacerDevtoolsCore({}), - - ) + const [devtools] = createSignal(new PacerDevtoolsCore({})) onMount(() => { if (devToolRef) { devtools().mount(devToolRef) @@ -22,7 +16,5 @@ export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { } }) - return ( -
- ) + return
} diff --git a/packages/pacer-solid-devtools/src/index.ts b/packages/pacer-solid-devtools/src/index.ts index d94438d3..550256c8 100644 --- a/packages/pacer-solid-devtools/src/index.ts +++ b/packages/pacer-solid-devtools/src/index.ts @@ -1 +1 @@ -export { PacerDevtoolsPanel } from "./devtools" \ No newline at end of file +export { PacerDevtoolsPanel } from './devtools' diff --git a/packages/pacer-solid-devtools/tsconfig.json b/packages/pacer-solid-devtools/tsconfig.json index 4add0559..3ee4c951 100644 --- a/packages/pacer-solid-devtools/tsconfig.json +++ b/packages/pacer-solid-devtools/tsconfig.json @@ -3,6 +3,6 @@ "include": ["src", "eslint.config.js", "vite.config.ts", "tests"], "compilerOptions": { "jsx": "preserve", - "jsxImportSource": "solid-js", + "jsxImportSource": "solid-js" } } diff --git a/packages/pacer-solid-devtools/vite.config.ts b/packages/pacer-solid-devtools/vite.config.ts index 67121f71..e4e39edc 100644 --- a/packages/pacer-solid-devtools/vite.config.ts +++ b/packages/pacer-solid-devtools/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' -import solid from "vite-plugin-solid"; +import solid from 'vite-plugin-solid' import packageJson from './package.json' const config = defineConfig({ diff --git a/packages/pacer/package.json b/packages/pacer/package.json index c2f90d8c..9feb887e 100644 --- a/packages/pacer/package.json +++ b/packages/pacer/package.json @@ -184,4 +184,4 @@ "@tanstack/devtools-event-client": "^0.2.1", "@tanstack/store": "^0.7.2" } -} \ No newline at end of file +} diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 793c82c6..7415e52d 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -264,7 +264,7 @@ export class AsyncBatcher { ? 'idle' : 'populated', } as const - pacerEventClient.emit("async-batcher-state", finalState) + pacerEventClient.emit('async-batcher-state', finalState) return finalState }) } diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index 5ecff13e..dfc5e31e 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -229,7 +229,7 @@ export class AsyncDebouncer { ? 'settled' : 'idle', } as const - pacerEventClient.emit("async-debouncer-state", finalState) + pacerEventClient.emit('async-debouncer-state', finalState) return finalState }) } diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index 71a7de50..4e3ba70e 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -323,7 +323,7 @@ export class AsyncQueuer { size, status, } as const - pacerEventClient.emit("async-queuer-state", finalState) + pacerEventClient.emit('async-queuer-state', finalState) return finalState }) } diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index 8f280e84..39dff211 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -246,12 +246,12 @@ export class AsyncRateLimiter { : isExceeded ? 'exceeded' : 'idle' - const finalState = { + const finalState = { ...combinedState, isExceeded, status, } as const - pacerEventClient.emit("async-rate-limiter-state", finalState) + pacerEventClient.emit('async-rate-limiter-state', finalState) return finalState }) } diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index e7c36901..af3395ab 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -240,7 +240,7 @@ export class AsyncThrottler { ? 'settled' : 'idle', } as const - pacerEventClient.emit("async-throttler-state", finalState) + pacerEventClient.emit('async-throttler-state', finalState) return finalState }) } diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index f25c7481..a7e4e0f8 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -170,14 +170,14 @@ export class Batcher { const { isPending, items } = combinedState const size = items.length const isEmpty = size === 0 - const finalState = { + const finalState = { ...combinedState, isEmpty, size, status: isPending ? 'pending' : 'idle', } as const - pacerEventClient.emit("batcher-state", finalState) + pacerEventClient.emit('batcher-state', finalState) return finalState }) } diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index 33029c30..ea242a2b 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -161,7 +161,7 @@ export class Debouncer { ? 'pending' : 'idle', } as const - pacerEventClient.emit("debouncer-state", finalState) + pacerEventClient.emit('debouncer-state', finalState) return finalState }) } diff --git a/packages/pacer/src/event-client.ts b/packages/pacer/src/event-client.ts index 754a1c46..8161cea2 100644 --- a/packages/pacer/src/event-client.ts +++ b/packages/pacer/src/event-client.ts @@ -1,37 +1,35 @@ -import { EventClient } from "@tanstack/devtools-event-client" -import type { AsyncBatcherState } from "./async-batcher" -import type { AsyncDebouncerState } from "./async-debouncer" -import type { AsyncQueuerState } from "./async-queuer" -import type { AsyncRateLimiterState } from "./async-rate-limiter" -import type { AsyncThrottlerState } from "./async-throttler" -import type { DebouncerState } from "./debouncer" -import type { BatcherState } from "./batcher" -import type { QueuerState } from "./queuer" -import type { RateLimiterState } from "./rate-limiter" -import type { ThrottlerState } from "./throttler" +import { EventClient } from '@tanstack/devtools-event-client' +import type { AsyncBatcherState } from './async-batcher' +import type { AsyncDebouncerState } from './async-debouncer' +import type { AsyncQueuerState } from './async-queuer' +import type { AsyncRateLimiterState } from './async-rate-limiter' +import type { AsyncThrottlerState } from './async-throttler' +import type { DebouncerState } from './debouncer' +import type { BatcherState } from './batcher' +import type { QueuerState } from './queuer' +import type { RateLimiterState } from './rate-limiter' +import type { ThrottlerState } from './throttler' export interface PacerEventMap { - "pacer:async-batcher-state": AsyncBatcherState - "pacer:async-debouncer-state": AsyncDebouncerState - "pacer:async-queuer-state": AsyncQueuerState - "pacer:async-rate-limiter-state": AsyncRateLimiterState - "pacer:async-throttler-state": AsyncThrottlerState - "pacer:batcher-state": BatcherState - "pacer:debouncer-state": DebouncerState - "pacer:queuer-state": QueuerState - "pacer:rate-limiter-state": RateLimiterState - "pacer:throttler-state": ThrottlerState + 'pacer:async-batcher-state': AsyncBatcherState + 'pacer:async-debouncer-state': AsyncDebouncerState + 'pacer:async-queuer-state': AsyncQueuerState + 'pacer:async-rate-limiter-state': AsyncRateLimiterState + 'pacer:async-throttler-state': AsyncThrottlerState + 'pacer:batcher-state': BatcherState + 'pacer:debouncer-state': DebouncerState + 'pacer:queuer-state': QueuerState + 'pacer:rate-limiter-state': RateLimiterState + 'pacer:throttler-state': ThrottlerState } export class PacerEventClient extends EventClient { - constructor(props?: { - debug: boolean - }) { + constructor(props?: { debug: boolean }) { super({ - pluginId: "pacer", - debug: props?.debug + pluginId: 'pacer', + debug: props?.debug, }) } } -export const pacerEventClient = new PacerEventClient() \ No newline at end of file +export const pacerEventClient = new PacerEventClient() diff --git a/packages/pacer/src/index.ts b/packages/pacer/src/index.ts index c599f9e8..9c630dd2 100644 --- a/packages/pacer/src/index.ts +++ b/packages/pacer/src/index.ts @@ -10,4 +10,4 @@ export * from './rate-limiter' export * from './throttler' export * from './types' export * from './utils' -export * from './event-client' \ No newline at end of file +export * from './event-client' diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index e9216751..b445fce7 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -305,8 +305,8 @@ export class Queuer { isIdle, size, status, - } as const - pacerEventClient.emit("queuer-state", finalState) + } as const + pacerEventClient.emit('queuer-state', finalState) return finalState }) } diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index 675df875..de2fd61f 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -174,7 +174,7 @@ export class RateLimiter { isExceeded, status, } as const - pacerEventClient.emit("rate-limiter-state", finalState) + pacerEventClient.emit('rate-limiter-state', finalState) return finalState }) } diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index 265eae5b..1e1b36f7 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -169,7 +169,7 @@ export class Throttler { ? 'pending' : 'idle', } as const - pacerEventClient.emit("throttler-state", finalState) + pacerEventClient.emit('throttler-state', finalState) return finalState }) } From 9b634593391159a66f38c1113c0a932db728740f Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Mon, 11 Aug 2025 11:30:42 +0200 Subject: [PATCH 08/50] chore: fix test issues --- examples/react/queue/package.json | 6 +- packages/pacer-devtools/package.json | 4 +- .../src/context/use-context-hooks.ts | 2 +- packages/pacer-devtools/tests/index.test.ts | 7 +++ .../pacer-react-devtools/eslint.config.js | 24 +++++++- packages/pacer-react-devtools/package.json | 6 +- .../pacer-react-devtools/src/devtools.tsx | 2 +- .../pacer-react-devtools/tests/index.test.ts | 7 +++ packages/pacer-solid-devtools/package.json | 2 +- .../pacer-solid-devtools/src/devtools.tsx | 2 +- .../pacer-solid-devtools/tests/index.test.ts | 7 +++ pnpm-lock.yaml | 56 ++----------------- 12 files changed, 60 insertions(+), 65 deletions(-) create mode 100644 packages/pacer-devtools/tests/index.test.ts create mode 100644 packages/pacer-react-devtools/tests/index.test.ts create mode 100644 packages/pacer-solid-devtools/tests/index.test.ts diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index fbf100a9..7206e62d 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -14,11 +14,11 @@ "react-dom": "^19.1.1" }, "devDependencies": { + "@tanstack/pacer-react-devtools": "0.14.0", + "@tanstack/react-devtools": "0.2.2", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^4.7.0", - "@tanstack/pacer-react-devtools": "0.14.0", - "@tanstack/react-devtools": "0.2.2", "vite": "^7.0.6" }, "browserslist": { @@ -33,4 +33,4 @@ "last 1 safari version" ] } -} \ No newline at end of file +} diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json index 771738de..4173606f 100644 --- a/packages/pacer-devtools/package.json +++ b/packages/pacer-devtools/package.json @@ -64,6 +64,6 @@ "solid-js": "^1.9.7" }, "devDependencies": { - "vite-plugin-solid": "^2.11.6" + "vite-plugin-solid": "^2.11.8" } -} \ No newline at end of file +} diff --git a/packages/pacer-devtools/src/context/use-context-hooks.ts b/packages/pacer-devtools/src/context/use-context-hooks.ts index d25ac386..52c943f9 100644 --- a/packages/pacer-devtools/src/context/use-context-hooks.ts +++ b/packages/pacer-devtools/src/context/use-context-hooks.ts @@ -1,7 +1,7 @@ import { useContext } from "solid-js" import { PacerContext } from "./context" -export const usePacerContext = () => { +const usePacerContext = () => { const context = useContext(PacerContext) return context diff --git a/packages/pacer-devtools/tests/index.test.ts b/packages/pacer-devtools/tests/index.test.ts new file mode 100644 index 00000000..54a212ef --- /dev/null +++ b/packages/pacer-devtools/tests/index.test.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from "vitest"; + +describe("test suite", () => { + it("should work", () => { + expect(true).toBe(true); + }) +}) \ No newline at end of file diff --git a/packages/pacer-react-devtools/eslint.config.js b/packages/pacer-react-devtools/eslint.config.js index e472c69e..3b8dc150 100644 --- a/packages/pacer-react-devtools/eslint.config.js +++ b/packages/pacer-react-devtools/eslint.config.js @@ -1,10 +1,32 @@ // @ts-check +import pluginReact from '@eslint-react/eslint-plugin' +import pluginReactCompiler from 'eslint-plugin-react-compiler' +import pluginReactHooks from 'eslint-plugin-react-hooks' import rootConfig from '../../eslint.config.js' export default [ ...rootConfig, { - rules: {}, + files: ['**/*.{ts,tsx}'], + ...pluginReact.configs.recommended, + }, + { + plugins: { + 'react-hooks': pluginReactHooks, + 'react-compiler': pluginReactCompiler, + }, + rules: { + '@eslint-react/dom/no-missing-button-type': 'off', + 'react-compiler/react-compiler': 'error', + 'react-hooks/exhaustive-deps': 'error', + 'react-hooks/rules-of-hooks': 'error', + }, + }, + { + files: ['**/__tests__/**'], + rules: { + // 'react-compiler/react-compiler': 'off', + }, }, ] diff --git a/packages/pacer-react-devtools/package.json b/packages/pacer-react-devtools/package.json index 6b536fce..5d3e2f62 100644 --- a/packages/pacer-react-devtools/package.json +++ b/packages/pacer-react-devtools/package.json @@ -67,9 +67,9 @@ "@tanstack/pacer-devtools": "workspace:*" }, "devDependencies": { + "@eslint-react/eslint-plugin": "^1.52.3", "@vitejs/plugin-react": "^4.7.0", - "@eslint-react/eslint-plugin": "^1.48.5", - "eslint-plugin-react-compiler": "19.1.0-rc.1", + "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0" } -} \ No newline at end of file +} diff --git a/packages/pacer-react-devtools/src/devtools.tsx b/packages/pacer-react-devtools/src/devtools.tsx index 0097fbd2..f7d38c12 100644 --- a/packages/pacer-react-devtools/src/devtools.tsx +++ b/packages/pacer-react-devtools/src/devtools.tsx @@ -3,7 +3,7 @@ import { PacerDevtoolsCore, } from '@tanstack/pacer-devtools' -export interface PacerDevtoolsReactInit { +interface PacerDevtoolsReactInit { } diff --git a/packages/pacer-react-devtools/tests/index.test.ts b/packages/pacer-react-devtools/tests/index.test.ts new file mode 100644 index 00000000..54a212ef --- /dev/null +++ b/packages/pacer-react-devtools/tests/index.test.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from "vitest"; + +describe("test suite", () => { + it("should work", () => { + expect(true).toBe(true); + }) +}) \ No newline at end of file diff --git a/packages/pacer-solid-devtools/package.json b/packages/pacer-solid-devtools/package.json index 5efcf22f..d36b4058 100644 --- a/packages/pacer-solid-devtools/package.json +++ b/packages/pacer-solid-devtools/package.json @@ -66,4 +66,4 @@ "devDependencies": { "vite-plugin-solid": "^2.11.8" } -} \ No newline at end of file +} diff --git a/packages/pacer-solid-devtools/src/devtools.tsx b/packages/pacer-solid-devtools/src/devtools.tsx index 92046cec..a6979bef 100644 --- a/packages/pacer-solid-devtools/src/devtools.tsx +++ b/packages/pacer-solid-devtools/src/devtools.tsx @@ -2,7 +2,7 @@ import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' import { createSignal, onCleanup, onMount } from 'solid-js' -export interface PacerDevtoolsSolidInit { +interface PacerDevtoolsSolidInit { } diff --git a/packages/pacer-solid-devtools/tests/index.test.ts b/packages/pacer-solid-devtools/tests/index.test.ts new file mode 100644 index 00000000..54a212ef --- /dev/null +++ b/packages/pacer-solid-devtools/tests/index.test.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from "vitest"; + +describe("test suite", () => { + it("should work", () => { + expect(true).toBe(true); + }) +}) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c922fce1..1de8954d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1564,7 +1564,7 @@ importers: version: 1.9.7 devDependencies: vite-plugin-solid: - specifier: ^2.11.6 + specifier: ^2.11.8 version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) packages/pacer-react-devtools: @@ -1586,14 +1586,14 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@eslint-react/eslint-plugin': - specifier: ^1.48.5 + specifier: ^1.52.3 version: 1.52.3(eslint@9.32.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^4.7.0 version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: - specifier: 19.1.0-rc.1 - version: 19.1.0-rc.1(eslint@9.32.0(jiti@2.4.2)) + specifier: 19.1.0-rc.2 + version: 19.1.0-rc.2(eslint@9.32.0(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: ^5.2.0 version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) @@ -3502,12 +3502,6 @@ packages: peerDependencies: eslint: ^9.0.0 - eslint-plugin-react-compiler@19.1.0-rc.1: - resolution: {integrity: sha512-3umw5eqZXapBl7aQGmvcjheKhUbsElb9jTETxRZg371e1LG4EPs/zCHt2JzP+wNcdaZWzjU/R730zPUJblY2zw==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} - peerDependencies: - eslint: '>=7' - eslint-plugin-react-compiler@19.1.0-rc.2: resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} @@ -5357,19 +5351,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.28.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.27.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-globals@7.28.0': {} '@babel/helper-member-expression-to-functions@7.25.9': @@ -5432,15 +5413,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: '@babel/traverse': 7.27.0 @@ -5486,14 +5458,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -7371,18 +7335,6 @@ snapshots: tinyglobby: 0.2.14 yaml-eslint-parser: 1.3.0 - eslint-plugin-react-compiler@19.1.0-rc.1(eslint@9.32.0(jiti@2.4.2)): - dependencies: - '@babel/core': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.0) - eslint: 9.32.0(jiti@2.4.2) - hermes-parser: 0.25.1 - zod: 3.25.72 - zod-validation-error: 3.4.0(zod@3.25.72) - transitivePeerDependencies: - - supports-color - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.32.0(jiti@2.4.2)): dependencies: '@babel/core': 7.26.10 From c60e383200d5850339f1b6233e72673927e7771e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 09:37:51 +0000 Subject: [PATCH 09/50] ci: apply automated fixes --- packages/pacer-devtools/tests/index.test.ts | 10 +++++----- packages/pacer-react-devtools/src/devtools.tsx | 2 +- packages/pacer-react-devtools/tests/index.test.ts | 10 +++++----- packages/pacer-solid-devtools/src/devtools.tsx | 2 +- packages/pacer-solid-devtools/tests/index.test.ts | 10 +++++----- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/pacer-devtools/tests/index.test.ts b/packages/pacer-devtools/tests/index.test.ts index 54a212ef..350ef3ad 100644 --- a/packages/pacer-devtools/tests/index.test.ts +++ b/packages/pacer-devtools/tests/index.test.ts @@ -1,7 +1,7 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from 'vitest' -describe("test suite", () => { - it("should work", () => { - expect(true).toBe(true); +describe('test suite', () => { + it('should work', () => { + expect(true).toBe(true) }) -}) \ No newline at end of file +}) diff --git a/packages/pacer-react-devtools/src/devtools.tsx b/packages/pacer-react-devtools/src/devtools.tsx index ed38931b..c2ab840d 100644 --- a/packages/pacer-react-devtools/src/devtools.tsx +++ b/packages/pacer-react-devtools/src/devtools.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from 'react' import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' -interface PacerDevtoolsReactInit { } +interface PacerDevtoolsReactInit {} export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { const devToolRef = useRef(null) diff --git a/packages/pacer-react-devtools/tests/index.test.ts b/packages/pacer-react-devtools/tests/index.test.ts index 54a212ef..350ef3ad 100644 --- a/packages/pacer-react-devtools/tests/index.test.ts +++ b/packages/pacer-react-devtools/tests/index.test.ts @@ -1,7 +1,7 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from 'vitest' -describe("test suite", () => { - it("should work", () => { - expect(true).toBe(true); +describe('test suite', () => { + it('should work', () => { + expect(true).toBe(true) }) -}) \ No newline at end of file +}) diff --git a/packages/pacer-solid-devtools/src/devtools.tsx b/packages/pacer-solid-devtools/src/devtools.tsx index 490e6045..4aad3e6b 100644 --- a/packages/pacer-solid-devtools/src/devtools.tsx +++ b/packages/pacer-solid-devtools/src/devtools.tsx @@ -1,7 +1,7 @@ import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' import { createSignal, onCleanup, onMount } from 'solid-js' -interface PacerDevtoolsSolidInit { } +interface PacerDevtoolsSolidInit {} export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { let devToolRef: HTMLDivElement | undefined diff --git a/packages/pacer-solid-devtools/tests/index.test.ts b/packages/pacer-solid-devtools/tests/index.test.ts index 54a212ef..350ef3ad 100644 --- a/packages/pacer-solid-devtools/tests/index.test.ts +++ b/packages/pacer-solid-devtools/tests/index.test.ts @@ -1,7 +1,7 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from 'vitest' -describe("test suite", () => { - it("should work", () => { - expect(true).toBe(true); +describe('test suite', () => { + it('should work', () => { + expect(true).toBe(true) }) -}) \ No newline at end of file +}) From a8f5096abde50a9cd5f77566222b29164694f386 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Mon, 11 Aug 2025 12:03:57 +0200 Subject: [PATCH 10/50] chore:fix render issue --- package.json | 2 +- .../src/context/context-provider.tsx | 26 +++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index b8ea335a..9629cf10 100644 --- a/package.json +++ b/package.json @@ -84,4 +84,4 @@ "@tanstack/pacer-solid-devtools": "workspace:*", "@tanstack/pacer-react-devtools": "workspace:*" } -} +} \ No newline at end of file diff --git a/packages/pacer-devtools/src/context/context-provider.tsx b/packages/pacer-devtools/src/context/context-provider.tsx index 5be12b52..3fd14931 100644 --- a/packages/pacer-devtools/src/context/context-provider.tsx +++ b/packages/pacer-devtools/src/context/context-provider.tsx @@ -6,48 +6,46 @@ import type { PacerContextType } from './context' export function PacerContextProvider(props: { children: any }) { const [store, setStore] = createStore(initialStore) - const updateStore = (newState: Partial) => { - setStore((prev) => ({ ...prev, ...newState })) - } + createEffect(() => { const cleanup = pacerEventClient.onAllPluginEvents((e) => { switch (e.type) { case 'pacer:async-batcher-state': - updateStore({ asyncBatcherState: e.payload }) + setStore({ asyncBatcherState: e.payload }) break case 'pacer:async-debouncer-state': - updateStore({ asyncDebouncerState: e.payload }) + setStore({ asyncDebouncerState: e.payload }) break case 'pacer:async-queuer-state': - updateStore({ asyncQueuerState: e.payload }) + setStore({ asyncQueuerState: e.payload }) break case 'pacer:async-rate-limiter-state': - updateStore({ asyncRateLimiterState: e.payload }) + setStore({ asyncRateLimiterState: e.payload }) break case 'pacer:async-throttler-state': - updateStore({ asyncThrottlerState: e.payload }) + setStore({ asyncThrottlerState: e.payload }) break case 'pacer:batcher-state': - updateStore({ batcherState: e.payload }) + setStore({ batcherState: e.payload }) break case 'pacer:debouncer-state': - updateStore({ debouncerState: e.payload }) + setStore({ debouncerState: e.payload }) break case 'pacer:queuer-state': - updateStore({ queuerState: e.payload }) + setStore({ queuerState: e.payload }) break case 'pacer:rate-limiter-state': - updateStore({ rateLimiterState: e.payload }) + setStore({ rateLimiterState: e.payload }) break case 'pacer:throttler-state': - updateStore({ throttlerState: e.payload }) + setStore({ throttlerState: e.payload }) break } }) onCleanup(cleanup) }) return ( - + {props.children} ) From 7badb9f339a56349b280f74eb64a44576b68e5a7 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 10:04:55 +0000 Subject: [PATCH 11/50] ci: apply automated fixes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9629cf10..b8ea335a 100644 --- a/package.json +++ b/package.json @@ -84,4 +84,4 @@ "@tanstack/pacer-solid-devtools": "workspace:*", "@tanstack/pacer-react-devtools": "workspace:*" } -} \ No newline at end of file +} From db96874ab4cbbe66aaf02fe4fd05e0bc86e9e8ff Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 18:57:07 +0000 Subject: [PATCH 12/50] ci: apply automated fixes --- .../reference/functions/pacerprovider.md | 24 ++ .../reference/functions/useasyncbatcher.md | 2 +- .../reference/functions/useasyncdebouncer.md | 2 +- .../reference/functions/useasyncqueuer.md | 2 +- .../functions/useasyncratelimiter.md | 2 +- .../reference/functions/useasyncretryer.md | 165 +++++++++++ .../reference/functions/useasyncthrottler.md | 2 +- .../react/reference/functions/usebatcher.md | 2 +- .../react/reference/functions/usedebouncer.md | 2 +- .../functions/usedefaultpaceroptions.md | 18 ++ .../reference/functions/usepacercontext.md | 18 ++ .../react/reference/functions/usequeuer.md | 2 +- .../reference/functions/useratelimiter.md | 2 +- .../react/reference/functions/usethrottler.md | 2 +- docs/framework/react/reference/index.md | 7 + .../interfaces/pacerprovideroptions.md | 120 ++++++++ .../interfaces/pacerproviderprops.md | 30 ++ .../reference/interfaces/reactasyncbatcher.md | 6 +- .../interfaces/reactasyncdebouncer.md | 6 +- .../reference/interfaces/reactasyncqueuer.md | 6 +- .../interfaces/reactasyncratelimiter.md | 6 +- .../reference/interfaces/reactasyncretryer.md | 50 ++++ .../interfaces/reactasyncthrottler.md | 6 +- .../reference/interfaces/reactbatcher.md | 6 +- .../reference/interfaces/reactdebouncer.md | 6 +- .../react/reference/interfaces/reactqueuer.md | 6 +- .../reference/interfaces/reactratelimiter.md | 6 +- .../reference/interfaces/reactthrottler.md | 6 +- docs/reference/classes/asyncbatcher.md | 34 ++- docs/reference/classes/asyncdebouncer.md | 30 +- docs/reference/classes/asyncqueuer.md | 48 ++-- docs/reference/classes/asyncratelimiter.md | 30 +- docs/reference/classes/asyncretryer.md | 225 +++++++++++++++ docs/reference/classes/asyncthrottler.md | 30 +- docs/reference/functions/asyncbatch.md | 2 +- docs/reference/functions/asyncdebounce.md | 2 +- docs/reference/functions/asyncqueue.md | 2 +- docs/reference/functions/asyncratelimit.md | 2 +- docs/reference/functions/asyncretry.md | 61 ++++ docs/reference/functions/asyncthrottle.md | 2 +- docs/reference/index.md | 4 + .../interfaces/asyncbatcheroptions.md | 34 ++- .../reference/interfaces/asyncbatcherstate.md | 30 +- .../interfaces/asyncdebounceroptions.md | 32 ++- .../interfaces/asyncdebouncerstate.md | 22 +- .../interfaces/asyncqueueroptions.md | 50 ++-- docs/reference/interfaces/asyncqueuerstate.md | 34 +-- .../interfaces/asyncratelimiteroptions.md | 34 ++- .../interfaces/asyncratelimiterstate.md | 22 +- .../interfaces/asyncretryeroptions.md | 264 ++++++++++++++++++ .../reference/interfaces/asyncretryerstate.md | 110 ++++++++ .../interfaces/asyncthrottleroptions.md | 32 ++- .../interfaces/asyncthrottlerstate.md | 24 +- docs/reference/interfaces/debouncerstate.md | 2 +- docs/reference/interfaces/ratelimiterstate.md | 2 +- docs/reference/interfaces/throttlerstate.md | 2 +- 56 files changed, 1442 insertions(+), 236 deletions(-) create mode 100644 docs/framework/react/reference/functions/pacerprovider.md create mode 100644 docs/framework/react/reference/functions/useasyncretryer.md create mode 100644 docs/framework/react/reference/functions/usedefaultpaceroptions.md create mode 100644 docs/framework/react/reference/functions/usepacercontext.md create mode 100644 docs/framework/react/reference/interfaces/pacerprovideroptions.md create mode 100644 docs/framework/react/reference/interfaces/pacerproviderprops.md create mode 100644 docs/framework/react/reference/interfaces/reactasyncretryer.md create mode 100644 docs/reference/classes/asyncretryer.md create mode 100644 docs/reference/functions/asyncretry.md create mode 100644 docs/reference/interfaces/asyncretryeroptions.md create mode 100644 docs/reference/interfaces/asyncretryerstate.md diff --git a/docs/framework/react/reference/functions/pacerprovider.md b/docs/framework/react/reference/functions/pacerprovider.md new file mode 100644 index 00000000..06e51a87 --- /dev/null +++ b/docs/framework/react/reference/functions/pacerprovider.md @@ -0,0 +1,24 @@ +--- +id: PacerProvider +title: PacerProvider +--- + + + +# Function: PacerProvider() + +```ts +function PacerProvider(__namedParameters): Element +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:43](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L43) + +## Parameters + +### \_\_namedParameters + +[`PacerProviderProps`](../../interfaces/pacerproviderprops.md) + +## Returns + +`Element` diff --git a/docs/framework/react/reference/functions/useasyncbatcher.md b/docs/framework/react/reference/functions/useasyncbatcher.md index c06c3070..11761a87 100644 --- a/docs/framework/react/reference/functions/useasyncbatcher.md +++ b/docs/framework/react/reference/functions/useasyncbatcher.md @@ -14,7 +14,7 @@ function useAsyncBatcher( selector): ReactAsyncBatcher ``` -Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:167](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts#L167) +Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:168](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts#L168) A React hook that creates an `AsyncBatcher` instance for managing asynchronous batches of items. diff --git a/docs/framework/react/reference/functions/useasyncdebouncer.md b/docs/framework/react/reference/functions/useasyncdebouncer.md index 696a696e..54fb45ac 100644 --- a/docs/framework/react/reference/functions/useasyncdebouncer.md +++ b/docs/framework/react/reference/functions/useasyncdebouncer.md @@ -14,7 +14,7 @@ function useAsyncDebouncer( selector): ReactAsyncDebouncer ``` -Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:149](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts#L149) +Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:150](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts#L150) A low-level React hook that creates an `AsyncDebouncer` instance to delay execution of an async function. diff --git a/docs/framework/react/reference/functions/useasyncqueuer.md b/docs/framework/react/reference/functions/useasyncqueuer.md index 96329a26..7e86e10b 100644 --- a/docs/framework/react/reference/functions/useasyncqueuer.md +++ b/docs/framework/react/reference/functions/useasyncqueuer.md @@ -14,7 +14,7 @@ function useAsyncQueuer( selector): ReactAsyncQueuer ``` -Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:167](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts#L167) +Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:168](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts#L168) A lower-level React hook that creates an `AsyncQueuer` instance for managing an async queue of items. diff --git a/docs/framework/react/reference/functions/useasyncratelimiter.md b/docs/framework/react/reference/functions/useasyncratelimiter.md index 0d6a2fbe..b209c15f 100644 --- a/docs/framework/react/reference/functions/useasyncratelimiter.md +++ b/docs/framework/react/reference/functions/useasyncratelimiter.md @@ -14,7 +14,7 @@ function useAsyncRateLimiter( selector): ReactAsyncRateLimiter ``` -Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:178](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts#L178) +Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:179](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts#L179) A low-level React hook that creates an `AsyncRateLimiter` instance to limit how many times an async function can execute within a time window. diff --git a/docs/framework/react/reference/functions/useasyncretryer.md b/docs/framework/react/reference/functions/useasyncretryer.md new file mode 100644 index 00000000..2b8a58be --- /dev/null +++ b/docs/framework/react/reference/functions/useasyncretryer.md @@ -0,0 +1,165 @@ +--- +id: useAsyncRetryer +title: useAsyncRetryer +--- + + + +# Function: useAsyncRetryer() + +```ts +function useAsyncRetryer( + fn, + options, +selector): ReactAsyncRetryer +``` + +Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:152](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L152) + +A low-level React hook that creates an `AsyncRetryer` instance to retry execution of an async function. + +This hook is designed to be flexible and state-management agnostic - it simply returns a retryer instance that +you can integrate with any state management solution (useState, Redux, Zustand, Jotai, etc). + +Async retrying automatically re-executes a failed async function up to a specified number of attempts with +configurable backoff strategies. This is useful for handling transient errors like network failures, temporary +server issues, or rate limiting where you want to automatically retry the operation. + +Error Handling: +- If an `onError` handler is provided, it will be called for every error during execution +- If an `onLastError` handler is provided, it will be called only for the final error after all retries fail +- If `throwOnError` is 'last' (default), only the final error after all retries will be thrown +- If `throwOnError` is true, every error will be thrown immediately (disables retrying) +- If `throwOnError` is false, errors are never thrown and undefined is returned instead + +## State Management and Selector + +The hook uses TanStack Store for reactive state management. The `selector` parameter allows you +to specify which state changes will trigger a re-render, optimizing performance by preventing +unnecessary re-renders when irrelevant state changes occur. + +**By default, there will be no reactive state subscriptions** and you must opt-in to state +tracking by providing a selector function. This prevents unnecessary re-renders and gives you +full control over when your component updates. Only when you provide a selector will the +component re-render when the selected state values change. + +Available state properties: +- `currentAttempt`: The current retry attempt number (0 when not executing) +- `executionCount`: Total number of completed executions (successful or failed) +- `isExecuting`: Whether the retryer is currently executing the function +- `lastError`: The most recent error encountered during execution +- `lastExecutionTime`: Timestamp of the last execution completion in milliseconds +- `lastResult`: The result from the most recent successful execution +- `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') +- `totalExecutionTime`: Total time spent executing (including retries) in milliseconds + +## Type Parameters + +• **TFn** *extends* `AnyAsyncFunction` + +• **TSelected** = \{\} + +## Parameters + +### fn + +`TFn` + +### options + +`AsyncRetryerOptions`\<`TFn`\> + +### selector + +(`state`) => `TSelected` + +## Returns + +[`ReactAsyncRetryer`](../../interfaces/reactasyncretryer.md)\<`TFn`, `TSelected`\> + +## Example + +```tsx +// Default behavior - no reactive state subscriptions +const apiRetryer = useAsyncRetryer( + async (userId: string) => { + const response = await fetch(`/api/users/${userId}`); + if (!response.ok) throw new Error('Failed to fetch user'); + return response.json(); + }, + { maxAttempts: 3, backoff: 'exponential' } +); + +// Opt-in to re-render when execution state changes (optimized for loading indicators) +const apiRetryer = useAsyncRetryer( + async (userId: string) => { + const response = await fetch(`/api/users/${userId}`); + if (!response.ok) throw new Error('Failed to fetch user'); + return response.json(); + }, + { maxAttempts: 3, backoff: 'exponential' }, + (state) => ({ + isExecuting: state.isExecuting, + currentAttempt: state.currentAttempt + }) +); + +// Opt-in to re-render when results are available (optimized for data display) +const apiRetryer = useAsyncRetryer( + async (userId: string) => { + const response = await fetch(`/api/users/${userId}`); + if (!response.ok) throw new Error('Failed to fetch user'); + return response.json(); + }, + { maxAttempts: 3, backoff: 'exponential' }, + (state) => ({ + lastResult: state.lastResult, + executionCount: state.executionCount + }) +); + +// Opt-in to re-render when error state changes (optimized for error handling) +const apiRetryer = useAsyncRetryer( + async (userId: string) => { + const response = await fetch(`/api/users/${userId}`); + if (!response.ok) throw new Error('Failed to fetch user'); + return response.json(); + }, + { + maxAttempts: 3, + backoff: 'exponential', + onError: (error) => console.error('API call failed:', error), + onLastError: (error) => console.error('All retries failed:', error) + }, + (state) => ({ + lastError: state.lastError, + status: state.status + }) +); + +// With state management +const [userData, setUserData] = useState(null); +const { execute, state } = useAsyncRetryer( + async (userId) => { + const response = await fetch(`/api/users/${userId}`); + if (!response.ok) throw new Error('Failed to fetch user'); + const data = await response.json(); + setUserData(data); + return data; + }, + { + maxAttempts: 5, + backoff: 'exponential', + baseWait: 1000, + onRetry: (attempt, error) => { + console.log(`Retry attempt ${attempt} after error:`, error); + }, + onError: (error) => { + console.error('Request failed:', error); + } + } +); + +// Access the selected state (will be empty object {} unless selector provided) +const { isExecuting, currentAttempt } = state; +``` diff --git a/docs/framework/react/reference/functions/useasyncthrottler.md b/docs/framework/react/reference/functions/useasyncthrottler.md index 5802d49c..1feb0fe4 100644 --- a/docs/framework/react/reference/functions/useasyncthrottler.md +++ b/docs/framework/react/reference/functions/useasyncthrottler.md @@ -14,7 +14,7 @@ function useAsyncThrottler( selector): ReactAsyncThrottler ``` -Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:160](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts#L160) +Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:161](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts#L161) A low-level React hook that creates an `AsyncThrottler` instance to limit how often an async function can execute. diff --git a/docs/framework/react/reference/functions/usebatcher.md b/docs/framework/react/reference/functions/usebatcher.md index 8ee2d6c9..f16ec58d 100644 --- a/docs/framework/react/reference/functions/usebatcher.md +++ b/docs/framework/react/reference/functions/usebatcher.md @@ -14,7 +14,7 @@ function useBatcher( selector): ReactBatcher ``` -Defined in: [react-pacer/src/batcher/useBatcher.ts:121](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/batcher/useBatcher.ts#L121) +Defined in: [react-pacer/src/batcher/useBatcher.ts:122](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/batcher/useBatcher.ts#L122) A React hook that creates and manages a Batcher instance. diff --git a/docs/framework/react/reference/functions/usedebouncer.md b/docs/framework/react/reference/functions/usedebouncer.md index b3f3d0b6..5281a2f6 100644 --- a/docs/framework/react/reference/functions/usedebouncer.md +++ b/docs/framework/react/reference/functions/usedebouncer.md @@ -14,7 +14,7 @@ function useDebouncer( selector): ReactDebouncer ``` -Defined in: [react-pacer/src/debouncer/useDebouncer.ts:102](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/debouncer/useDebouncer.ts#L102) +Defined in: [react-pacer/src/debouncer/useDebouncer.ts:103](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/debouncer/useDebouncer.ts#L103) A React hook that creates and manages a Debouncer instance. diff --git a/docs/framework/react/reference/functions/usedefaultpaceroptions.md b/docs/framework/react/reference/functions/usedefaultpaceroptions.md new file mode 100644 index 00000000..532cd830 --- /dev/null +++ b/docs/framework/react/reference/functions/usedefaultpaceroptions.md @@ -0,0 +1,18 @@ +--- +id: useDefaultPacerOptions +title: useDefaultPacerOptions +--- + + + +# Function: useDefaultPacerOptions() + +```ts +function useDefaultPacerOptions(): PacerProviderOptions +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:59](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L59) + +## Returns + +[`PacerProviderOptions`](../../interfaces/pacerprovideroptions.md) diff --git a/docs/framework/react/reference/functions/usepacercontext.md b/docs/framework/react/reference/functions/usepacercontext.md new file mode 100644 index 00000000..4937efd5 --- /dev/null +++ b/docs/framework/react/reference/functions/usepacercontext.md @@ -0,0 +1,18 @@ +--- +id: usePacerContext +title: usePacerContext +--- + + + +# Function: usePacerContext() + +```ts +function usePacerContext(): null | PacerContextValue +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:55](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L55) + +## Returns + +`null` \| `PacerContextValue` diff --git a/docs/framework/react/reference/functions/usequeuer.md b/docs/framework/react/reference/functions/usequeuer.md index 40d322ce..bdbe8fe2 100644 --- a/docs/framework/react/reference/functions/usequeuer.md +++ b/docs/framework/react/reference/functions/usequeuer.md @@ -14,7 +14,7 @@ function useQueuer( selector): ReactQueuer ``` -Defined in: [react-pacer/src/queuer/useQueuer.ts:132](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/queuer/useQueuer.ts#L132) +Defined in: [react-pacer/src/queuer/useQueuer.ts:133](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/queuer/useQueuer.ts#L133) A React hook that creates and manages a Queuer instance. diff --git a/docs/framework/react/reference/functions/useratelimiter.md b/docs/framework/react/reference/functions/useratelimiter.md index e59d9e0d..ac7316b0 100644 --- a/docs/framework/react/reference/functions/useratelimiter.md +++ b/docs/framework/react/reference/functions/useratelimiter.md @@ -14,7 +14,7 @@ function useRateLimiter( selector): ReactRateLimiter ``` -Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:141](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/rate-limiter/useRateLimiter.ts#L141) +Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:142](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/rate-limiter/useRateLimiter.ts#L142) A low-level React hook that creates a `RateLimiter` instance to enforce rate limits on function execution. diff --git a/docs/framework/react/reference/functions/usethrottler.md b/docs/framework/react/reference/functions/usethrottler.md index 666bebaa..601b3927 100644 --- a/docs/framework/react/reference/functions/usethrottler.md +++ b/docs/framework/react/reference/functions/usethrottler.md @@ -14,7 +14,7 @@ function useThrottler( selector): ReactThrottler ``` -Defined in: [react-pacer/src/throttler/useThrottler.ts:107](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/throttler/useThrottler.ts#L107) +Defined in: [react-pacer/src/throttler/useThrottler.ts:108](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/throttler/useThrottler.ts#L108) A low-level React hook that creates a `Throttler` instance that limits how often the provided function can execute. diff --git a/docs/framework/react/reference/index.md b/docs/framework/react/reference/index.md index 1ba0d014..b0415dcc 100644 --- a/docs/framework/react/reference/index.md +++ b/docs/framework/react/reference/index.md @@ -9,10 +9,13 @@ title: "@tanstack/react-pacer" ## Interfaces +- [PacerProviderOptions](../interfaces/pacerprovideroptions.md) +- [PacerProviderProps](../interfaces/pacerproviderprops.md) - [ReactAsyncBatcher](../interfaces/reactasyncbatcher.md) - [ReactAsyncDebouncer](../interfaces/reactasyncdebouncer.md) - [ReactAsyncQueuer](../interfaces/reactasyncqueuer.md) - [ReactAsyncRateLimiter](../interfaces/reactasyncratelimiter.md) +- [ReactAsyncRetryer](../interfaces/reactasyncretryer.md) - [ReactAsyncThrottler](../interfaces/reactasyncthrottler.md) - [ReactBatcher](../interfaces/reactbatcher.md) - [ReactDebouncer](../interfaces/reactdebouncer.md) @@ -22,6 +25,7 @@ title: "@tanstack/react-pacer" ## Functions +- [PacerProvider](../functions/pacerprovider.md) - [useAsyncBatchedCallback](../functions/useasyncbatchedcallback.md) - [useAsyncBatcher](../functions/useasyncbatcher.md) - [useAsyncDebouncedCallback](../functions/useasyncdebouncedcallback.md) @@ -30,6 +34,7 @@ title: "@tanstack/react-pacer" - [useAsyncQueuer](../functions/useasyncqueuer.md) - [useAsyncRateLimitedCallback](../functions/useasyncratelimitedcallback.md) - [useAsyncRateLimiter](../functions/useasyncratelimiter.md) +- [useAsyncRetryer](../functions/useasyncretryer.md) - [useAsyncThrottledCallback](../functions/useasyncthrottledcallback.md) - [useAsyncThrottler](../functions/useasyncthrottler.md) - [useBatchedCallback](../functions/usebatchedcallback.md) @@ -38,6 +43,8 @@ title: "@tanstack/react-pacer" - [useDebouncedState](../functions/usedebouncedstate.md) - [useDebouncedValue](../functions/usedebouncedvalue.md) - [useDebouncer](../functions/usedebouncer.md) +- [useDefaultPacerOptions](../functions/usedefaultpaceroptions.md) +- [usePacerContext](../functions/usepacercontext.md) - [useQueuedState](../functions/usequeuedstate.md) - [useQueuedValue](../functions/usequeuedvalue.md) - [useQueuer](../functions/usequeuer.md) diff --git a/docs/framework/react/reference/interfaces/pacerprovideroptions.md b/docs/framework/react/reference/interfaces/pacerprovideroptions.md new file mode 100644 index 00000000..f148c0bf --- /dev/null +++ b/docs/framework/react/reference/interfaces/pacerprovideroptions.md @@ -0,0 +1,120 @@ +--- +id: PacerProviderOptions +title: PacerProviderOptions +--- + + + +# Interface: PacerProviderOptions + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:18](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L18) + +## Properties + +### asyncBatcher? + +```ts +optional asyncBatcher: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:19](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L19) + +*** + +### asyncDebouncer? + +```ts +optional asyncDebouncer: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:20](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L20) + +*** + +### asyncQueuer? + +```ts +optional asyncQueuer: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:21](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L21) + +*** + +### asyncRateLimiter? + +```ts +optional asyncRateLimiter: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:22](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L22) + +*** + +### asyncRetryer? + +```ts +optional asyncRetryer: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:23](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L23) + +*** + +### asyncThrottler? + +```ts +optional asyncThrottler: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:24](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L24) + +*** + +### batcher? + +```ts +optional batcher: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:25](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L25) + +*** + +### debouncer? + +```ts +optional debouncer: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:26](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L26) + +*** + +### queuer? + +```ts +optional queuer: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:27](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L27) + +*** + +### rateLimiter? + +```ts +optional rateLimiter: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:28](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L28) + +*** + +### throttler? + +```ts +optional throttler: Partial>; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:29](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L29) diff --git a/docs/framework/react/reference/interfaces/pacerproviderprops.md b/docs/framework/react/reference/interfaces/pacerproviderprops.md new file mode 100644 index 00000000..49380176 --- /dev/null +++ b/docs/framework/react/reference/interfaces/pacerproviderprops.md @@ -0,0 +1,30 @@ +--- +id: PacerProviderProps +title: PacerProviderProps +--- + + + +# Interface: PacerProviderProps + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:38](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L38) + +## Properties + +### children + +```ts +children: ReactNode; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:39](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L39) + +*** + +### options? + +```ts +optional options: PacerProviderOptions; +``` + +Defined in: [react-pacer/src/provider/PacerProvider.tsx:40](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L40) diff --git a/docs/framework/react/reference/interfaces/reactasyncbatcher.md b/docs/framework/react/reference/interfaces/reactasyncbatcher.md index 3b603968..4335c3c5 100644 --- a/docs/framework/react/reference/interfaces/reactasyncbatcher.md +++ b/docs/framework/react/reference/interfaces/reactasyncbatcher.md @@ -7,7 +7,7 @@ title: ReactAsyncBatcher # Interface: ReactAsyncBatcher\ -Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:10](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts#L10) +Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:11](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts#L11) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:10](https://github readonly state: Readonly; ``` -Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:17](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts#L17) +Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:18](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts#L18) Reactive state that will be updated and re-rendered when the batcher state changes @@ -41,7 +41,7 @@ Use this instead of `batcher.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:23](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts#L23) +Defined in: [react-pacer/src/async-batcher/useAsyncBatcher.ts:24](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts#L24) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactasyncdebouncer.md b/docs/framework/react/reference/interfaces/reactasyncdebouncer.md index bb9bd246..12644ed1 100644 --- a/docs/framework/react/reference/interfaces/reactasyncdebouncer.md +++ b/docs/framework/react/reference/interfaces/reactasyncdebouncer.md @@ -7,7 +7,7 @@ title: ReactAsyncDebouncer # Interface: ReactAsyncDebouncer\ -Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:11](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts#L11) +Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:12](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts#L12) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:11](https://gi readonly state: Readonly; ``` -Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:20](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts#L20) +Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts#L21) Reactive state that will be updated and re-rendered when the debouncer state changes @@ -41,7 +41,7 @@ Use this instead of `debouncer.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts#L26) +Defined in: [react-pacer/src/async-debouncer/useAsyncDebouncer.ts:27](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts#L27) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactasyncqueuer.md b/docs/framework/react/reference/interfaces/reactasyncqueuer.md index a37023a9..f07b1116 100644 --- a/docs/framework/react/reference/interfaces/reactasyncqueuer.md +++ b/docs/framework/react/reference/interfaces/reactasyncqueuer.md @@ -7,7 +7,7 @@ title: ReactAsyncQueuer # Interface: ReactAsyncQueuer\ -Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts#L10) +Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:11](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts#L11) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:10](https://github.c readonly state: Readonly; ``` -Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:17](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts#L17) +Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts#L18) Reactive state that will be updated and re-rendered when the queuer state changes @@ -41,7 +41,7 @@ Use this instead of `queuer.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:23](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts#L23) +Defined in: [react-pacer/src/async-queuer/useAsyncQueuer.ts:24](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts#L24) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactasyncratelimiter.md b/docs/framework/react/reference/interfaces/reactasyncratelimiter.md index d226ec96..a69d42d2 100644 --- a/docs/framework/react/reference/interfaces/reactasyncratelimiter.md +++ b/docs/framework/react/reference/interfaces/reactasyncratelimiter.md @@ -7,7 +7,7 @@ title: ReactAsyncRateLimiter # Interface: ReactAsyncRateLimiter\ -Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:11](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts#L11) +Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:12](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts#L12) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:11](https readonly state: Readonly; ``` -Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:20](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts#L20) +Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:21](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts#L21) Reactive state that will be updated and re-rendered when the rate limiter state changes @@ -41,7 +41,7 @@ Use this instead of `rateLimiter.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:26](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts#L26) +Defined in: [react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts:27](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts#L27) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactasyncretryer.md b/docs/framework/react/reference/interfaces/reactasyncretryer.md new file mode 100644 index 00000000..586aa7e5 --- /dev/null +++ b/docs/framework/react/reference/interfaces/reactasyncretryer.md @@ -0,0 +1,50 @@ +--- +id: ReactAsyncRetryer +title: ReactAsyncRetryer +--- + + + +# Interface: ReactAsyncRetryer\ + +Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:12](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L12) + +## Extends + +- `Omit`\<`AsyncRetryer`\<`TFn`\>, `"store"`\> + +## Type Parameters + +• **TFn** *extends* `AnyAsyncFunction` + +• **TSelected** = \{\} + +## Properties + +### state + +```ts +readonly state: Readonly; +``` + +Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:19](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L19) + +Reactive state that will be updated and re-rendered when the retryer state changes + +Use this instead of `retryer.store.state` + +*** + +### ~~store~~ + +```ts +readonly store: Store>>; +``` + +Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L25) + +#### Deprecated + +Use `retryer.state` instead of `retryer.store.state` if you want to read reactive state. +The state on the store object is not reactive, as it has not been wrapped in a `useStore` hook internally. +Although, you can make the state reactive by using the `useStore` in your own usage. diff --git a/docs/framework/react/reference/interfaces/reactasyncthrottler.md b/docs/framework/react/reference/interfaces/reactasyncthrottler.md index b7d8b408..24902767 100644 --- a/docs/framework/react/reference/interfaces/reactasyncthrottler.md +++ b/docs/framework/react/reference/interfaces/reactasyncthrottler.md @@ -7,7 +7,7 @@ title: ReactAsyncThrottler # Interface: ReactAsyncThrottler\ -Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:11](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts#L11) +Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:12](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts#L12) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:11](https://gi readonly state: Readonly; ``` -Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:20](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts#L20) +Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:21](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts#L21) Reactive state that will be updated and re-rendered when the throttler state changes @@ -41,7 +41,7 @@ Use this instead of `throttler.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:26](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts#L26) +Defined in: [react-pacer/src/async-throttler/useAsyncThrottler.ts:27](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts#L27) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactbatcher.md b/docs/framework/react/reference/interfaces/reactbatcher.md index b1afe1ea..c231c1eb 100644 --- a/docs/framework/react/reference/interfaces/reactbatcher.md +++ b/docs/framework/react/reference/interfaces/reactbatcher.md @@ -7,7 +7,7 @@ title: ReactBatcher # Interface: ReactBatcher\ -Defined in: [react-pacer/src/batcher/useBatcher.ts:7](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/batcher/useBatcher.ts#L7) +Defined in: [react-pacer/src/batcher/useBatcher.ts:8](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/batcher/useBatcher.ts#L8) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/batcher/useBatcher.ts:7](https://github.com/TanStac readonly state: Readonly; ``` -Defined in: [react-pacer/src/batcher/useBatcher.ts:14](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/batcher/useBatcher.ts#L14) +Defined in: [react-pacer/src/batcher/useBatcher.ts:15](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/batcher/useBatcher.ts#L15) Reactive state that will be updated and re-rendered when the batcher state changes @@ -41,7 +41,7 @@ Use this instead of `batcher.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/batcher/useBatcher.ts:20](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/batcher/useBatcher.ts#L20) +Defined in: [react-pacer/src/batcher/useBatcher.ts:21](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/batcher/useBatcher.ts#L21) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactdebouncer.md b/docs/framework/react/reference/interfaces/reactdebouncer.md index 85cf17e6..c9c0dbf7 100644 --- a/docs/framework/react/reference/interfaces/reactdebouncer.md +++ b/docs/framework/react/reference/interfaces/reactdebouncer.md @@ -7,7 +7,7 @@ title: ReactDebouncer # Interface: ReactDebouncer\ -Defined in: [react-pacer/src/debouncer/useDebouncer.ts:11](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/debouncer/useDebouncer.ts#L11) +Defined in: [react-pacer/src/debouncer/useDebouncer.ts:12](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/debouncer/useDebouncer.ts#L12) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/debouncer/useDebouncer.ts:11](https://github.com/Ta readonly state: Readonly; ``` -Defined in: [react-pacer/src/debouncer/useDebouncer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/debouncer/useDebouncer.ts#L18) +Defined in: [react-pacer/src/debouncer/useDebouncer.ts:19](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/debouncer/useDebouncer.ts#L19) Reactive state that will be updated and re-rendered when the debouncer state changes @@ -41,7 +41,7 @@ Use this instead of `debouncer.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/debouncer/useDebouncer.ts:24](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/debouncer/useDebouncer.ts#L24) +Defined in: [react-pacer/src/debouncer/useDebouncer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/debouncer/useDebouncer.ts#L25) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactqueuer.md b/docs/framework/react/reference/interfaces/reactqueuer.md index e3ccdecf..34b3f68f 100644 --- a/docs/framework/react/reference/interfaces/reactqueuer.md +++ b/docs/framework/react/reference/interfaces/reactqueuer.md @@ -7,7 +7,7 @@ title: ReactQueuer # Interface: ReactQueuer\ -Defined in: [react-pacer/src/queuer/useQueuer.ts:7](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/queuer/useQueuer.ts#L7) +Defined in: [react-pacer/src/queuer/useQueuer.ts:8](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/queuer/useQueuer.ts#L8) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/queuer/useQueuer.ts:7](https://github.com/TanStack/ readonly state: Readonly; ``` -Defined in: [react-pacer/src/queuer/useQueuer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/queuer/useQueuer.ts#L14) +Defined in: [react-pacer/src/queuer/useQueuer.ts:15](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/queuer/useQueuer.ts#L15) Reactive state that will be updated and re-rendered when the queuer state changes @@ -41,7 +41,7 @@ Use this instead of `queuer.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/queuer/useQueuer.ts:20](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/queuer/useQueuer.ts#L20) +Defined in: [react-pacer/src/queuer/useQueuer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/queuer/useQueuer.ts#L21) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactratelimiter.md b/docs/framework/react/reference/interfaces/reactratelimiter.md index 3096a5dc..885732c3 100644 --- a/docs/framework/react/reference/interfaces/reactratelimiter.md +++ b/docs/framework/react/reference/interfaces/reactratelimiter.md @@ -7,7 +7,7 @@ title: ReactRateLimiter # Interface: ReactRateLimiter\ -Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:11](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/rate-limiter/useRateLimiter.ts#L11) +Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:12](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/rate-limiter/useRateLimiter.ts#L12) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:11](https://github.c readonly state: Readonly; ``` -Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:18](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/rate-limiter/useRateLimiter.ts#L18) +Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:19](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/rate-limiter/useRateLimiter.ts#L19) Reactive state that will be updated and re-rendered when the rate limiter state changes @@ -41,7 +41,7 @@ Use this instead of `rateLimiter.store.state` readonly store: Store>; ``` -Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:24](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/rate-limiter/useRateLimiter.ts#L24) +Defined in: [react-pacer/src/rate-limiter/useRateLimiter.ts:25](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/rate-limiter/useRateLimiter.ts#L25) #### Deprecated diff --git a/docs/framework/react/reference/interfaces/reactthrottler.md b/docs/framework/react/reference/interfaces/reactthrottler.md index 14ea1336..d90fc71f 100644 --- a/docs/framework/react/reference/interfaces/reactthrottler.md +++ b/docs/framework/react/reference/interfaces/reactthrottler.md @@ -7,7 +7,7 @@ title: ReactThrottler # Interface: ReactThrottler\ -Defined in: [react-pacer/src/throttler/useThrottler.ts:11](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/throttler/useThrottler.ts#L11) +Defined in: [react-pacer/src/throttler/useThrottler.ts:12](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/throttler/useThrottler.ts#L12) ## Extends @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/throttler/useThrottler.ts:11](https://github.com/Ta readonly state: Readonly; ``` -Defined in: [react-pacer/src/throttler/useThrottler.ts:18](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/throttler/useThrottler.ts#L18) +Defined in: [react-pacer/src/throttler/useThrottler.ts:19](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/throttler/useThrottler.ts#L19) Reactive state that will be updated and re-rendered when the throttler state changes @@ -41,7 +41,7 @@ Use this instead of `throttler.store.state` readonly store: Store>>; ``` -Defined in: [react-pacer/src/throttler/useThrottler.ts:24](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/throttler/useThrottler.ts#L24) +Defined in: [react-pacer/src/throttler/useThrottler.ts:25](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/throttler/useThrottler.ts#L25) #### Deprecated diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index 72e66ddf..cacfbfc5 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -7,7 +7,7 @@ title: AsyncBatcher # Class: AsyncBatcher\ -Defined in: [async-batcher.ts:219](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L219) +Defined in: [async-batcher.ts:230](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L230) A class that collects items and processes them in batches asynchronously. @@ -82,7 +82,7 @@ batcher.addItem(2); new AsyncBatcher(fn, initialOptions): AsyncBatcher ``` -Defined in: [async-batcher.ts:226](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L226) +Defined in: [async-batcher.ts:238](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L238) #### Parameters @@ -100,13 +100,23 @@ Defined in: [async-batcher.ts:226](https://github.com/TanStack/pacer/blob/main/p ## Properties +### asyncRetryer + +```ts +asyncRetryer: AsyncRetryer<(items) => Promise>; +``` + +Defined in: [async-batcher.ts:235](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L235) + +*** + ### fn() ```ts fn: (items) => Promise; ``` -Defined in: [async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L227) +Defined in: [async-batcher.ts:239](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L239) #### Parameters @@ -126,7 +136,7 @@ Defined in: [async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/p options: AsyncBatcherOptionsWithOptionalCallbacks; ``` -Defined in: [async-batcher.ts:223](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L223) +Defined in: [async-batcher.ts:234](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L234) *** @@ -136,7 +146,7 @@ Defined in: [async-batcher.ts:223](https://github.com/TanStack/pacer/blob/main/p readonly store: Store>>; ``` -Defined in: [async-batcher.ts:220](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L220) +Defined in: [async-batcher.ts:231](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L231) ## Methods @@ -146,7 +156,7 @@ Defined in: [async-batcher.ts:220](https://github.com/TanStack/pacer/blob/main/p addItem(item): void ``` -Defined in: [async-batcher.ts:277](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L277) +Defined in: [async-batcher.ts:293](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L293) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -169,7 +179,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [async-batcher.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L378) +Defined in: [async-batcher.ts:394](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L394) Removes all items from the async batcher @@ -185,7 +195,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [async-batcher.ts:352](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L352) +Defined in: [async-batcher.ts:368](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L368) Processes the current batch of items immediately @@ -201,7 +211,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [async-batcher.ts:360](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L360) +Defined in: [async-batcher.ts:376](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L376) Returns a copy of all items in the async batcher @@ -217,7 +227,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [async-batcher.ts:364](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L364) +Defined in: [async-batcher.ts:380](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L380) #### Returns @@ -231,7 +241,7 @@ Defined in: [async-batcher.ts:364](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:385](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L385) +Defined in: [async-batcher.ts:401](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L401) Resets the async batcher state to its default values @@ -247,7 +257,7 @@ Resets the async batcher state to its default values setOptions(newOptions): void ``` -Defined in: [async-batcher.ts:241](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L241) +Defined in: [async-batcher.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L257) Updates the async batcher options diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index 4be9dab3..411ff090 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -7,7 +7,7 @@ title: AsyncDebouncer # Class: AsyncDebouncer\ -Defined in: [async-debouncer.ts:177](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L177) +Defined in: [async-debouncer.ts:186](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L186) A class that creates an async debounced function. @@ -66,7 +66,7 @@ const results = await asyncDebouncer.maybeExecute(inputElement.value); new AsyncDebouncer(fn, initialOptions): AsyncDebouncer ``` -Defined in: [async-debouncer.ts:188](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L188) +Defined in: [async-debouncer.ts:197](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L197) #### Parameters @@ -84,13 +84,23 @@ Defined in: [async-debouncer.ts:188](https://github.com/TanStack/pacer/blob/main ## Properties +### asyncRetryer + +```ts +asyncRetryer: AsyncRetryer; +``` + +Defined in: [async-debouncer.ts:191](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L191) + +*** + ### fn ```ts fn: TFn; ``` -Defined in: [async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L189) +Defined in: [async-debouncer.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L198) *** @@ -100,7 +110,7 @@ Defined in: [async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main options: AsyncDebouncerOptions; ``` -Defined in: [async-debouncer.ts:181](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L181) +Defined in: [async-debouncer.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L190) *** @@ -110,7 +120,7 @@ Defined in: [async-debouncer.ts:181](https://github.com/TanStack/pacer/blob/main readonly store: Store>>; ``` -Defined in: [async-debouncer.ts:178](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L178) +Defined in: [async-debouncer.ts:187](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L187) ## Methods @@ -120,7 +130,7 @@ Defined in: [async-debouncer.ts:178](https://github.com/TanStack/pacer/blob/main cancel(): void ``` -Defined in: [async-debouncer.ts:387](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L387) +Defined in: [async-debouncer.ts:395](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L395) Cancels any pending execution or aborts any execution in progress @@ -136,7 +146,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-debouncer.ts:339](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L339) +Defined in: [async-debouncer.ts:350](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L350) Processes the current pending execution immediately @@ -152,7 +162,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-debouncer.ts:262](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L262) +Defined in: [async-debouncer.ts:275](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L275) Attempts to execute the debounced function. If a call is already in progress, it will be queued. @@ -188,7 +198,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [async-debouncer.ts:396](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L396) +Defined in: [async-debouncer.ts:404](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L404) Resets the debouncer state to its default values @@ -204,7 +214,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-debouncer.ts:203](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L203) +Defined in: [async-debouncer.ts:216](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L216) Updates the async debouncer options diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index 797f7e4f..fa8710c1 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -7,7 +7,7 @@ title: AsyncQueuer # Class: AsyncQueuer\ -Defined in: [async-queuer.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L259) +Defined in: [async-queuer.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L268) A flexible asynchronous queue for processing tasks with configurable concurrency, priority, and expiration. @@ -71,7 +71,7 @@ asyncQueuer.start(); new AsyncQueuer(fn, initialOptions): AsyncQueuer ``` -Defined in: [async-queuer.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L266) +Defined in: [async-queuer.ts:276](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L276) #### Parameters @@ -89,13 +89,23 @@ Defined in: [async-queuer.ts:266](https://github.com/TanStack/pacer/blob/main/pa ## Properties +### asyncRetryer + +```ts +asyncRetryer: AsyncRetryer<(item) => Promise>; +``` + +Defined in: [async-queuer.ts:273](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L273) + +*** + ### fn() ```ts fn: (item) => Promise; ``` -Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L267) +Defined in: [async-queuer.ts:277](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L277) #### Parameters @@ -115,7 +125,7 @@ Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/pa options: AsyncQueuerOptions; ``` -Defined in: [async-queuer.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L263) +Defined in: [async-queuer.ts:272](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L272) *** @@ -125,7 +135,7 @@ Defined in: [async-queuer.ts:263](https://github.com/TanStack/pacer/blob/main/pa readonly store: Store>>; ``` -Defined in: [async-queuer.ts:260](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L260) +Defined in: [async-queuer.ts:269](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L269) ## Methods @@ -138,7 +148,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [async-queuer.ts:400](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L400) +Defined in: [async-queuer.ts:414](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L414) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -176,7 +186,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [async-queuer.ts:704](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L704) +Defined in: [async-queuer.ts:718](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L718) Removes all pending items from the queue. Does not affect active tasks. @@ -192,7 +202,7 @@ Removes all pending items from the queue. Does not affect active tasks. execute(position?): Promise ``` -Defined in: [async-queuer.ts:526](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L526) +Defined in: [async-queuer.ts:540](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L540) Removes and returns the next item from the queue and executes the task function with it. @@ -222,7 +232,7 @@ queuer.execute('back'); flush(numberOfItems, position?): Promise ``` -Defined in: [async-queuer.ts:561](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L561) +Defined in: [async-queuer.ts:575](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L575) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -249,7 +259,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): Promise ``` -Defined in: [async-queuer.ts:575](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L575) +Defined in: [async-queuer.ts:589](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L589) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -272,7 +282,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:479](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L479) +Defined in: [async-queuer.ts:493](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L493) Removes and returns the next item from the queue without executing the task function. Use for manual queue management. Normally, use execute() to process items. @@ -304,7 +314,7 @@ queuer.getNextItem('back'); peekActiveItems(): TValue[] ``` -Defined in: [async-queuer.ts:667](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L667) +Defined in: [async-queuer.ts:681](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L681) Returns the items currently being processed (active tasks). @@ -320,7 +330,7 @@ Returns the items currently being processed (active tasks). peekAllItems(): TValue[] ``` -Defined in: [async-queuer.ts:660](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L660) +Defined in: [async-queuer.ts:674](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L674) Returns a copy of all items in the queue, including active and pending items. @@ -336,7 +346,7 @@ Returns a copy of all items in the queue, including active and pending items. peekNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:650](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L650) +Defined in: [async-queuer.ts:664](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L664) Returns the next item in the queue without removing it. @@ -365,7 +375,7 @@ queuer.peekNextItem('back'); // back peekPendingItems(): TValue[] ``` -Defined in: [async-queuer.ts:674](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L674) +Defined in: [async-queuer.ts:688](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L688) Returns the items waiting to be processed (pending tasks). @@ -381,7 +391,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [async-queuer.ts:712](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L712) +Defined in: [async-queuer.ts:726](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L726) Resets the queuer state to its default values @@ -397,7 +407,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [async-queuer.ts:298](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L298) +Defined in: [async-queuer.ts:312](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L312) Updates the queuer options. New options are merged with existing options. @@ -419,7 +429,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [async-queuer.ts:681](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L681) +Defined in: [async-queuer.ts:695](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L695) Starts processing items in the queue. If already running, does nothing. @@ -435,7 +445,7 @@ Starts processing items in the queue. If already running, does nothing. stop(): void ``` -Defined in: [async-queuer.ts:691](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L691) +Defined in: [async-queuer.ts:705](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L705) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index 9e1c68cd..a3dcb267 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -7,7 +7,7 @@ title: AsyncRateLimiter # Class: AsyncRateLimiter\ -Defined in: [async-rate-limiter.ts:205](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L205) +Defined in: [async-rate-limiter.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L214) A class that creates an async rate-limited function. @@ -87,7 +87,7 @@ const data = await rateLimiter.maybeExecute('123'); new AsyncRateLimiter(fn, initialOptions): AsyncRateLimiter ``` -Defined in: [async-rate-limiter.ts:212](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L212) +Defined in: [async-rate-limiter.ts:222](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L222) #### Parameters @@ -105,13 +105,23 @@ Defined in: [async-rate-limiter.ts:212](https://github.com/TanStack/pacer/blob/m ## Properties +### asyncRetryer + +```ts +asyncRetryer: AsyncRetryer; +``` + +Defined in: [async-rate-limiter.ts:219](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L219) + +*** + ### fn ```ts fn: TFn; ``` -Defined in: [async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L213) +Defined in: [async-rate-limiter.ts:223](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L223) *** @@ -121,7 +131,7 @@ Defined in: [async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/m options: AsyncRateLimiterOptions; ``` -Defined in: [async-rate-limiter.ts:209](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L209) +Defined in: [async-rate-limiter.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L218) *** @@ -131,7 +141,7 @@ Defined in: [async-rate-limiter.ts:209](https://github.com/TanStack/pacer/blob/m readonly store: Store>>; ``` -Defined in: [async-rate-limiter.ts:206](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L206) +Defined in: [async-rate-limiter.ts:215](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L215) ## Methods @@ -141,7 +151,7 @@ Defined in: [async-rate-limiter.ts:206](https://github.com/TanStack/pacer/blob/m getMsUntilNextWindow(): number ``` -Defined in: [async-rate-limiter.ts:433](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L433) +Defined in: [async-rate-limiter.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L447) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -159,7 +169,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [async-rate-limiter.ts:423](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L423) +Defined in: [async-rate-limiter.ts:437](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L437) Returns the number of remaining executions allowed in the current window @@ -175,7 +185,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [async-rate-limiter.ts:302](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L302) +Defined in: [async-rate-limiter.ts:316](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L316) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -223,7 +233,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [async-rate-limiter.ts:444](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L444) +Defined in: [async-rate-limiter.ts:458](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L458) Resets the rate limiter state @@ -239,7 +249,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [async-rate-limiter.ts:230](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L230) +Defined in: [async-rate-limiter.ts:244](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L244) Updates the async rate limiter options diff --git a/docs/reference/classes/asyncretryer.md b/docs/reference/classes/asyncretryer.md new file mode 100644 index 00000000..20cc7e58 --- /dev/null +++ b/docs/reference/classes/asyncretryer.md @@ -0,0 +1,225 @@ +--- +id: AsyncRetryer +title: AsyncRetryer +--- + + + +# Class: AsyncRetryer\ + +Defined in: [async-retryer.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L198) + +Provides robust retry functionality for asynchronous functions, supporting configurable backoff strategies, +attempt limits, and detailed state management. The AsyncRetryer class is designed to help you reliably +execute async operations that may fail intermittently, such as network requests or database operations, +by automatically retrying them according to your chosen policy. + +## Retrying Concepts + +- **Retrying**: Automatically re-executes a failed async function up to a specified number of attempts. + Useful for handling transient errors (e.g., network flakiness, rate limits, temporary server issues). +- **Backoff Strategies**: Controls the delay between retry attempts (default: `'exponential'`): + - `'exponential'`: Wait time doubles with each attempt (1s, 2s, 4s, ...) - **DEFAULT** + - `'linear'`: Wait time increases linearly (1s, 2s, 3s, ...) + - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt +- **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. If cancelled, retries are stopped. +- **State Management**: Tracks execution status, current attempt, last error, and result using TanStack Store. +- **Callbacks**: Provides hooks for handling success, error, retry, and settled events. + +## State Management +- Uses TanStack Store for fine-grained reactivity. +- State includes: `isExecuting`, `currentAttempt`, `lastError`, `lastResult`, and `status` (`idle`, `executing`, `retrying`, `disabled`). +- State can be accessed via the `store.state` property. + +## Error Handling +The `throwOnError` option controls when errors are thrown (default: `'last'`): +- `'last'`: Only throws the final error after all retries are exhausted - **DEFAULT** +- `true`: Throws every error immediately (no retries) +- `false`: Never throws errors, returns `undefined` instead + +Additional error handling: +- `onError`: Called for every error (including during retries) +- `onLastError`: Called only for the final error after all retries fail +- If `onError` is provided but `throwOnError` is not specified, defaults to `'last'` + +## Usage +- Use for async operations that may fail transiently and benefit from retrying. +- Configure `maxAttempts`, `backoff`, and `baseWait` to control retry behavior. +- Use `onRetry`, `onSuccess`, `onError`, and `onSettled` for custom side effects. + +## Example + +```typescript +// Retry a fetch operation up to 5 times with exponential backoff +const retryer = new AsyncRetryer(fetchData, { + maxAttempts: 5, + backoff: 'exponential', + baseWait: 1000, + onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), + onSuccess: (result) => console.log('Success:', result), + onError: (error) => console.error('Error:', error), + onLastError: (error) => console.error('All retries failed:', error), +}) + +const result = await retryer.execute(userId) +``` + +## Type Parameters + +• **TFn** *extends* [`AnyAsyncFunction`](../../type-aliases/anyasyncfunction.md) + +The async function type to be retried. + +## Constructors + +### new AsyncRetryer() + +```ts +new AsyncRetryer(fn, initialOptions): AsyncRetryer +``` + +Defined in: [async-retryer.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L210) + +Creates a new AsyncRetryer instance + +#### Parameters + +##### fn + +`TFn` + +The async function to retry + +##### initialOptions + +[`AsyncRetryerOptions`](../../interfaces/asyncretryeroptions.md)\<`TFn`\> = `{}` + +Configuration options for the retryer + +#### Returns + +[`AsyncRetryer`](../asyncretryer.md)\<`TFn`\> + +## Properties + +### fn + +```ts +fn: TFn; +``` + +Defined in: [async-retryer.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L211) + +The async function to retry + +*** + +### options + +```ts +options: AsyncRetryerOptions & Omit>, + | "initialState" + | "onError" + | "onLastError" + | "onRetry" + | "onSettled" +| "onSuccess">; +``` + +Defined in: [async-retryer.ts:202](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L202) + +*** + +### store + +```ts +readonly store: Store>>; +``` + +Defined in: [async-retryer.ts:199](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L199) + +## Methods + +### cancel() + +```ts +cancel(): void +``` + +Defined in: [async-retryer.ts:395](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L395) + +Cancels the current execution and any pending retries + +#### Returns + +`void` + +*** + +### execute() + +```ts +execute(...args): Promise> +``` + +Defined in: [async-retryer.ts:284](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L284) + +Executes the function with retry logic + +#### Parameters + +##### args + +...`Parameters`\<`TFn`\> + +Arguments to pass to the function + +#### Returns + +`Promise`\<`undefined` \| `ReturnType`\<`TFn`\>\> + +The function result, or undefined if disabled or all retries failed (when throwOnError is false) + +#### Throws + +The last error if throwOnError is true and all retries fail + +*** + +### reset() + +```ts +reset(): void +``` + +Defined in: [async-retryer.ts:409](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L409) + +Resets the retryer to its initial state and cancels any ongoing execution + +#### Returns + +`void` + +*** + +### setOptions() + +```ts +setOptions(newOptions): void +``` + +Defined in: [async-retryer.ts:228](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L228) + +Updates the retryer options + +#### Parameters + +##### newOptions + +`Partial`\<[`AsyncRetryerOptions`](../../interfaces/asyncretryeroptions.md)\<`TFn`\>\> + +Partial options to merge with existing options + +#### Returns + +`void` diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index cd73bfeb..50440785 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -7,7 +7,7 @@ title: AsyncThrottler # Class: AsyncThrottler\ -Defined in: [async-throttler.ts:188](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L188) +Defined in: [async-throttler.ts:197](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L197) A class that creates an async throttled function. @@ -69,7 +69,7 @@ const result = await throttler.maybeExecute(inputElement.value); new AsyncThrottler(fn, initialOptions): AsyncThrottler ``` -Defined in: [async-throttler.ts:199](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L199) +Defined in: [async-throttler.ts:208](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L208) #### Parameters @@ -87,13 +87,23 @@ Defined in: [async-throttler.ts:199](https://github.com/TanStack/pacer/blob/main ## Properties +### asyncRetryer + +```ts +asyncRetryer: AsyncRetryer; +``` + +Defined in: [async-throttler.ts:202](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L202) + +*** + ### fn ```ts fn: TFn; ``` -Defined in: [async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L200) +Defined in: [async-throttler.ts:209](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L209) *** @@ -103,7 +113,7 @@ Defined in: [async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main options: AsyncThrottlerOptions; ``` -Defined in: [async-throttler.ts:192](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L192) +Defined in: [async-throttler.ts:201](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L201) *** @@ -113,7 +123,7 @@ Defined in: [async-throttler.ts:192](https://github.com/TanStack/pacer/blob/main readonly store: Store>>; ``` -Defined in: [async-throttler.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L189) +Defined in: [async-throttler.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L198) ## Methods @@ -123,7 +133,7 @@ Defined in: [async-throttler.ts:189](https://github.com/TanStack/pacer/blob/main cancel(): void ``` -Defined in: [async-throttler.ts:422](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L422) +Defined in: [async-throttler.ts:430](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L430) Cancels any pending execution or aborts any execution in progress @@ -139,7 +149,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-throttler.ts:371](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L371) +Defined in: [async-throttler.ts:382](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L382) Processes the current pending execution immediately @@ -155,7 +165,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-throttler.ts:281](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L281) +Defined in: [async-throttler.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L294) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -197,7 +207,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [async-throttler.ts:430](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L430) +Defined in: [async-throttler.ts:438](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L438) Resets the debouncer state to its default values @@ -213,7 +223,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-throttler.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L214) +Defined in: [async-throttler.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L227) Updates the async throttler options diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index c97f6e49..d3bf8d00 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,7 +11,7 @@ title: asyncBatch function asyncBatch(fn, options): (item) => void ``` -Defined in: [async-batcher.ts:440](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L440) +Defined in: [async-batcher.ts:456](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L456) Creates an async batcher that processes items in batches diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index c1b269ac..04c74624 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,7 +11,7 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-debouncer.ts:445](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L445) +Defined in: [async-debouncer.ts:453](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L453) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index fe62c082..76cc1c38 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,7 +11,7 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [async-queuer.ts:751](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L751) +Defined in: [async-queuer.ts:765](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L765) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index 4810dfee..49704cdd 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,7 +11,7 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-rate-limiter.ts:515](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L515) +Defined in: [async-rate-limiter.ts:529](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L529) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/asyncretry.md b/docs/reference/functions/asyncretry.md new file mode 100644 index 00000000..3f6b2424 --- /dev/null +++ b/docs/reference/functions/asyncretry.md @@ -0,0 +1,61 @@ +--- +id: asyncRetry +title: asyncRetry +--- + + + +# Function: asyncRetry() + +```ts +function asyncRetry(fn, initialOptions): (...args) => Promise> +``` + +Defined in: [async-retryer.ts:432](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L432) + +Creates a retry-enabled version of an async function + +## Type Parameters + +• **TFn** *extends* [`AnyAsyncFunction`](../../type-aliases/anyasyncfunction.md) + +## Parameters + +### fn + +`TFn` + +The async function to add retry functionality to + +### initialOptions + +[`AsyncRetryerOptions`](../../interfaces/asyncretryeroptions.md)\<`TFn`\> = `{}` + +Configuration options for the retry behavior + +## Returns + +`Function` + +A new function that executes the original with retry logic + +### Parameters + +#### args + +...`Parameters`\<`TFn`\> + +### Returns + +`Promise`\<`undefined` \| `ReturnType`\<`TFn`\>\> + +## Example + +```typescript +const retryFetch = asyncRetry(fetch, { + maxAttempts: 3, + backoff: 'exponential' +}) + +const response = await retryFetch('/api/data') +``` diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index 5e83fd7d..5efca894 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,7 +11,7 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-throttler.ts:478](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L478) +Defined in: [async-throttler.ts:486](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L486) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. diff --git a/docs/reference/index.md b/docs/reference/index.md index a592ae55..a8719c78 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -13,6 +13,7 @@ title: "@tanstack/pacer" - [AsyncDebouncer](../classes/asyncdebouncer.md) - [AsyncQueuer](../classes/asyncqueuer.md) - [AsyncRateLimiter](../classes/asyncratelimiter.md) +- [AsyncRetryer](../classes/asyncretryer.md) - [AsyncThrottler](../classes/asyncthrottler.md) - [Batcher](../classes/batcher.md) - [Debouncer](../classes/debouncer.md) @@ -30,6 +31,8 @@ title: "@tanstack/pacer" - [AsyncQueuerState](../interfaces/asyncqueuerstate.md) - [AsyncRateLimiterOptions](../interfaces/asyncratelimiteroptions.md) - [AsyncRateLimiterState](../interfaces/asyncratelimiterstate.md) +- [AsyncRetryerOptions](../interfaces/asyncretryeroptions.md) +- [AsyncRetryerState](../interfaces/asyncretryerstate.md) - [AsyncThrottlerOptions](../interfaces/asyncthrottleroptions.md) - [AsyncThrottlerState](../interfaces/asyncthrottlerstate.md) - [BatcherOptions](../interfaces/batcheroptions.md) @@ -56,6 +59,7 @@ title: "@tanstack/pacer" - [asyncDebounce](../functions/asyncdebounce.md) - [asyncQueue](../functions/asyncqueue.md) - [asyncRateLimit](../functions/asyncratelimit.md) +- [asyncRetry](../functions/asyncretry.md) - [asyncThrottle](../functions/asyncthrottle.md) - [batch](../functions/batch.md) - [debounce](../functions/debounce.md) diff --git a/docs/reference/interfaces/asyncbatcheroptions.md b/docs/reference/interfaces/asyncbatcheroptions.md index 78b35a21..56aa2d2e 100644 --- a/docs/reference/interfaces/asyncbatcheroptions.md +++ b/docs/reference/interfaces/asyncbatcheroptions.md @@ -7,7 +7,7 @@ title: AsyncBatcherOptions # Interface: AsyncBatcherOptions\ -Defined in: [async-batcher.ts:81](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L81) +Defined in: [async-batcher.ts:83](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L83) Options for configuring an AsyncBatcher instance @@ -17,13 +17,25 @@ Options for configuring an AsyncBatcher instance ## Properties +### asyncRetryerOptions? + +```ts +optional asyncRetryerOptions: AsyncRetryerOptions<(items) => Promise>; +``` + +Defined in: [async-batcher.ts:87](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L87) + +Options for configuring the underlying async retryer + +*** + ### getShouldExecute()? ```ts optional getShouldExecute: (items, batcher) => boolean; ``` -Defined in: [async-batcher.ts:86](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L86) +Defined in: [async-batcher.ts:94](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L94) Custom function to determine if a batch should be processed Return true to process the batch immediately @@ -50,7 +62,7 @@ Return true to process the batch immediately optional initialState: Partial>; ``` -Defined in: [async-batcher.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L93) +Defined in: [async-batcher.ts:101](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L101) Initial state for the async batcher @@ -62,7 +74,7 @@ Initial state for the async batcher optional maxSize: number; ``` -Defined in: [async-batcher.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L98) +Defined in: [async-batcher.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L106) Maximum number of items in a batch @@ -80,7 +92,7 @@ Infinity optional onError: (error, batch, batcher) => void; ``` -Defined in: [async-batcher.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L104) +Defined in: [async-batcher.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L112) Optional error handler for when the batch function throws. If provided, the handler will be called with the error, the batch of items that failed, and batcher instance. @@ -112,7 +124,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onItemsChange: (batcher) => void; ``` -Defined in: [async-batcher.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L112) +Defined in: [async-batcher.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L120) Callback fired after items are added to the batcher @@ -134,7 +146,7 @@ Callback fired after items are added to the batcher optional onSettled: (batch, batcher) => void; ``` -Defined in: [async-batcher.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L116) +Defined in: [async-batcher.ts:124](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L124) Optional callback to call when a batch is settled (completed or failed) @@ -160,7 +172,7 @@ Optional callback to call when a batch is settled (completed or failed) optional onSuccess: (result, batch, batcher) => void; ``` -Defined in: [async-batcher.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L120) +Defined in: [async-batcher.ts:128](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L128) Optional callback to call when a batch succeeds @@ -190,7 +202,7 @@ Optional callback to call when a batch succeeds optional started: boolean; ``` -Defined in: [async-batcher.ts:129](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L129) +Defined in: [async-batcher.ts:137](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L137) Whether the batcher should start processing immediately @@ -208,7 +220,7 @@ true optional throwOnError: boolean; ``` -Defined in: [async-batcher.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L135) +Defined in: [async-batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L143) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -222,7 +234,7 @@ Can be explicitly set to override these defaults. optional wait: number | (asyncBatcher) => number; ``` -Defined in: [async-batcher.ts:142](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L142) +Defined in: [async-batcher.ts:150](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L150) Maximum time in milliseconds to wait before processing a batch. If the wait duration has elapsed, the batch will be processed. diff --git a/docs/reference/interfaces/asyncbatcherstate.md b/docs/reference/interfaces/asyncbatcherstate.md index 6a3a6970..49eb38c2 100644 --- a/docs/reference/interfaces/asyncbatcherstate.md +++ b/docs/reference/interfaces/asyncbatcherstate.md @@ -7,7 +7,7 @@ title: AsyncBatcherState # Interface: AsyncBatcherState\ -Defined in: [async-batcher.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L5) +Defined in: [async-batcher.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L7) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-batcher.ts:5](https://github.com/TanStack/pacer/blob/main/pac errorCount: number; ``` -Defined in: [async-batcher.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L9) +Defined in: [async-batcher.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L11) Number of batch executions that have resulted in errors @@ -33,7 +33,7 @@ Number of batch executions that have resulted in errors failedItems: TValue[]; ``` -Defined in: [async-batcher.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L13) +Defined in: [async-batcher.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L15) Array of items that failed during batch processing @@ -45,7 +45,7 @@ Array of items that failed during batch processing isEmpty: boolean; ``` -Defined in: [async-batcher.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L17) +Defined in: [async-batcher.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L19) Whether the batcher has no items to process (items array is empty) @@ -57,7 +57,7 @@ Whether the batcher has no items to process (items array is empty) isExecuting: boolean; ``` -Defined in: [async-batcher.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L21) +Defined in: [async-batcher.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L23) Whether a batch is currently being processed asynchronously @@ -69,7 +69,7 @@ Whether a batch is currently being processed asynchronously isPending: boolean; ``` -Defined in: [async-batcher.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L25) +Defined in: [async-batcher.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L27) Whether the batcher is waiting for the timeout to trigger batch processing @@ -81,7 +81,7 @@ Whether the batcher is waiting for the timeout to trigger batch processing items: TValue[]; ``` -Defined in: [async-batcher.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L29) +Defined in: [async-batcher.ts:31](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L31) Array of items currently queued for batch processing @@ -93,7 +93,7 @@ Array of items currently queued for batch processing lastResult: any; ``` -Defined in: [async-batcher.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L33) +Defined in: [async-batcher.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L35) The result from the most recent batch execution @@ -105,7 +105,7 @@ The result from the most recent batch execution settleCount: number; ``` -Defined in: [async-batcher.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L37) +Defined in: [async-batcher.ts:39](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L39) Number of batch executions that have completed (either successfully or with errors) @@ -117,7 +117,7 @@ Number of batch executions that have completed (either successfully or with erro size: number; ``` -Defined in: [async-batcher.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L41) +Defined in: [async-batcher.ts:43](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L43) Number of items currently in the batch queue @@ -126,10 +126,10 @@ Number of items currently in the batch queue ### status ```ts -status: "idle" | "pending" | "executing" | "populated"; +status: "idle" | "executing" | "pending" | "populated"; ``` -Defined in: [async-batcher.ts:45](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L45) +Defined in: [async-batcher.ts:47](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L47) Current processing status - 'idle' when not processing, 'pending' when waiting for timeout, 'executing' when processing, 'populated' when items are present, but no wait is configured @@ -141,7 +141,7 @@ Current processing status - 'idle' when not processing, 'pending' when waiting f successCount: number; ``` -Defined in: [async-batcher.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L49) +Defined in: [async-batcher.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L51) Number of batch executions that have completed successfully @@ -153,7 +153,7 @@ Number of batch executions that have completed successfully totalItemsFailed: number; ``` -Defined in: [async-batcher.ts:53](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L53) +Defined in: [async-batcher.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L55) Total number of items that have failed processing across all batches @@ -165,6 +165,6 @@ Total number of items that have failed processing across all batches totalItemsProcessed: number; ``` -Defined in: [async-batcher.ts:57](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L57) +Defined in: [async-batcher.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L59) Total number of items that have been processed across all batches diff --git a/docs/reference/interfaces/asyncdebounceroptions.md b/docs/reference/interfaces/asyncdebounceroptions.md index b9f62cc1..e8751714 100644 --- a/docs/reference/interfaces/asyncdebounceroptions.md +++ b/docs/reference/interfaces/asyncdebounceroptions.md @@ -7,7 +7,7 @@ title: AsyncDebouncerOptions # Interface: AsyncDebouncerOptions\ -Defined in: [async-debouncer.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L63) +Defined in: [async-debouncer.ts:65](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L65) Options for configuring an async debounced function @@ -17,13 +17,25 @@ Options for configuring an async debounced function ## Properties +### asyncRetryerOptions? + +```ts +optional asyncRetryerOptions: AsyncRetryerOptions; +``` + +Defined in: [async-debouncer.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L69) + +Options for configuring the underlying async retryer + +*** + ### enabled? ```ts optional enabled: boolean | (debouncer) => boolean; ``` -Defined in: [async-debouncer.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L69) +Defined in: [async-debouncer.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L75) Whether the debouncer is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +49,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [async-debouncer.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L73) +Defined in: [async-debouncer.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L79) Initial state for the async debouncer @@ -49,7 +61,7 @@ Initial state for the async debouncer optional leading: boolean; ``` -Defined in: [async-debouncer.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L78) +Defined in: [async-debouncer.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L84) Whether to execute on the leading edge of the timeout. Defaults to false. @@ -62,7 +74,7 @@ Defaults to false. optional onError: (error, args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L84) +Defined in: [async-debouncer.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L90) Optional error handler for when the debounced function throws. If provided, the handler will be called with the error and debouncer instance. @@ -94,7 +106,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onSettled: (args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:92](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L92) +Defined in: [async-debouncer.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L98) Optional callback to call when the debounced function is executed @@ -120,7 +132,7 @@ Optional callback to call when the debounced function is executed optional onSuccess: (result, args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:96](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L96) +Defined in: [async-debouncer.ts:102](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L102) Optional callback to call when the debounced function is executed @@ -150,7 +162,7 @@ Optional callback to call when the debounced function is executed optional throwOnError: boolean; ``` -Defined in: [async-debouncer.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L106) +Defined in: [async-debouncer.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L112) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -164,7 +176,7 @@ Can be explicitly set to override these defaults. optional trailing: boolean; ``` -Defined in: [async-debouncer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L111) +Defined in: [async-debouncer.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L117) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -177,7 +189,7 @@ Defaults to true. wait: number | (debouncer) => number; ``` -Defined in: [async-debouncer.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L117) +Defined in: [async-debouncer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L123) Delay in milliseconds to wait after the last call before executing. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncdebouncerstate.md b/docs/reference/interfaces/asyncdebouncerstate.md index 78e91133..c72df0c5 100644 --- a/docs/reference/interfaces/asyncdebouncerstate.md +++ b/docs/reference/interfaces/asyncdebouncerstate.md @@ -7,7 +7,7 @@ title: AsyncDebouncerState # Interface: AsyncDebouncerState\ -Defined in: [async-debouncer.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L5) +Defined in: [async-debouncer.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L7) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-debouncer.ts:5](https://github.com/TanStack/pacer/blob/main/p canLeadingExecute: boolean; ``` -Defined in: [async-debouncer.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L9) +Defined in: [async-debouncer.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L11) Whether the debouncer can execute on the leading edge of the timeout @@ -33,7 +33,7 @@ Whether the debouncer can execute on the leading edge of the timeout errorCount: number; ``` -Defined in: [async-debouncer.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L13) +Defined in: [async-debouncer.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L15) Number of function executions that have resulted in errors @@ -45,7 +45,7 @@ Number of function executions that have resulted in errors isExecuting: boolean; ``` -Defined in: [async-debouncer.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L17) +Defined in: [async-debouncer.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L19) Whether the debounced function is currently executing asynchronously @@ -57,7 +57,7 @@ Whether the debounced function is currently executing asynchronously isPending: boolean; ``` -Defined in: [async-debouncer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L21) +Defined in: [async-debouncer.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L23) Whether the debouncer is waiting for the timeout to trigger execution @@ -69,7 +69,7 @@ Whether the debouncer is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [async-debouncer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L25) +Defined in: [async-debouncer.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L27) The arguments from the most recent call to maybeExecute @@ -81,7 +81,7 @@ The arguments from the most recent call to maybeExecute lastResult: undefined | ReturnType; ``` -Defined in: [async-debouncer.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L29) +Defined in: [async-debouncer.ts:31](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L31) The result from the most recent successful function execution @@ -93,7 +93,7 @@ The result from the most recent successful function execution settleCount: number; ``` -Defined in: [async-debouncer.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L33) +Defined in: [async-debouncer.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L35) Number of function executions that have completed (either successfully or with errors) @@ -102,10 +102,10 @@ Number of function executions that have completed (either successfully or with e ### status ```ts -status: "idle" | "pending" | "executing" | "disabled" | "settled"; +status: "disabled" | "idle" | "executing" | "pending" | "settled"; ``` -Defined in: [async-debouncer.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L37) +Defined in: [async-debouncer.ts:39](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L39) Current execution status - 'idle' when not active, 'pending' when waiting, 'executing' when running, 'settled' when completed @@ -117,6 +117,6 @@ Current execution status - 'idle' when not active, 'pending' when waiting, 'exec successCount: number; ``` -Defined in: [async-debouncer.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L41) +Defined in: [async-debouncer.ts:43](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L43) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/asyncqueueroptions.md b/docs/reference/interfaces/asyncqueueroptions.md index 92c61d43..025f89ce 100644 --- a/docs/reference/interfaces/asyncqueueroptions.md +++ b/docs/reference/interfaces/asyncqueueroptions.md @@ -7,7 +7,7 @@ title: AsyncQueuerOptions # Interface: AsyncQueuerOptions\ -Defined in: [async-queuer.ts:94](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L94) +Defined in: [async-queuer.ts:96](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L96) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-queuer.ts:94](https://github.com/TanStack/pacer/blob/main/pac optional addItemsTo: QueuePosition; ``` -Defined in: [async-queuer.ts:99](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L99) +Defined in: [async-queuer.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L105) Default position to add items to the queuer @@ -33,13 +33,25 @@ Default position to add items to the queuer *** +### asyncRetryerOptions? + +```ts +optional asyncRetryerOptions: AsyncRetryerOptions<(item) => Promise>; +``` + +Defined in: [async-queuer.ts:100](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L100) + +Options for configuring the underlying async retryer + +*** + ### concurrency? ```ts optional concurrency: number | (queuer) => number; ``` -Defined in: [async-queuer.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L105) +Defined in: [async-queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L111) Maximum number of concurrent tasks to process. Can be a number or a function that returns a number. @@ -58,7 +70,7 @@ Can be a number or a function that returns a number. optional expirationDuration: number; ``` -Defined in: [async-queuer.ts:110](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L110) +Defined in: [async-queuer.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L116) Maximum time in milliseconds that an item can stay in the queue If not provided, items will never expire @@ -71,7 +83,7 @@ If not provided, items will never expire optional getIsExpired: (item, addedAt) => boolean; ``` -Defined in: [async-queuer.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L115) +Defined in: [async-queuer.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L121) Function to determine if an item has expired If provided, this overrides the expirationDuration behavior @@ -98,7 +110,7 @@ If provided, this overrides the expirationDuration behavior optional getItemsFrom: QueuePosition; ``` -Defined in: [async-queuer.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L120) +Defined in: [async-queuer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L126) Default position to get items from during processing @@ -116,7 +128,7 @@ Default position to get items from during processing optional getPriority: (item) => number; ``` -Defined in: [async-queuer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L126) +Defined in: [async-queuer.ts:132](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L132) Function to determine priority of items in the queuer Higher priority items will be processed first @@ -140,7 +152,7 @@ If not provided, will use static priority values attached to tasks optional initialItems: TValue[]; ``` -Defined in: [async-queuer.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L130) +Defined in: [async-queuer.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L136) Initial items to populate the queuer with @@ -152,7 +164,7 @@ Initial items to populate the queuer with optional initialState: Partial>; ``` -Defined in: [async-queuer.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L134) +Defined in: [async-queuer.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L140) Initial state for the async queuer @@ -164,7 +176,7 @@ Initial state for the async queuer optional maxSize: number; ``` -Defined in: [async-queuer.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L138) +Defined in: [async-queuer.ts:144](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L144) Maximum number of items allowed in the queuer @@ -176,7 +188,7 @@ Maximum number of items allowed in the queuer optional onError: (error, item, queuer) => void; ``` -Defined in: [async-queuer.ts:144](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L144) +Defined in: [async-queuer.ts:150](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L150) Optional error handler for when a task throws. If provided, the handler will be called with the error and queuer instance. @@ -208,7 +220,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onExpire: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:148](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L148) +Defined in: [async-queuer.ts:154](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L154) Callback fired whenever an item expires in the queuer @@ -234,7 +246,7 @@ Callback fired whenever an item expires in the queuer optional onItemsChange: (queuer) => void; ``` -Defined in: [async-queuer.ts:152](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L152) +Defined in: [async-queuer.ts:158](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L158) Callback fired whenever an item is added or removed from the queuer @@ -256,7 +268,7 @@ Callback fired whenever an item is added or removed from the queuer optional onReject: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:156](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L156) +Defined in: [async-queuer.ts:162](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L162) Callback fired whenever an item is rejected from being added to the queuer @@ -282,7 +294,7 @@ Callback fired whenever an item is rejected from being added to the queuer optional onSettled: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:160](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L160) +Defined in: [async-queuer.ts:166](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L166) Optional callback to call when a task is settled @@ -308,7 +320,7 @@ Optional callback to call when a task is settled optional onSuccess: (result, item, queuer) => void; ``` -Defined in: [async-queuer.ts:164](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L164) +Defined in: [async-queuer.ts:170](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L170) Optional callback to call when a task succeeds @@ -338,7 +350,7 @@ Optional callback to call when a task succeeds optional started: boolean; ``` -Defined in: [async-queuer.ts:168](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L168) +Defined in: [async-queuer.ts:174](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L174) Whether the queuer should start processing tasks immediately or not. @@ -350,7 +362,7 @@ Whether the queuer should start processing tasks immediately or not. optional throwOnError: boolean; ``` -Defined in: [async-queuer.ts:174](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L174) +Defined in: [async-queuer.ts:180](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L180) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -364,7 +376,7 @@ Can be explicitly set to override these defaults. optional wait: number | (queuer) => number; ``` -Defined in: [async-queuer.ts:180](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L180) +Defined in: [async-queuer.ts:186](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L186) Time in milliseconds to wait between processing items. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncqueuerstate.md b/docs/reference/interfaces/asyncqueuerstate.md index 5edf5fa5..75afad6f 100644 --- a/docs/reference/interfaces/asyncqueuerstate.md +++ b/docs/reference/interfaces/asyncqueuerstate.md @@ -7,7 +7,7 @@ title: AsyncQueuerState # Interface: AsyncQueuerState\ -Defined in: [async-queuer.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L6) +Defined in: [async-queuer.ts:8](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L8) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-queuer.ts:6](https://github.com/TanStack/pacer/blob/main/pack activeItems: TValue[]; ``` -Defined in: [async-queuer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L10) +Defined in: [async-queuer.ts:12](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L12) Items currently being processed by the queuer @@ -33,7 +33,7 @@ Items currently being processed by the queuer errorCount: number; ``` -Defined in: [async-queuer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L14) +Defined in: [async-queuer.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L16) Number of task executions that have resulted in errors @@ -45,7 +45,7 @@ Number of task executions that have resulted in errors expirationCount: number; ``` -Defined in: [async-queuer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L18) +Defined in: [async-queuer.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L20) Number of items that have been removed from the queue due to expiration @@ -57,7 +57,7 @@ Number of items that have been removed from the queue due to expiration isEmpty: boolean; ``` -Defined in: [async-queuer.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L22) +Defined in: [async-queuer.ts:24](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L24) Whether the queuer has no items to process (items array is empty) @@ -69,7 +69,7 @@ Whether the queuer has no items to process (items array is empty) isFull: boolean; ``` -Defined in: [async-queuer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L26) +Defined in: [async-queuer.ts:28](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L28) Whether the queuer has reached its maximum capacity @@ -81,7 +81,7 @@ Whether the queuer has reached its maximum capacity isIdle: boolean; ``` -Defined in: [async-queuer.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L30) +Defined in: [async-queuer.ts:32](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L32) Whether the queuer is not currently processing any items @@ -93,7 +93,7 @@ Whether the queuer is not currently processing any items isRunning: boolean; ``` -Defined in: [async-queuer.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L34) +Defined in: [async-queuer.ts:36](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L36) Whether the queuer is active and will process items automatically @@ -105,7 +105,7 @@ Whether the queuer is active and will process items automatically items: TValue[]; ``` -Defined in: [async-queuer.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L38) +Defined in: [async-queuer.ts:40](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L40) Array of items currently waiting to be processed @@ -117,7 +117,7 @@ Array of items currently waiting to be processed itemTimestamps: number[]; ``` -Defined in: [async-queuer.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L42) +Defined in: [async-queuer.ts:44](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L44) Timestamps when items were added to the queue for expiration tracking @@ -129,7 +129,7 @@ Timestamps when items were added to the queue for expiration tracking lastResult: any; ``` -Defined in: [async-queuer.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L46) +Defined in: [async-queuer.ts:48](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L48) The result from the most recent task execution @@ -141,7 +141,7 @@ The result from the most recent task execution pendingTick: boolean; ``` -Defined in: [async-queuer.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L50) +Defined in: [async-queuer.ts:52](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L52) Whether the queuer has a pending timeout for processing the next item @@ -153,7 +153,7 @@ Whether the queuer has a pending timeout for processing the next item rejectionCount: number; ``` -Defined in: [async-queuer.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L54) +Defined in: [async-queuer.ts:56](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L56) Number of items that have been rejected from being added to the queue @@ -165,7 +165,7 @@ Number of items that have been rejected from being added to the queue settledCount: number; ``` -Defined in: [async-queuer.ts:58](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L58) +Defined in: [async-queuer.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L60) Number of task executions that have completed (either successfully or with errors) @@ -177,7 +177,7 @@ Number of task executions that have completed (either successfully or with error size: number; ``` -Defined in: [async-queuer.ts:62](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L62) +Defined in: [async-queuer.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L64) Number of items currently in the queue @@ -189,7 +189,7 @@ Number of items currently in the queue status: "idle" | "running" | "stopped"; ``` -Defined in: [async-queuer.ts:66](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L66) +Defined in: [async-queuer.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L68) Current processing status - 'idle' when not processing, 'running' when active, 'stopped' when paused @@ -201,6 +201,6 @@ Current processing status - 'idle' when not processing, 'running' when active, ' successCount: number; ``` -Defined in: [async-queuer.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L70) +Defined in: [async-queuer.ts:72](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L72) Number of task executions that have completed successfully diff --git a/docs/reference/interfaces/asyncratelimiteroptions.md b/docs/reference/interfaces/asyncratelimiteroptions.md index 9bb807f6..2c0d390b 100644 --- a/docs/reference/interfaces/asyncratelimiteroptions.md +++ b/docs/reference/interfaces/asyncratelimiteroptions.md @@ -7,7 +7,7 @@ title: AsyncRateLimiterOptions # Interface: AsyncRateLimiterOptions\ -Defined in: [async-rate-limiter.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L63) +Defined in: [async-rate-limiter.ts:65](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L65) Options for configuring an async rate-limited function @@ -17,13 +17,25 @@ Options for configuring an async rate-limited function ## Properties +### asyncRetryerOptions? + +```ts +optional asyncRetryerOptions: AsyncRetryerOptions; +``` + +Defined in: [async-rate-limiter.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L69) + +Options for configuring the underlying async retryer + +*** + ### enabled? ```ts optional enabled: boolean | (rateLimiter) => boolean; ``` -Defined in: [async-rate-limiter.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L69) +Defined in: [async-rate-limiter.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L75) Whether the rate limiter is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +49,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [async-rate-limiter.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L73) +Defined in: [async-rate-limiter.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L79) Initial state for the rate limiter @@ -49,7 +61,7 @@ Initial state for the rate limiter limit: number | (rateLimiter) => number; ``` -Defined in: [async-rate-limiter.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L78) +Defined in: [async-rate-limiter.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L84) Maximum number of executions allowed within the time window. Can be a number or a function that returns a number. @@ -62,7 +74,7 @@ Can be a number or a function that returns a number. optional onError: (error, args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L84) +Defined in: [async-rate-limiter.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L90) Optional error handler for when the rate-limited function throws. If provided, the handler will be called with the error and rate limiter instance. @@ -94,7 +106,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onReject: (args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:92](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L92) +Defined in: [async-rate-limiter.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L98) Optional callback function that is called when an execution is rejected due to rate limiting @@ -120,7 +132,7 @@ Optional callback function that is called when an execution is rejected due to r optional onSettled: (args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:96](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L96) +Defined in: [async-rate-limiter.ts:102](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L102) Optional function to call when the rate-limited function is executed @@ -146,7 +158,7 @@ Optional function to call when the rate-limited function is executed optional onSuccess: (result, args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L103) +Defined in: [async-rate-limiter.ts:109](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L109) Optional function to call when the rate-limited function is executed @@ -176,7 +188,7 @@ Optional function to call when the rate-limited function is executed optional throwOnError: boolean; ``` -Defined in: [async-rate-limiter.ts:113](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L113) +Defined in: [async-rate-limiter.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L119) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -190,7 +202,7 @@ Can be explicitly set to override these defaults. window: number | (rateLimiter) => number; ``` -Defined in: [async-rate-limiter.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L118) +Defined in: [async-rate-limiter.ts:124](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L124) Time window in milliseconds within which the limit applies. Can be a number or a function that returns a number. @@ -203,7 +215,7 @@ Can be a number or a function that returns a number. optional windowType: "fixed" | "sliding"; ``` -Defined in: [async-rate-limiter.ts:125](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L125) +Defined in: [async-rate-limiter.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L131) Type of window to use for rate limiting - 'fixed': Uses a fixed window that resets after the window period diff --git a/docs/reference/interfaces/asyncratelimiterstate.md b/docs/reference/interfaces/asyncratelimiterstate.md index 8e7cc64e..5bc3b39e 100644 --- a/docs/reference/interfaces/asyncratelimiterstate.md +++ b/docs/reference/interfaces/asyncratelimiterstate.md @@ -7,7 +7,7 @@ title: AsyncRateLimiterState # Interface: AsyncRateLimiterState\ -Defined in: [async-rate-limiter.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L5) +Defined in: [async-rate-limiter.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L7) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-rate-limiter.ts:5](https://github.com/TanStack/pacer/blob/mai errorCount: number; ``` -Defined in: [async-rate-limiter.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L9) +Defined in: [async-rate-limiter.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L11) Number of function executions that have resulted in errors @@ -33,7 +33,7 @@ Number of function executions that have resulted in errors executionTimes: number[]; ``` -Defined in: [async-rate-limiter.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L13) +Defined in: [async-rate-limiter.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L15) Array of timestamps when executions occurred for rate limiting calculations @@ -45,7 +45,7 @@ Array of timestamps when executions occurred for rate limiting calculations isExceeded: boolean; ``` -Defined in: [async-rate-limiter.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L17) +Defined in: [async-rate-limiter.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L19) Whether the rate limiter has exceeded the limit @@ -57,7 +57,7 @@ Whether the rate limiter has exceeded the limit isExecuting: boolean; ``` -Defined in: [async-rate-limiter.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L21) +Defined in: [async-rate-limiter.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L23) Whether the rate-limited function is currently executing asynchronously @@ -69,7 +69,7 @@ Whether the rate-limited function is currently executing asynchronously lastResult: undefined | ReturnType; ``` -Defined in: [async-rate-limiter.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L25) +Defined in: [async-rate-limiter.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L27) The result from the most recent successful function execution @@ -81,7 +81,7 @@ The result from the most recent successful function execution rejectionCount: number; ``` -Defined in: [async-rate-limiter.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L29) +Defined in: [async-rate-limiter.ts:31](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L31) Number of function executions that have been rejected due to rate limiting @@ -93,7 +93,7 @@ Number of function executions that have been rejected due to rate limiting settleCount: number; ``` -Defined in: [async-rate-limiter.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L33) +Defined in: [async-rate-limiter.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L35) Number of function executions that have completed (either successfully or with errors) @@ -102,10 +102,10 @@ Number of function executions that have completed (either successfully or with e ### status ```ts -status: "idle" | "executing" | "disabled" | "exceeded"; +status: "disabled" | "idle" | "executing" | "exceeded"; ``` -Defined in: [async-rate-limiter.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L37) +Defined in: [async-rate-limiter.ts:39](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L39) Current execution status - 'disabled' when not active, 'executing' when executing, 'idle' when not executing, 'exceeded' when rate limit is exceeded @@ -117,6 +117,6 @@ Current execution status - 'disabled' when not active, 'executing' when executin successCount: number; ``` -Defined in: [async-rate-limiter.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L41) +Defined in: [async-rate-limiter.ts:43](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L43) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/asyncretryeroptions.md b/docs/reference/interfaces/asyncretryeroptions.md new file mode 100644 index 00000000..c039c1fb --- /dev/null +++ b/docs/reference/interfaces/asyncretryeroptions.md @@ -0,0 +1,264 @@ +--- +id: AsyncRetryerOptions +title: AsyncRetryerOptions +--- + + + +# Interface: AsyncRetryerOptions\ + +Defined in: [async-retryer.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L59) + +## Type Parameters + +• **TFn** *extends* [`AnyAsyncFunction`](../../type-aliases/anyasyncfunction.md) + +## Properties + +### backoff? + +```ts +optional backoff: "linear" | "exponential" | "fixed"; +``` + +Defined in: [async-retryer.ts:67](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L67) + +The backoff strategy for retry delays: +- 'exponential': Wait time doubles with each attempt (1s, 2s, 4s, ...) +- 'linear': Wait time increases linearly (1s, 2s, 3s, ...) +- 'fixed': Same wait time for all attempts + +#### Default + +```ts +'exponential' +``` + +*** + +### baseWait? + +```ts +optional baseWait: number | (retryer) => number; +``` + +Defined in: [async-retryer.ts:72](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L72) + +Base wait time in milliseconds between retries, or a function that returns the wait time + +#### Default + +```ts +1000 +``` + +*** + +### enabled? + +```ts +optional enabled: boolean | (retryer) => boolean; +``` + +Defined in: [async-retryer.ts:77](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L77) + +Whether the retryer is enabled, or a function that determines if it's enabled + +#### Default + +```ts +true +``` + +*** + +### initialState? + +```ts +optional initialState: Partial>; +``` + +Defined in: [async-retryer.ts:81](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L81) + +Initial state to merge with the default state + +*** + +### maxAttempts? + +```ts +optional maxAttempts: number | (retryer) => number; +``` + +Defined in: [async-retryer.ts:86](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L86) + +Maximum number of retry attempts, or a function that returns the max attempts + +#### Default + +```ts +3 +``` + +*** + +### onError()? + +```ts +optional onError: (error, args, retryer) => void; +``` + +Defined in: [async-retryer.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L90) + +Callback invoked when any error occurs during execution (including retries) + +#### Parameters + +##### error + +`unknown` + +##### args + +`Parameters`\<`TFn`\> + +##### retryer + +[`AsyncRetryer`](../../classes/asyncretryer.md)\<`TFn`\> + +#### Returns + +`void` + +*** + +### onLastError()? + +```ts +optional onLastError: (error, retryer) => void; +``` + +Defined in: [async-retryer.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L98) + +Callback invoked when the final error occurs after all retries are exhausted + +#### Parameters + +##### error + +`Error` + +##### retryer + +[`AsyncRetryer`](../../classes/asyncretryer.md)\<`TFn`\> + +#### Returns + +`void` + +*** + +### onRetry()? + +```ts +optional onRetry: (attempt, error, retryer) => void; +``` + +Defined in: [async-retryer.ts:102](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L102) + +Callback invoked before each retry attempt + +#### Parameters + +##### attempt + +`number` + +##### error + +`Error` + +##### retryer + +[`AsyncRetryer`](../../classes/asyncretryer.md)\<`TFn`\> + +#### Returns + +`void` + +*** + +### onSettled()? + +```ts +optional onSettled: (args, retryer) => void; +``` + +Defined in: [async-retryer.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L106) + +Callback invoked after execution completes (success or failure) + +#### Parameters + +##### args + +`Parameters`\<`TFn`\> + +##### retryer + +[`AsyncRetryer`](../../classes/asyncretryer.md)\<`TFn`\> + +#### Returns + +`void` + +*** + +### onSuccess()? + +```ts +optional onSuccess: (result, args, retryer) => void; +``` + +Defined in: [async-retryer.ts:110](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L110) + +Callback invoked when execution succeeds + +#### Parameters + +##### result + +`ReturnType`\<`TFn`\> + +##### args + +`Parameters`\<`TFn`\> + +##### retryer + +[`AsyncRetryer`](../../classes/asyncretryer.md)\<`TFn`\> + +#### Returns + +`void` + +*** + +### throwOnError? + +```ts +optional throwOnError: boolean | "last"; +``` + +Defined in: [async-retryer.ts:122](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L122) + +Controls when errors are thrown: +- 'last': Only throw the final error after all retries are exhausted +- true: Throw every error immediately (disables retrying) +- false: Never throw errors, return undefined instead + +#### Default + +```ts +'last' +``` diff --git a/docs/reference/interfaces/asyncretryerstate.md b/docs/reference/interfaces/asyncretryerstate.md new file mode 100644 index 00000000..dd7647da --- /dev/null +++ b/docs/reference/interfaces/asyncretryerstate.md @@ -0,0 +1,110 @@ +--- +id: AsyncRetryerState +title: AsyncRetryerState +--- + + + +# Interface: AsyncRetryerState\ + +Defined in: [async-retryer.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L5) + +## Type Parameters + +• **TFn** *extends* [`AnyAsyncFunction`](../../type-aliases/anyasyncfunction.md) + +## Properties + +### currentAttempt + +```ts +currentAttempt: number; +``` + +Defined in: [async-retryer.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L9) + +The current retry attempt number (0 when not executing) + +*** + +### executionCount + +```ts +executionCount: number; +``` + +Defined in: [async-retryer.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L13) + +Total number of completed executions (successful or failed) + +*** + +### isExecuting + +```ts +isExecuting: boolean; +``` + +Defined in: [async-retryer.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L17) + +Whether the retryer is currently executing the function + +*** + +### lastError + +```ts +lastError: undefined | Error; +``` + +Defined in: [async-retryer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L21) + +The most recent error encountered during execution + +*** + +### lastExecutionTime + +```ts +lastExecutionTime: number; +``` + +Defined in: [async-retryer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L25) + +Timestamp of the last execution completion in milliseconds + +*** + +### lastResult + +```ts +lastResult: undefined | ReturnType; +``` + +Defined in: [async-retryer.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L29) + +The result from the most recent successful execution + +*** + +### status + +```ts +status: "disabled" | "idle" | "executing" | "retrying"; +``` + +Defined in: [async-retryer.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L33) + +Current execution status - 'disabled' when not enabled, 'idle' when ready, 'executing' when running + +*** + +### totalExecutionTime + +```ts +totalExecutionTime: number; +``` + +Defined in: [async-retryer.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L37) + +Total time spent executing (including retries) in milliseconds diff --git a/docs/reference/interfaces/asyncthrottleroptions.md b/docs/reference/interfaces/asyncthrottleroptions.md index 6bd5b084..d73ded7d 100644 --- a/docs/reference/interfaces/asyncthrottleroptions.md +++ b/docs/reference/interfaces/asyncthrottleroptions.md @@ -7,7 +7,7 @@ title: AsyncThrottlerOptions # Interface: AsyncThrottlerOptions\ -Defined in: [async-throttler.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L68) +Defined in: [async-throttler.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L70) Options for configuring an async throttled function @@ -17,13 +17,25 @@ Options for configuring an async throttled function ## Properties +### asyncRetryerOptions? + +```ts +optional asyncRetryerOptions: AsyncRetryerOptions; +``` + +Defined in: [async-throttler.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L74) + +Options for configuring the underlying async retryer + +*** + ### enabled? ```ts optional enabled: boolean | (throttler) => boolean; ``` -Defined in: [async-throttler.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L74) +Defined in: [async-throttler.ts:80](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L80) Whether the throttler is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +49,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [async-throttler.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L78) +Defined in: [async-throttler.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L84) Initial state for the async throttler @@ -49,7 +61,7 @@ Initial state for the async throttler optional leading: boolean; ``` -Defined in: [async-throttler.ts:83](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L83) +Defined in: [async-throttler.ts:89](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L89) Whether to execute the function immediately when called Defaults to true @@ -62,7 +74,7 @@ Defaults to true optional onError: (error, args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:89](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L89) +Defined in: [async-throttler.ts:95](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L95) Optional error handler for when the throttled function throws. If provided, the handler will be called with the error and throttler instance. @@ -94,7 +106,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onSettled: (args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L97) +Defined in: [async-throttler.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L103) Optional function to call when the throttled function is executed @@ -120,7 +132,7 @@ Optional function to call when the throttled function is executed optional onSuccess: (result, args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L104) +Defined in: [async-throttler.ts:110](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L110) Optional function to call when the throttled function is executed @@ -150,7 +162,7 @@ Optional function to call when the throttled function is executed optional throwOnError: boolean; ``` -Defined in: [async-throttler.ts:114](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L114) +Defined in: [async-throttler.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L120) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -164,7 +176,7 @@ Can be explicitly set to override these defaults. optional trailing: boolean; ``` -Defined in: [async-throttler.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L119) +Defined in: [async-throttler.ts:125](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L125) Whether to execute the function on the trailing edge of the wait period Defaults to true @@ -177,7 +189,7 @@ Defaults to true wait: number | (throttler) => number; ``` -Defined in: [async-throttler.ts:125](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L125) +Defined in: [async-throttler.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L131) Time window in milliseconds during which the function can only be executed once. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncthrottlerstate.md b/docs/reference/interfaces/asyncthrottlerstate.md index 148bae3c..f4d3cacd 100644 --- a/docs/reference/interfaces/asyncthrottlerstate.md +++ b/docs/reference/interfaces/asyncthrottlerstate.md @@ -7,7 +7,7 @@ title: AsyncThrottlerState # Interface: AsyncThrottlerState\ -Defined in: [async-throttler.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L5) +Defined in: [async-throttler.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L7) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [async-throttler.ts:5](https://github.com/TanStack/pacer/blob/main/p errorCount: number; ``` -Defined in: [async-throttler.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L9) +Defined in: [async-throttler.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L11) Number of function executions that have resulted in errors @@ -33,7 +33,7 @@ Number of function executions that have resulted in errors isExecuting: boolean; ``` -Defined in: [async-throttler.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L13) +Defined in: [async-throttler.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L15) Whether the throttled function is currently executing asynchronously @@ -45,7 +45,7 @@ Whether the throttled function is currently executing asynchronously isPending: boolean; ``` -Defined in: [async-throttler.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L17) +Defined in: [async-throttler.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L19) Whether the throttler is waiting for the timeout to trigger execution @@ -57,7 +57,7 @@ Whether the throttler is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [async-throttler.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L21) +Defined in: [async-throttler.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L23) The arguments from the most recent call to maybeExecute @@ -69,7 +69,7 @@ The arguments from the most recent call to maybeExecute lastExecutionTime: number; ``` -Defined in: [async-throttler.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L25) +Defined in: [async-throttler.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L27) Timestamp of the last function execution in milliseconds @@ -81,7 +81,7 @@ Timestamp of the last function execution in milliseconds lastResult: undefined | ReturnType; ``` -Defined in: [async-throttler.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L29) +Defined in: [async-throttler.ts:31](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L31) The result from the most recent successful function execution @@ -93,7 +93,7 @@ The result from the most recent successful function execution nextExecutionTime: undefined | number; ``` -Defined in: [async-throttler.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L33) +Defined in: [async-throttler.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L35) Timestamp when the next execution can occur in milliseconds @@ -105,7 +105,7 @@ Timestamp when the next execution can occur in milliseconds settleCount: number; ``` -Defined in: [async-throttler.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L37) +Defined in: [async-throttler.ts:39](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L39) Number of function executions that have completed (either successfully or with errors) @@ -114,10 +114,10 @@ Number of function executions that have completed (either successfully or with e ### status ```ts -status: "idle" | "pending" | "executing" | "disabled" | "settled"; +status: "disabled" | "idle" | "executing" | "pending" | "settled"; ``` -Defined in: [async-throttler.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L41) +Defined in: [async-throttler.ts:43](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L43) Current execution status - 'idle' when not active, 'pending' when waiting, 'executing' when running, 'settled' when completed @@ -129,6 +129,6 @@ Current execution status - 'idle' when not active, 'pending' when waiting, 'exec successCount: number; ``` -Defined in: [async-throttler.ts:45](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L45) +Defined in: [async-throttler.ts:47](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L47) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/debouncerstate.md b/docs/reference/interfaces/debouncerstate.md index 3b2a70a4..728ee596 100644 --- a/docs/reference/interfaces/debouncerstate.md +++ b/docs/reference/interfaces/debouncerstate.md @@ -66,7 +66,7 @@ The arguments from the most recent call to maybeExecute ### status ```ts -status: "idle" | "pending" | "disabled"; +status: "disabled" | "idle" | "pending"; ``` Defined in: [debouncer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L25) diff --git a/docs/reference/interfaces/ratelimiterstate.md b/docs/reference/interfaces/ratelimiterstate.md index bb165047..e6b27468 100644 --- a/docs/reference/interfaces/ratelimiterstate.md +++ b/docs/reference/interfaces/ratelimiterstate.md @@ -62,7 +62,7 @@ Number of function executions that have been rejected due to rate limiting ### status ```ts -status: "idle" | "disabled" | "exceeded"; +status: "disabled" | "idle" | "exceeded"; ``` Defined in: [rate-limiter.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L25) diff --git a/docs/reference/interfaces/throttlerstate.md b/docs/reference/interfaces/throttlerstate.md index d2c4a654..de074cbe 100644 --- a/docs/reference/interfaces/throttlerstate.md +++ b/docs/reference/interfaces/throttlerstate.md @@ -78,7 +78,7 @@ Timestamp when the next execution can occur in milliseconds ### status ```ts -status: "idle" | "pending" | "disabled"; +status: "disabled" | "idle" | "pending"; ``` Defined in: [throttler.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L29) From c1029549a57bda40d050f35e45634a3776190092 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Tue, 12 Aug 2025 11:45:30 +0200 Subject: [PATCH 13/50] feat: drastically improve the pacer devtools UI --- examples/react/util-comparison/package.json | 4 +- examples/react/util-comparison/src/index.tsx | 18 +- packages/pacer-devtools/package.json | 4 +- .../src/context/context-provider.tsx | 81 +++-- .../pacer-devtools/src/context/context.ts | 44 +-- packages/pacer-devtools/src/devtools.tsx | 84 ++++- packages/pacer-devtools/src/styles/tokens.ts | 305 ++++++++++++++++++ .../pacer-devtools/src/styles/use-styles.ts | 123 +++++++ packages/pacer-devtools/src/tree.tsx | 71 ++++ .../pacer-react-devtools/src/devtools.tsx | 4 +- .../pacer-solid-devtools/src/devtools.tsx | 4 +- packages/pacer/src/async-batcher.ts | 10 +- packages/pacer/src/async-debouncer.ts | 10 +- packages/pacer/src/async-queuer.ts | 36 ++- packages/pacer/src/async-rate-limiter.ts | 10 +- packages/pacer/src/async-throttler.ts | 10 +- packages/pacer/src/batcher.ts | 10 +- packages/pacer/src/debouncer.ts | 10 +- packages/pacer/src/event-client.ts | 31 +- packages/pacer/src/index.ts | 3 +- packages/pacer/src/queuer.ts | 10 +- packages/pacer/src/rate-limiter.ts | 9 +- packages/pacer/src/throttler.ts | 8 +- pnpm-lock.yaml | 12 + 24 files changed, 799 insertions(+), 112 deletions(-) create mode 100644 packages/pacer-devtools/src/styles/tokens.ts create mode 100644 packages/pacer-devtools/src/styles/use-styles.ts create mode 100644 packages/pacer-devtools/src/tree.tsx diff --git a/examples/react/util-comparison/package.json b/examples/react/util-comparison/package.json index 3b7e87a9..93dfab0d 100644 --- a/examples/react/util-comparison/package.json +++ b/examples/react/util-comparison/package.json @@ -14,6 +14,8 @@ "react-dom": "^19.1.1" }, "devDependencies": { + "@tanstack/pacer-react-devtools": "0.14.0", + "@tanstack/react-devtools": "0.2.2", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^4.7.0", @@ -31,4 +33,4 @@ "last 1 safari version" ] } -} +} \ No newline at end of file diff --git a/examples/react/util-comparison/src/index.tsx b/examples/react/util-comparison/src/index.tsx index 0bced21c..8a1cb032 100644 --- a/examples/react/util-comparison/src/index.tsx +++ b/examples/react/util-comparison/src/index.tsx @@ -5,6 +5,8 @@ import { useThrottler } from '@tanstack/react-pacer/throttler' import { useRateLimiter } from '@tanstack/react-pacer/rate-limiter' import { useQueuer } from '@tanstack/react-pacer/queuer' import { useBatcher } from '@tanstack/react-pacer/batcher' +import { PacerDevtoolsPanel } from '@tanstack/pacer-react-devtools' +import { TanstackDevtools } from '@tanstack/react-devtools' function ComparisonApp() { const [currentValue, setCurrentValue] = useState(50) @@ -344,11 +346,11 @@ function ComparisonApp() { {instantExecutionCount === 0 ? '0' : Math.round( - ((instantExecutionCount - - utility.state.executionCount) / - instantExecutionCount) * - 100, - )} + ((instantExecutionCount - + utility.state.executionCount) / + instantExecutionCount) * + 100, + )} %
{utility.name === 'Rate Limiter' && ( @@ -440,6 +442,12 @@ function ComparisonApp() { ))}
+ }]} + />
) } diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json index 4173606f..8d2d4abc 100644 --- a/packages/pacer-devtools/package.json +++ b/packages/pacer-devtools/package.json @@ -61,9 +61,11 @@ "@tanstack/pacer": ">=0.14.0" }, "dependencies": { + "clsx": "^2.1.1", + "goober": "^2.1.16", "solid-js": "^1.9.7" }, "devDependencies": { "vite-plugin-solid": "^2.11.8" } -} +} \ No newline at end of file diff --git a/packages/pacer-devtools/src/context/context-provider.tsx b/packages/pacer-devtools/src/context/context-provider.tsx index 3fd14931..7d23dc60 100644 --- a/packages/pacer-devtools/src/context/context-provider.tsx +++ b/packages/pacer-devtools/src/context/context-provider.tsx @@ -4,42 +4,83 @@ import { pacerEventClient } from '@tanstack/pacer' import { PacerContext, initialStore } from './context' import type { PacerContextType } from './context' +const updateOrAddToArray = (oldArray: Array, newItem: T) => { + const index = oldArray.findIndex(item => item.uuid === newItem.uuid) + if (index !== -1) { + // Update existing item + return oldArray.map((item, i) => (i === index ? newItem : item)) + } + // Add new item + return [...oldArray, newItem] +} + export function PacerContextProvider(props: { children: any }) { const [store, setStore] = createStore(initialStore) createEffect(() => { const cleanup = pacerEventClient.onAllPluginEvents((e) => { + switch (e.type) { case 'pacer:async-batcher-state': - setStore({ asyncBatcherState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.asyncBatcherState, e.payload) + setStore({ asyncBatcherState: newItems }) + break + } case 'pacer:async-debouncer-state': - setStore({ asyncDebouncerState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.asyncDebouncerState, e.payload) + setStore({ asyncDebouncerState: newItems }) + break + } case 'pacer:async-queuer-state': - setStore({ asyncQueuerState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.asyncQueuerState, e.payload) + setStore({ asyncQueuerState: newItems }) + break + } case 'pacer:async-rate-limiter-state': - setStore({ asyncRateLimiterState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.asyncRateLimiterState, e.payload) + setStore({ asyncRateLimiterState: newItems }) + break + } case 'pacer:async-throttler-state': - setStore({ asyncThrottlerState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.asyncThrottlerState, e.payload) + setStore({ asyncThrottlerState: newItems }) + break + } case 'pacer:batcher-state': - setStore({ batcherState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.batcherState, e.payload) + setStore({ batcherState: newItems }) + break + } case 'pacer:debouncer-state': - setStore({ debouncerState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.debouncerState, e.payload) + setStore({ debouncerState: newItems }) + break + } case 'pacer:queuer-state': - setStore({ queuerState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.queuerState, e.payload) + setStore({ queuerState: newItems }) + break + } case 'pacer:rate-limiter-state': - setStore({ rateLimiterState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.rateLimiterState, e.payload) + setStore({ rateLimiterState: newItems }) + break + } case 'pacer:throttler-state': - setStore({ throttlerState: e.payload }) - break + { + const newItems = updateOrAddToArray(store.throttlerState, e.payload) + setStore({ throttlerState: newItems }) + break + } } }) onCleanup(cleanup) diff --git a/packages/pacer-devtools/src/context/context.ts b/packages/pacer-devtools/src/context/context.ts index e2aac766..c5c5e20f 100644 --- a/packages/pacer-devtools/src/context/context.ts +++ b/packages/pacer-devtools/src/context/context.ts @@ -12,32 +12,34 @@ import type { ThrottlerState, } from '@tanstack/pacer' +type WithUuid = T & { uuid: string } + export interface PacerContextType { - asyncBatcherState: AsyncBatcherState | undefined - asyncDebouncerState: AsyncDebouncerState | undefined - asyncQueuerState: AsyncQueuerState | undefined - asyncRateLimiterState: AsyncRateLimiterState | undefined - asyncThrottlerState: AsyncThrottlerState | undefined - batcherState: BatcherState | undefined - debouncerState: DebouncerState | undefined - queuerState: QueuerState | undefined - rateLimiterState: RateLimiterState | undefined - throttlerState: ThrottlerState | undefined + asyncBatcherState: Array>> + asyncDebouncerState: Array>> + asyncQueuerState: Array>> + asyncRateLimiterState: Array>> + asyncThrottlerState: Array>> + batcherState: Array>> + debouncerState: Array>> + queuerState: Array>> + rateLimiterState: Array> + throttlerState: Array>> } export const initialStore = { - asyncBatcherState: undefined, - asyncDebouncerState: undefined, - asyncQueuerState: undefined, - asyncRateLimiterState: undefined, - asyncThrottlerState: undefined, - batcherState: undefined, - debouncerState: undefined, - queuerState: undefined, - rateLimiterState: undefined, - throttlerState: undefined, + asyncBatcherState: [], + asyncDebouncerState: [], + asyncQueuerState: [], + asyncRateLimiterState: [], + asyncThrottlerState: [], + batcherState: [], + debouncerState: [], + queuerState: [], + rateLimiterState: [], + throttlerState: [], } export const PacerContext = createContext< [PacerContextType, (newState: Partial) => void] ->([initialStore, () => {}]) +>([initialStore, () => { }]) diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/devtools.tsx index 3daff91e..fe61395c 100644 --- a/packages/pacer-devtools/src/devtools.tsx +++ b/packages/pacer-devtools/src/devtools.tsx @@ -1,16 +1,86 @@ -import { usePacerState } from './context/use-context-hooks' -import { PacerContextProvider } from './context/context-provider' + +import { For, } from 'solid-js'; +import clsx from 'clsx'; +import { usePacerState } from './context/use-context-hooks'; +import { PacerContextProvider } from './context/context-provider'; +import { useStyles } from './styles/use-styles'; +import { JsonTree } from './tree'; + +type StateKey = + | 'asyncBatcherState' + | 'asyncDebouncerState' + | 'asyncQueuerState' + | 'asyncRateLimiterState' + | 'asyncThrottlerState' + | 'batcherState' + | 'debouncerState' + | 'queuerState' + | 'rateLimiterState' + | 'throttlerState'; + +const CONTEXT_SECTIONS: Array<{ key: StateKey; label: string }> = [ + { key: 'asyncBatcherState', label: 'Async Batcher State' }, + { key: 'asyncDebouncerState', label: 'Async Debouncer State' }, + { key: 'asyncQueuerState', label: 'Async Queuer State' }, + { key: 'asyncRateLimiterState', label: 'Async Rate Limiter State' }, + { key: 'asyncThrottlerState', label: 'Async Throttler State' }, + { key: 'batcherState', label: 'Batcher State' }, + { key: 'debouncerState', label: 'Debouncer State' }, + { key: 'queuerState', label: 'Queuer State' }, + { key: 'rateLimiterState', label: 'Rate Limiter State' }, + { key: 'throttlerState', label: 'Throttler State' }, +]; + + +function Section({ key, label }: { key: StateKey; label: string }) { + const state = usePacerState(); + const styles = useStyles(); + + return ( + <> + {state[key].length === 0 ? null : ( +
+
{label}
+
+ {(inst) => + + } +
+
+ )} + + ); +} function Shell() { - const state = usePacerState() + const styles = useStyles(); + return ( -
- Pacer state is: -
{JSON.stringify(state, null, 2)}
+
+
TanStack Pacer
+ +
+ {({ key, label }) => +
+ } +
- ) + ); } +function AnimatedInstanceCard(props: { value: any; }) { + + const styles = useStyles(); + + + return ( +
+ +
+ ); +} + + export default function Devtools() { return ( diff --git a/packages/pacer-devtools/src/styles/tokens.ts b/packages/pacer-devtools/src/styles/tokens.ts new file mode 100644 index 00000000..9d247cf1 --- /dev/null +++ b/packages/pacer-devtools/src/styles/tokens.ts @@ -0,0 +1,305 @@ +export const tokens = { + colors: { + inherit: 'inherit', + current: 'currentColor', + transparent: 'transparent', + black: '#000000', + white: '#ffffff', + neutral: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + darkGray: { + 50: '#525c7a', + 100: '#49536e', + 200: '#414962', + 300: '#394056', + 400: '#313749', + 500: '#292e3d', + 600: '#212530', + 700: '#191c24', + 800: '#111318', + 900: '#0b0d10', + }, + gray: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + blue: { + 25: '#F5FAFF', + 50: '#EFF8FF', + 100: '#D1E9FF', + 200: '#B2DDFF', + 300: '#84CAFF', + 400: '#53B1FD', + 500: '#2E90FA', + 600: '#1570EF', + 700: '#175CD3', + 800: '#1849A9', + 900: '#194185', + }, + green: { + 25: '#F6FEF9', + 50: '#ECFDF3', + 100: '#D1FADF', + 200: '#A6F4C5', + 300: '#6CE9A6', + 400: '#32D583', + 500: '#12B76A', + 600: '#039855', + 700: '#027A48', + 800: '#05603A', + 900: '#054F31', + }, + red: { + 50: '#fef2f2', + 100: '#fee2e2', + 200: '#fecaca', + 300: '#fca5a5', + 400: '#f87171', + 500: '#ef4444', + 600: '#dc2626', + 700: '#b91c1c', + 800: '#991b1b', + 900: '#7f1d1d', + 950: '#450a0a', + }, + yellow: { + 25: '#FFFCF5', + 50: '#FFFAEB', + 100: '#FEF0C7', + 200: '#FEDF89', + 300: '#FEC84B', + 400: '#FDB022', + 500: '#F79009', + 600: '#DC6803', + 700: '#B54708', + 800: '#93370D', + 900: '#7A2E0E', + }, + purple: { + 25: '#FAFAFF', + 50: '#F4F3FF', + 100: '#EBE9FE', + 200: '#D9D6FE', + 300: '#BDB4FE', + 400: '#9B8AFB', + 500: '#7A5AF8', + 600: '#6938EF', + 700: '#5925DC', + 800: '#4A1FB8', + 900: '#3E1C96', + }, + teal: { + 25: '#F6FEFC', + 50: '#F0FDF9', + 100: '#CCFBEF', + 200: '#99F6E0', + 300: '#5FE9D0', + 400: '#2ED3B7', + 500: '#15B79E', + 600: '#0E9384', + 700: '#107569', + 800: '#125D56', + 900: '#134E48', + }, + pink: { + 25: '#fdf2f8', + 50: '#fce7f3', + 100: '#fbcfe8', + 200: '#f9a8d4', + 300: '#f472b6', + 400: '#ec4899', + 500: '#db2777', + 600: '#be185d', + 700: '#9d174d', + 800: '#831843', + 900: '#500724', + }, + cyan: { + 25: '#ecfeff', + 50: '#cffafe', + 100: '#a5f3fc', + 200: '#67e8f9', + 300: '#22d3ee', + 400: '#06b6d4', + 500: '#0891b2', + 600: '#0e7490', + 700: '#155e75', + 800: '#164e63', + 900: '#083344', + }, + }, + alpha: { + 100: 'ff', + 90: 'e5', + 80: 'cc', + 70: 'b3', + 60: '99', + 50: '80', + 40: '66', + 30: '4d', + 20: '33', + 10: '1a', + 0: '00', + }, + font: { + size: { + '2xs': 'calc(var(--tsrd-font-size) * 0.625)', + xs: 'calc(var(--tsrd-font-size) * 0.75)', + sm: 'calc(var(--tsrd-font-size) * 0.875)', + md: 'var(--tsrd-font-size)', + lg: 'calc(var(--tsrd-font-size) * 1.125)', + xl: 'calc(var(--tsrd-font-size) * 1.25)', + '2xl': 'calc(var(--tsrd-font-size) * 1.5)', + '3xl': 'calc(var(--tsrd-font-size) * 1.875)', + '4xl': 'calc(var(--tsrd-font-size) * 2.25)', + '5xl': 'calc(var(--tsrd-font-size) * 3)', + '6xl': 'calc(var(--tsrd-font-size) * 3.75)', + '7xl': 'calc(var(--tsrd-font-size) * 4.5)', + '8xl': 'calc(var(--tsrd-font-size) * 6)', + '9xl': 'calc(var(--tsrd-font-size) * 8)', + }, + lineHeight: { + '3xs': 'calc(var(--tsrd-font-size) * 0.75)', + '2xs': 'calc(var(--tsrd-font-size) * 0.875)', + xs: 'calc(var(--tsrd-font-size) * 1)', + sm: 'calc(var(--tsrd-font-size) * 1.25)', + md: 'calc(var(--tsrd-font-size) * 1.5)', + lg: 'calc(var(--tsrd-font-size) * 1.75)', + xl: 'calc(var(--tsrd-font-size) * 2)', + '2xl': 'calc(var(--tsrd-font-size) * 2.25)', + '3xl': 'calc(var(--tsrd-font-size) * 2.5)', + '4xl': 'calc(var(--tsrd-font-size) * 2.75)', + '5xl': 'calc(var(--tsrd-font-size) * 3)', + '6xl': 'calc(var(--tsrd-font-size) * 3.25)', + '7xl': 'calc(var(--tsrd-font-size) * 3.5)', + '8xl': 'calc(var(--tsrd-font-size) * 3.75)', + '9xl': 'calc(var(--tsrd-font-size) * 4)', + }, + weight: { + thin: '100', + extralight: '200', + light: '300', + normal: '400', + medium: '500', + semibold: '600', + bold: '700', + extrabold: '800', + black: '900', + }, + fontFamily: { + sans: 'ui-sans-serif, Inter, system-ui, sans-serif, sans-serif', + mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`, + }, + }, + breakpoints: { + xs: '320px', + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px', + }, + border: { + radius: { + none: '0px', + xs: 'calc(var(--tsrd-font-size) * 0.125)', + sm: 'calc(var(--tsrd-font-size) * 0.25)', + md: 'calc(var(--tsrd-font-size) * 0.375)', + lg: 'calc(var(--tsrd-font-size) * 0.5)', + xl: 'calc(var(--tsrd-font-size) * 0.75)', + '2xl': 'calc(var(--tsrd-font-size) * 1)', + '3xl': 'calc(var(--tsrd-font-size) * 1.5)', + full: '9999px', + }, + }, + size: { + 0: '0px', + 0.25: 'calc(var(--tsrd-font-size) * 0.0625)', + 0.5: 'calc(var(--tsrd-font-size) * 0.125)', + 1: 'calc(var(--tsrd-font-size) * 0.25)', + 1.5: 'calc(var(--tsrd-font-size) * 0.375)', + 2: 'calc(var(--tsrd-font-size) * 0.5)', + 2.5: 'calc(var(--tsrd-font-size) * 0.625)', + 3: 'calc(var(--tsrd-font-size) * 0.75)', + 3.5: 'calc(var(--tsrd-font-size) * 0.875)', + 4: 'calc(var(--tsrd-font-size) * 1)', + 4.5: 'calc(var(--tsrd-font-size) * 1.125)', + 5: 'calc(var(--tsrd-font-size) * 1.25)', + 5.5: 'calc(var(--tsrd-font-size) * 1.375)', + 6: 'calc(var(--tsrd-font-size) * 1.5)', + 6.5: 'calc(var(--tsrd-font-size) * 1.625)', + 7: 'calc(var(--tsrd-font-size) * 1.75)', + 8: 'calc(var(--tsrd-font-size) * 2)', + 9: 'calc(var(--tsrd-font-size) * 2.25)', + 10: 'calc(var(--tsrd-font-size) * 2.5)', + 11: 'calc(var(--tsrd-font-size) * 2.75)', + 12: 'calc(var(--tsrd-font-size) * 3)', + 14: 'calc(var(--tsrd-font-size) * 3.5)', + 16: 'calc(var(--tsrd-font-size) * 4)', + 20: 'calc(var(--tsrd-font-size) * 5)', + 24: 'calc(var(--tsrd-font-size) * 6)', + 28: 'calc(var(--tsrd-font-size) * 7)', + 32: 'calc(var(--tsrd-font-size) * 8)', + 36: 'calc(var(--tsrd-font-size) * 9)', + 40: 'calc(var(--tsrd-font-size) * 10)', + 44: 'calc(var(--tsrd-font-size) * 11)', + 48: 'calc(var(--tsrd-font-size) * 12)', + 52: 'calc(var(--tsrd-font-size) * 13)', + 56: 'calc(var(--tsrd-font-size) * 14)', + 60: 'calc(var(--tsrd-font-size) * 15)', + 64: 'calc(var(--tsrd-font-size) * 16)', + 72: 'calc(var(--tsrd-font-size) * 18)', + 80: 'calc(var(--tsrd-font-size) * 20)', + 96: 'calc(var(--tsrd-font-size) * 24)', + }, + shadow: { + xs: (_: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const, + sm: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const, + md: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const, + lg: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const, + xl: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const, + '2xl': (color: string = 'rgb(0 0 0 / 0.25)') => + `0 25px 50px -12px ${color}` as const, + inner: (color: string = 'rgb(0 0 0 / 0.05)') => + `inset 0 2px 4px 0 ${color}` as const, + none: () => `none` as const, + }, + zIndices: { + hide: -1, + auto: 'auto', + base: 0, + docked: 10, + dropdown: 1000, + sticky: 1100, + banner: 1200, + overlay: 1300, + modal: 1400, + popover: 1500, + skipLink: 1600, + toast: 1700, + tooltip: 1800, + }, +} as const diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts new file mode 100644 index 00000000..ad983887 --- /dev/null +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -0,0 +1,123 @@ +import * as goober from 'goober' +import { createSignal } from 'solid-js' +import { tokens } from './tokens' + + +const stylesFactory = () => { + const { colors, font, size, alpha, border } = tokens; + const { fontFamily, size: fontSize } = font; + const css = goober.css; + + return { + devtoolsPanel: css` + background: ${colors.darkGray[900]}; + color: ${colors.gray[100]}; + font-family: ${fontFamily.sans}; + font-size: ${fontSize.md}; + min-height: 100%; + padding: ${size[4]}; + box-sizing: border-box; + display: flex; + flex-direction: column; + gap: ${size[6]}; + width: 100%; + height: 100%; + overflow-x: auto; + `, + stickyHeader: css` + position: sticky; + top: 0; + z-index: 10; + background: ${colors.darkGray[900]}; + padding-bottom: ${size[3]}; + margin-bottom: ${size[2]}; + font-size: ${fontSize.xl}; + font-weight: ${font.weight.bold}; + color: ${colors.blue[400]}; + letter-spacing: 0.04em; + text-transform: uppercase; + border-bottom: 1px solid ${colors.darkGray[700]}; + box-shadow: 0 2px 8px 0 ${colors.black + alpha[40]}; + `, + sectionContainer: css` + display: flex; + flex-wrap: wrap; + gap: ${size[4]}; + `, + section: css` + background: ${colors.darkGray[800]}; + border-radius: ${border.radius.lg}; + box-shadow: ${tokens.shadow.md(colors.black + alpha[80])}; + padding: ${size[4]}; + margin-bottom: ${size[4]}; + border: 1px solid ${colors.darkGray[700]}; + min-width: 0; + max-width: 33%; + max-height: fit-content; + `, + sectionHeader: css` + font-size: ${fontSize.lg}; + font-weight: ${font.weight.bold}; + margin-bottom: ${size[2]}; + color: ${colors.blue[400]}; + letter-spacing: 0.01em; + display: flex; + align-items: center; + gap: ${size[2]}; + `, + sectionEmpty: css` + color: ${colors.gray[500]}; + font-size: ${fontSize.sm}; + font-style: italic; + margin: ${size[2]} 0; + `, + instanceList: css` + display: flex; + flex-direction: column; + gap: ${size[2]}; + `, + instanceCard: css` + background: ${colors.darkGray[700]}; + border-radius: ${border.radius.md}; + padding: ${size[3]}; + border: 1px solid ${colors.darkGray[600]}; + font-size: ${fontSize.sm}; + color: ${colors.gray[100]}; + font-family: ${fontFamily.mono}; + overflow-x: auto; + transition: box-shadow 0.3s, background 0.3s; + `, + flash: (isFlashing: boolean) => isFlashing ? css` + box-shadow: 0 0 0 2px ${colors.blue[400]}; + background: ${colors.blue[600]}; + ` : css``, + valueString: css` + color: ${colors.green[400]}; + `, + valueNumber: css` + color: ${colors.yellow[400]}; + `, + valueBoolean: css` + color: ${colors.pink[400]}; + `, + valueNull: css` + color: ${colors.gray[400]}; + font-style: italic; + `, + valueKey: css` + color: ${colors.blue[300]}; + `, + valueBraces: css` + color: ${colors.gray[500]}; + `, + valueContainer: css` + display: block; + margin-left: 1rem; + ` + }; +} + +export function useStyles() { + const [_styles] = createSignal(stylesFactory()) + return _styles +} diff --git a/packages/pacer-devtools/src/tree.tsx b/packages/pacer-devtools/src/tree.tsx new file mode 100644 index 00000000..5576258d --- /dev/null +++ b/packages/pacer-devtools/src/tree.tsx @@ -0,0 +1,71 @@ +import { For } from "solid-js"; +import { useStyles } from "./styles/use-styles"; + +export function JsonTree(props: { value: any; keyName?: string }) { + const { value, keyName } = props; + const styles = useStyles(); + + if (typeof value === 'string') { + return + {keyName && "{keyName}": } + "{value}" + , + ; + } + if (typeof value === 'number') { + return + {keyName && "{keyName}": } + {value} + , + ; + } + if (typeof value === 'boolean') { + return + + {keyName && "{keyName}": } + {String(value)} + + , + ; + } + if (value === null) { + return + {keyName && "{keyName}": } + null + , + ; + } + if (value === undefined) { + return + {keyName && "{keyName}": } + undefined + , + ; + } + if (Array.isArray(value)) { + return + {keyName && "{keyName}": } + [ + {(item) => <> + + } + + ] + , + ; + } + if (typeof value === 'object') { + const keys = Object.keys(value); + return + {keyName && "{keyName}": } + {'{'} + {(k,) => <> + + } + + {'}'} + + ; + } + return ; +} \ No newline at end of file diff --git a/packages/pacer-react-devtools/src/devtools.tsx b/packages/pacer-react-devtools/src/devtools.tsx index c2ab840d..5bdf7222 100644 --- a/packages/pacer-react-devtools/src/devtools.tsx +++ b/packages/pacer-react-devtools/src/devtools.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from 'react' import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' -interface PacerDevtoolsReactInit {} +interface PacerDevtoolsReactInit { } export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { const devToolRef = useRef(null) @@ -15,5 +15,5 @@ export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { return () => devtools.unmount() }, [devtools]) - return
+ return
} diff --git a/packages/pacer-solid-devtools/src/devtools.tsx b/packages/pacer-solid-devtools/src/devtools.tsx index 4aad3e6b..657998c8 100644 --- a/packages/pacer-solid-devtools/src/devtools.tsx +++ b/packages/pacer-solid-devtools/src/devtools.tsx @@ -1,7 +1,7 @@ import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' import { createSignal, onCleanup, onMount } from 'solid-js' -interface PacerDevtoolsSolidInit {} +interface PacerDevtoolsSolidInit { } export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { let devToolRef: HTMLDivElement | undefined @@ -16,5 +16,5 @@ export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { } }) - return
+ return
} diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 7415e52d..c890f3fa 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange, } from './event-client' import type { OptionalKeys } from './types' export interface AsyncBatcherState { @@ -223,11 +223,12 @@ export class AsyncBatcher { ) options: AsyncBatcherOptionsWithOptionalCallbacks #timeoutId: NodeJS.Timeout | null = null - + #uuid: string constructor( public fn: (items: Array) => Promise, initialOptions: AsyncBatcherOptions, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -264,7 +265,10 @@ export class AsyncBatcher { ? 'idle' : 'populated', } as const - pacerEventClient.emit('async-batcher-state', finalState) + emitChange('async-batcher-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index dfc5e31e..3b7cc9ce 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange, } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncDebouncerState { @@ -185,11 +185,12 @@ export class AsyncDebouncer { #resolvePreviousPromise: | ((value?: ReturnType | undefined) => void) | null = null - + #uuid: string constructor( public fn: TFn, initialOptions: AsyncDebouncerOptions, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -229,7 +230,10 @@ export class AsyncDebouncer { ? 'settled' : 'idle', } as const - pacerEventClient.emit('async-debouncer-state', finalState) + emitChange('async-debouncer-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index 4e3ba70e..dd59a642 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange } from './event-client' import type { OptionalKeys } from './types' import type { QueuePosition } from './queuer' @@ -263,11 +263,12 @@ export class AsyncQueuer { >(getDefaultAsyncQueuerState()) options: AsyncQueuerOptions #timeoutIds: Set = new Set() - + #uuid: string constructor( public fn: (item: TValue) => Promise, initialOptions: AsyncQueuerOptions = {}, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -323,7 +324,10 @@ export class AsyncQueuer { size, status, } as const - pacerEventClient.emit('async-queuer-state', finalState) + emitChange('async-queuer-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } @@ -371,19 +375,19 @@ export class AsyncQueuer { this.#setState({ activeItems, }) - ;(async () => { - const result = await this.execute() - this.#setState({ lastResult: result }) - - const wait = this.#getWait() - if (wait > 0) { - const timeoutId = setTimeout(() => this.#tick(), wait) - this.#timeoutIds.add(timeoutId) - return - } - - this.#tick() - })() + ; (async () => { + const result = await this.execute() + this.#setState({ lastResult: result }) + + const wait = this.#getWait() + if (wait > 0) { + const timeoutId = setTimeout(() => this.#tick(), wait) + this.#timeoutIds.add(timeoutId) + return + } + + this.#tick() + })() } this.#setState({ pendingTick: false }) diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index 39dff211..c959d8ee 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange } from './event-client' import type { AnyAsyncFunction } from './types' export interface AsyncRateLimiterState { @@ -209,11 +209,12 @@ export class AsyncRateLimiter { >(getDefaultAsyncRateLimiterState()) options: AsyncRateLimiterOptions #timeoutIds: Set = new Set() - + #uuid: string constructor( public fn: TFn, initialOptions: AsyncRateLimiterOptions, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -251,7 +252,10 @@ export class AsyncRateLimiter { isExceeded, status, } as const - pacerEventClient.emit('async-rate-limiter-state', finalState) + emitChange('async-rate-limiter-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index af3395ab..acb42072 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncThrottlerState { @@ -196,11 +196,12 @@ export class AsyncThrottler { #resolvePreviousPromise: | ((value?: ReturnType | undefined) => void) | null = null - + #uuid: string constructor( public fn: TFn, initialOptions: AsyncThrottlerOptions, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -240,7 +241,10 @@ export class AsyncThrottler { ? 'settled' : 'idle', } as const - pacerEventClient.emit('async-throttler-state', finalState) + emitChange('async-throttler-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index a7e4e0f8..dcd4709a 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange } from './event-client' import type { OptionalKeys } from './types' export interface BatcherState { @@ -142,11 +142,12 @@ export class Batcher { ) options: BatcherOptionsWithOptionalCallbacks #timeoutId: NodeJS.Timeout | null = null - + #uuid: string constructor( public fn: (items: Array) => void, initialOptions: BatcherOptions, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -177,7 +178,10 @@ export class Batcher { status: isPending ? 'pending' : 'idle', } as const - pacerEventClient.emit('batcher-state', finalState) + emitChange('batcher-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index ea242a2b..37de3db6 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange } from './event-client' import type { AnyFunction } from './types' export interface DebouncerState { @@ -122,11 +122,12 @@ export class Debouncer { ) options: DebouncerOptions #timeoutId: NodeJS.Timeout | undefined - + #uuid: string constructor( public fn: TFn, initialOptions: DebouncerOptions, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -161,7 +162,10 @@ export class Debouncer { ? 'pending' : 'idle', } as const - pacerEventClient.emit('debouncer-state', finalState) + emitChange('debouncer-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/packages/pacer/src/event-client.ts b/packages/pacer/src/event-client.ts index 8161cea2..c3eaac87 100644 --- a/packages/pacer/src/event-client.ts +++ b/packages/pacer/src/event-client.ts @@ -10,20 +10,22 @@ import type { QueuerState } from './queuer' import type { RateLimiterState } from './rate-limiter' import type { ThrottlerState } from './throttler' +type WithUuid = T & { uuid: string } + export interface PacerEventMap { - 'pacer:async-batcher-state': AsyncBatcherState - 'pacer:async-debouncer-state': AsyncDebouncerState - 'pacer:async-queuer-state': AsyncQueuerState - 'pacer:async-rate-limiter-state': AsyncRateLimiterState - 'pacer:async-throttler-state': AsyncThrottlerState - 'pacer:batcher-state': BatcherState - 'pacer:debouncer-state': DebouncerState - 'pacer:queuer-state': QueuerState - 'pacer:rate-limiter-state': RateLimiterState - 'pacer:throttler-state': ThrottlerState + 'pacer:async-batcher-state': WithUuid> + 'pacer:async-debouncer-state': WithUuid> + 'pacer:async-queuer-state': WithUuid> + 'pacer:async-rate-limiter-state': WithUuid> + 'pacer:async-throttler-state': WithUuid> + 'pacer:batcher-state': WithUuid> + 'pacer:debouncer-state': WithUuid> + 'pacer:queuer-state': WithUuid> + 'pacer:rate-limiter-state': WithUuid + 'pacer:throttler-state': WithUuid> } -export class PacerEventClient extends EventClient { +class PacerEventClient extends EventClient { constructor(props?: { debug: boolean }) { super({ pluginId: 'pacer', @@ -32,4 +34,11 @@ export class PacerEventClient extends EventClient { } } +export const emitChange = extends `${string}:${infer S}` ? S : never>( + event: TSuffix, + payload: PacerEventMap[`pacer:${TSuffix}`] & { uuid: string } +) => { + pacerEventClient.emit(event, payload) +} + export const pacerEventClient = new PacerEventClient() diff --git a/packages/pacer/src/index.ts b/packages/pacer/src/index.ts index 9c630dd2..97f55d9b 100644 --- a/packages/pacer/src/index.ts +++ b/packages/pacer/src/index.ts @@ -10,4 +10,5 @@ export * from './rate-limiter' export * from './throttler' export * from './types' export * from './utils' -export * from './event-client' +export { pacerEventClient } from './event-client' +export type { PacerEventMap } from './event-client' \ No newline at end of file diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index b445fce7..0ee341cf 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange } from './event-client' export interface QueuerState { /** @@ -247,11 +247,12 @@ export class Queuer { ) options: QueuerOptions #timeoutId: NodeJS.Timeout | null = null - + #uuid: string constructor( public fn: (item: TValue) => void, initialOptions: QueuerOptions = {}, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -306,7 +307,10 @@ export class Queuer { size, status, } as const - pacerEventClient.emit('queuer-state', finalState) + emitChange('queuer-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index de2fd61f..abf472a1 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange } from './event-client' import type { AnyFunction } from './types' export interface RateLimiterState { @@ -135,11 +135,13 @@ export class RateLimiter { new Store(getDefaultRateLimiterState()) options: RateLimiterOptions #timeoutIds: Set = new Set() + #uuid: string constructor( public fn: TFn, initialOptions: RateLimiterOptions, ) { + this.#uuid = crypto.randomUUID() this.options = { ...defaultOptions, ...initialOptions, @@ -174,7 +176,10 @@ export class RateLimiter { isExceeded, status, } as const - pacerEventClient.emit('rate-limiter-state', finalState) + emitChange('rate-limiter-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index 1e1b36f7..009f6933 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { pacerEventClient } from './event-client' +import { emitChange } from './event-client' import type { AnyFunction } from './types' export interface ThrottlerState { @@ -130,6 +130,7 @@ export class Throttler { ) options: ThrottlerOptions #timeoutId: NodeJS.Timeout | undefined + #uuid = crypto.randomUUID() constructor( public fn: TFn, @@ -169,7 +170,10 @@ export class Throttler { ? 'pending' : 'idle', } as const - pacerEventClient.emit('throttler-state', finalState) + emitChange('throttler-state', { + ...finalState, + uuid: this.#uuid, + }) return finalState }) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1de8954d..054f4ec1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1132,6 +1132,12 @@ importers: specifier: ^19.1.1 version: 19.1.1(react@19.1.1) devDependencies: + '@tanstack/pacer-react-devtools': + specifier: 0.14.0 + version: link:../../../packages/pacer-react-devtools + '@tanstack/react-devtools': + specifier: 0.2.2 + version: 0.2.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.7) '@types/react': specifier: ^19.1.9 version: 19.1.9 @@ -1559,6 +1565,12 @@ importers: '@tanstack/pacer': specifier: '>=0.14.0' version: link:../pacer + clsx: + specifier: ^2.1.1 + version: 2.1.1 + goober: + specifier: ^2.1.16 + version: 2.1.16(csstype@3.1.3) solid-js: specifier: ^1.9.7 version: 1.9.7 From 03fe0083d253217acaf52e9055bd28a54af43f30 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 09:46:33 +0000 Subject: [PATCH 14/50] ci: apply automated fixes --- docs/reference/classes/asyncbatcher.md | 24 +- docs/reference/classes/asyncdebouncer.md | 20 +- docs/reference/classes/asyncqueuer.md | 38 ++-- docs/reference/classes/asyncratelimiter.md | 20 +- docs/reference/classes/asyncthrottler.md | 20 +- docs/reference/classes/batcher.md | 22 +- docs/reference/classes/debouncer.md | 20 +- docs/reference/classes/pacereventclient.md | 214 ------------------ docs/reference/classes/queuer.md | 34 +-- docs/reference/classes/ratelimiter.md | 20 +- docs/reference/classes/throttler.md | 20 +- docs/reference/functions/asyncbatch.md | 2 +- docs/reference/functions/asyncdebounce.md | 2 +- docs/reference/functions/asyncqueue.md | 2 +- docs/reference/functions/asyncratelimit.md | 2 +- docs/reference/functions/asyncthrottle.md | 2 +- docs/reference/functions/batch.md | 2 +- docs/reference/functions/debounce.md | 2 +- docs/reference/functions/isfunction.md | 2 +- .../functions/parsefunctionorvalue.md | 2 +- docs/reference/functions/queue.md | 2 +- docs/reference/functions/ratelimit.md | 2 +- docs/reference/functions/throttle.md | 2 +- docs/reference/index.md | 1 - .../interfaces/asyncbatcheroptions.md | 22 +- .../reference/interfaces/asyncbatcherstate.md | 28 +-- .../interfaces/asyncdebounceroptions.md | 20 +- .../interfaces/asyncdebouncerstate.md | 20 +- .../interfaces/asyncqueueroptions.md | 38 ++-- docs/reference/interfaces/asyncqueuerstate.md | 34 +-- .../interfaces/asyncratelimiteroptions.md | 22 +- .../interfaces/asyncratelimiterstate.md | 20 +- .../interfaces/asyncthrottleroptions.md | 20 +- .../interfaces/asyncthrottlerstate.md | 22 +- docs/reference/interfaces/batcheroptions.md | 16 +- docs/reference/interfaces/batcherstate.md | 16 +- docs/reference/interfaces/debounceroptions.md | 14 +- docs/reference/interfaces/debouncerstate.md | 12 +- docs/reference/interfaces/pacereventmap.md | 42 ++-- docs/reference/interfaces/queueroptions.md | 30 +-- docs/reference/interfaces/queuerstate.md | 26 +-- .../interfaces/ratelimiteroptions.md | 16 +- docs/reference/interfaces/ratelimiterstate.md | 12 +- docs/reference/interfaces/throttleroptions.md | 14 +- docs/reference/interfaces/throttlerstate.md | 14 +- .../type-aliases/anyasyncfunction.md | 2 +- docs/reference/type-aliases/anyfunction.md | 2 +- docs/reference/type-aliases/optionalkeys.md | 2 +- docs/reference/type-aliases/queueposition.md | 2 +- docs/reference/variables/pacereventclient.md | 2 +- examples/react/util-comparison/package.json | 2 +- examples/react/util-comparison/src/index.tsx | 10 +- packages/pacer-devtools/package.json | 2 +- .../src/context/context-provider.tsx | 130 +++++------ .../pacer-devtools/src/context/context.ts | 2 +- packages/pacer-devtools/src/devtools.tsx | 51 ++--- .../pacer-devtools/src/styles/use-styles.ts | 26 ++- packages/pacer-devtools/src/tree.tsx | 152 ++++++++----- .../pacer-react-devtools/src/devtools.tsx | 4 +- .../pacer-solid-devtools/src/devtools.tsx | 4 +- packages/pacer/src/async-batcher.ts | 2 +- packages/pacer/src/async-debouncer.ts | 2 +- packages/pacer/src/async-queuer.ts | 26 +-- packages/pacer/src/event-client.ts | 11 +- packages/pacer/src/index.ts | 2 +- 65 files changed, 606 insertions(+), 765 deletions(-) delete mode 100644 docs/reference/classes/pacereventclient.md diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index e94aa1b4..43e39bab 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -7,7 +7,7 @@ title: AsyncBatcher # Class: AsyncBatcher\ -Defined in: [packages/pacer/src/async-batcher.ts:220](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L220) +Defined in: [async-batcher.ts:220](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L220) A class that collects items and processes them in batches asynchronously. @@ -82,7 +82,7 @@ batcher.addItem(2); new AsyncBatcher(fn, initialOptions): AsyncBatcher ``` -Defined in: [packages/pacer/src/async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L227) +Defined in: [async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L227) #### Parameters @@ -106,7 +106,7 @@ Defined in: [packages/pacer/src/async-batcher.ts:227](https://github.com/TanStac fn: (items) => Promise; ``` -Defined in: [packages/pacer/src/async-batcher.ts:228](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L228) +Defined in: [async-batcher.ts:228](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L228) #### Parameters @@ -126,7 +126,7 @@ Defined in: [packages/pacer/src/async-batcher.ts:228](https://github.com/TanStac options: AsyncBatcherOptionsWithOptionalCallbacks; ``` -Defined in: [packages/pacer/src/async-batcher.ts:224](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L224) +Defined in: [async-batcher.ts:224](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L224) *** @@ -136,7 +136,7 @@ Defined in: [packages/pacer/src/async-batcher.ts:224](https://github.com/TanStac readonly store: Store>>; ``` -Defined in: [packages/pacer/src/async-batcher.ts:221](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L221) +Defined in: [async-batcher.ts:221](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L221) ## Methods @@ -146,7 +146,7 @@ Defined in: [packages/pacer/src/async-batcher.ts:221](https://github.com/TanStac addItem(item): void ``` -Defined in: [packages/pacer/src/async-batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L280) +Defined in: [async-batcher.ts:284](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L284) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -169,7 +169,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [packages/pacer/src/async-batcher.ts:381](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L381) +Defined in: [async-batcher.ts:385](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L385) Removes all items from the async batcher @@ -185,7 +185,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [packages/pacer/src/async-batcher.ts:355](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L355) +Defined in: [async-batcher.ts:359](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L359) Processes the current batch of items immediately @@ -201,7 +201,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [packages/pacer/src/async-batcher.ts:363](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L363) +Defined in: [async-batcher.ts:367](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L367) Returns a copy of all items in the async batcher @@ -217,7 +217,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [packages/pacer/src/async-batcher.ts:367](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L367) +Defined in: [async-batcher.ts:371](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L371) #### Returns @@ -231,7 +231,7 @@ Defined in: [packages/pacer/src/async-batcher.ts:367](https://github.com/TanStac reset(): void ``` -Defined in: [packages/pacer/src/async-batcher.ts:388](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L388) +Defined in: [async-batcher.ts:392](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L392) Resets the async batcher state to its default values @@ -247,7 +247,7 @@ Resets the async batcher state to its default values setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/async-batcher.ts:242](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L242) +Defined in: [async-batcher.ts:243](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L243) Updates the async batcher options diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index 297ffe50..6f8666b4 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -7,7 +7,7 @@ title: AsyncDebouncer # Class: AsyncDebouncer\ -Defined in: [packages/pacer/src/async-debouncer.ts:178](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L178) +Defined in: [async-debouncer.ts:178](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L178) A class that creates an async debounced function. @@ -66,7 +66,7 @@ const results = await asyncDebouncer.maybeExecute(inputElement.value); new AsyncDebouncer(fn, initialOptions): AsyncDebouncer ``` -Defined in: [packages/pacer/src/async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L189) +Defined in: [async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L189) #### Parameters @@ -90,7 +90,7 @@ Defined in: [packages/pacer/src/async-debouncer.ts:189](https://github.com/TanSt fn: TFn; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L190) +Defined in: [async-debouncer.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L190) *** @@ -100,7 +100,7 @@ Defined in: [packages/pacer/src/async-debouncer.ts:190](https://github.com/TanSt options: AsyncDebouncerOptions; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:182](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L182) +Defined in: [async-debouncer.ts:182](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L182) *** @@ -110,7 +110,7 @@ Defined in: [packages/pacer/src/async-debouncer.ts:182](https://github.com/TanSt readonly store: Store>>; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:179](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L179) +Defined in: [async-debouncer.ts:179](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L179) ## Methods @@ -120,7 +120,7 @@ Defined in: [packages/pacer/src/async-debouncer.ts:179](https://github.com/TanSt cancel(): void ``` -Defined in: [packages/pacer/src/async-debouncer.ts:390](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L390) +Defined in: [async-debouncer.ts:394](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L394) Cancels any pending execution or aborts any execution in progress @@ -136,7 +136,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [packages/pacer/src/async-debouncer.ts:342](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L342) +Defined in: [async-debouncer.ts:346](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L346) Processes the current pending execution immediately @@ -152,7 +152,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [packages/pacer/src/async-debouncer.ts:265](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L265) +Defined in: [async-debouncer.ts:269](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L269) Attempts to execute the debounced function. If a call is already in progress, it will be queued. @@ -188,7 +188,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [packages/pacer/src/async-debouncer.ts:399](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L399) +Defined in: [async-debouncer.ts:403](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L403) Resets the debouncer state to its default values @@ -204,7 +204,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/async-debouncer.ts:204](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L204) +Defined in: [async-debouncer.ts:205](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L205) Updates the async debouncer options diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index 0d09aa38..8a95ac82 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -7,7 +7,7 @@ title: AsyncQueuer # Class: AsyncQueuer\ -Defined in: [packages/pacer/src/async-queuer.ts:260](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L260) +Defined in: [async-queuer.ts:260](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L260) A flexible asynchronous queue for processing tasks with configurable concurrency, priority, and expiration. @@ -71,7 +71,7 @@ asyncQueuer.start(); new AsyncQueuer(fn, initialOptions): AsyncQueuer ``` -Defined in: [packages/pacer/src/async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L267) +Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L267) #### Parameters @@ -95,7 +95,7 @@ Defined in: [packages/pacer/src/async-queuer.ts:267](https://github.com/TanStack fn: (item) => Promise; ``` -Defined in: [packages/pacer/src/async-queuer.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L268) +Defined in: [async-queuer.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L268) #### Parameters @@ -115,7 +115,7 @@ Defined in: [packages/pacer/src/async-queuer.ts:268](https://github.com/TanStack options: AsyncQueuerOptions; ``` -Defined in: [packages/pacer/src/async-queuer.ts:264](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L264) +Defined in: [async-queuer.ts:264](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L264) *** @@ -125,7 +125,7 @@ Defined in: [packages/pacer/src/async-queuer.ts:264](https://github.com/TanStack readonly store: Store>>; ``` -Defined in: [packages/pacer/src/async-queuer.ts:261](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L261) +Defined in: [async-queuer.ts:261](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L261) ## Methods @@ -138,7 +138,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [packages/pacer/src/async-queuer.ts:402](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L402) +Defined in: [async-queuer.ts:406](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L406) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -176,7 +176,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [packages/pacer/src/async-queuer.ts:706](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L706) +Defined in: [async-queuer.ts:710](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L710) Removes all pending items from the queue. Does not affect active tasks. @@ -192,7 +192,7 @@ Removes all pending items from the queue. Does not affect active tasks. execute(position?): Promise ``` -Defined in: [packages/pacer/src/async-queuer.ts:528](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L528) +Defined in: [async-queuer.ts:532](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L532) Removes and returns the next item from the queue and executes the task function with it. @@ -222,7 +222,7 @@ queuer.execute('back'); flush(numberOfItems, position?): Promise ``` -Defined in: [packages/pacer/src/async-queuer.ts:563](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L563) +Defined in: [async-queuer.ts:567](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L567) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -249,7 +249,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): Promise ``` -Defined in: [packages/pacer/src/async-queuer.ts:577](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L577) +Defined in: [async-queuer.ts:581](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L581) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -272,7 +272,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [packages/pacer/src/async-queuer.ts:481](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L481) +Defined in: [async-queuer.ts:485](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L485) Removes and returns the next item from the queue without executing the task function. Use for manual queue management. Normally, use execute() to process items. @@ -304,7 +304,7 @@ queuer.getNextItem('back'); peekActiveItems(): TValue[] ``` -Defined in: [packages/pacer/src/async-queuer.ts:669](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L669) +Defined in: [async-queuer.ts:673](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L673) Returns the items currently being processed (active tasks). @@ -320,7 +320,7 @@ Returns the items currently being processed (active tasks). peekAllItems(): TValue[] ``` -Defined in: [packages/pacer/src/async-queuer.ts:662](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L662) +Defined in: [async-queuer.ts:666](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L666) Returns a copy of all items in the queue, including active and pending items. @@ -336,7 +336,7 @@ Returns a copy of all items in the queue, including active and pending items. peekNextItem(position): undefined | TValue ``` -Defined in: [packages/pacer/src/async-queuer.ts:652](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L652) +Defined in: [async-queuer.ts:656](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L656) Returns the next item in the queue without removing it. @@ -365,7 +365,7 @@ queuer.peekNextItem('back'); // back peekPendingItems(): TValue[] ``` -Defined in: [packages/pacer/src/async-queuer.ts:676](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L676) +Defined in: [async-queuer.ts:680](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L680) Returns the items waiting to be processed (pending tasks). @@ -381,7 +381,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [packages/pacer/src/async-queuer.ts:714](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L714) +Defined in: [async-queuer.ts:718](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L718) Resets the queuer state to its default values @@ -397,7 +397,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/async-queuer.ts:299](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L299) +Defined in: [async-queuer.ts:300](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L300) Updates the queuer options. New options are merged with existing options. @@ -419,7 +419,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [packages/pacer/src/async-queuer.ts:683](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L683) +Defined in: [async-queuer.ts:687](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L687) Starts processing items in the queue. If already running, does nothing. @@ -435,7 +435,7 @@ Starts processing items in the queue. If already running, does nothing. stop(): void ``` -Defined in: [packages/pacer/src/async-queuer.ts:693](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L693) +Defined in: [async-queuer.ts:697](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L697) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index c950b595..34cabbe1 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -7,7 +7,7 @@ title: AsyncRateLimiter # Class: AsyncRateLimiter\ -Defined in: [packages/pacer/src/async-rate-limiter.ts:206](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L206) +Defined in: [async-rate-limiter.ts:206](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L206) A class that creates an async rate-limited function. @@ -87,7 +87,7 @@ const data = await rateLimiter.maybeExecute('123'); new AsyncRateLimiter(fn, initialOptions): AsyncRateLimiter ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L213) +Defined in: [async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L213) #### Parameters @@ -111,7 +111,7 @@ Defined in: [packages/pacer/src/async-rate-limiter.ts:213](https://github.com/Ta fn: TFn; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L214) +Defined in: [async-rate-limiter.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L214) *** @@ -121,7 +121,7 @@ Defined in: [packages/pacer/src/async-rate-limiter.ts:214](https://github.com/Ta options: AsyncRateLimiterOptions; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L210) +Defined in: [async-rate-limiter.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L210) *** @@ -131,7 +131,7 @@ Defined in: [packages/pacer/src/async-rate-limiter.ts:210](https://github.com/Ta readonly store: Store>>; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:207](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L207) +Defined in: [async-rate-limiter.ts:207](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L207) ## Methods @@ -141,7 +141,7 @@ Defined in: [packages/pacer/src/async-rate-limiter.ts:207](https://github.com/Ta getMsUntilNextWindow(): number ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:436](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L436) +Defined in: [async-rate-limiter.ts:440](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L440) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -159,7 +159,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:426](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L426) +Defined in: [async-rate-limiter.ts:430](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L430) Returns the number of remaining executions allowed in the current window @@ -175,7 +175,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:305](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L305) +Defined in: [async-rate-limiter.ts:309](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L309) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -223,7 +223,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L447) +Defined in: [async-rate-limiter.ts:451](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L451) Resets the rate limiter state @@ -239,7 +239,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:231](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L231) +Defined in: [async-rate-limiter.ts:232](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L232) Updates the async rate limiter options diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index 6bd6f919..1a17ad2f 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -7,7 +7,7 @@ title: AsyncThrottler # Class: AsyncThrottler\ -Defined in: [packages/pacer/src/async-throttler.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L189) +Defined in: [async-throttler.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L189) A class that creates an async throttled function. @@ -69,7 +69,7 @@ const result = await throttler.maybeExecute(inputElement.value); new AsyncThrottler(fn, initialOptions): AsyncThrottler ``` -Defined in: [packages/pacer/src/async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L200) +Defined in: [async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L200) #### Parameters @@ -93,7 +93,7 @@ Defined in: [packages/pacer/src/async-throttler.ts:200](https://github.com/TanSt fn: TFn; ``` -Defined in: [packages/pacer/src/async-throttler.ts:201](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L201) +Defined in: [async-throttler.ts:201](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L201) *** @@ -103,7 +103,7 @@ Defined in: [packages/pacer/src/async-throttler.ts:201](https://github.com/TanSt options: AsyncThrottlerOptions; ``` -Defined in: [packages/pacer/src/async-throttler.ts:193](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L193) +Defined in: [async-throttler.ts:193](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L193) *** @@ -113,7 +113,7 @@ Defined in: [packages/pacer/src/async-throttler.ts:193](https://github.com/TanSt readonly store: Store>>; ``` -Defined in: [packages/pacer/src/async-throttler.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L190) +Defined in: [async-throttler.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L190) ## Methods @@ -123,7 +123,7 @@ Defined in: [packages/pacer/src/async-throttler.ts:190](https://github.com/TanSt cancel(): void ``` -Defined in: [packages/pacer/src/async-throttler.ts:425](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L425) +Defined in: [async-throttler.ts:429](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L429) Cancels any pending execution or aborts any execution in progress @@ -139,7 +139,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [packages/pacer/src/async-throttler.ts:374](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L374) +Defined in: [async-throttler.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L378) Processes the current pending execution immediately @@ -155,7 +155,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [packages/pacer/src/async-throttler.ts:284](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L284) +Defined in: [async-throttler.ts:288](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L288) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -197,7 +197,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [packages/pacer/src/async-throttler.ts:433](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L433) +Defined in: [async-throttler.ts:437](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L437) Resets the debouncer state to its default values @@ -213,7 +213,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/async-throttler.ts:215](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L215) +Defined in: [async-throttler.ts:216](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L216) Updates the async throttler options diff --git a/docs/reference/classes/batcher.md b/docs/reference/classes/batcher.md index 57a9ffb3..aca76a53 100644 --- a/docs/reference/classes/batcher.md +++ b/docs/reference/classes/batcher.md @@ -7,7 +7,7 @@ title: Batcher # Class: Batcher\ -Defined in: [packages/pacer/src/batcher.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L139) +Defined in: [batcher.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L139) A class that collects items and processes them in batches. @@ -59,7 +59,7 @@ batcher.addItem(2); new Batcher(fn, initialOptions): Batcher ``` -Defined in: [packages/pacer/src/batcher.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L146) +Defined in: [batcher.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L146) #### Parameters @@ -83,7 +83,7 @@ Defined in: [packages/pacer/src/batcher.ts:146](https://github.com/TanStack/pace fn: (items) => void; ``` -Defined in: [packages/pacer/src/batcher.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L147) +Defined in: [batcher.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L147) #### Parameters @@ -103,7 +103,7 @@ Defined in: [packages/pacer/src/batcher.ts:147](https://github.com/TanStack/pace options: BatcherOptionsWithOptionalCallbacks; ``` -Defined in: [packages/pacer/src/batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L143) +Defined in: [batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L143) *** @@ -113,7 +113,7 @@ Defined in: [packages/pacer/src/batcher.ts:143](https://github.com/TanStack/pace readonly store: Store>>; ``` -Defined in: [packages/pacer/src/batcher.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L140) +Defined in: [batcher.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L140) ## Methods @@ -123,7 +123,7 @@ Defined in: [packages/pacer/src/batcher.ts:140](https://github.com/TanStack/pace addItem(item): void ``` -Defined in: [packages/pacer/src/batcher.ts:193](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L193) +Defined in: [batcher.ts:197](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L197) Adds an item to the batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -146,7 +146,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [packages/pacer/src/batcher.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L263) +Defined in: [batcher.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L267) Removes all items from the batcher @@ -162,7 +162,7 @@ Removes all items from the batcher flush(): void ``` -Defined in: [packages/pacer/src/batcher.ts:241](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L241) +Defined in: [batcher.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L245) Processes the current batch of items immediately @@ -178,7 +178,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [packages/pacer/src/batcher.ts:249](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L249) +Defined in: [batcher.ts:253](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L253) Returns a copy of all items in the batcher @@ -194,7 +194,7 @@ Returns a copy of all items in the batcher reset(): void ``` -Defined in: [packages/pacer/src/batcher.ts:270](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L270) +Defined in: [batcher.ts:274](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L274) Resets the batcher state to its default values @@ -210,7 +210,7 @@ Resets the batcher state to its default values setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/batcher.ts:160](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L160) +Defined in: [batcher.ts:161](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L161) Updates the batcher options diff --git a/docs/reference/classes/debouncer.md b/docs/reference/classes/debouncer.md index 3579c252..18bbec02 100644 --- a/docs/reference/classes/debouncer.md +++ b/docs/reference/classes/debouncer.md @@ -7,7 +7,7 @@ title: Debouncer # Class: Debouncer\ -Defined in: [packages/pacer/src/debouncer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L119) +Defined in: [debouncer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L119) A class that creates a debounced function. @@ -52,7 +52,7 @@ inputElement.addEventListener('input', () => { new Debouncer(fn, initialOptions): Debouncer ``` -Defined in: [packages/pacer/src/debouncer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L126) +Defined in: [debouncer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L126) #### Parameters @@ -76,7 +76,7 @@ Defined in: [packages/pacer/src/debouncer.ts:126](https://github.com/TanStack/pa fn: TFn; ``` -Defined in: [packages/pacer/src/debouncer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L127) +Defined in: [debouncer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L127) *** @@ -86,7 +86,7 @@ Defined in: [packages/pacer/src/debouncer.ts:127](https://github.com/TanStack/pa options: DebouncerOptions; ``` -Defined in: [packages/pacer/src/debouncer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L123) +Defined in: [debouncer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L123) *** @@ -96,7 +96,7 @@ Defined in: [packages/pacer/src/debouncer.ts:123](https://github.com/TanStack/pa readonly store: Store>>; ``` -Defined in: [packages/pacer/src/debouncer.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L120) +Defined in: [debouncer.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L120) ## Methods @@ -106,7 +106,7 @@ Defined in: [packages/pacer/src/debouncer.ts:120](https://github.com/TanStack/pa cancel(): void ``` -Defined in: [packages/pacer/src/debouncer.ts:246](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L246) +Defined in: [debouncer.ts:250](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L250) Cancels any pending execution @@ -122,7 +122,7 @@ Cancels any pending execution flush(): void ``` -Defined in: [packages/pacer/src/debouncer.ts:229](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L229) +Defined in: [debouncer.ts:233](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L233) Processes the current pending execution immediately @@ -138,7 +138,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [packages/pacer/src/debouncer.ts:187](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L187) +Defined in: [debouncer.ts:191](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L191) Attempts to execute the debounced function If a call is already in progress, it will be queued @@ -161,7 +161,7 @@ If a call is already in progress, it will be queued reset(): void ``` -Defined in: [packages/pacer/src/debouncer.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L257) +Defined in: [debouncer.ts:261](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L261) Resets the debouncer state to its default values @@ -177,7 +177,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/debouncer.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L140) +Defined in: [debouncer.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L141) Updates the debouncer options diff --git a/docs/reference/classes/pacereventclient.md b/docs/reference/classes/pacereventclient.md deleted file mode 100644 index c9a25ca9..00000000 --- a/docs/reference/classes/pacereventclient.md +++ /dev/null @@ -1,214 +0,0 @@ ---- -id: PacerEventClient -title: PacerEventClient ---- - - - -# Class: PacerEventClient - -Defined in: [packages/pacer/src/event-client.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L26) - -## Extends - -- `EventClient`\<[`PacerEventMap`](../../interfaces/pacereventmap.md)\> - -## Constructors - -### new PacerEventClient() - -```ts -new PacerEventClient(props?): PacerEventClient -``` - -Defined in: [packages/pacer/src/event-client.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L27) - -#### Parameters - -##### props? - -###### debug - -`boolean` - -#### Returns - -[`PacerEventClient`](../pacereventclient.md) - -#### Overrides - -```ts -EventClient.constructor -``` - -## Methods - -### emit() - -```ts -emit(eventSuffix, payload): number | void -``` - -Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:24 - -#### Type Parameters - -• **TSuffix** *extends* - \| `"async-batcher-state"` - \| `"async-debouncer-state"` - \| `"async-queuer-state"` - \| `"async-rate-limiter-state"` - \| `"async-throttler-state"` - \| `"batcher-state"` - \| `"debouncer-state"` - \| `"queuer-state"` - \| `"rate-limiter-state"` - \| `"throttler-state"` - -#### Parameters - -##### eventSuffix - -`TSuffix` - -##### payload - -[`PacerEventMap`](../../interfaces/pacereventmap.md)\[`` `pacer:${TSuffix}` ``\] - -#### Returns - -`number` \| `void` - -#### Inherited from - -```ts -EventClient.emit -``` - -*** - -### getPluginId() - -```ts -getPluginId(): "pacer" -``` - -Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:22 - -#### Returns - -`"pacer"` - -#### Inherited from - -```ts -EventClient.getPluginId -``` - -*** - -### on() - -```ts -on(eventSuffix, cb): () => void -``` - -Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:25 - -#### Type Parameters - -• **TSuffix** *extends* - \| `"async-batcher-state"` - \| `"async-debouncer-state"` - \| `"async-queuer-state"` - \| `"async-rate-limiter-state"` - \| `"async-throttler-state"` - \| `"batcher-state"` - \| `"debouncer-state"` - \| `"queuer-state"` - \| `"rate-limiter-state"` - \| `"throttler-state"` - -#### Parameters - -##### eventSuffix - -`TSuffix` - -##### cb - -(`event`) => `void` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Inherited from - -```ts -EventClient.on -``` - -*** - -### onAll() - -```ts -onAll(cb): () => void -``` - -Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:26 - -#### Parameters - -##### cb - -(`event`) => `void` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Inherited from - -```ts -EventClient.onAll -``` - -*** - -### onAllPluginEvents() - -```ts -onAllPluginEvents(cb): () => void -``` - -Defined in: node\_modules/.pnpm/@tanstack+devtools-event-client@0.2.1/node\_modules/@tanstack/devtools-event-client/dist/esm/plugin.d.ts:27 - -#### Parameters - -##### cb - -(`event`) => `void` - -#### Returns - -`Function` - -##### Returns - -`void` - -#### Inherited from - -```ts -EventClient.onAllPluginEvents -``` diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index ce191fdb..0bfa3727 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -7,7 +7,7 @@ title: Queuer # Class: Queuer\ -Defined in: [packages/pacer/src/queuer.ts:244](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L244) +Defined in: [queuer.ts:244](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L244) A flexible queue that processes items with configurable wait times, expiration, and priority. @@ -92,7 +92,7 @@ manualQueue.getNextItem(); // returns 2, queue is empty new Queuer(fn, initialOptions): Queuer ``` -Defined in: [packages/pacer/src/queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L251) +Defined in: [queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L251) #### Parameters @@ -116,7 +116,7 @@ Defined in: [packages/pacer/src/queuer.ts:251](https://github.com/TanStack/pacer fn: (item) => void; ``` -Defined in: [packages/pacer/src/queuer.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L252) +Defined in: [queuer.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L252) #### Parameters @@ -136,7 +136,7 @@ Defined in: [packages/pacer/src/queuer.ts:252](https://github.com/TanStack/pacer options: QueuerOptions; ``` -Defined in: [packages/pacer/src/queuer.ts:248](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L248) +Defined in: [queuer.ts:248](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L248) *** @@ -146,7 +146,7 @@ Defined in: [packages/pacer/src/queuer.ts:248](https://github.com/TanStack/pacer readonly store: Store>>; ``` -Defined in: [packages/pacer/src/queuer.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L245) +Defined in: [queuer.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L245) ## Methods @@ -159,7 +159,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [packages/pacer/src/queuer.ts:366](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L366) +Defined in: [queuer.ts:370](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L370) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -198,7 +198,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [packages/pacer/src/queuer.ts:639](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L639) +Defined in: [queuer.ts:643](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L643) Removes all pending items from the queue. Does not affect items being processed. @@ -214,7 +214,7 @@ Removes all pending items from the queue. Does not affect items being processed. execute(position?): undefined | TValue ``` -Defined in: [packages/pacer/src/queuer.ts:493](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L493) +Defined in: [queuer.ts:497](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L497) Removes and returns the next item from the queue and processes it using the provided function. @@ -243,7 +243,7 @@ queuer.execute('back'); flush(numberOfItems, position?): void ``` -Defined in: [packages/pacer/src/queuer.ts:509](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L509) +Defined in: [queuer.ts:513](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L513) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -270,7 +270,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [packages/pacer/src/queuer.ts:524](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L524) +Defined in: [queuer.ts:528](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L528) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -293,7 +293,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [packages/pacer/src/queuer.ts:446](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L446) +Defined in: [queuer.ts:450](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L450) Removes and returns the next item from the queue without executing the function. Use for manual queue management. Normally, use execute() to process items. @@ -324,7 +324,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [packages/pacer/src/queuer.ts:607](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L607) +Defined in: [queuer.ts:611](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L611) Returns a copy of all items in the queue. @@ -340,7 +340,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [packages/pacer/src/queuer.ts:597](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L597) +Defined in: [queuer.ts:601](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L601) Returns the next item in the queue without removing it. @@ -368,7 +368,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [packages/pacer/src/queuer.ts:647](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L647) +Defined in: [queuer.ts:651](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L651) Resets the queuer state to its default values @@ -384,7 +384,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/queuer.ts:282](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L282) +Defined in: [queuer.ts:283](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L283) Updates the queuer options. New options are merged with existing options. @@ -406,7 +406,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [packages/pacer/src/queuer.ts:614](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L614) +Defined in: [queuer.ts:618](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L618) Starts processing items in the queue. If already isRunning, does nothing. @@ -422,7 +422,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [packages/pacer/src/queuer.ts:624](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L624) +Defined in: [queuer.ts:628](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L628) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/ratelimiter.md b/docs/reference/classes/ratelimiter.md index f45a0e9c..5ef754c7 100644 --- a/docs/reference/classes/ratelimiter.md +++ b/docs/reference/classes/ratelimiter.md @@ -7,7 +7,7 @@ title: RateLimiter # Class: RateLimiter\ -Defined in: [packages/pacer/src/rate-limiter.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L133) +Defined in: [rate-limiter.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L133) A class that creates a rate-limited function. @@ -65,7 +65,7 @@ rateLimiter.maybeExecute('123'); new RateLimiter(fn, initialOptions): RateLimiter ``` -Defined in: [packages/pacer/src/rate-limiter.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L139) +Defined in: [rate-limiter.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L140) #### Parameters @@ -89,7 +89,7 @@ Defined in: [packages/pacer/src/rate-limiter.ts:139](https://github.com/TanStack fn: TFn; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L140) +Defined in: [rate-limiter.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L141) *** @@ -99,7 +99,7 @@ Defined in: [packages/pacer/src/rate-limiter.ts:140](https://github.com/TanStack options: RateLimiterOptions; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L136) +Defined in: [rate-limiter.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L136) *** @@ -109,7 +109,7 @@ Defined in: [packages/pacer/src/rate-limiter.ts:136](https://github.com/TanStack readonly store: Store>; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L134) +Defined in: [rate-limiter.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L134) ## Methods @@ -119,7 +119,7 @@ Defined in: [packages/pacer/src/rate-limiter.ts:134](https://github.com/TanStack getMsUntilNextWindow(): number ``` -Defined in: [packages/pacer/src/rate-limiter.ts:320](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L320) +Defined in: [rate-limiter.ts:325](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L325) Returns the number of milliseconds until the next execution will be possible @@ -135,7 +135,7 @@ Returns the number of milliseconds until the next execution will be possible getRemainingInWindow(): number ``` -Defined in: [packages/pacer/src/rate-limiter.ts:312](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L312) +Defined in: [rate-limiter.ts:317](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L317) Returns the number of remaining executions allowed in the current window @@ -151,7 +151,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): boolean ``` -Defined in: [packages/pacer/src/rate-limiter.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L218) +Defined in: [rate-limiter.ts:223](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L223) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -186,7 +186,7 @@ rateLimiter.maybeExecute('arg1', 'arg2'); // false reset(): void ``` -Defined in: [packages/pacer/src/rate-limiter.ts:331](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L331) +Defined in: [rate-limiter.ts:336](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L336) Resets the rate limiter state @@ -202,7 +202,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/rate-limiter.ts:156](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L156) +Defined in: [rate-limiter.ts:158](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L158) Updates the rate limiter options diff --git a/docs/reference/classes/throttler.md b/docs/reference/classes/throttler.md index 71d90dc3..819a0872 100644 --- a/docs/reference/classes/throttler.md +++ b/docs/reference/classes/throttler.md @@ -7,7 +7,7 @@ title: Throttler # Class: Throttler\ -Defined in: [packages/pacer/src/throttler.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L127) +Defined in: [throttler.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L127) A class that creates a throttled function. @@ -56,7 +56,7 @@ throttler.maybeExecute('123'); // Throttled new Throttler(fn, initialOptions): Throttler ``` -Defined in: [packages/pacer/src/throttler.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L134) +Defined in: [throttler.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L135) #### Parameters @@ -80,7 +80,7 @@ Defined in: [packages/pacer/src/throttler.ts:134](https://github.com/TanStack/pa fn: TFn; ``` -Defined in: [packages/pacer/src/throttler.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L135) +Defined in: [throttler.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L136) *** @@ -90,7 +90,7 @@ Defined in: [packages/pacer/src/throttler.ts:135](https://github.com/TanStack/pa options: ThrottlerOptions; ``` -Defined in: [packages/pacer/src/throttler.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L131) +Defined in: [throttler.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L131) *** @@ -100,7 +100,7 @@ Defined in: [packages/pacer/src/throttler.ts:131](https://github.com/TanStack/pa readonly store: Store>>; ``` -Defined in: [packages/pacer/src/throttler.ts:128](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L128) +Defined in: [throttler.ts:128](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L128) ## Methods @@ -110,7 +110,7 @@ Defined in: [packages/pacer/src/throttler.ts:128](https://github.com/TanStack/pa cancel(): void ``` -Defined in: [packages/pacer/src/throttler.ts:284](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L284) +Defined in: [throttler.ts:288](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L288) Cancels any pending trailing execution and clears internal state. @@ -132,7 +132,7 @@ Has no effect if there is no pending execution. flush(): void ``` -Defined in: [packages/pacer/src/throttler.ts:262](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L262) +Defined in: [throttler.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L266) Processes the current pending execution immediately @@ -148,7 +148,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [packages/pacer/src/throttler.ts:207](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L207) +Defined in: [throttler.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L211) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -190,7 +190,7 @@ throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [packages/pacer/src/throttler.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L295) +Defined in: [throttler.ts:299](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L299) Resets the throttler state to its default values @@ -206,7 +206,7 @@ Resets the throttler state to its default values setOptions(newOptions): void ``` -Defined in: [packages/pacer/src/throttler.ts:148](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L148) +Defined in: [throttler.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L149) Updates the throttler options diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index 9d6078f3..058fa991 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,7 +11,7 @@ title: asyncBatch function asyncBatch(fn, options): (item) => void ``` -Defined in: [packages/pacer/src/async-batcher.ts:443](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L443) +Defined in: [async-batcher.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L447) Creates an async batcher that processes items in batches diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index 2792a773..b7ad9237 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,7 +11,7 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [packages/pacer/src/async-debouncer.ts:448](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L448) +Defined in: [async-debouncer.ts:452](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L452) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index ffead6df..2e3da553 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,7 +11,7 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [packages/pacer/src/async-queuer.ts:753](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L753) +Defined in: [async-queuer.ts:757](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L757) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index e85faaaa..d0db7b3b 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,7 +11,7 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:518](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L518) +Defined in: [async-rate-limiter.ts:522](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L522) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index 77f5c6ad..97f76c2b 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,7 +11,7 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [packages/pacer/src/async-throttler.ts:481](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L481) +Defined in: [async-throttler.ts:485](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L485) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md index 78ccafbc..9342bf72 100644 --- a/docs/reference/functions/batch.md +++ b/docs/reference/functions/batch.md @@ -11,7 +11,7 @@ title: batch function batch(fn, options): (item) => void ``` -Defined in: [packages/pacer/src/batcher.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L294) +Defined in: [batcher.ts:298](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L298) Creates a batcher that processes items in batches diff --git a/docs/reference/functions/debounce.md b/docs/reference/functions/debounce.md index 9b932c63..da4e2ecf 100644 --- a/docs/reference/functions/debounce.md +++ b/docs/reference/functions/debounce.md @@ -11,7 +11,7 @@ title: debounce function debounce(fn, initialOptions): (...args) => void ``` -Defined in: [packages/pacer/src/debouncer.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L290) +Defined in: [debouncer.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L294) Creates a debounced function that delays invoking the provided function until after a specified wait time. Multiple calls during the wait period will cancel previous pending invocations and reset the timer. diff --git a/docs/reference/functions/isfunction.md b/docs/reference/functions/isfunction.md index 9cbdfafd..96879e1e 100644 --- a/docs/reference/functions/isfunction.md +++ b/docs/reference/functions/isfunction.md @@ -11,7 +11,7 @@ title: isFunction function isFunction(value): value is T ``` -Defined in: [packages/pacer/src/utils.ts:3](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L3) +Defined in: [utils.ts:3](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L3) ## Type Parameters diff --git a/docs/reference/functions/parsefunctionorvalue.md b/docs/reference/functions/parsefunctionorvalue.md index 7d0685c7..1629cd6c 100644 --- a/docs/reference/functions/parsefunctionorvalue.md +++ b/docs/reference/functions/parsefunctionorvalue.md @@ -11,7 +11,7 @@ title: parseFunctionOrValue function parseFunctionOrValue(value, ...args): T ``` -Defined in: [packages/pacer/src/utils.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L7) +Defined in: [utils.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L7) ## Type Parameters diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index 35556f2b..61dbc854 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -11,7 +11,7 @@ title: queue function queue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [packages/pacer/src/queuer.ts:690](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L690) +Defined in: [queuer.ts:694](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L694) Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. diff --git a/docs/reference/functions/ratelimit.md b/docs/reference/functions/ratelimit.md index 0d3918b5..778862a2 100644 --- a/docs/reference/functions/ratelimit.md +++ b/docs/reference/functions/ratelimit.md @@ -11,7 +11,7 @@ title: rateLimit function rateLimit(fn, initialOptions): (...args) => boolean ``` -Defined in: [packages/pacer/src/rate-limiter.ts:383](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L383) +Defined in: [rate-limiter.ts:388](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L388) Creates a rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/throttle.md b/docs/reference/functions/throttle.md index d17e3390..739ae5c2 100644 --- a/docs/reference/functions/throttle.md +++ b/docs/reference/functions/throttle.md @@ -11,7 +11,7 @@ title: throttle function throttle(fn, initialOptions): (...args) => void ``` -Defined in: [packages/pacer/src/throttler.ts:334](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L334) +Defined in: [throttler.ts:338](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L338) Creates a throttled function that limits how often the provided function can execute. diff --git a/docs/reference/index.md b/docs/reference/index.md index bb332f65..a27297a2 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -16,7 +16,6 @@ title: "@tanstack/pacer" - [AsyncThrottler](../classes/asyncthrottler.md) - [Batcher](../classes/batcher.md) - [Debouncer](../classes/debouncer.md) -- [PacerEventClient](../classes/pacereventclient.md) - [Queuer](../classes/queuer.md) - [RateLimiter](../classes/ratelimiter.md) - [Throttler](../classes/throttler.md) diff --git a/docs/reference/interfaces/asyncbatcheroptions.md b/docs/reference/interfaces/asyncbatcheroptions.md index 2b999ffb..e2d5495e 100644 --- a/docs/reference/interfaces/asyncbatcheroptions.md +++ b/docs/reference/interfaces/asyncbatcheroptions.md @@ -7,7 +7,7 @@ title: AsyncBatcherOptions # Interface: AsyncBatcherOptions\ -Defined in: [packages/pacer/src/async-batcher.ts:82](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L82) +Defined in: [async-batcher.ts:82](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L82) Options for configuring an AsyncBatcher instance @@ -23,7 +23,7 @@ Options for configuring an AsyncBatcher instance optional getShouldExecute: (items, batcher) => boolean; ``` -Defined in: [packages/pacer/src/async-batcher.ts:87](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L87) +Defined in: [async-batcher.ts:87](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L87) Custom function to determine if a batch should be processed Return true to process the batch immediately @@ -50,7 +50,7 @@ Return true to process the batch immediately optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/async-batcher.ts:94](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L94) +Defined in: [async-batcher.ts:94](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L94) Initial state for the async batcher @@ -62,7 +62,7 @@ Initial state for the async batcher optional maxSize: number; ``` -Defined in: [packages/pacer/src/async-batcher.ts:99](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L99) +Defined in: [async-batcher.ts:99](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L99) Maximum number of items in a batch @@ -80,7 +80,7 @@ Infinity optional onError: (error, batch, batcher) => void; ``` -Defined in: [packages/pacer/src/async-batcher.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L105) +Defined in: [async-batcher.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L105) Optional error handler for when the batch function throws. If provided, the handler will be called with the error, the batch of items that failed, and batcher instance. @@ -112,7 +112,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onItemsChange: (batcher) => void; ``` -Defined in: [packages/pacer/src/async-batcher.ts:113](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L113) +Defined in: [async-batcher.ts:113](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L113) Callback fired after items are added to the batcher @@ -134,7 +134,7 @@ Callback fired after items are added to the batcher optional onSettled: (batch, batcher) => void; ``` -Defined in: [packages/pacer/src/async-batcher.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L117) +Defined in: [async-batcher.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L117) Optional callback to call when a batch is settled (completed or failed) @@ -160,7 +160,7 @@ Optional callback to call when a batch is settled (completed or failed) optional onSuccess: (result, batch, batcher) => void; ``` -Defined in: [packages/pacer/src/async-batcher.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L121) +Defined in: [async-batcher.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L121) Optional callback to call when a batch succeeds @@ -190,7 +190,7 @@ Optional callback to call when a batch succeeds optional started: boolean; ``` -Defined in: [packages/pacer/src/async-batcher.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L130) +Defined in: [async-batcher.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L130) Whether the batcher should start processing immediately @@ -208,7 +208,7 @@ true optional throwOnError: boolean; ``` -Defined in: [packages/pacer/src/async-batcher.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L136) +Defined in: [async-batcher.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L136) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -222,7 +222,7 @@ Can be explicitly set to override these defaults. optional wait: number | (asyncBatcher) => number; ``` -Defined in: [packages/pacer/src/async-batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L143) +Defined in: [async-batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L143) Maximum time in milliseconds to wait before processing a batch. If the wait duration has elapsed, the batch will be processed. diff --git a/docs/reference/interfaces/asyncbatcherstate.md b/docs/reference/interfaces/asyncbatcherstate.md index 6b0b2ac2..38bbde18 100644 --- a/docs/reference/interfaces/asyncbatcherstate.md +++ b/docs/reference/interfaces/asyncbatcherstate.md @@ -7,7 +7,7 @@ title: AsyncBatcherState # Interface: AsyncBatcherState\ -Defined in: [packages/pacer/src/async-batcher.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L6) +Defined in: [async-batcher.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/async-batcher.ts:6](https://github.com/TanStack/ errorCount: number; ``` -Defined in: [packages/pacer/src/async-batcher.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L10) +Defined in: [async-batcher.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L10) Number of batch executions that have resulted in errors @@ -33,7 +33,7 @@ Number of batch executions that have resulted in errors failedItems: TValue[]; ``` -Defined in: [packages/pacer/src/async-batcher.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L14) +Defined in: [async-batcher.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L14) Array of items that failed during batch processing @@ -45,7 +45,7 @@ Array of items that failed during batch processing isEmpty: boolean; ``` -Defined in: [packages/pacer/src/async-batcher.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L18) +Defined in: [async-batcher.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L18) Whether the batcher has no items to process (items array is empty) @@ -57,7 +57,7 @@ Whether the batcher has no items to process (items array is empty) isExecuting: boolean; ``` -Defined in: [packages/pacer/src/async-batcher.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L22) +Defined in: [async-batcher.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L22) Whether a batch is currently being processed asynchronously @@ -69,7 +69,7 @@ Whether a batch is currently being processed asynchronously isPending: boolean; ``` -Defined in: [packages/pacer/src/async-batcher.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L26) +Defined in: [async-batcher.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L26) Whether the batcher is waiting for the timeout to trigger batch processing @@ -81,7 +81,7 @@ Whether the batcher is waiting for the timeout to trigger batch processing items: TValue[]; ``` -Defined in: [packages/pacer/src/async-batcher.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L30) +Defined in: [async-batcher.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L30) Array of items currently queued for batch processing @@ -93,7 +93,7 @@ Array of items currently queued for batch processing lastResult: any; ``` -Defined in: [packages/pacer/src/async-batcher.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L34) +Defined in: [async-batcher.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L34) The result from the most recent batch execution @@ -105,7 +105,7 @@ The result from the most recent batch execution settleCount: number; ``` -Defined in: [packages/pacer/src/async-batcher.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L38) +Defined in: [async-batcher.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L38) Number of batch executions that have completed (either successfully or with errors) @@ -117,7 +117,7 @@ Number of batch executions that have completed (either successfully or with erro size: number; ``` -Defined in: [packages/pacer/src/async-batcher.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L42) +Defined in: [async-batcher.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L42) Number of items currently in the batch queue @@ -129,7 +129,7 @@ Number of items currently in the batch queue status: "idle" | "pending" | "executing" | "populated"; ``` -Defined in: [packages/pacer/src/async-batcher.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L46) +Defined in: [async-batcher.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L46) Current processing status - 'idle' when not processing, 'pending' when waiting for timeout, 'executing' when processing, 'populated' when items are present, but no wait is configured @@ -141,7 +141,7 @@ Current processing status - 'idle' when not processing, 'pending' when waiting f successCount: number; ``` -Defined in: [packages/pacer/src/async-batcher.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L50) +Defined in: [async-batcher.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L50) Number of batch executions that have completed successfully @@ -153,7 +153,7 @@ Number of batch executions that have completed successfully totalItemsFailed: number; ``` -Defined in: [packages/pacer/src/async-batcher.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L54) +Defined in: [async-batcher.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L54) Total number of items that have failed processing across all batches @@ -165,6 +165,6 @@ Total number of items that have failed processing across all batches totalItemsProcessed: number; ``` -Defined in: [packages/pacer/src/async-batcher.ts:58](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L58) +Defined in: [async-batcher.ts:58](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L58) Total number of items that have been processed across all batches diff --git a/docs/reference/interfaces/asyncdebounceroptions.md b/docs/reference/interfaces/asyncdebounceroptions.md index cb5191ca..53b27b99 100644 --- a/docs/reference/interfaces/asyncdebounceroptions.md +++ b/docs/reference/interfaces/asyncdebounceroptions.md @@ -7,7 +7,7 @@ title: AsyncDebouncerOptions # Interface: AsyncDebouncerOptions\ -Defined in: [packages/pacer/src/async-debouncer.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L64) +Defined in: [async-debouncer.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L64) Options for configuring an async debounced function @@ -23,7 +23,7 @@ Options for configuring an async debounced function optional enabled: boolean | (debouncer) => boolean; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L70) +Defined in: [async-debouncer.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L70) Whether the debouncer is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L74) +Defined in: [async-debouncer.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L74) Initial state for the async debouncer @@ -49,7 +49,7 @@ Initial state for the async debouncer optional leading: boolean; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L79) +Defined in: [async-debouncer.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L79) Whether to execute on the leading edge of the timeout. Defaults to false. @@ -62,7 +62,7 @@ Defaults to false. optional onError: (error, args, debouncer) => void; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L85) +Defined in: [async-debouncer.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L85) Optional error handler for when the debounced function throws. If provided, the handler will be called with the error and debouncer instance. @@ -94,7 +94,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onSettled: (args, debouncer) => void; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L93) +Defined in: [async-debouncer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L93) Optional callback to call when the debounced function is executed @@ -120,7 +120,7 @@ Optional callback to call when the debounced function is executed optional onSuccess: (result, args, debouncer) => void; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L97) +Defined in: [async-debouncer.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L97) Optional callback to call when the debounced function is executed @@ -150,7 +150,7 @@ Optional callback to call when the debounced function is executed optional throwOnError: boolean; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L107) +Defined in: [async-debouncer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L107) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -164,7 +164,7 @@ Can be explicitly set to override these defaults. optional trailing: boolean; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L112) +Defined in: [async-debouncer.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L112) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -177,7 +177,7 @@ Defaults to true. wait: number | (debouncer) => number; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L118) +Defined in: [async-debouncer.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L118) Delay in milliseconds to wait after the last call before executing. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncdebouncerstate.md b/docs/reference/interfaces/asyncdebouncerstate.md index 513b4101..b8482b0b 100644 --- a/docs/reference/interfaces/asyncdebouncerstate.md +++ b/docs/reference/interfaces/asyncdebouncerstate.md @@ -7,7 +7,7 @@ title: AsyncDebouncerState # Interface: AsyncDebouncerState\ -Defined in: [packages/pacer/src/async-debouncer.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L6) +Defined in: [async-debouncer.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/async-debouncer.ts:6](https://github.com/TanStac canLeadingExecute: boolean; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L10) +Defined in: [async-debouncer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L10) Whether the debouncer can execute on the leading edge of the timeout @@ -33,7 +33,7 @@ Whether the debouncer can execute on the leading edge of the timeout errorCount: number; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L14) +Defined in: [async-debouncer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L14) Number of function executions that have resulted in errors @@ -45,7 +45,7 @@ Number of function executions that have resulted in errors isExecuting: boolean; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L18) +Defined in: [async-debouncer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L18) Whether the debounced function is currently executing asynchronously @@ -57,7 +57,7 @@ Whether the debounced function is currently executing asynchronously isPending: boolean; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L22) +Defined in: [async-debouncer.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L22) Whether the debouncer is waiting for the timeout to trigger execution @@ -69,7 +69,7 @@ Whether the debouncer is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L26) +Defined in: [async-debouncer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L26) The arguments from the most recent call to maybeExecute @@ -81,7 +81,7 @@ The arguments from the most recent call to maybeExecute lastResult: undefined | ReturnType; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L30) +Defined in: [async-debouncer.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L30) The result from the most recent successful function execution @@ -93,7 +93,7 @@ The result from the most recent successful function execution settleCount: number; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L34) +Defined in: [async-debouncer.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L34) Number of function executions that have completed (either successfully or with errors) @@ -105,7 +105,7 @@ Number of function executions that have completed (either successfully or with e status: "disabled" | "idle" | "pending" | "executing" | "settled"; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L38) +Defined in: [async-debouncer.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L38) Current execution status - 'idle' when not active, 'pending' when waiting, 'executing' when running, 'settled' when completed @@ -117,6 +117,6 @@ Current execution status - 'idle' when not active, 'pending' when waiting, 'exec successCount: number; ``` -Defined in: [packages/pacer/src/async-debouncer.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L42) +Defined in: [async-debouncer.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L42) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/asyncqueueroptions.md b/docs/reference/interfaces/asyncqueueroptions.md index dd99dce3..7685fe32 100644 --- a/docs/reference/interfaces/asyncqueueroptions.md +++ b/docs/reference/interfaces/asyncqueueroptions.md @@ -7,7 +7,7 @@ title: AsyncQueuerOptions # Interface: AsyncQueuerOptions\ -Defined in: [packages/pacer/src/async-queuer.ts:95](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L95) +Defined in: [async-queuer.ts:95](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L95) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/async-queuer.ts:95](https://github.com/TanStack/ optional addItemsTo: QueuePosition; ``` -Defined in: [packages/pacer/src/async-queuer.ts:100](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L100) +Defined in: [async-queuer.ts:100](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L100) Default position to add items to the queuer @@ -39,7 +39,7 @@ Default position to add items to the queuer optional concurrency: number | (queuer) => number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L106) +Defined in: [async-queuer.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L106) Maximum number of concurrent tasks to process. Can be a number or a function that returns a number. @@ -58,7 +58,7 @@ Can be a number or a function that returns a number. optional expirationDuration: number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L111) +Defined in: [async-queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L111) Maximum time in milliseconds that an item can stay in the queue If not provided, items will never expire @@ -71,7 +71,7 @@ If not provided, items will never expire optional getIsExpired: (item, addedAt) => boolean; ``` -Defined in: [packages/pacer/src/async-queuer.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L116) +Defined in: [async-queuer.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L116) Function to determine if an item has expired If provided, this overrides the expirationDuration behavior @@ -98,7 +98,7 @@ If provided, this overrides the expirationDuration behavior optional getItemsFrom: QueuePosition; ``` -Defined in: [packages/pacer/src/async-queuer.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L121) +Defined in: [async-queuer.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L121) Default position to get items from during processing @@ -116,7 +116,7 @@ Default position to get items from during processing optional getPriority: (item) => number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L127) +Defined in: [async-queuer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L127) Function to determine priority of items in the queuer Higher priority items will be processed first @@ -140,7 +140,7 @@ If not provided, will use static priority values attached to tasks optional initialItems: TValue[]; ``` -Defined in: [packages/pacer/src/async-queuer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L131) +Defined in: [async-queuer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L131) Initial items to populate the queuer with @@ -152,7 +152,7 @@ Initial items to populate the queuer with optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/async-queuer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L135) +Defined in: [async-queuer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L135) Initial state for the async queuer @@ -164,7 +164,7 @@ Initial state for the async queuer optional maxSize: number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L139) +Defined in: [async-queuer.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L139) Maximum number of items allowed in the queuer @@ -176,7 +176,7 @@ Maximum number of items allowed in the queuer optional onError: (error, item, queuer) => void; ``` -Defined in: [packages/pacer/src/async-queuer.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L145) +Defined in: [async-queuer.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L145) Optional error handler for when a task throws. If provided, the handler will be called with the error and queuer instance. @@ -208,7 +208,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onExpire: (item, queuer) => void; ``` -Defined in: [packages/pacer/src/async-queuer.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L149) +Defined in: [async-queuer.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L149) Callback fired whenever an item expires in the queuer @@ -234,7 +234,7 @@ Callback fired whenever an item expires in the queuer optional onItemsChange: (queuer) => void; ``` -Defined in: [packages/pacer/src/async-queuer.ts:153](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L153) +Defined in: [async-queuer.ts:153](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L153) Callback fired whenever an item is added or removed from the queuer @@ -256,7 +256,7 @@ Callback fired whenever an item is added or removed from the queuer optional onReject: (item, queuer) => void; ``` -Defined in: [packages/pacer/src/async-queuer.ts:157](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L157) +Defined in: [async-queuer.ts:157](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L157) Callback fired whenever an item is rejected from being added to the queuer @@ -282,7 +282,7 @@ Callback fired whenever an item is rejected from being added to the queuer optional onSettled: (item, queuer) => void; ``` -Defined in: [packages/pacer/src/async-queuer.ts:161](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L161) +Defined in: [async-queuer.ts:161](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L161) Optional callback to call when a task is settled @@ -308,7 +308,7 @@ Optional callback to call when a task is settled optional onSuccess: (result, item, queuer) => void; ``` -Defined in: [packages/pacer/src/async-queuer.ts:165](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L165) +Defined in: [async-queuer.ts:165](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L165) Optional callback to call when a task succeeds @@ -338,7 +338,7 @@ Optional callback to call when a task succeeds optional started: boolean; ``` -Defined in: [packages/pacer/src/async-queuer.ts:169](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L169) +Defined in: [async-queuer.ts:169](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L169) Whether the queuer should start processing tasks immediately or not. @@ -350,7 +350,7 @@ Whether the queuer should start processing tasks immediately or not. optional throwOnError: boolean; ``` -Defined in: [packages/pacer/src/async-queuer.ts:175](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L175) +Defined in: [async-queuer.ts:175](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L175) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -364,7 +364,7 @@ Can be explicitly set to override these defaults. optional wait: number | (queuer) => number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:181](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L181) +Defined in: [async-queuer.ts:181](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L181) Time in milliseconds to wait between processing items. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncqueuerstate.md b/docs/reference/interfaces/asyncqueuerstate.md index f7aca665..130e33b7 100644 --- a/docs/reference/interfaces/asyncqueuerstate.md +++ b/docs/reference/interfaces/asyncqueuerstate.md @@ -7,7 +7,7 @@ title: AsyncQueuerState # Interface: AsyncQueuerState\ -Defined in: [packages/pacer/src/async-queuer.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L7) +Defined in: [async-queuer.ts:7](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L7) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/async-queuer.ts:7](https://github.com/TanStack/p activeItems: TValue[]; ``` -Defined in: [packages/pacer/src/async-queuer.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L11) +Defined in: [async-queuer.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L11) Items currently being processed by the queuer @@ -33,7 +33,7 @@ Items currently being processed by the queuer errorCount: number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L15) +Defined in: [async-queuer.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L15) Number of task executions that have resulted in errors @@ -45,7 +45,7 @@ Number of task executions that have resulted in errors expirationCount: number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L19) +Defined in: [async-queuer.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L19) Number of items that have been removed from the queue due to expiration @@ -57,7 +57,7 @@ Number of items that have been removed from the queue due to expiration isEmpty: boolean; ``` -Defined in: [packages/pacer/src/async-queuer.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L23) +Defined in: [async-queuer.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L23) Whether the queuer has no items to process (items array is empty) @@ -69,7 +69,7 @@ Whether the queuer has no items to process (items array is empty) isFull: boolean; ``` -Defined in: [packages/pacer/src/async-queuer.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L27) +Defined in: [async-queuer.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L27) Whether the queuer has reached its maximum capacity @@ -81,7 +81,7 @@ Whether the queuer has reached its maximum capacity isIdle: boolean; ``` -Defined in: [packages/pacer/src/async-queuer.ts:31](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L31) +Defined in: [async-queuer.ts:31](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L31) Whether the queuer is not currently processing any items @@ -93,7 +93,7 @@ Whether the queuer is not currently processing any items isRunning: boolean; ``` -Defined in: [packages/pacer/src/async-queuer.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L35) +Defined in: [async-queuer.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L35) Whether the queuer is active and will process items automatically @@ -105,7 +105,7 @@ Whether the queuer is active and will process items automatically items: TValue[]; ``` -Defined in: [packages/pacer/src/async-queuer.ts:39](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L39) +Defined in: [async-queuer.ts:39](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L39) Array of items currently waiting to be processed @@ -117,7 +117,7 @@ Array of items currently waiting to be processed itemTimestamps: number[]; ``` -Defined in: [packages/pacer/src/async-queuer.ts:43](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L43) +Defined in: [async-queuer.ts:43](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L43) Timestamps when items were added to the queue for expiration tracking @@ -129,7 +129,7 @@ Timestamps when items were added to the queue for expiration tracking lastResult: any; ``` -Defined in: [packages/pacer/src/async-queuer.ts:47](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L47) +Defined in: [async-queuer.ts:47](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L47) The result from the most recent task execution @@ -141,7 +141,7 @@ The result from the most recent task execution pendingTick: boolean; ``` -Defined in: [packages/pacer/src/async-queuer.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L51) +Defined in: [async-queuer.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L51) Whether the queuer has a pending timeout for processing the next item @@ -153,7 +153,7 @@ Whether the queuer has a pending timeout for processing the next item rejectionCount: number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L55) +Defined in: [async-queuer.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L55) Number of items that have been rejected from being added to the queue @@ -165,7 +165,7 @@ Number of items that have been rejected from being added to the queue settledCount: number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L59) +Defined in: [async-queuer.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L59) Number of task executions that have completed (either successfully or with errors) @@ -177,7 +177,7 @@ Number of task executions that have completed (either successfully or with error size: number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L63) +Defined in: [async-queuer.ts:63](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L63) Number of items currently in the queue @@ -189,7 +189,7 @@ Number of items currently in the queue status: "idle" | "running" | "stopped"; ``` -Defined in: [packages/pacer/src/async-queuer.ts:67](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L67) +Defined in: [async-queuer.ts:67](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L67) Current processing status - 'idle' when not processing, 'running' when active, 'stopped' when paused @@ -201,6 +201,6 @@ Current processing status - 'idle' when not processing, 'running' when active, ' successCount: number; ``` -Defined in: [packages/pacer/src/async-queuer.ts:71](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L71) +Defined in: [async-queuer.ts:71](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L71) Number of task executions that have completed successfully diff --git a/docs/reference/interfaces/asyncratelimiteroptions.md b/docs/reference/interfaces/asyncratelimiteroptions.md index 6de7abfe..40f9ac9d 100644 --- a/docs/reference/interfaces/asyncratelimiteroptions.md +++ b/docs/reference/interfaces/asyncratelimiteroptions.md @@ -7,7 +7,7 @@ title: AsyncRateLimiterOptions # Interface: AsyncRateLimiterOptions\ -Defined in: [packages/pacer/src/async-rate-limiter.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L64) +Defined in: [async-rate-limiter.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L64) Options for configuring an async rate-limited function @@ -23,7 +23,7 @@ Options for configuring an async rate-limited function optional enabled: boolean | (rateLimiter) => boolean; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L70) +Defined in: [async-rate-limiter.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L70) Whether the rate limiter is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L74) +Defined in: [async-rate-limiter.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L74) Initial state for the rate limiter @@ -49,7 +49,7 @@ Initial state for the rate limiter limit: number | (rateLimiter) => number; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L79) +Defined in: [async-rate-limiter.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L79) Maximum number of executions allowed within the time window. Can be a number or a function that returns a number. @@ -62,7 +62,7 @@ Can be a number or a function that returns a number. optional onError: (error, args, rateLimiter) => void; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L85) +Defined in: [async-rate-limiter.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L85) Optional error handler for when the rate-limited function throws. If provided, the handler will be called with the error and rate limiter instance. @@ -94,7 +94,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onReject: (args, rateLimiter) => void; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L93) +Defined in: [async-rate-limiter.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L93) Optional callback function that is called when an execution is rejected due to rate limiting @@ -120,7 +120,7 @@ Optional callback function that is called when an execution is rejected due to r optional onSettled: (args, rateLimiter) => void; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L97) +Defined in: [async-rate-limiter.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L97) Optional function to call when the rate-limited function is executed @@ -146,7 +146,7 @@ Optional function to call when the rate-limited function is executed optional onSuccess: (result, args, rateLimiter) => void; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L104) +Defined in: [async-rate-limiter.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L104) Optional function to call when the rate-limited function is executed @@ -176,7 +176,7 @@ Optional function to call when the rate-limited function is executed optional throwOnError: boolean; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:114](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L114) +Defined in: [async-rate-limiter.ts:114](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L114) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -190,7 +190,7 @@ Can be explicitly set to override these defaults. window: number | (rateLimiter) => number; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L119) +Defined in: [async-rate-limiter.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L119) Time window in milliseconds within which the limit applies. Can be a number or a function that returns a number. @@ -203,7 +203,7 @@ Can be a number or a function that returns a number. optional windowType: "fixed" | "sliding"; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L126) +Defined in: [async-rate-limiter.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L126) Type of window to use for rate limiting - 'fixed': Uses a fixed window that resets after the window period diff --git a/docs/reference/interfaces/asyncratelimiterstate.md b/docs/reference/interfaces/asyncratelimiterstate.md index dabae5fe..40df4d50 100644 --- a/docs/reference/interfaces/asyncratelimiterstate.md +++ b/docs/reference/interfaces/asyncratelimiterstate.md @@ -7,7 +7,7 @@ title: AsyncRateLimiterState # Interface: AsyncRateLimiterState\ -Defined in: [packages/pacer/src/async-rate-limiter.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L6) +Defined in: [async-rate-limiter.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/async-rate-limiter.ts:6](https://github.com/TanS errorCount: number; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L10) +Defined in: [async-rate-limiter.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L10) Number of function executions that have resulted in errors @@ -33,7 +33,7 @@ Number of function executions that have resulted in errors executionTimes: number[]; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L14) +Defined in: [async-rate-limiter.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L14) Array of timestamps when executions occurred for rate limiting calculations @@ -45,7 +45,7 @@ Array of timestamps when executions occurred for rate limiting calculations isExceeded: boolean; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L18) +Defined in: [async-rate-limiter.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L18) Whether the rate limiter has exceeded the limit @@ -57,7 +57,7 @@ Whether the rate limiter has exceeded the limit isExecuting: boolean; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L22) +Defined in: [async-rate-limiter.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L22) Whether the rate-limited function is currently executing asynchronously @@ -69,7 +69,7 @@ Whether the rate-limited function is currently executing asynchronously lastResult: undefined | ReturnType; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L26) +Defined in: [async-rate-limiter.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L26) The result from the most recent successful function execution @@ -81,7 +81,7 @@ The result from the most recent successful function execution rejectionCount: number; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L30) +Defined in: [async-rate-limiter.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L30) Number of function executions that have been rejected due to rate limiting @@ -93,7 +93,7 @@ Number of function executions that have been rejected due to rate limiting settleCount: number; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L34) +Defined in: [async-rate-limiter.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L34) Number of function executions that have completed (either successfully or with errors) @@ -105,7 +105,7 @@ Number of function executions that have completed (either successfully or with e status: "disabled" | "idle" | "executing" | "exceeded"; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L38) +Defined in: [async-rate-limiter.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L38) Current execution status - 'disabled' when not active, 'executing' when executing, 'idle' when not executing, 'exceeded' when rate limit is exceeded @@ -117,6 +117,6 @@ Current execution status - 'disabled' when not active, 'executing' when executin successCount: number; ``` -Defined in: [packages/pacer/src/async-rate-limiter.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L42) +Defined in: [async-rate-limiter.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L42) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/asyncthrottleroptions.md b/docs/reference/interfaces/asyncthrottleroptions.md index 7fa793f1..277be425 100644 --- a/docs/reference/interfaces/asyncthrottleroptions.md +++ b/docs/reference/interfaces/asyncthrottleroptions.md @@ -7,7 +7,7 @@ title: AsyncThrottlerOptions # Interface: AsyncThrottlerOptions\ -Defined in: [packages/pacer/src/async-throttler.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L69) +Defined in: [async-throttler.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L69) Options for configuring an async throttled function @@ -23,7 +23,7 @@ Options for configuring an async throttled function optional enabled: boolean | (throttler) => boolean; ``` -Defined in: [packages/pacer/src/async-throttler.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L75) +Defined in: [async-throttler.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L75) Whether the throttler is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/async-throttler.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L79) +Defined in: [async-throttler.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L79) Initial state for the async throttler @@ -49,7 +49,7 @@ Initial state for the async throttler optional leading: boolean; ``` -Defined in: [packages/pacer/src/async-throttler.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L84) +Defined in: [async-throttler.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L84) Whether to execute the function immediately when called Defaults to true @@ -62,7 +62,7 @@ Defaults to true optional onError: (error, args, asyncThrottler) => void; ``` -Defined in: [packages/pacer/src/async-throttler.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L90) +Defined in: [async-throttler.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L90) Optional error handler for when the throttled function throws. If provided, the handler will be called with the error and throttler instance. @@ -94,7 +94,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onSettled: (args, asyncThrottler) => void; ``` -Defined in: [packages/pacer/src/async-throttler.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L98) +Defined in: [async-throttler.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L98) Optional function to call when the throttled function is executed @@ -120,7 +120,7 @@ Optional function to call when the throttled function is executed optional onSuccess: (result, args, asyncThrottler) => void; ``` -Defined in: [packages/pacer/src/async-throttler.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L105) +Defined in: [async-throttler.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L105) Optional function to call when the throttled function is executed @@ -150,7 +150,7 @@ Optional function to call when the throttled function is executed optional throwOnError: boolean; ``` -Defined in: [packages/pacer/src/async-throttler.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L115) +Defined in: [async-throttler.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L115) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -164,7 +164,7 @@ Can be explicitly set to override these defaults. optional trailing: boolean; ``` -Defined in: [packages/pacer/src/async-throttler.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L120) +Defined in: [async-throttler.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L120) Whether to execute the function on the trailing edge of the wait period Defaults to true @@ -177,7 +177,7 @@ Defaults to true wait: number | (throttler) => number; ``` -Defined in: [packages/pacer/src/async-throttler.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L126) +Defined in: [async-throttler.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L126) Time window in milliseconds during which the function can only be executed once. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncthrottlerstate.md b/docs/reference/interfaces/asyncthrottlerstate.md index bf3c5d98..2340f1b1 100644 --- a/docs/reference/interfaces/asyncthrottlerstate.md +++ b/docs/reference/interfaces/asyncthrottlerstate.md @@ -7,7 +7,7 @@ title: AsyncThrottlerState # Interface: AsyncThrottlerState\ -Defined in: [packages/pacer/src/async-throttler.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L6) +Defined in: [async-throttler.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/async-throttler.ts:6](https://github.com/TanStac errorCount: number; ``` -Defined in: [packages/pacer/src/async-throttler.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L10) +Defined in: [async-throttler.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L10) Number of function executions that have resulted in errors @@ -33,7 +33,7 @@ Number of function executions that have resulted in errors isExecuting: boolean; ``` -Defined in: [packages/pacer/src/async-throttler.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L14) +Defined in: [async-throttler.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L14) Whether the throttled function is currently executing asynchronously @@ -45,7 +45,7 @@ Whether the throttled function is currently executing asynchronously isPending: boolean; ``` -Defined in: [packages/pacer/src/async-throttler.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L18) +Defined in: [async-throttler.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L18) Whether the throttler is waiting for the timeout to trigger execution @@ -57,7 +57,7 @@ Whether the throttler is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [packages/pacer/src/async-throttler.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L22) +Defined in: [async-throttler.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L22) The arguments from the most recent call to maybeExecute @@ -69,7 +69,7 @@ The arguments from the most recent call to maybeExecute lastExecutionTime: number; ``` -Defined in: [packages/pacer/src/async-throttler.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L26) +Defined in: [async-throttler.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L26) Timestamp of the last function execution in milliseconds @@ -81,7 +81,7 @@ Timestamp of the last function execution in milliseconds lastResult: undefined | ReturnType; ``` -Defined in: [packages/pacer/src/async-throttler.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L30) +Defined in: [async-throttler.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L30) The result from the most recent successful function execution @@ -93,7 +93,7 @@ The result from the most recent successful function execution nextExecutionTime: undefined | number; ``` -Defined in: [packages/pacer/src/async-throttler.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L34) +Defined in: [async-throttler.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L34) Timestamp when the next execution can occur in milliseconds @@ -105,7 +105,7 @@ Timestamp when the next execution can occur in milliseconds settleCount: number; ``` -Defined in: [packages/pacer/src/async-throttler.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L38) +Defined in: [async-throttler.ts:38](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L38) Number of function executions that have completed (either successfully or with errors) @@ -117,7 +117,7 @@ Number of function executions that have completed (either successfully or with e status: "disabled" | "idle" | "pending" | "executing" | "settled"; ``` -Defined in: [packages/pacer/src/async-throttler.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L42) +Defined in: [async-throttler.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L42) Current execution status - 'idle' when not active, 'pending' when waiting, 'executing' when running, 'settled' when completed @@ -129,6 +129,6 @@ Current execution status - 'idle' when not active, 'pending' when waiting, 'exec successCount: number; ``` -Defined in: [packages/pacer/src/async-throttler.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L46) +Defined in: [async-throttler.ts:46](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L46) Number of function executions that have completed successfully diff --git a/docs/reference/interfaces/batcheroptions.md b/docs/reference/interfaces/batcheroptions.md index 9577326e..2c44ec3d 100644 --- a/docs/reference/interfaces/batcheroptions.md +++ b/docs/reference/interfaces/batcheroptions.md @@ -7,7 +7,7 @@ title: BatcherOptions # Interface: BatcherOptions\ -Defined in: [packages/pacer/src/batcher.ts:52](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L52) +Defined in: [batcher.ts:52](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L52) Options for configuring a Batcher instance @@ -23,7 +23,7 @@ Options for configuring a Batcher instance optional getShouldExecute: (items, batcher) => boolean; ``` -Defined in: [packages/pacer/src/batcher.ts:57](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L57) +Defined in: [batcher.ts:57](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L57) Custom function to determine if a batch should be processed Return true to process the batch immediately @@ -50,7 +50,7 @@ Return true to process the batch immediately optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/batcher.ts:61](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L61) +Defined in: [batcher.ts:61](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L61) Initial state for the batcher @@ -62,7 +62,7 @@ Initial state for the batcher optional maxSize: number; ``` -Defined in: [packages/pacer/src/batcher.ts:66](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L66) +Defined in: [batcher.ts:66](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L66) Maximum number of items in a batch @@ -80,7 +80,7 @@ Infinity optional onExecute: (batch, batcher) => void; ``` -Defined in: [packages/pacer/src/batcher.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L70) +Defined in: [batcher.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L70) Callback fired after a batch is processed @@ -106,7 +106,7 @@ Callback fired after a batch is processed optional onItemsChange: (batcher) => void; ``` -Defined in: [packages/pacer/src/batcher.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L74) +Defined in: [batcher.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L74) Callback fired after items are added to the batcher @@ -128,7 +128,7 @@ Callback fired after items are added to the batcher optional started: boolean; ``` -Defined in: [packages/pacer/src/batcher.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L79) +Defined in: [batcher.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L79) Whether the batcher should start processing immediately @@ -146,7 +146,7 @@ true optional wait: number | (batcher) => number; ``` -Defined in: [packages/pacer/src/batcher.ts:86](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L86) +Defined in: [batcher.ts:86](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L86) Maximum time in milliseconds to wait before processing a batch. If the wait duration has elapsed, the batch will be processed. diff --git a/docs/reference/interfaces/batcherstate.md b/docs/reference/interfaces/batcherstate.md index a4fba1d1..fc3e32e7 100644 --- a/docs/reference/interfaces/batcherstate.md +++ b/docs/reference/interfaces/batcherstate.md @@ -7,7 +7,7 @@ title: BatcherState # Interface: BatcherState\ -Defined in: [packages/pacer/src/batcher.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L6) +Defined in: [batcher.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/batcher.ts:6](https://github.com/TanStack/pacer/ executionCount: number; ``` -Defined in: [packages/pacer/src/batcher.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L10) +Defined in: [batcher.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L10) Number of batch executions that have been completed @@ -33,7 +33,7 @@ Number of batch executions that have been completed isEmpty: boolean; ``` -Defined in: [packages/pacer/src/batcher.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L14) +Defined in: [batcher.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L14) Whether the batcher has no items to process (items array is empty) @@ -45,7 +45,7 @@ Whether the batcher has no items to process (items array is empty) isPending: boolean; ``` -Defined in: [packages/pacer/src/batcher.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L18) +Defined in: [batcher.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L18) Whether the batcher is waiting for the timeout to trigger batch processing @@ -57,7 +57,7 @@ Whether the batcher is waiting for the timeout to trigger batch processing items: TValue[]; ``` -Defined in: [packages/pacer/src/batcher.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L22) +Defined in: [batcher.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L22) Array of items currently queued for batch processing @@ -69,7 +69,7 @@ Array of items currently queued for batch processing size: number; ``` -Defined in: [packages/pacer/src/batcher.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L26) +Defined in: [batcher.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L26) Number of items currently in the batch queue @@ -81,7 +81,7 @@ Number of items currently in the batch queue status: "idle" | "pending"; ``` -Defined in: [packages/pacer/src/batcher.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L30) +Defined in: [batcher.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L30) Current processing status - 'idle' when not processing, 'pending' when waiting for timeout @@ -93,6 +93,6 @@ Current processing status - 'idle' when not processing, 'pending' when waiting f totalItemsProcessed: number; ``` -Defined in: [packages/pacer/src/batcher.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L34) +Defined in: [batcher.ts:34](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L34) Total number of items that have been processed across all batches diff --git a/docs/reference/interfaces/debounceroptions.md b/docs/reference/interfaces/debounceroptions.md index 63fbc3d3..9910cddd 100644 --- a/docs/reference/interfaces/debounceroptions.md +++ b/docs/reference/interfaces/debounceroptions.md @@ -7,7 +7,7 @@ title: DebouncerOptions # Interface: DebouncerOptions\ -Defined in: [packages/pacer/src/debouncer.ts:44](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L44) +Defined in: [debouncer.ts:44](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L44) Options for configuring a debounced function @@ -23,7 +23,7 @@ Options for configuring a debounced function optional enabled: boolean | (debouncer) => boolean; ``` -Defined in: [packages/pacer/src/debouncer.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L50) +Defined in: [debouncer.ts:50](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L50) Whether the debouncer is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/debouncer.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L54) +Defined in: [debouncer.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L54) Initial state for the debouncer @@ -49,7 +49,7 @@ Initial state for the debouncer optional leading: boolean; ``` -Defined in: [packages/pacer/src/debouncer.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L60) +Defined in: [debouncer.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L60) Whether to execute on the leading edge of the timeout. The first call will execute immediately and the rest will wait the delay. @@ -63,7 +63,7 @@ Defaults to false. optional onExecute: (args, debouncer) => void; ``` -Defined in: [packages/pacer/src/debouncer.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L64) +Defined in: [debouncer.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L64) Callback function that is called after the function is executed @@ -89,7 +89,7 @@ Callback function that is called after the function is executed optional trailing: boolean; ``` -Defined in: [packages/pacer/src/debouncer.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L69) +Defined in: [debouncer.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L69) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -102,7 +102,7 @@ Defaults to true. wait: number | (debouncer) => number; ``` -Defined in: [packages/pacer/src/debouncer.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L75) +Defined in: [debouncer.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L75) Delay in milliseconds before executing the function. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/debouncerstate.md b/docs/reference/interfaces/debouncerstate.md index 5cabe467..676c46f5 100644 --- a/docs/reference/interfaces/debouncerstate.md +++ b/docs/reference/interfaces/debouncerstate.md @@ -7,7 +7,7 @@ title: DebouncerState # Interface: DebouncerState\ -Defined in: [packages/pacer/src/debouncer.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L6) +Defined in: [debouncer.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/debouncer.ts:6](https://github.com/TanStack/pace canLeadingExecute: boolean; ``` -Defined in: [packages/pacer/src/debouncer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L10) +Defined in: [debouncer.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L10) Whether the debouncer can execute on the leading edge of the timeout @@ -33,7 +33,7 @@ Whether the debouncer can execute on the leading edge of the timeout executionCount: number; ``` -Defined in: [packages/pacer/src/debouncer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L14) +Defined in: [debouncer.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L14) Number of function executions that have been completed @@ -45,7 +45,7 @@ Number of function executions that have been completed isPending: boolean; ``` -Defined in: [packages/pacer/src/debouncer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L18) +Defined in: [debouncer.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L18) Whether the debouncer is waiting for the timeout to trigger execution @@ -57,7 +57,7 @@ Whether the debouncer is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [packages/pacer/src/debouncer.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L22) +Defined in: [debouncer.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L22) The arguments from the most recent call to maybeExecute @@ -69,6 +69,6 @@ The arguments from the most recent call to maybeExecute status: "disabled" | "idle" | "pending"; ``` -Defined in: [packages/pacer/src/debouncer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L26) +Defined in: [debouncer.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L26) Current execution status - 'idle' when not active, 'pending' when waiting for timeout diff --git a/docs/reference/interfaces/pacereventmap.md b/docs/reference/interfaces/pacereventmap.md index 24757832..9193e21c 100644 --- a/docs/reference/interfaces/pacereventmap.md +++ b/docs/reference/interfaces/pacereventmap.md @@ -7,104 +7,104 @@ title: PacerEventMap # Interface: PacerEventMap -Defined in: [packages/pacer/src/event-client.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L13) +Defined in: [event-client.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L15) ## Properties ### pacer:async-batcher-state ```ts -pacer:async-batcher-state: AsyncBatcherState; +pacer:async-batcher-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L14) +Defined in: [event-client.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L16) *** ### pacer:async-debouncer-state ```ts -pacer:async-debouncer-state: AsyncDebouncerState; +pacer:async-debouncer-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L15) +Defined in: [event-client.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L17) *** ### pacer:async-queuer-state ```ts -pacer:async-queuer-state: AsyncQueuerState; +pacer:async-queuer-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L16) +Defined in: [event-client.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L18) *** ### pacer:async-rate-limiter-state ```ts -pacer:async-rate-limiter-state: AsyncRateLimiterState; +pacer:async-rate-limiter-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L17) +Defined in: [event-client.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L19) *** ### pacer:async-throttler-state ```ts -pacer:async-throttler-state: AsyncThrottlerState; +pacer:async-throttler-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L18) +Defined in: [event-client.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L20) *** ### pacer:batcher-state ```ts -pacer:batcher-state: BatcherState; +pacer:batcher-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L19) +Defined in: [event-client.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L21) *** ### pacer:debouncer-state ```ts -pacer:debouncer-state: DebouncerState; +pacer:debouncer-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L20) +Defined in: [event-client.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L22) *** ### pacer:queuer-state ```ts -pacer:queuer-state: QueuerState; +pacer:queuer-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L21) +Defined in: [event-client.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L23) *** ### pacer:rate-limiter-state ```ts -pacer:rate-limiter-state: RateLimiterState; +pacer:rate-limiter-state: WithUuid; ``` -Defined in: [packages/pacer/src/event-client.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L22) +Defined in: [event-client.ts:24](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L24) *** ### pacer:throttler-state ```ts -pacer:throttler-state: ThrottlerState; +pacer:throttler-state: WithUuid>; ``` -Defined in: [packages/pacer/src/event-client.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L23) +Defined in: [event-client.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L25) diff --git a/docs/reference/interfaces/queueroptions.md b/docs/reference/interfaces/queueroptions.md index 8e2ab82f..70d3cbee 100644 --- a/docs/reference/interfaces/queueroptions.md +++ b/docs/reference/interfaces/queueroptions.md @@ -7,7 +7,7 @@ title: QueuerOptions # Interface: QueuerOptions\ -Defined in: [packages/pacer/src/queuer.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L78) +Defined in: [queuer.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L78) Options for configuring a Queuer instance. @@ -25,7 +25,7 @@ These options control queue behavior, item expiration, callbacks, and more. optional addItemsTo: QueuePosition; ``` -Defined in: [packages/pacer/src/queuer.ts:83](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L83) +Defined in: [queuer.ts:83](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L83) Default position to add items to the queuer @@ -43,7 +43,7 @@ Default position to add items to the queuer optional expirationDuration: number; ``` -Defined in: [packages/pacer/src/queuer.ts:88](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L88) +Defined in: [queuer.ts:88](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L88) Maximum time in milliseconds that an item can stay in the queue If not provided, items will never expire @@ -56,7 +56,7 @@ If not provided, items will never expire optional getIsExpired: (item, addedAt) => boolean; ``` -Defined in: [packages/pacer/src/queuer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L93) +Defined in: [queuer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L93) Function to determine if an item has expired If provided, this overrides the expirationDuration behavior @@ -83,7 +83,7 @@ If provided, this overrides the expirationDuration behavior optional getItemsFrom: QueuePosition; ``` -Defined in: [packages/pacer/src/queuer.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L98) +Defined in: [queuer.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L98) Default position to get items from during processing @@ -101,7 +101,7 @@ Default position to get items from during processing optional getPriority: (item) => number; ``` -Defined in: [packages/pacer/src/queuer.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L103) +Defined in: [queuer.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L103) Function to determine priority of items in the queuer Higher priority items will be processed first @@ -124,7 +124,7 @@ Higher priority items will be processed first optional initialItems: TValue[]; ``` -Defined in: [packages/pacer/src/queuer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L107) +Defined in: [queuer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L107) Initial items to populate the queuer with @@ -136,7 +136,7 @@ Initial items to populate the queuer with optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L111) +Defined in: [queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L111) Initial state for the queuer @@ -148,7 +148,7 @@ Initial state for the queuer optional maxSize: number; ``` -Defined in: [packages/pacer/src/queuer.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L115) +Defined in: [queuer.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L115) Maximum number of items allowed in the queuer @@ -160,7 +160,7 @@ Maximum number of items allowed in the queuer optional onExecute: (item, queuer) => void; ``` -Defined in: [packages/pacer/src/queuer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L119) +Defined in: [queuer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L119) Callback fired whenever an item is removed from the queuer @@ -186,7 +186,7 @@ Callback fired whenever an item is removed from the queuer optional onExpire: (item, queuer) => void; ``` -Defined in: [packages/pacer/src/queuer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L123) +Defined in: [queuer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L123) Callback fired whenever an item expires in the queuer @@ -212,7 +212,7 @@ Callback fired whenever an item expires in the queuer optional onItemsChange: (queuer) => void; ``` -Defined in: [packages/pacer/src/queuer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L127) +Defined in: [queuer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L127) Callback fired whenever an item is added or removed from the queuer @@ -234,7 +234,7 @@ Callback fired whenever an item is added or removed from the queuer optional onReject: (item, queuer) => void; ``` -Defined in: [packages/pacer/src/queuer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L131) +Defined in: [queuer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L131) Callback fired whenever an item is rejected from being added to the queuer @@ -260,7 +260,7 @@ Callback fired whenever an item is rejected from being added to the queuer optional started: boolean; ``` -Defined in: [packages/pacer/src/queuer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L135) +Defined in: [queuer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L135) Whether the queuer should start processing tasks immediately @@ -272,7 +272,7 @@ Whether the queuer should start processing tasks immediately optional wait: number | (queuer) => number; ``` -Defined in: [packages/pacer/src/queuer.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L141) +Defined in: [queuer.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L141) Time in milliseconds to wait between processing items. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/queuerstate.md b/docs/reference/interfaces/queuerstate.md index accb2e89..f98be509 100644 --- a/docs/reference/interfaces/queuerstate.md +++ b/docs/reference/interfaces/queuerstate.md @@ -7,7 +7,7 @@ title: QueuerState # Interface: QueuerState\ -Defined in: [packages/pacer/src/queuer.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L5) +Defined in: [queuer.ts:5](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L5) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/queuer.ts:5](https://github.com/TanStack/pacer/b executionCount: number; ``` -Defined in: [packages/pacer/src/queuer.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L9) +Defined in: [queuer.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L9) Number of items that have been processed by the queuer @@ -33,7 +33,7 @@ Number of items that have been processed by the queuer expirationCount: number; ``` -Defined in: [packages/pacer/src/queuer.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L13) +Defined in: [queuer.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L13) Number of items that have been removed from the queue due to expiration @@ -45,7 +45,7 @@ Number of items that have been removed from the queue due to expiration isEmpty: boolean; ``` -Defined in: [packages/pacer/src/queuer.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L17) +Defined in: [queuer.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L17) Whether the queuer has no items to process (items array is empty) @@ -57,7 +57,7 @@ Whether the queuer has no items to process (items array is empty) isFull: boolean; ``` -Defined in: [packages/pacer/src/queuer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L21) +Defined in: [queuer.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L21) Whether the queuer has reached its maximum capacity @@ -69,7 +69,7 @@ Whether the queuer has reached its maximum capacity isIdle: boolean; ``` -Defined in: [packages/pacer/src/queuer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L25) +Defined in: [queuer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L25) Whether the queuer is not currently processing any items @@ -81,7 +81,7 @@ Whether the queuer is not currently processing any items isRunning: boolean; ``` -Defined in: [packages/pacer/src/queuer.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L29) +Defined in: [queuer.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L29) Whether the queuer is active and will process items automatically @@ -93,7 +93,7 @@ Whether the queuer is active and will process items automatically items: TValue[]; ``` -Defined in: [packages/pacer/src/queuer.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L33) +Defined in: [queuer.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L33) Array of items currently waiting to be processed @@ -105,7 +105,7 @@ Array of items currently waiting to be processed itemTimestamps: number[]; ``` -Defined in: [packages/pacer/src/queuer.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L37) +Defined in: [queuer.ts:37](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L37) Timestamps when items were added to the queue for expiration tracking @@ -117,7 +117,7 @@ Timestamps when items were added to the queue for expiration tracking pendingTick: boolean; ``` -Defined in: [packages/pacer/src/queuer.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L41) +Defined in: [queuer.ts:41](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L41) Whether the queuer has a pending timeout for processing the next item @@ -129,7 +129,7 @@ Whether the queuer has a pending timeout for processing the next item rejectionCount: number; ``` -Defined in: [packages/pacer/src/queuer.ts:45](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L45) +Defined in: [queuer.ts:45](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L45) Number of items that have been rejected from being added to the queue @@ -141,7 +141,7 @@ Number of items that have been rejected from being added to the queue size: number; ``` -Defined in: [packages/pacer/src/queuer.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L49) +Defined in: [queuer.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L49) Number of items currently in the queue @@ -153,6 +153,6 @@ Number of items currently in the queue status: "idle" | "running" | "stopped"; ``` -Defined in: [packages/pacer/src/queuer.ts:53](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L53) +Defined in: [queuer.ts:53](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L53) Current processing status - 'idle' when not processing, 'running' when active, 'stopped' when paused diff --git a/docs/reference/interfaces/ratelimiteroptions.md b/docs/reference/interfaces/ratelimiteroptions.md index c435536f..9800f487 100644 --- a/docs/reference/interfaces/ratelimiteroptions.md +++ b/docs/reference/interfaces/ratelimiteroptions.md @@ -7,7 +7,7 @@ title: RateLimiterOptions # Interface: RateLimiterOptions\ -Defined in: [packages/pacer/src/rate-limiter.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L42) +Defined in: [rate-limiter.ts:42](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L42) Options for configuring a rate-limited function @@ -23,7 +23,7 @@ Options for configuring a rate-limited function optional enabled: boolean | (rateLimiter) => boolean; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:47](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L47) +Defined in: [rate-limiter.ts:47](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L47) Whether the rate limiter is enabled. When disabled, maybeExecute will not trigger any executions. Defaults to true. @@ -36,7 +36,7 @@ Defaults to true. optional initialState: Partial; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L51) +Defined in: [rate-limiter.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L51) Initial state for the rate limiter @@ -48,7 +48,7 @@ Initial state for the rate limiter limit: number | (rateLimiter) => number; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:56](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L56) +Defined in: [rate-limiter.ts:56](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L56) Maximum number of executions allowed within the time window. Can be a number or a callback function that receives the rate limiter instance and returns a number. @@ -61,7 +61,7 @@ Can be a number or a callback function that receives the rate limiter instance a optional onExecute: (args, rateLimiter) => void; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L60) +Defined in: [rate-limiter.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L60) Callback function that is called after the function is executed @@ -87,7 +87,7 @@ Callback function that is called after the function is executed optional onReject: (rateLimiter) => void; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L64) +Defined in: [rate-limiter.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L64) Optional callback function that is called when an execution is rejected due to rate limiting @@ -109,7 +109,7 @@ Optional callback function that is called when an execution is rejected due to r window: number | (rateLimiter) => number; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L69) +Defined in: [rate-limiter.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L69) Time window in milliseconds within which the limit applies. Can be a number or a callback function that receives the rate limiter instance and returns a number. @@ -122,7 +122,7 @@ Can be a number or a callback function that receives the rate limiter instance a optional windowType: "fixed" | "sliding"; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:76](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L76) +Defined in: [rate-limiter.ts:76](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L76) Type of window to use for rate limiting - 'fixed': Uses a fixed window that resets after the window period diff --git a/docs/reference/interfaces/ratelimiterstate.md b/docs/reference/interfaces/ratelimiterstate.md index 05b9bef8..fe9d9e69 100644 --- a/docs/reference/interfaces/ratelimiterstate.md +++ b/docs/reference/interfaces/ratelimiterstate.md @@ -7,7 +7,7 @@ title: RateLimiterState # Interface: RateLimiterState -Defined in: [packages/pacer/src/rate-limiter.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L6) +Defined in: [rate-limiter.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L6) ## Properties @@ -17,7 +17,7 @@ Defined in: [packages/pacer/src/rate-limiter.ts:6](https://github.com/TanStack/p executionCount: number; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L10) +Defined in: [rate-limiter.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L10) Number of function executions that have been completed @@ -29,7 +29,7 @@ Number of function executions that have been completed executionTimes: number[]; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L14) +Defined in: [rate-limiter.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L14) Array of timestamps when executions occurred for rate limiting calculations @@ -41,7 +41,7 @@ Array of timestamps when executions occurred for rate limiting calculations isExceeded: boolean; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L18) +Defined in: [rate-limiter.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L18) Whether the rate limiter has exceeded the limit @@ -53,7 +53,7 @@ Whether the rate limiter has exceeded the limit rejectionCount: number; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L22) +Defined in: [rate-limiter.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L22) Number of function executions that have been rejected due to rate limiting @@ -65,6 +65,6 @@ Number of function executions that have been rejected due to rate limiting status: "disabled" | "idle" | "exceeded"; ``` -Defined in: [packages/pacer/src/rate-limiter.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L26) +Defined in: [rate-limiter.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L26) Current execution status - 'disabled' when not active, 'executing' when executing, 'idle' when not executing, 'exceeded' when rate limit is exceeded diff --git a/docs/reference/interfaces/throttleroptions.md b/docs/reference/interfaces/throttleroptions.md index 43e3c376..c4d9c518 100644 --- a/docs/reference/interfaces/throttleroptions.md +++ b/docs/reference/interfaces/throttleroptions.md @@ -7,7 +7,7 @@ title: ThrottlerOptions # Interface: ThrottlerOptions\ -Defined in: [packages/pacer/src/throttler.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L49) +Defined in: [throttler.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L49) Options for configuring a throttled function @@ -23,7 +23,7 @@ Options for configuring a throttled function optional enabled: boolean | (throttler) => boolean; ``` -Defined in: [packages/pacer/src/throttler.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L55) +Defined in: [throttler.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L55) Whether the throttler is enabled. When disabled, maybeExecute will not trigger any executions. Can be a boolean or a function that returns a boolean. @@ -37,7 +37,7 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [packages/pacer/src/throttler.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L59) +Defined in: [throttler.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L59) Initial state for the throttler @@ -49,7 +49,7 @@ Initial state for the throttler optional leading: boolean; ``` -Defined in: [packages/pacer/src/throttler.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L64) +Defined in: [throttler.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L64) Whether to execute on the leading edge of the timeout. Defaults to true. @@ -62,7 +62,7 @@ Defaults to true. optional onExecute: (args, throttler) => void; ``` -Defined in: [packages/pacer/src/throttler.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L68) +Defined in: [throttler.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L68) Callback function that is called after the function is executed @@ -88,7 +88,7 @@ Callback function that is called after the function is executed optional trailing: boolean; ``` -Defined in: [packages/pacer/src/throttler.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L73) +Defined in: [throttler.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L73) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -101,7 +101,7 @@ Defaults to true. wait: number | (throttler) => number; ``` -Defined in: [packages/pacer/src/throttler.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L79) +Defined in: [throttler.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L79) Time window in milliseconds during which the function can only be executed once. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/throttlerstate.md b/docs/reference/interfaces/throttlerstate.md index e10d6d0a..5dda13a5 100644 --- a/docs/reference/interfaces/throttlerstate.md +++ b/docs/reference/interfaces/throttlerstate.md @@ -7,7 +7,7 @@ title: ThrottlerState # Interface: ThrottlerState\ -Defined in: [packages/pacer/src/throttler.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L6) +Defined in: [throttler.ts:6](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L6) ## Type Parameters @@ -21,7 +21,7 @@ Defined in: [packages/pacer/src/throttler.ts:6](https://github.com/TanStack/pace executionCount: number; ``` -Defined in: [packages/pacer/src/throttler.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L10) +Defined in: [throttler.ts:10](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L10) Number of function executions that have been completed @@ -33,7 +33,7 @@ Number of function executions that have been completed isPending: boolean; ``` -Defined in: [packages/pacer/src/throttler.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L14) +Defined in: [throttler.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L14) Whether the throttler is waiting for the timeout to trigger execution @@ -45,7 +45,7 @@ Whether the throttler is waiting for the timeout to trigger execution lastArgs: undefined | Parameters; ``` -Defined in: [packages/pacer/src/throttler.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L18) +Defined in: [throttler.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L18) The arguments from the most recent call to maybeExecute @@ -57,7 +57,7 @@ The arguments from the most recent call to maybeExecute lastExecutionTime: number; ``` -Defined in: [packages/pacer/src/throttler.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L22) +Defined in: [throttler.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L22) Timestamp of the last function execution in milliseconds @@ -69,7 +69,7 @@ Timestamp of the last function execution in milliseconds nextExecutionTime: undefined | number; ``` -Defined in: [packages/pacer/src/throttler.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L26) +Defined in: [throttler.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L26) Timestamp when the next execution can occur in milliseconds @@ -81,6 +81,6 @@ Timestamp when the next execution can occur in milliseconds status: "disabled" | "idle" | "pending"; ``` -Defined in: [packages/pacer/src/throttler.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L30) +Defined in: [throttler.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L30) Current execution status - 'idle' when not active, 'pending' when waiting for timeout diff --git a/docs/reference/type-aliases/anyasyncfunction.md b/docs/reference/type-aliases/anyasyncfunction.md index 8d277867..19b6a17d 100644 --- a/docs/reference/type-aliases/anyasyncfunction.md +++ b/docs/reference/type-aliases/anyasyncfunction.md @@ -11,7 +11,7 @@ title: AnyAsyncFunction type AnyAsyncFunction = (...args) => Promise; ``` -Defined in: [packages/pacer/src/types.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L9) +Defined in: [types.ts:9](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L9) Represents an asynchronous function that can be called with any arguments and returns a promise. diff --git a/docs/reference/type-aliases/anyfunction.md b/docs/reference/type-aliases/anyfunction.md index a05f98cc..039ac0e6 100644 --- a/docs/reference/type-aliases/anyfunction.md +++ b/docs/reference/type-aliases/anyfunction.md @@ -11,7 +11,7 @@ title: AnyFunction type AnyFunction = (...args) => any; ``` -Defined in: [packages/pacer/src/types.ts:4](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L4) +Defined in: [types.ts:4](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L4) Represents a function that can be called with any arguments and returns any value. diff --git a/docs/reference/type-aliases/optionalkeys.md b/docs/reference/type-aliases/optionalkeys.md index f35b429c..e09cbfd2 100644 --- a/docs/reference/type-aliases/optionalkeys.md +++ b/docs/reference/type-aliases/optionalkeys.md @@ -11,7 +11,7 @@ title: OptionalKeys type OptionalKeys = Omit & Partial>; ``` -Defined in: [packages/pacer/src/types.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L11) +Defined in: [types.ts:11](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/types.ts#L11) ## Type Parameters diff --git a/docs/reference/type-aliases/queueposition.md b/docs/reference/type-aliases/queueposition.md index 0e1000a2..4ab6460c 100644 --- a/docs/reference/type-aliases/queueposition.md +++ b/docs/reference/type-aliases/queueposition.md @@ -11,7 +11,7 @@ title: QueuePosition type QueuePosition = "front" | "back"; ``` -Defined in: [packages/pacer/src/queuer.ts:170](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L170) +Defined in: [queuer.ts:170](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L170) Position type for addItem and getNextItem operations. diff --git a/docs/reference/variables/pacereventclient.md b/docs/reference/variables/pacereventclient.md index a6659a46..4f3957d1 100644 --- a/docs/reference/variables/pacereventclient.md +++ b/docs/reference/variables/pacereventclient.md @@ -11,4 +11,4 @@ title: pacerEventClient const pacerEventClient: PacerEventClient; ``` -Defined in: [packages/pacer/src/event-client.ts:35](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L35) +Defined in: [event-client.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L51) diff --git a/examples/react/util-comparison/package.json b/examples/react/util-comparison/package.json index 93dfab0d..480673df 100644 --- a/examples/react/util-comparison/package.json +++ b/examples/react/util-comparison/package.json @@ -33,4 +33,4 @@ "last 1 safari version" ] } -} \ No newline at end of file +} diff --git a/examples/react/util-comparison/src/index.tsx b/examples/react/util-comparison/src/index.tsx index 8a1cb032..ba95270e 100644 --- a/examples/react/util-comparison/src/index.tsx +++ b/examples/react/util-comparison/src/index.tsx @@ -346,11 +346,11 @@ function ComparisonApp() { {instantExecutionCount === 0 ? '0' : Math.round( - ((instantExecutionCount - - utility.state.executionCount) / - instantExecutionCount) * - 100, - )} + ((instantExecutionCount - + utility.state.executionCount) / + instantExecutionCount) * + 100, + )} %
{utility.name === 'Rate Limiter' && ( diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json index 8d2d4abc..5cecdbe8 100644 --- a/packages/pacer-devtools/package.json +++ b/packages/pacer-devtools/package.json @@ -68,4 +68,4 @@ "devDependencies": { "vite-plugin-solid": "^2.11.8" } -} \ No newline at end of file +} diff --git a/packages/pacer-devtools/src/context/context-provider.tsx b/packages/pacer-devtools/src/context/context-provider.tsx index 7d23dc60..82b93779 100644 --- a/packages/pacer-devtools/src/context/context-provider.tsx +++ b/packages/pacer-devtools/src/context/context-provider.tsx @@ -4,8 +4,11 @@ import { pacerEventClient } from '@tanstack/pacer' import { PacerContext, initialStore } from './context' import type { PacerContextType } from './context' -const updateOrAddToArray = (oldArray: Array, newItem: T) => { - const index = oldArray.findIndex(item => item.uuid === newItem.uuid) +const updateOrAddToArray = ( + oldArray: Array, + newItem: T, +) => { + const index = oldArray.findIndex((item) => item.uuid === newItem.uuid) if (index !== -1) { // Update existing item return oldArray.map((item, i) => (i === index ? newItem : item)) @@ -19,68 +22,69 @@ export function PacerContextProvider(props: { children: any }) { createEffect(() => { const cleanup = pacerEventClient.onAllPluginEvents((e) => { - switch (e.type) { - case 'pacer:async-batcher-state': - { - const newItems = updateOrAddToArray(store.asyncBatcherState, e.payload) - setStore({ asyncBatcherState: newItems }) - break - } - case 'pacer:async-debouncer-state': - { - const newItems = updateOrAddToArray(store.asyncDebouncerState, e.payload) - setStore({ asyncDebouncerState: newItems }) - break - } - case 'pacer:async-queuer-state': - { - const newItems = updateOrAddToArray(store.asyncQueuerState, e.payload) - setStore({ asyncQueuerState: newItems }) - break - } - case 'pacer:async-rate-limiter-state': - { - const newItems = updateOrAddToArray(store.asyncRateLimiterState, e.payload) - setStore({ asyncRateLimiterState: newItems }) - break - } - case 'pacer:async-throttler-state': - { - const newItems = updateOrAddToArray(store.asyncThrottlerState, e.payload) - setStore({ asyncThrottlerState: newItems }) - break - } - case 'pacer:batcher-state': - { - const newItems = updateOrAddToArray(store.batcherState, e.payload) - setStore({ batcherState: newItems }) - break - } - case 'pacer:debouncer-state': - { - const newItems = updateOrAddToArray(store.debouncerState, e.payload) - setStore({ debouncerState: newItems }) - break - } - case 'pacer:queuer-state': - { - const newItems = updateOrAddToArray(store.queuerState, e.payload) - setStore({ queuerState: newItems }) - break - } - case 'pacer:rate-limiter-state': - { - const newItems = updateOrAddToArray(store.rateLimiterState, e.payload) - setStore({ rateLimiterState: newItems }) - break - } - case 'pacer:throttler-state': - { - const newItems = updateOrAddToArray(store.throttlerState, e.payload) - setStore({ throttlerState: newItems }) - break - } + case 'pacer:async-batcher-state': { + const newItems = updateOrAddToArray( + store.asyncBatcherState, + e.payload, + ) + setStore({ asyncBatcherState: newItems }) + break + } + case 'pacer:async-debouncer-state': { + const newItems = updateOrAddToArray( + store.asyncDebouncerState, + e.payload, + ) + setStore({ asyncDebouncerState: newItems }) + break + } + case 'pacer:async-queuer-state': { + const newItems = updateOrAddToArray(store.asyncQueuerState, e.payload) + setStore({ asyncQueuerState: newItems }) + break + } + case 'pacer:async-rate-limiter-state': { + const newItems = updateOrAddToArray( + store.asyncRateLimiterState, + e.payload, + ) + setStore({ asyncRateLimiterState: newItems }) + break + } + case 'pacer:async-throttler-state': { + const newItems = updateOrAddToArray( + store.asyncThrottlerState, + e.payload, + ) + setStore({ asyncThrottlerState: newItems }) + break + } + case 'pacer:batcher-state': { + const newItems = updateOrAddToArray(store.batcherState, e.payload) + setStore({ batcherState: newItems }) + break + } + case 'pacer:debouncer-state': { + const newItems = updateOrAddToArray(store.debouncerState, e.payload) + setStore({ debouncerState: newItems }) + break + } + case 'pacer:queuer-state': { + const newItems = updateOrAddToArray(store.queuerState, e.payload) + setStore({ queuerState: newItems }) + break + } + case 'pacer:rate-limiter-state': { + const newItems = updateOrAddToArray(store.rateLimiterState, e.payload) + setStore({ rateLimiterState: newItems }) + break + } + case 'pacer:throttler-state': { + const newItems = updateOrAddToArray(store.throttlerState, e.payload) + setStore({ throttlerState: newItems }) + break + } } }) onCleanup(cleanup) diff --git a/packages/pacer-devtools/src/context/context.ts b/packages/pacer-devtools/src/context/context.ts index c5c5e20f..ae2aa6bc 100644 --- a/packages/pacer-devtools/src/context/context.ts +++ b/packages/pacer-devtools/src/context/context.ts @@ -42,4 +42,4 @@ export const initialStore = { export const PacerContext = createContext< [PacerContextType, (newState: Partial) => void] ->([initialStore, () => { }]) +>([initialStore, () => {}]) diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/devtools.tsx index fe61395c..5565c693 100644 --- a/packages/pacer-devtools/src/devtools.tsx +++ b/packages/pacer-devtools/src/devtools.tsx @@ -1,10 +1,9 @@ - -import { For, } from 'solid-js'; -import clsx from 'clsx'; -import { usePacerState } from './context/use-context-hooks'; -import { PacerContextProvider } from './context/context-provider'; -import { useStyles } from './styles/use-styles'; -import { JsonTree } from './tree'; +import { For } from 'solid-js' +import clsx from 'clsx' +import { usePacerState } from './context/use-context-hooks' +import { PacerContextProvider } from './context/context-provider' +import { useStyles } from './styles/use-styles' +import { JsonTree } from './tree' type StateKey = | 'asyncBatcherState' @@ -16,7 +15,7 @@ type StateKey = | 'debouncerState' | 'queuerState' | 'rateLimiterState' - | 'throttlerState'; + | 'throttlerState' const CONTEXT_SECTIONS: Array<{ key: StateKey; label: string }> = [ { key: 'asyncBatcherState', label: 'Async Batcher State' }, @@ -29,12 +28,11 @@ const CONTEXT_SECTIONS: Array<{ key: StateKey; label: string }> = [ { key: 'queuerState', label: 'Queuer State' }, { key: 'rateLimiterState', label: 'Rate Limiter State' }, { key: 'throttlerState', label: 'Throttler State' }, -]; - +] function Section({ key, label }: { key: StateKey; label: string }) { - const state = usePacerState(); - const styles = useStyles(); + const state = usePacerState() + const styles = useStyles() return ( <> @@ -42,45 +40,42 @@ function Section({ key, label }: { key: StateKey; label: string }) {
{label}
- {(inst) => - - } + + {(inst) => } +
)} - ); + ) } function Shell() { - const styles = useStyles(); + const styles = useStyles() return (
TanStack Pacer
- {({ key, label }) => -
- } + + {({ key, label }) =>
} +
- ); + ) } -function AnimatedInstanceCard(props: { value: any; }) { - - const styles = useStyles(); - +function AnimatedInstanceCard(props: { value: any }) { + const styles = useStyles() return ( -
+
- ); + ) } - export default function Devtools() { return ( diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index ad983887..80bfb130 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -2,11 +2,10 @@ import * as goober from 'goober' import { createSignal } from 'solid-js' import { tokens } from './tokens' - const stylesFactory = () => { - const { colors, font, size, alpha, border } = tokens; - const { fontFamily, size: fontSize } = font; - const css = goober.css; + const { colors, font, size, alpha, border } = tokens + const { fontFamily, size: fontSize } = font + const css = goober.css return { devtoolsPanel: css` @@ -85,12 +84,17 @@ const stylesFactory = () => { color: ${colors.gray[100]}; font-family: ${fontFamily.mono}; overflow-x: auto; - transition: box-shadow 0.3s, background 0.3s; + transition: + box-shadow 0.3s, + background 0.3s; `, - flash: (isFlashing: boolean) => isFlashing ? css` - box-shadow: 0 0 0 2px ${colors.blue[400]}; - background: ${colors.blue[600]}; - ` : css``, + flash: (isFlashing: boolean) => + isFlashing + ? css` + box-shadow: 0 0 0 2px ${colors.blue[400]}; + background: ${colors.blue[600]}; + ` + : css``, valueString: css` color: ${colors.green[400]}; `, @@ -113,8 +117,8 @@ const stylesFactory = () => { valueContainer: css` display: block; margin-left: 1rem; - ` - }; + `, + } } export function useStyles() { diff --git a/packages/pacer-devtools/src/tree.tsx b/packages/pacer-devtools/src/tree.tsx index 5576258d..cedde29b 100644 --- a/packages/pacer-devtools/src/tree.tsx +++ b/packages/pacer-devtools/src/tree.tsx @@ -1,71 +1,117 @@ -import { For } from "solid-js"; -import { useStyles } from "./styles/use-styles"; +import { For } from 'solid-js' +import { useStyles } from './styles/use-styles' export function JsonTree(props: { value: any; keyName?: string }) { - const { value, keyName } = props; - const styles = useStyles(); + const { value, keyName } = props + const styles = useStyles() if (typeof value === 'string') { - return - {keyName && "{keyName}": } - "{value}" - , - ; + return ( + + + {keyName && ( + "{keyName}": + )} + "{value}" + + , + + ) } if (typeof value === 'number') { - return - {keyName && "{keyName}": } - {value} - , - ; + return ( + + + {keyName && ( + "{keyName}": + )} + {value} + + , + + ) } if (typeof value === 'boolean') { - return - - {keyName && "{keyName}": } - {String(value)} + return ( + + + {keyName && ( + "{keyName}": + )} + {String(value)} + + , - , - ; + ) } if (value === null) { - return - {keyName && "{keyName}": } - null - , - ; + return ( + + + {keyName && ( + "{keyName}": + )} + null + + , + + ) } if (value === undefined) { - return - {keyName && "{keyName}": } - undefined - , - ; + return ( + + + {keyName && ( + "{keyName}": + )} + undefined + + , + + ) } if (Array.isArray(value)) { - return - {keyName && "{keyName}": } - [ - {(item) => <> - - } - - ] - , - ; + return ( + + + {keyName && ( + "{keyName}": + )} + [ + + {(item) => ( + <> + + + )} + + ] + + , + + ) } if (typeof value === 'object') { - const keys = Object.keys(value); - return - {keyName && "{keyName}": } - {'{'} - {(k,) => <> - - } - - {'}'} - - ; + const keys = Object.keys(value) + return ( + + + {' '} + {keyName && ( + "{keyName}": + )} + {'{'} + + {(k) => ( + <> + + + )} + + {'}'} + + + ) } - return ; -} \ No newline at end of file + return +} diff --git a/packages/pacer-react-devtools/src/devtools.tsx b/packages/pacer-react-devtools/src/devtools.tsx index 5bdf7222..6654e5df 100644 --- a/packages/pacer-react-devtools/src/devtools.tsx +++ b/packages/pacer-react-devtools/src/devtools.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useRef, useState } from 'react' import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' -interface PacerDevtoolsReactInit { } +interface PacerDevtoolsReactInit {} export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { const devToolRef = useRef(null) @@ -15,5 +15,5 @@ export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { return () => devtools.unmount() }, [devtools]) - return
+ return
} diff --git a/packages/pacer-solid-devtools/src/devtools.tsx b/packages/pacer-solid-devtools/src/devtools.tsx index 657998c8..01266de1 100644 --- a/packages/pacer-solid-devtools/src/devtools.tsx +++ b/packages/pacer-solid-devtools/src/devtools.tsx @@ -1,7 +1,7 @@ import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' import { createSignal, onCleanup, onMount } from 'solid-js' -interface PacerDevtoolsSolidInit { } +interface PacerDevtoolsSolidInit {} export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { let devToolRef: HTMLDivElement | undefined @@ -16,5 +16,5 @@ export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { } }) - return
+ return
} diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index c890f3fa..5b11f882 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { emitChange, } from './event-client' +import { emitChange } from './event-client' import type { OptionalKeys } from './types' export interface AsyncBatcherState { diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index 3b7cc9ce..5bc01bde 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { parseFunctionOrValue } from './utils' -import { emitChange, } from './event-client' +import { emitChange } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncDebouncerState { diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index dd59a642..a76a7319 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -375,19 +375,19 @@ export class AsyncQueuer { this.#setState({ activeItems, }) - ; (async () => { - const result = await this.execute() - this.#setState({ lastResult: result }) - - const wait = this.#getWait() - if (wait > 0) { - const timeoutId = setTimeout(() => this.#tick(), wait) - this.#timeoutIds.add(timeoutId) - return - } - - this.#tick() - })() + ;(async () => { + const result = await this.execute() + this.#setState({ lastResult: result }) + + const wait = this.#getWait() + if (wait > 0) { + const timeoutId = setTimeout(() => this.#tick(), wait) + this.#timeoutIds.add(timeoutId) + return + } + + this.#tick() + })() } this.#setState({ pendingTick: false }) diff --git a/packages/pacer/src/event-client.ts b/packages/pacer/src/event-client.ts index c3eaac87..b442dc55 100644 --- a/packages/pacer/src/event-client.ts +++ b/packages/pacer/src/event-client.ts @@ -34,9 +34,16 @@ class PacerEventClient extends EventClient { } } -export const emitChange = extends `${string}:${infer S}` ? S : never>( +export const emitChange = < + TSuffix extends Extract< + keyof PacerEventMap, + `${string}:${string}` + > extends `${string}:${infer S}` + ? S + : never, +>( event: TSuffix, - payload: PacerEventMap[`pacer:${TSuffix}`] & { uuid: string } + payload: PacerEventMap[`pacer:${TSuffix}`] & { uuid: string }, ) => { pacerEventClient.emit(event, payload) } diff --git a/packages/pacer/src/index.ts b/packages/pacer/src/index.ts index 97f55d9b..36721840 100644 --- a/packages/pacer/src/index.ts +++ b/packages/pacer/src/index.ts @@ -11,4 +11,4 @@ export * from './throttler' export * from './types' export * from './utils' export { pacerEventClient } from './event-client' -export type { PacerEventMap } from './event-client' \ No newline at end of file +export type { PacerEventMap } from './event-client' From b220c67e1ee0aaa9013e9ea1b737ff7d8e1d24e4 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Tue, 12 Aug 2025 13:04:02 +0200 Subject: [PATCH 15/50] chore: remove built-in tree in favor of devtools/ui --- package.json | 4 +- packages/pacer-devtools/package.json | 1 + packages/pacer-devtools/src/devtools.tsx | 13 +- .../pacer-devtools/src/styles/use-styles.ts | 32 +---- packages/pacer-devtools/src/tree.tsx | 117 ------------------ pnpm-lock.yaml | 16 +++ 6 files changed, 27 insertions(+), 156 deletions(-) delete mode 100644 packages/pacer-devtools/src/tree.tsx diff --git a/package.json b/package.json index b8ea335a..4e2b3c09 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "packageManager": "pnpm@10.2.1", "type": "module", "scripts": { - "build": "nx affected --targets=build --exclude=examples/** && size-limit", + "build": "nx affected --skip-nx-cache --targets=build --exclude=examples/** && size-limit", "build:all": "nx run-many --targets=build --exclude=examples/** && size-limit", "build:core": "nx run-many --targets=build --projects=packages/pacer,packages/persister && size-limit", "changeset": "changeset", @@ -84,4 +84,4 @@ "@tanstack/pacer-solid-devtools": "workspace:*", "@tanstack/pacer-react-devtools": "workspace:*" } -} +} \ No newline at end of file diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json index 5cecdbe8..fa178e43 100644 --- a/packages/pacer-devtools/package.json +++ b/packages/pacer-devtools/package.json @@ -61,6 +61,7 @@ "@tanstack/pacer": ">=0.14.0" }, "dependencies": { + "@tanstack/devtools-ui": "^0.3.0", "clsx": "^2.1.1", "goober": "^2.1.16", "solid-js": "^1.9.7" diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/devtools.tsx index 5565c693..1e05c49b 100644 --- a/packages/pacer-devtools/src/devtools.tsx +++ b/packages/pacer-devtools/src/devtools.tsx @@ -1,9 +1,10 @@ -import { For } from 'solid-js' -import clsx from 'clsx' -import { usePacerState } from './context/use-context-hooks' -import { PacerContextProvider } from './context/context-provider' -import { useStyles } from './styles/use-styles' -import { JsonTree } from './tree' + +import { For, } from 'solid-js'; +import clsx from 'clsx'; +import { JsonTree } from "@tanstack/devtools-ui" +import { usePacerState } from './context/use-context-hooks'; +import { PacerContextProvider } from './context/context-provider'; +import { useStyles } from './styles/use-styles'; type StateKey = | 'asyncBatcherState' diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index 80bfb130..b7566cf2 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -88,37 +88,7 @@ const stylesFactory = () => { box-shadow 0.3s, background 0.3s; `, - flash: (isFlashing: boolean) => - isFlashing - ? css` - box-shadow: 0 0 0 2px ${colors.blue[400]}; - background: ${colors.blue[600]}; - ` - : css``, - valueString: css` - color: ${colors.green[400]}; - `, - valueNumber: css` - color: ${colors.yellow[400]}; - `, - valueBoolean: css` - color: ${colors.pink[400]}; - `, - valueNull: css` - color: ${colors.gray[400]}; - font-style: italic; - `, - valueKey: css` - color: ${colors.blue[300]}; - `, - valueBraces: css` - color: ${colors.gray[500]}; - `, - valueContainer: css` - display: block; - margin-left: 1rem; - `, - } + }; } export function useStyles() { diff --git a/packages/pacer-devtools/src/tree.tsx b/packages/pacer-devtools/src/tree.tsx deleted file mode 100644 index cedde29b..00000000 --- a/packages/pacer-devtools/src/tree.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import { For } from 'solid-js' -import { useStyles } from './styles/use-styles' - -export function JsonTree(props: { value: any; keyName?: string }) { - const { value, keyName } = props - const styles = useStyles() - - if (typeof value === 'string') { - return ( - - - {keyName && ( - "{keyName}": - )} - "{value}" - - , - - ) - } - if (typeof value === 'number') { - return ( - - - {keyName && ( - "{keyName}": - )} - {value} - - , - - ) - } - if (typeof value === 'boolean') { - return ( - - - {keyName && ( - "{keyName}": - )} - {String(value)} - - , - - ) - } - if (value === null) { - return ( - - - {keyName && ( - "{keyName}": - )} - null - - , - - ) - } - if (value === undefined) { - return ( - - - {keyName && ( - "{keyName}": - )} - undefined - - , - - ) - } - if (Array.isArray(value)) { - return ( - - - {keyName && ( - "{keyName}": - )} - [ - - {(item) => ( - <> - - - )} - - ] - - , - - ) - } - if (typeof value === 'object') { - const keys = Object.keys(value) - return ( - - - {' '} - {keyName && ( - "{keyName}": - )} - {'{'} - - {(k) => ( - <> - - - )} - - {'}'} - - - ) - } - return -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 054f4ec1..c43ed73e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1562,6 +1562,9 @@ importers: packages/pacer-devtools: dependencies: + '@tanstack/devtools-ui': + specifier: ^0.3.0 + version: 0.3.0(csstype@3.1.3)(solid-js@1.9.7) '@tanstack/pacer': specifier: '>=0.14.0' version: link:../pacer @@ -2670,6 +2673,12 @@ packages: peerDependencies: solid-js: '>=1.9.7' + '@tanstack/devtools-ui@0.3.0': + resolution: {integrity: sha512-lyP0eM6juIWn8zgI8xI32Lh86gCnjUyNePE9F7Bfgkv5taILmmJAHW5Mme4T2ufv7L8NLwOiBY/bZYnP4zev0w==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + '@tanstack/devtools@0.3.0': resolution: {integrity: sha512-uxj3MM2/ZlQDlhnBoUSlJC8oneJ+sPh6hK0kgiKZAEgrlUvZfUNgKGhrmMHZaAGl/WEglhZoxXwvvo9HAFT8yw==} engines: {node: '>=18'} @@ -6392,6 +6401,13 @@ snapshots: transitivePeerDependencies: - csstype + '@tanstack/devtools-ui@0.3.0(csstype@3.1.3)(solid-js@1.9.7)': + dependencies: + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.7 + transitivePeerDependencies: + - csstype + '@tanstack/devtools@0.3.0(csstype@3.1.3)(solid-js@1.9.7)': dependencies: '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.7) From 99d052b8a266de166e51b97f9fa5197f710b4292 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 11:05:01 +0000 Subject: [PATCH 16/50] ci: apply automated fixes --- package.json | 2 +- packages/pacer-devtools/src/devtools.tsx | 13 ++++++------- packages/pacer-devtools/src/styles/use-styles.ts | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 4e2b3c09..9c8e98fc 100644 --- a/package.json +++ b/package.json @@ -84,4 +84,4 @@ "@tanstack/pacer-solid-devtools": "workspace:*", "@tanstack/pacer-react-devtools": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/devtools.tsx index 1e05c49b..bf2091c4 100644 --- a/packages/pacer-devtools/src/devtools.tsx +++ b/packages/pacer-devtools/src/devtools.tsx @@ -1,10 +1,9 @@ - -import { For, } from 'solid-js'; -import clsx from 'clsx'; -import { JsonTree } from "@tanstack/devtools-ui" -import { usePacerState } from './context/use-context-hooks'; -import { PacerContextProvider } from './context/context-provider'; -import { useStyles } from './styles/use-styles'; +import { For } from 'solid-js' +import clsx from 'clsx' +import { JsonTree } from '@tanstack/devtools-ui' +import { usePacerState } from './context/use-context-hooks' +import { PacerContextProvider } from './context/context-provider' +import { useStyles } from './styles/use-styles' type StateKey = | 'asyncBatcherState' diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index b7566cf2..6587a7b9 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -88,7 +88,7 @@ const stylesFactory = () => { box-shadow 0.3s, background 0.3s; `, - }; + } } export function useStyles() { From b1eb9e667c71c0a6545e2a6b9aa2192086c9b376 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Tue, 12 Aug 2025 13:19:22 -0500 Subject: [PATCH 17/50] refactor to key --- docs/reference/interfaces/pacereventmap.md | 20 ++++++++-------- .../src/context/context-provider.tsx | 4 ++-- .../pacer-devtools/src/context/context.ts | 22 ++++++++--------- packages/pacer/src/async-batcher.ts | 21 ++++++++++++---- packages/pacer/src/async-debouncer.ts | 16 +++++++++---- packages/pacer/src/async-queuer.ts | 15 ++++++++---- packages/pacer/src/async-rate-limiter.ts | 16 +++++++++---- packages/pacer/src/async-throttler.ts | 14 +++++++---- packages/pacer/src/batcher.ts | 16 +++++++++---- packages/pacer/src/debouncer.ts | 16 +++++++++---- packages/pacer/src/event-client.ts | 24 +++++++++---------- packages/pacer/src/queuer.ts | 15 ++++++++---- packages/pacer/src/rate-limiter.ts | 15 ++++++++---- packages/pacer/src/throttler.ts | 14 +++++++---- packages/pacer/src/utils.ts | 15 ++++++++++++ 15 files changed, 162 insertions(+), 81 deletions(-) diff --git a/docs/reference/interfaces/pacereventmap.md b/docs/reference/interfaces/pacereventmap.md index 9193e21c..5d5a7807 100644 --- a/docs/reference/interfaces/pacereventmap.md +++ b/docs/reference/interfaces/pacereventmap.md @@ -14,7 +14,7 @@ Defined in: [event-client.ts:15](https://github.com/TanStack/pacer/blob/main/pac ### pacer:async-batcher-state ```ts -pacer:async-batcher-state: WithUuid>; +pacer:async-batcher-state: WithKey>; ``` Defined in: [event-client.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L16) @@ -24,7 +24,7 @@ Defined in: [event-client.ts:16](https://github.com/TanStack/pacer/blob/main/pac ### pacer:async-debouncer-state ```ts -pacer:async-debouncer-state: WithUuid>; +pacer:async-debouncer-state: WithKey>; ``` Defined in: [event-client.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L17) @@ -34,7 +34,7 @@ Defined in: [event-client.ts:17](https://github.com/TanStack/pacer/blob/main/pac ### pacer:async-queuer-state ```ts -pacer:async-queuer-state: WithUuid>; +pacer:async-queuer-state: WithKey>; ``` Defined in: [event-client.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L18) @@ -44,7 +44,7 @@ Defined in: [event-client.ts:18](https://github.com/TanStack/pacer/blob/main/pac ### pacer:async-rate-limiter-state ```ts -pacer:async-rate-limiter-state: WithUuid>; +pacer:async-rate-limiter-state: WithKey>; ``` Defined in: [event-client.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L19) @@ -54,7 +54,7 @@ Defined in: [event-client.ts:19](https://github.com/TanStack/pacer/blob/main/pac ### pacer:async-throttler-state ```ts -pacer:async-throttler-state: WithUuid>; +pacer:async-throttler-state: WithKey>; ``` Defined in: [event-client.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L20) @@ -64,7 +64,7 @@ Defined in: [event-client.ts:20](https://github.com/TanStack/pacer/blob/main/pac ### pacer:batcher-state ```ts -pacer:batcher-state: WithUuid>; +pacer:batcher-state: WithKey>; ``` Defined in: [event-client.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L21) @@ -74,7 +74,7 @@ Defined in: [event-client.ts:21](https://github.com/TanStack/pacer/blob/main/pac ### pacer:debouncer-state ```ts -pacer:debouncer-state: WithUuid>; +pacer:debouncer-state: WithKey>; ``` Defined in: [event-client.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L22) @@ -84,7 +84,7 @@ Defined in: [event-client.ts:22](https://github.com/TanStack/pacer/blob/main/pac ### pacer:queuer-state ```ts -pacer:queuer-state: WithUuid>; +pacer:queuer-state: WithKey>; ``` Defined in: [event-client.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L23) @@ -94,7 +94,7 @@ Defined in: [event-client.ts:23](https://github.com/TanStack/pacer/blob/main/pac ### pacer:rate-limiter-state ```ts -pacer:rate-limiter-state: WithUuid; +pacer:rate-limiter-state: WithKey; ``` Defined in: [event-client.ts:24](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L24) @@ -104,7 +104,7 @@ Defined in: [event-client.ts:24](https://github.com/TanStack/pacer/blob/main/pac ### pacer:throttler-state ```ts -pacer:throttler-state: WithUuid>; +pacer:throttler-state: WithKey>; ``` Defined in: [event-client.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L25) diff --git a/packages/pacer-devtools/src/context/context-provider.tsx b/packages/pacer-devtools/src/context/context-provider.tsx index 82b93779..08e07df8 100644 --- a/packages/pacer-devtools/src/context/context-provider.tsx +++ b/packages/pacer-devtools/src/context/context-provider.tsx @@ -4,11 +4,11 @@ import { pacerEventClient } from '@tanstack/pacer' import { PacerContext, initialStore } from './context' import type { PacerContextType } from './context' -const updateOrAddToArray = ( +const updateOrAddToArray = ( oldArray: Array, newItem: T, ) => { - const index = oldArray.findIndex((item) => item.uuid === newItem.uuid) + const index = oldArray.findIndex((item) => item.key === newItem.key) if (index !== -1) { // Update existing item return oldArray.map((item, i) => (i === index ? newItem : item)) diff --git a/packages/pacer-devtools/src/context/context.ts b/packages/pacer-devtools/src/context/context.ts index ae2aa6bc..4ed31433 100644 --- a/packages/pacer-devtools/src/context/context.ts +++ b/packages/pacer-devtools/src/context/context.ts @@ -12,19 +12,19 @@ import type { ThrottlerState, } from '@tanstack/pacer' -type WithUuid = T & { uuid: string } +type WithKey = T & { key: string } export interface PacerContextType { - asyncBatcherState: Array>> - asyncDebouncerState: Array>> - asyncQueuerState: Array>> - asyncRateLimiterState: Array>> - asyncThrottlerState: Array>> - batcherState: Array>> - debouncerState: Array>> - queuerState: Array>> - rateLimiterState: Array> - throttlerState: Array>> + asyncBatcherState: Array>> + asyncDebouncerState: Array>> + asyncQueuerState: Array>> + asyncRateLimiterState: Array>> + asyncThrottlerState: Array>> + batcherState: Array>> + debouncerState: Array>> + queuerState: Array>> + rateLimiterState: Array> + throttlerState: Array>> } export const initialStore = { diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 5b11f882..b5d2647d 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { OptionalKeys } from './types' @@ -92,6 +92,11 @@ export interface AsyncBatcherOptions { * Initial state for the async batcher */ initialState?: Partial> + /** + * Optional key to identify this async batcher instance. + * If provided, the async batcher will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Maximum number of items in a batch * @default Infinity @@ -145,7 +150,12 @@ export interface AsyncBatcherOptions { type AsyncBatcherOptionsWithOptionalCallbacks = OptionalKeys< Required>, - 'initialState' | 'onError' | 'onItemsChange' | 'onSettled' | 'onSuccess' + | 'initialState' + | 'onError' + | 'onItemsChange' + | 'onSettled' + | 'onSuccess' + | 'key' > const defaultOptions: AsyncBatcherOptionsWithOptionalCallbacks = { @@ -221,14 +231,15 @@ export class AsyncBatcher { readonly store: Store>> = new Store( getDefaultAsyncBatcherState(), ) + key: string options: AsyncBatcherOptionsWithOptionalCallbacks #timeoutId: NodeJS.Timeout | null = null - #uuid: string + constructor( public fn: (items: Array) => Promise, initialOptions: AsyncBatcherOptions, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -267,7 +278,7 @@ export class AsyncBatcher { } as const emitChange('async-batcher-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index 5bc01bde..6d6f92c8 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' @@ -72,6 +72,11 @@ export interface AsyncDebouncerOptions { * Initial state for the async debouncer */ initialState?: Partial> + /** + * Optional key to identify this async debouncer instance. + * If provided, the async debouncer will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Whether to execute on the leading edge of the timeout. * Defaults to false. @@ -120,7 +125,7 @@ export interface AsyncDebouncerOptions { type AsyncDebouncerOptionsWithOptionalCallbacks = OptionalKeys< AsyncDebouncerOptions, - 'initialState' | 'onError' | 'onSettled' | 'onSuccess' + 'initialState' | 'onError' | 'onSettled' | 'onSuccess' | 'key' > const defaultOptions: AsyncDebouncerOptionsWithOptionalCallbacks = { @@ -179,18 +184,19 @@ export class AsyncDebouncer { readonly store: Store>> = new Store< AsyncDebouncerState >(getDefaultAsyncDebouncerState()) + key: string options: AsyncDebouncerOptions #abortController: AbortController | null = null #timeoutId: NodeJS.Timeout | null = null #resolvePreviousPromise: | ((value?: ReturnType | undefined) => void) | null = null - #uuid: string + constructor( public fn: TFn, initialOptions: AsyncDebouncerOptions, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -232,7 +238,7 @@ export class AsyncDebouncer { } as const emitChange('async-debouncer-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index a76a7319..39cdb9d0 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { OptionalKeys } from './types' import type { QueuePosition } from './queuer' @@ -98,6 +98,11 @@ export interface AsyncQueuerOptions { * @default 'back' */ addItemsTo?: QueuePosition + /** + * Optional key to identify this async queuer instance. + * If provided, the async queuer will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Maximum number of concurrent tasks to process. * Can be a number or a function that returns a number. @@ -191,6 +196,7 @@ type AsyncQueuerOptionsWithOptionalCallbacks = OptionalKeys< | 'onItemsChange' | 'onExpire' | 'onError' + | 'key' > const defaultOptions: AsyncQueuerOptionsWithOptionalCallbacks = { @@ -261,14 +267,15 @@ export class AsyncQueuer { readonly store: Store>> = new Store< AsyncQueuerState >(getDefaultAsyncQueuerState()) + key: string options: AsyncQueuerOptions #timeoutIds: Set = new Set() - #uuid: string + constructor( public fn: (item: TValue) => Promise, initialOptions: AsyncQueuerOptions = {}, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -326,7 +333,7 @@ export class AsyncQueuer { } as const emitChange('async-queuer-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index c959d8ee..c01ffc0b 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { AnyAsyncFunction } from './types' @@ -72,6 +72,11 @@ export interface AsyncRateLimiterOptions { * Initial state for the rate limiter */ initialState?: Partial> + /** + * Optional key to identify this async rate limiter instance. + * If provided, the async rate limiter will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Maximum number of executions allowed within the time window. * Can be a number or a function that returns a number. @@ -128,7 +133,7 @@ export interface AsyncRateLimiterOptions { const defaultOptions: Omit< Required>, - 'initialState' | 'onError' | 'onReject' | 'onSettled' | 'onSuccess' + 'initialState' | 'onError' | 'onReject' | 'onSettled' | 'onSuccess' | 'key' > = { enabled: true, limit: 1, @@ -207,14 +212,15 @@ export class AsyncRateLimiter { readonly store: Store>> = new Store< AsyncRateLimiterState >(getDefaultAsyncRateLimiterState()) + key: string options: AsyncRateLimiterOptions #timeoutIds: Set = new Set() - #uuid: string + constructor( public fn: TFn, initialOptions: AsyncRateLimiterOptions, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -254,7 +260,7 @@ export class AsyncRateLimiter { } as const emitChange('async-rate-limiter-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index acb42072..a0d3c63b 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' @@ -77,6 +77,11 @@ export interface AsyncThrottlerOptions { * Initial state for the async throttler */ initialState?: Partial> + /** + * Optional key to identify this async throttler instance. + * If provided, the async throttler will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Whether to execute the function immediately when called * Defaults to true @@ -190,18 +195,19 @@ export class AsyncThrottler { readonly store: Store>> = new Store< AsyncThrottlerState >(getDefaultAsyncThrottlerState()) + key: string options: AsyncThrottlerOptions #abortController: AbortController | null = null #timeoutId: NodeJS.Timeout | null = null #resolvePreviousPromise: | ((value?: ReturnType | undefined) => void) | null = null - #uuid: string + constructor( public fn: TFn, initialOptions: AsyncThrottlerOptions, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -243,7 +249,7 @@ export class AsyncThrottler { } as const emitChange('async-throttler-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index dcd4709a..c68732cf 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { OptionalKeys } from './types' @@ -59,6 +59,11 @@ export interface BatcherOptions { * Initial state for the batcher */ initialState?: Partial> + /** + * Optional key to identify this batcher instance. + * If provided, the batcher will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Maximum number of items in a batch * @default Infinity @@ -88,7 +93,7 @@ export interface BatcherOptions { type BatcherOptionsWithOptionalCallbacks = OptionalKeys< Required>, - 'initialState' | 'onExecute' | 'onItemsChange' + 'initialState' | 'onExecute' | 'onItemsChange' | 'key' > const defaultOptions: BatcherOptionsWithOptionalCallbacks = { @@ -140,14 +145,15 @@ export class Batcher { readonly store: Store>> = new Store( getDefaultBatcherState(), ) + key: string options: BatcherOptionsWithOptionalCallbacks #timeoutId: NodeJS.Timeout | null = null - #uuid: string + constructor( public fn: (items: Array) => void, initialOptions: BatcherOptions, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -180,7 +186,7 @@ export class Batcher { emitChange('batcher-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index 37de3db6..6221e307 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { AnyFunction } from './types' @@ -48,6 +48,11 @@ export interface DebouncerOptions { * Defaults to true. */ enabled?: boolean | ((debouncer: Debouncer) => boolean) + /** + * A key to identify the debouncer. + * If provided, the debouncer will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Initial state for the debouncer */ @@ -77,7 +82,7 @@ export interface DebouncerOptions { const defaultOptions: Omit< Required>, - 'initialState' | 'onExecute' + 'initialState' | 'onExecute' | 'key' > = { enabled: true, leading: false, @@ -120,14 +125,15 @@ export class Debouncer { readonly store: Store>> = new Store( getDefaultDebouncerState(), ) + key: string options: DebouncerOptions #timeoutId: NodeJS.Timeout | undefined - #uuid: string + constructor( public fn: TFn, initialOptions: DebouncerOptions, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -164,7 +170,7 @@ export class Debouncer { } as const emitChange('debouncer-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/event-client.ts b/packages/pacer/src/event-client.ts index b442dc55..71e156e7 100644 --- a/packages/pacer/src/event-client.ts +++ b/packages/pacer/src/event-client.ts @@ -10,19 +10,19 @@ import type { QueuerState } from './queuer' import type { RateLimiterState } from './rate-limiter' import type { ThrottlerState } from './throttler' -type WithUuid = T & { uuid: string } +type WithKey = T & { key: string } export interface PacerEventMap { - 'pacer:async-batcher-state': WithUuid> - 'pacer:async-debouncer-state': WithUuid> - 'pacer:async-queuer-state': WithUuid> - 'pacer:async-rate-limiter-state': WithUuid> - 'pacer:async-throttler-state': WithUuid> - 'pacer:batcher-state': WithUuid> - 'pacer:debouncer-state': WithUuid> - 'pacer:queuer-state': WithUuid> - 'pacer:rate-limiter-state': WithUuid - 'pacer:throttler-state': WithUuid> + 'pacer:async-batcher-state': WithKey> + 'pacer:async-debouncer-state': WithKey> + 'pacer:async-queuer-state': WithKey> + 'pacer:async-rate-limiter-state': WithKey> + 'pacer:async-throttler-state': WithKey> + 'pacer:batcher-state': WithKey> + 'pacer:debouncer-state': WithKey> + 'pacer:queuer-state': WithKey> + 'pacer:rate-limiter-state': WithKey + 'pacer:throttler-state': WithKey> } class PacerEventClient extends EventClient { @@ -43,7 +43,7 @@ export const emitChange = < : never, >( event: TSuffix, - payload: PacerEventMap[`pacer:${TSuffix}`] & { uuid: string }, + payload: PacerEventMap[`pacer:${TSuffix}`] & { key: string }, ) => { pacerEventClient.emit(event, payload) } diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index 0ee341cf..0d095463 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' export interface QueuerState { @@ -81,6 +81,11 @@ export interface QueuerOptions { * @default 'back' */ addItemsTo?: QueuePosition + /** + * Optional key to identify this queuer instance. + * If provided, the queuer will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Maximum time in milliseconds that an item can stay in the queue * If not provided, items will never expire @@ -149,6 +154,7 @@ const defaultOptions: Omit< | 'onItemsChange' | 'onReject' | 'onExpire' + | 'key' > = { addItemsTo: 'back', getItemsFrom: 'front', @@ -245,14 +251,15 @@ export class Queuer { readonly store: Store>> = new Store( getDefaultQueuerState(), ) + key: string options: QueuerOptions #timeoutId: NodeJS.Timeout | null = null - #uuid: string + constructor( public fn: (item: TValue) => void, initialOptions: QueuerOptions = {}, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -309,7 +316,7 @@ export class Queuer { } as const emitChange('queuer-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index abf472a1..a894b0e2 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { AnyFunction } from './types' @@ -49,6 +49,11 @@ export interface RateLimiterOptions { * Initial state for the rate limiter */ initialState?: Partial + /** + * Optional key to identify this rate limiter instance. + * If provided, the rate limiter will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Maximum number of executions allowed within the time window. * Can be a number or a callback function that receives the rate limiter instance and returns a number. @@ -78,7 +83,7 @@ export interface RateLimiterOptions { const defaultOptions: Omit< Required>, - 'initialState' | 'onExecute' | 'onReject' + 'initialState' | 'onExecute' | 'onReject' | 'key' > = { enabled: true, limit: 1, @@ -133,15 +138,15 @@ const defaultOptions: Omit< export class RateLimiter { readonly store: Store> = new Store(getDefaultRateLimiterState()) + key: string options: RateLimiterOptions #timeoutIds: Set = new Set() - #uuid: string constructor( public fn: TFn, initialOptions: RateLimiterOptions, ) { - this.#uuid = crypto.randomUUID() + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -178,7 +183,7 @@ export class RateLimiter { } as const emitChange('rate-limiter-state', { ...finalState, - uuid: this.#uuid, + key: this.key, }) return finalState }) diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index 009f6933..d0fcc956 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -1,5 +1,5 @@ import { Store } from '@tanstack/store' -import { parseFunctionOrValue } from './utils' +import { createKey, parseFunctionOrValue } from './utils' import { emitChange } from './event-client' import type { AnyFunction } from './types' @@ -57,6 +57,11 @@ export interface ThrottlerOptions { * Initial state for the throttler */ initialState?: Partial> + /** + * A key to identify the throttler. + * If provided, the throttler will be identified by this key in the devtools and PacerProvider if applicable. + */ + key?: string /** * Whether to execute on the leading edge of the timeout. * Defaults to true. @@ -81,7 +86,7 @@ export interface ThrottlerOptions { const defaultOptions: Omit< Required>, - 'initialState' | 'onExecute' + 'initialState' | 'onExecute' | 'key' > = { enabled: true, leading: true, @@ -128,14 +133,15 @@ export class Throttler { readonly store: Store>> = new Store( getDefaultThrottlerState(), ) + key: string | undefined options: ThrottlerOptions #timeoutId: NodeJS.Timeout | undefined - #uuid = crypto.randomUUID() constructor( public fn: TFn, initialOptions: ThrottlerOptions, ) { + this.key = createKey(initialOptions.key) this.options = { ...defaultOptions, ...initialOptions, @@ -172,7 +178,7 @@ export class Throttler { } as const emitChange('throttler-state', { ...finalState, - uuid: this.#uuid, + key: this.key ?? '', }) return finalState }) diff --git a/packages/pacer/src/utils.ts b/packages/pacer/src/utils.ts index 3a510d8e..ceb8b605 100644 --- a/packages/pacer/src/utils.ts +++ b/packages/pacer/src/utils.ts @@ -10,3 +10,18 @@ export function parseFunctionOrValue>( ): T { return isFunction(value) ? value(...args) : value } + +export function createKey(key?: string): string { + if (key) { + return key + } + + if ( + typeof crypto !== 'undefined' && + typeof crypto.randomUUID === 'function' + ) { + return crypto.randomUUID() + } + + return '' +} From c7699df03da96fb43d55dbab459ad69018a2b275 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 18:20:34 +0000 Subject: [PATCH 18/50] ci: apply automated fixes --- docs/reference/classes/asyncbatcher.md | 34 ++++++++----- docs/reference/classes/asyncdebouncer.md | 30 ++++++++---- docs/reference/classes/asyncqueuer.md | 48 +++++++++++-------- docs/reference/classes/asyncratelimiter.md | 30 ++++++++---- docs/reference/classes/asyncthrottler.md | 30 ++++++++---- docs/reference/classes/batcher.md | 32 ++++++++----- docs/reference/classes/debouncer.md | 30 ++++++++---- docs/reference/classes/queuer.md | 44 ++++++++++------- docs/reference/classes/ratelimiter.md | 28 +++++++---- docs/reference/classes/throttler.md | 28 +++++++---- docs/reference/functions/asyncbatch.md | 2 +- docs/reference/functions/asyncdebounce.md | 2 +- docs/reference/functions/asyncqueue.md | 2 +- docs/reference/functions/asyncratelimit.md | 2 +- docs/reference/functions/asyncthrottle.md | 2 +- docs/reference/functions/batch.md | 2 +- docs/reference/functions/createkey.md | 24 ++++++++++ docs/reference/functions/debounce.md | 2 +- docs/reference/functions/queue.md | 2 +- docs/reference/functions/ratelimit.md | 2 +- docs/reference/functions/throttle.md | 2 +- docs/reference/index.md | 1 + .../interfaces/asyncbatcheroptions.md | 29 +++++++---- .../interfaces/asyncdebounceroptions.md | 27 ++++++++--- .../interfaces/asyncqueueroptions.md | 47 +++++++++++------- .../interfaces/asyncratelimiteroptions.md | 29 +++++++---- .../interfaces/asyncthrottleroptions.md | 27 ++++++++--- docs/reference/interfaces/batcheroptions.md | 23 +++++++-- docs/reference/interfaces/debounceroptions.md | 23 +++++++-- docs/reference/interfaces/queueroptions.md | 39 ++++++++++----- .../interfaces/ratelimiteroptions.md | 23 +++++++-- docs/reference/interfaces/throttleroptions.md | 21 ++++++-- docs/reference/type-aliases/queueposition.md | 2 +- 33 files changed, 462 insertions(+), 207 deletions(-) create mode 100644 docs/reference/functions/createkey.md diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index 43e39bab..4b48729f 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -7,7 +7,7 @@ title: AsyncBatcher # Class: AsyncBatcher\ -Defined in: [async-batcher.ts:220](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L220) +Defined in: [async-batcher.ts:230](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L230) A class that collects items and processes them in batches asynchronously. @@ -82,7 +82,7 @@ batcher.addItem(2); new AsyncBatcher(fn, initialOptions): AsyncBatcher ``` -Defined in: [async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L227) +Defined in: [async-batcher.ts:238](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L238) #### Parameters @@ -106,7 +106,7 @@ Defined in: [async-batcher.ts:227](https://github.com/TanStack/pacer/blob/main/p fn: (items) => Promise; ``` -Defined in: [async-batcher.ts:228](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L228) +Defined in: [async-batcher.ts:239](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L239) #### Parameters @@ -120,13 +120,23 @@ Defined in: [async-batcher.ts:228](https://github.com/TanStack/pacer/blob/main/p *** +### key + +```ts +key: string; +``` + +Defined in: [async-batcher.ts:234](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L234) + +*** + ### options ```ts options: AsyncBatcherOptionsWithOptionalCallbacks; ``` -Defined in: [async-batcher.ts:224](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L224) +Defined in: [async-batcher.ts:235](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L235) *** @@ -136,7 +146,7 @@ Defined in: [async-batcher.ts:224](https://github.com/TanStack/pacer/blob/main/p readonly store: Store>>; ``` -Defined in: [async-batcher.ts:221](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L221) +Defined in: [async-batcher.ts:231](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L231) ## Methods @@ -146,7 +156,7 @@ Defined in: [async-batcher.ts:221](https://github.com/TanStack/pacer/blob/main/p addItem(item): void ``` -Defined in: [async-batcher.ts:284](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L284) +Defined in: [async-batcher.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L295) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -169,7 +179,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [async-batcher.ts:385](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L385) +Defined in: [async-batcher.ts:396](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L396) Removes all items from the async batcher @@ -185,7 +195,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [async-batcher.ts:359](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L359) +Defined in: [async-batcher.ts:370](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L370) Processes the current batch of items immediately @@ -201,7 +211,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [async-batcher.ts:367](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L367) +Defined in: [async-batcher.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L378) Returns a copy of all items in the async batcher @@ -217,7 +227,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [async-batcher.ts:371](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L371) +Defined in: [async-batcher.ts:382](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L382) #### Returns @@ -231,7 +241,7 @@ Defined in: [async-batcher.ts:371](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:392](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L392) +Defined in: [async-batcher.ts:403](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L403) Resets the async batcher state to its default values @@ -247,7 +257,7 @@ Resets the async batcher state to its default values setOptions(newOptions): void ``` -Defined in: [async-batcher.ts:243](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L243) +Defined in: [async-batcher.ts:254](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L254) Updates the async batcher options diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index 6f8666b4..8f02da69 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -7,7 +7,7 @@ title: AsyncDebouncer # Class: AsyncDebouncer\ -Defined in: [async-debouncer.ts:178](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L178) +Defined in: [async-debouncer.ts:183](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L183) A class that creates an async debounced function. @@ -66,7 +66,7 @@ const results = await asyncDebouncer.maybeExecute(inputElement.value); new AsyncDebouncer(fn, initialOptions): AsyncDebouncer ``` -Defined in: [async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L189) +Defined in: [async-debouncer.ts:195](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L195) #### Parameters @@ -90,7 +90,17 @@ Defined in: [async-debouncer.ts:189](https://github.com/TanStack/pacer/blob/main fn: TFn; ``` -Defined in: [async-debouncer.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L190) +Defined in: [async-debouncer.ts:196](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L196) + +*** + +### key + +```ts +key: string; +``` + +Defined in: [async-debouncer.ts:187](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L187) *** @@ -100,7 +110,7 @@ Defined in: [async-debouncer.ts:190](https://github.com/TanStack/pacer/blob/main options: AsyncDebouncerOptions; ``` -Defined in: [async-debouncer.ts:182](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L182) +Defined in: [async-debouncer.ts:188](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L188) *** @@ -110,7 +120,7 @@ Defined in: [async-debouncer.ts:182](https://github.com/TanStack/pacer/blob/main readonly store: Store>>; ``` -Defined in: [async-debouncer.ts:179](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L179) +Defined in: [async-debouncer.ts:184](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L184) ## Methods @@ -120,7 +130,7 @@ Defined in: [async-debouncer.ts:179](https://github.com/TanStack/pacer/blob/main cancel(): void ``` -Defined in: [async-debouncer.ts:394](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L394) +Defined in: [async-debouncer.ts:400](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L400) Cancels any pending execution or aborts any execution in progress @@ -136,7 +146,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-debouncer.ts:346](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L346) +Defined in: [async-debouncer.ts:352](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L352) Processes the current pending execution immediately @@ -152,7 +162,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-debouncer.ts:269](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L269) +Defined in: [async-debouncer.ts:275](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L275) Attempts to execute the debounced function. If a call is already in progress, it will be queued. @@ -188,7 +198,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [async-debouncer.ts:403](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L403) +Defined in: [async-debouncer.ts:409](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L409) Resets the debouncer state to its default values @@ -204,7 +214,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-debouncer.ts:205](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L205) +Defined in: [async-debouncer.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L211) Updates the async debouncer options diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index 8a95ac82..b09e92ac 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -7,7 +7,7 @@ title: AsyncQueuer # Class: AsyncQueuer\ -Defined in: [async-queuer.ts:260](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L260) +Defined in: [async-queuer.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L266) A flexible asynchronous queue for processing tasks with configurable concurrency, priority, and expiration. @@ -71,7 +71,7 @@ asyncQueuer.start(); new AsyncQueuer(fn, initialOptions): AsyncQueuer ``` -Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L267) +Defined in: [async-queuer.ts:274](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L274) #### Parameters @@ -95,7 +95,7 @@ Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/pa fn: (item) => Promise; ``` -Defined in: [async-queuer.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L268) +Defined in: [async-queuer.ts:275](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L275) #### Parameters @@ -109,13 +109,23 @@ Defined in: [async-queuer.ts:268](https://github.com/TanStack/pacer/blob/main/pa *** +### key + +```ts +key: string; +``` + +Defined in: [async-queuer.ts:270](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L270) + +*** + ### options ```ts options: AsyncQueuerOptions; ``` -Defined in: [async-queuer.ts:264](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L264) +Defined in: [async-queuer.ts:271](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L271) *** @@ -125,7 +135,7 @@ Defined in: [async-queuer.ts:264](https://github.com/TanStack/pacer/blob/main/pa readonly store: Store>>; ``` -Defined in: [async-queuer.ts:261](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L261) +Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L267) ## Methods @@ -138,7 +148,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [async-queuer.ts:406](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L406) +Defined in: [async-queuer.ts:413](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L413) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -176,7 +186,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [async-queuer.ts:710](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L710) +Defined in: [async-queuer.ts:717](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L717) Removes all pending items from the queue. Does not affect active tasks. @@ -192,7 +202,7 @@ Removes all pending items from the queue. Does not affect active tasks. execute(position?): Promise ``` -Defined in: [async-queuer.ts:532](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L532) +Defined in: [async-queuer.ts:539](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L539) Removes and returns the next item from the queue and executes the task function with it. @@ -222,7 +232,7 @@ queuer.execute('back'); flush(numberOfItems, position?): Promise ``` -Defined in: [async-queuer.ts:567](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L567) +Defined in: [async-queuer.ts:574](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L574) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -249,7 +259,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): Promise ``` -Defined in: [async-queuer.ts:581](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L581) +Defined in: [async-queuer.ts:588](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L588) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -272,7 +282,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:485](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L485) +Defined in: [async-queuer.ts:492](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L492) Removes and returns the next item from the queue without executing the task function. Use for manual queue management. Normally, use execute() to process items. @@ -304,7 +314,7 @@ queuer.getNextItem('back'); peekActiveItems(): TValue[] ``` -Defined in: [async-queuer.ts:673](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L673) +Defined in: [async-queuer.ts:680](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L680) Returns the items currently being processed (active tasks). @@ -320,7 +330,7 @@ Returns the items currently being processed (active tasks). peekAllItems(): TValue[] ``` -Defined in: [async-queuer.ts:666](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L666) +Defined in: [async-queuer.ts:673](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L673) Returns a copy of all items in the queue, including active and pending items. @@ -336,7 +346,7 @@ Returns a copy of all items in the queue, including active and pending items. peekNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:656](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L656) +Defined in: [async-queuer.ts:663](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L663) Returns the next item in the queue without removing it. @@ -365,7 +375,7 @@ queuer.peekNextItem('back'); // back peekPendingItems(): TValue[] ``` -Defined in: [async-queuer.ts:680](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L680) +Defined in: [async-queuer.ts:687](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L687) Returns the items waiting to be processed (pending tasks). @@ -381,7 +391,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [async-queuer.ts:718](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L718) +Defined in: [async-queuer.ts:725](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L725) Resets the queuer state to its default values @@ -397,7 +407,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [async-queuer.ts:300](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L300) +Defined in: [async-queuer.ts:307](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L307) Updates the queuer options. New options are merged with existing options. @@ -419,7 +429,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [async-queuer.ts:687](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L687) +Defined in: [async-queuer.ts:694](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L694) Starts processing items in the queue. If already running, does nothing. @@ -435,7 +445,7 @@ Starts processing items in the queue. If already running, does nothing. stop(): void ``` -Defined in: [async-queuer.ts:697](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L697) +Defined in: [async-queuer.ts:704](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L704) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index 34cabbe1..25fb0833 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -7,7 +7,7 @@ title: AsyncRateLimiter # Class: AsyncRateLimiter\ -Defined in: [async-rate-limiter.ts:206](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L206) +Defined in: [async-rate-limiter.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L211) A class that creates an async rate-limited function. @@ -87,7 +87,7 @@ const data = await rateLimiter.maybeExecute('123'); new AsyncRateLimiter(fn, initialOptions): AsyncRateLimiter ``` -Defined in: [async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L213) +Defined in: [async-rate-limiter.ts:219](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L219) #### Parameters @@ -111,7 +111,17 @@ Defined in: [async-rate-limiter.ts:213](https://github.com/TanStack/pacer/blob/m fn: TFn; ``` -Defined in: [async-rate-limiter.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L214) +Defined in: [async-rate-limiter.ts:220](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L220) + +*** + +### key + +```ts +key: string; +``` + +Defined in: [async-rate-limiter.ts:215](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L215) *** @@ -121,7 +131,7 @@ Defined in: [async-rate-limiter.ts:214](https://github.com/TanStack/pacer/blob/m options: AsyncRateLimiterOptions; ``` -Defined in: [async-rate-limiter.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L210) +Defined in: [async-rate-limiter.ts:216](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L216) *** @@ -131,7 +141,7 @@ Defined in: [async-rate-limiter.ts:210](https://github.com/TanStack/pacer/blob/m readonly store: Store>>; ``` -Defined in: [async-rate-limiter.ts:207](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L207) +Defined in: [async-rate-limiter.ts:212](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L212) ## Methods @@ -141,7 +151,7 @@ Defined in: [async-rate-limiter.ts:207](https://github.com/TanStack/pacer/blob/m getMsUntilNextWindow(): number ``` -Defined in: [async-rate-limiter.ts:440](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L440) +Defined in: [async-rate-limiter.ts:446](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L446) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -159,7 +169,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [async-rate-limiter.ts:430](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L430) +Defined in: [async-rate-limiter.ts:436](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L436) Returns the number of remaining executions allowed in the current window @@ -175,7 +185,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [async-rate-limiter.ts:309](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L309) +Defined in: [async-rate-limiter.ts:315](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L315) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -223,7 +233,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [async-rate-limiter.ts:451](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L451) +Defined in: [async-rate-limiter.ts:457](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L457) Resets the rate limiter state @@ -239,7 +249,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [async-rate-limiter.ts:232](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L232) +Defined in: [async-rate-limiter.ts:238](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L238) Updates the async rate limiter options diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index 1a17ad2f..bde56b7a 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -7,7 +7,7 @@ title: AsyncThrottler # Class: AsyncThrottler\ -Defined in: [async-throttler.ts:189](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L189) +Defined in: [async-throttler.ts:194](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L194) A class that creates an async throttled function. @@ -69,7 +69,7 @@ const result = await throttler.maybeExecute(inputElement.value); new AsyncThrottler(fn, initialOptions): AsyncThrottler ``` -Defined in: [async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L200) +Defined in: [async-throttler.ts:206](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L206) #### Parameters @@ -93,7 +93,17 @@ Defined in: [async-throttler.ts:200](https://github.com/TanStack/pacer/blob/main fn: TFn; ``` -Defined in: [async-throttler.ts:201](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L201) +Defined in: [async-throttler.ts:207](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L207) + +*** + +### key + +```ts +key: string; +``` + +Defined in: [async-throttler.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L198) *** @@ -103,7 +113,7 @@ Defined in: [async-throttler.ts:201](https://github.com/TanStack/pacer/blob/main options: AsyncThrottlerOptions; ``` -Defined in: [async-throttler.ts:193](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L193) +Defined in: [async-throttler.ts:199](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L199) *** @@ -113,7 +123,7 @@ Defined in: [async-throttler.ts:193](https://github.com/TanStack/pacer/blob/main readonly store: Store>>; ``` -Defined in: [async-throttler.ts:190](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L190) +Defined in: [async-throttler.ts:195](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L195) ## Methods @@ -123,7 +133,7 @@ Defined in: [async-throttler.ts:190](https://github.com/TanStack/pacer/blob/main cancel(): void ``` -Defined in: [async-throttler.ts:429](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L429) +Defined in: [async-throttler.ts:435](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L435) Cancels any pending execution or aborts any execution in progress @@ -139,7 +149,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-throttler.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L378) +Defined in: [async-throttler.ts:384](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L384) Processes the current pending execution immediately @@ -155,7 +165,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-throttler.ts:288](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L288) +Defined in: [async-throttler.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L294) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -197,7 +207,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [async-throttler.ts:437](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L437) +Defined in: [async-throttler.ts:443](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L443) Resets the debouncer state to its default values @@ -213,7 +223,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-throttler.ts:216](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L216) +Defined in: [async-throttler.ts:222](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L222) Updates the async throttler options diff --git a/docs/reference/classes/batcher.md b/docs/reference/classes/batcher.md index aca76a53..eb2d2192 100644 --- a/docs/reference/classes/batcher.md +++ b/docs/reference/classes/batcher.md @@ -7,7 +7,7 @@ title: Batcher # Class: Batcher\ -Defined in: [batcher.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L139) +Defined in: [batcher.ts:144](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L144) A class that collects items and processes them in batches. @@ -59,7 +59,7 @@ batcher.addItem(2); new Batcher(fn, initialOptions): Batcher ``` -Defined in: [batcher.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L146) +Defined in: [batcher.ts:152](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L152) #### Parameters @@ -83,7 +83,7 @@ Defined in: [batcher.ts:146](https://github.com/TanStack/pacer/blob/main/package fn: (items) => void; ``` -Defined in: [batcher.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L147) +Defined in: [batcher.ts:153](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L153) #### Parameters @@ -97,13 +97,23 @@ Defined in: [batcher.ts:147](https://github.com/TanStack/pacer/blob/main/package *** +### key + +```ts +key: string; +``` + +Defined in: [batcher.ts:148](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L148) + +*** + ### options ```ts options: BatcherOptionsWithOptionalCallbacks; ``` -Defined in: [batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L143) +Defined in: [batcher.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L149) *** @@ -113,7 +123,7 @@ Defined in: [batcher.ts:143](https://github.com/TanStack/pacer/blob/main/package readonly store: Store>>; ``` -Defined in: [batcher.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L140) +Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L145) ## Methods @@ -123,7 +133,7 @@ Defined in: [batcher.ts:140](https://github.com/TanStack/pacer/blob/main/package addItem(item): void ``` -Defined in: [batcher.ts:197](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L197) +Defined in: [batcher.ts:203](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L203) Adds an item to the batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -146,7 +156,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [batcher.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L267) +Defined in: [batcher.ts:273](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L273) Removes all items from the batcher @@ -162,7 +172,7 @@ Removes all items from the batcher flush(): void ``` -Defined in: [batcher.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L245) +Defined in: [batcher.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L251) Processes the current batch of items immediately @@ -178,7 +188,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [batcher.ts:253](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L253) +Defined in: [batcher.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L259) Returns a copy of all items in the batcher @@ -194,7 +204,7 @@ Returns a copy of all items in the batcher reset(): void ``` -Defined in: [batcher.ts:274](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L274) +Defined in: [batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L280) Resets the batcher state to its default values @@ -210,7 +220,7 @@ Resets the batcher state to its default values setOptions(newOptions): void ``` -Defined in: [batcher.ts:161](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L161) +Defined in: [batcher.ts:167](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L167) Updates the batcher options diff --git a/docs/reference/classes/debouncer.md b/docs/reference/classes/debouncer.md index 18bbec02..c9e72648 100644 --- a/docs/reference/classes/debouncer.md +++ b/docs/reference/classes/debouncer.md @@ -7,7 +7,7 @@ title: Debouncer # Class: Debouncer\ -Defined in: [debouncer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L119) +Defined in: [debouncer.ts:124](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L124) A class that creates a debounced function. @@ -52,7 +52,7 @@ inputElement.addEventListener('input', () => { new Debouncer(fn, initialOptions): Debouncer ``` -Defined in: [debouncer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L126) +Defined in: [debouncer.ts:132](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L132) #### Parameters @@ -76,7 +76,17 @@ Defined in: [debouncer.ts:126](https://github.com/TanStack/pacer/blob/main/packa fn: TFn; ``` -Defined in: [debouncer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L127) +Defined in: [debouncer.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L133) + +*** + +### key + +```ts +key: string; +``` + +Defined in: [debouncer.ts:128](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L128) *** @@ -86,7 +96,7 @@ Defined in: [debouncer.ts:127](https://github.com/TanStack/pacer/blob/main/packa options: DebouncerOptions; ``` -Defined in: [debouncer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L123) +Defined in: [debouncer.ts:129](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L129) *** @@ -96,7 +106,7 @@ Defined in: [debouncer.ts:123](https://github.com/TanStack/pacer/blob/main/packa readonly store: Store>>; ``` -Defined in: [debouncer.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L120) +Defined in: [debouncer.ts:125](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L125) ## Methods @@ -106,7 +116,7 @@ Defined in: [debouncer.ts:120](https://github.com/TanStack/pacer/blob/main/packa cancel(): void ``` -Defined in: [debouncer.ts:250](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L250) +Defined in: [debouncer.ts:256](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L256) Cancels any pending execution @@ -122,7 +132,7 @@ Cancels any pending execution flush(): void ``` -Defined in: [debouncer.ts:233](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L233) +Defined in: [debouncer.ts:239](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L239) Processes the current pending execution immediately @@ -138,7 +148,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [debouncer.ts:191](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L191) +Defined in: [debouncer.ts:197](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L197) Attempts to execute the debounced function If a call is already in progress, it will be queued @@ -161,7 +171,7 @@ If a call is already in progress, it will be queued reset(): void ``` -Defined in: [debouncer.ts:261](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L261) +Defined in: [debouncer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L267) Resets the debouncer state to its default values @@ -177,7 +187,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [debouncer.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L141) +Defined in: [debouncer.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L147) Updates the debouncer options diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index 0bfa3727..d91917fa 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -7,7 +7,7 @@ title: Queuer # Class: Queuer\ -Defined in: [queuer.ts:244](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L244) +Defined in: [queuer.ts:250](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L250) A flexible queue that processes items with configurable wait times, expiration, and priority. @@ -92,7 +92,7 @@ manualQueue.getNextItem(); // returns 2, queue is empty new Queuer(fn, initialOptions): Queuer ``` -Defined in: [queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L251) +Defined in: [queuer.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L258) #### Parameters @@ -116,7 +116,7 @@ Defined in: [queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages fn: (item) => void; ``` -Defined in: [queuer.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L252) +Defined in: [queuer.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L259) #### Parameters @@ -130,13 +130,23 @@ Defined in: [queuer.ts:252](https://github.com/TanStack/pacer/blob/main/packages *** +### key + +```ts +key: string; +``` + +Defined in: [queuer.ts:254](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L254) + +*** + ### options ```ts options: QueuerOptions; ``` -Defined in: [queuer.ts:248](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L248) +Defined in: [queuer.ts:255](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L255) *** @@ -146,7 +156,7 @@ Defined in: [queuer.ts:248](https://github.com/TanStack/pacer/blob/main/packages readonly store: Store>>; ``` -Defined in: [queuer.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L245) +Defined in: [queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L251) ## Methods @@ -159,7 +169,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [queuer.ts:370](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L370) +Defined in: [queuer.ts:377](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L377) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -198,7 +208,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [queuer.ts:643](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L643) +Defined in: [queuer.ts:650](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L650) Removes all pending items from the queue. Does not affect items being processed. @@ -214,7 +224,7 @@ Removes all pending items from the queue. Does not affect items being processed. execute(position?): undefined | TValue ``` -Defined in: [queuer.ts:497](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L497) +Defined in: [queuer.ts:504](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L504) Removes and returns the next item from the queue and processes it using the provided function. @@ -243,7 +253,7 @@ queuer.execute('back'); flush(numberOfItems, position?): void ``` -Defined in: [queuer.ts:513](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L513) +Defined in: [queuer.ts:520](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L520) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -270,7 +280,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [queuer.ts:528](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L528) +Defined in: [queuer.ts:535](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L535) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -293,7 +303,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:450](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L450) +Defined in: [queuer.ts:457](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L457) Removes and returns the next item from the queue without executing the function. Use for manual queue management. Normally, use execute() to process items. @@ -324,7 +334,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [queuer.ts:611](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L611) +Defined in: [queuer.ts:618](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L618) Returns a copy of all items in the queue. @@ -340,7 +350,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:601](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L601) +Defined in: [queuer.ts:608](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L608) Returns the next item in the queue without removing it. @@ -368,7 +378,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [queuer.ts:651](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L651) +Defined in: [queuer.ts:658](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L658) Resets the queuer state to its default values @@ -384,7 +394,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [queuer.ts:283](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L283) +Defined in: [queuer.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L290) Updates the queuer options. New options are merged with existing options. @@ -406,7 +416,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [queuer.ts:618](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L618) +Defined in: [queuer.ts:625](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L625) Starts processing items in the queue. If already isRunning, does nothing. @@ -422,7 +432,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [queuer.ts:628](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L628) +Defined in: [queuer.ts:635](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L635) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/ratelimiter.md b/docs/reference/classes/ratelimiter.md index 5ef754c7..7978bff2 100644 --- a/docs/reference/classes/ratelimiter.md +++ b/docs/reference/classes/ratelimiter.md @@ -7,7 +7,7 @@ title: RateLimiter # Class: RateLimiter\ -Defined in: [rate-limiter.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L133) +Defined in: [rate-limiter.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L138) A class that creates a rate-limited function. @@ -65,7 +65,7 @@ rateLimiter.maybeExecute('123'); new RateLimiter(fn, initialOptions): RateLimiter ``` -Defined in: [rate-limiter.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L140) +Defined in: [rate-limiter.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L145) #### Parameters @@ -89,6 +89,16 @@ Defined in: [rate-limiter.ts:140](https://github.com/TanStack/pacer/blob/main/pa fn: TFn; ``` +Defined in: [rate-limiter.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L146) + +*** + +### key + +```ts +key: string; +``` + Defined in: [rate-limiter.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L141) *** @@ -99,7 +109,7 @@ Defined in: [rate-limiter.ts:141](https://github.com/TanStack/pacer/blob/main/pa options: RateLimiterOptions; ``` -Defined in: [rate-limiter.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L136) +Defined in: [rate-limiter.ts:142](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L142) *** @@ -109,7 +119,7 @@ Defined in: [rate-limiter.ts:136](https://github.com/TanStack/pacer/blob/main/pa readonly store: Store>; ``` -Defined in: [rate-limiter.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L134) +Defined in: [rate-limiter.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L139) ## Methods @@ -119,7 +129,7 @@ Defined in: [rate-limiter.ts:134](https://github.com/TanStack/pacer/blob/main/pa getMsUntilNextWindow(): number ``` -Defined in: [rate-limiter.ts:325](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L325) +Defined in: [rate-limiter.ts:330](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L330) Returns the number of milliseconds until the next execution will be possible @@ -135,7 +145,7 @@ Returns the number of milliseconds until the next execution will be possible getRemainingInWindow(): number ``` -Defined in: [rate-limiter.ts:317](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L317) +Defined in: [rate-limiter.ts:322](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L322) Returns the number of remaining executions allowed in the current window @@ -151,7 +161,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): boolean ``` -Defined in: [rate-limiter.ts:223](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L223) +Defined in: [rate-limiter.ts:228](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L228) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -186,7 +196,7 @@ rateLimiter.maybeExecute('arg1', 'arg2'); // false reset(): void ``` -Defined in: [rate-limiter.ts:336](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L336) +Defined in: [rate-limiter.ts:341](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L341) Resets the rate limiter state @@ -202,7 +212,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [rate-limiter.ts:158](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L158) +Defined in: [rate-limiter.ts:163](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L163) Updates the rate limiter options diff --git a/docs/reference/classes/throttler.md b/docs/reference/classes/throttler.md index 819a0872..c14faaab 100644 --- a/docs/reference/classes/throttler.md +++ b/docs/reference/classes/throttler.md @@ -7,7 +7,7 @@ title: Throttler # Class: Throttler\ -Defined in: [throttler.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L127) +Defined in: [throttler.ts:132](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L132) A class that creates a throttled function. @@ -56,7 +56,7 @@ throttler.maybeExecute('123'); // Throttled new Throttler(fn, initialOptions): Throttler ``` -Defined in: [throttler.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L135) +Defined in: [throttler.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L140) #### Parameters @@ -80,6 +80,16 @@ Defined in: [throttler.ts:135](https://github.com/TanStack/pacer/blob/main/packa fn: TFn; ``` +Defined in: [throttler.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L141) + +*** + +### key + +```ts +key: undefined | string; +``` + Defined in: [throttler.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L136) *** @@ -90,7 +100,7 @@ Defined in: [throttler.ts:136](https://github.com/TanStack/pacer/blob/main/packa options: ThrottlerOptions; ``` -Defined in: [throttler.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L131) +Defined in: [throttler.ts:137](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L137) *** @@ -100,7 +110,7 @@ Defined in: [throttler.ts:131](https://github.com/TanStack/pacer/blob/main/packa readonly store: Store>>; ``` -Defined in: [throttler.ts:128](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L128) +Defined in: [throttler.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L133) ## Methods @@ -110,7 +120,7 @@ Defined in: [throttler.ts:128](https://github.com/TanStack/pacer/blob/main/packa cancel(): void ``` -Defined in: [throttler.ts:288](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L288) +Defined in: [throttler.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L294) Cancels any pending trailing execution and clears internal state. @@ -132,7 +142,7 @@ Has no effect if there is no pending execution. flush(): void ``` -Defined in: [throttler.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L266) +Defined in: [throttler.ts:272](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L272) Processes the current pending execution immediately @@ -148,7 +158,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [throttler.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L211) +Defined in: [throttler.ts:217](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L217) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -190,7 +200,7 @@ throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [throttler.ts:299](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L299) +Defined in: [throttler.ts:305](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L305) Resets the throttler state to its default values @@ -206,7 +216,7 @@ Resets the throttler state to its default values setOptions(newOptions): void ``` -Defined in: [throttler.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L149) +Defined in: [throttler.ts:155](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L155) Updates the throttler options diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index 058fa991..2652703f 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,7 +11,7 @@ title: asyncBatch function asyncBatch(fn, options): (item) => void ``` -Defined in: [async-batcher.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L447) +Defined in: [async-batcher.ts:458](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L458) Creates an async batcher that processes items in batches diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index b7ad9237..b77db41f 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,7 +11,7 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-debouncer.ts:452](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L452) +Defined in: [async-debouncer.ts:458](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L458) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index 2e3da553..ed0e47d2 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,7 +11,7 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [async-queuer.ts:757](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L757) +Defined in: [async-queuer.ts:764](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L764) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index d0db7b3b..752c47c4 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,7 +11,7 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-rate-limiter.ts:522](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L522) +Defined in: [async-rate-limiter.ts:528](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L528) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index 97f76c2b..e228b36f 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,7 +11,7 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-throttler.ts:485](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L485) +Defined in: [async-throttler.ts:491](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L491) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md index 9342bf72..26b75d6d 100644 --- a/docs/reference/functions/batch.md +++ b/docs/reference/functions/batch.md @@ -11,7 +11,7 @@ title: batch function batch(fn, options): (item) => void ``` -Defined in: [batcher.ts:298](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L298) +Defined in: [batcher.ts:304](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L304) Creates a batcher that processes items in batches diff --git a/docs/reference/functions/createkey.md b/docs/reference/functions/createkey.md new file mode 100644 index 00000000..820b3709 --- /dev/null +++ b/docs/reference/functions/createkey.md @@ -0,0 +1,24 @@ +--- +id: createKey +title: createKey +--- + + + +# Function: createKey() + +```ts +function createKey(key?): string +``` + +Defined in: [utils.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/utils.ts#L14) + +## Parameters + +### key? + +`string` + +## Returns + +`string` diff --git a/docs/reference/functions/debounce.md b/docs/reference/functions/debounce.md index da4e2ecf..e1c8a667 100644 --- a/docs/reference/functions/debounce.md +++ b/docs/reference/functions/debounce.md @@ -11,7 +11,7 @@ title: debounce function debounce(fn, initialOptions): (...args) => void ``` -Defined in: [debouncer.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L294) +Defined in: [debouncer.ts:300](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L300) Creates a debounced function that delays invoking the provided function until after a specified wait time. Multiple calls during the wait period will cancel previous pending invocations and reset the timer. diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index 61dbc854..39c142a2 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -11,7 +11,7 @@ title: queue function queue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [queuer.ts:694](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L694) +Defined in: [queuer.ts:701](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L701) Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. diff --git a/docs/reference/functions/ratelimit.md b/docs/reference/functions/ratelimit.md index 778862a2..fa1b658e 100644 --- a/docs/reference/functions/ratelimit.md +++ b/docs/reference/functions/ratelimit.md @@ -11,7 +11,7 @@ title: rateLimit function rateLimit(fn, initialOptions): (...args) => boolean ``` -Defined in: [rate-limiter.ts:388](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L388) +Defined in: [rate-limiter.ts:393](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L393) Creates a rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/throttle.md b/docs/reference/functions/throttle.md index 739ae5c2..bad5a296 100644 --- a/docs/reference/functions/throttle.md +++ b/docs/reference/functions/throttle.md @@ -11,7 +11,7 @@ title: throttle function throttle(fn, initialOptions): (...args) => void ``` -Defined in: [throttler.ts:338](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L338) +Defined in: [throttler.ts:344](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L344) Creates a throttled function that limits how often the provided function can execute. diff --git a/docs/reference/index.md b/docs/reference/index.md index a27297a2..a4f594d0 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -63,6 +63,7 @@ title: "@tanstack/pacer" - [asyncRateLimit](../functions/asyncratelimit.md) - [asyncThrottle](../functions/asyncthrottle.md) - [batch](../functions/batch.md) +- [createKey](../functions/createkey.md) - [debounce](../functions/debounce.md) - [isFunction](../functions/isfunction.md) - [parseFunctionOrValue](../functions/parsefunctionorvalue.md) diff --git a/docs/reference/interfaces/asyncbatcheroptions.md b/docs/reference/interfaces/asyncbatcheroptions.md index e2d5495e..d8e06dae 100644 --- a/docs/reference/interfaces/asyncbatcheroptions.md +++ b/docs/reference/interfaces/asyncbatcheroptions.md @@ -56,13 +56,26 @@ Initial state for the async batcher *** +### key? + +```ts +optional key: string; +``` + +Defined in: [async-batcher.ts:99](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L99) + +Optional key to identify this async batcher instance. +If provided, the async batcher will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### maxSize? ```ts optional maxSize: number; ``` -Defined in: [async-batcher.ts:99](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L99) +Defined in: [async-batcher.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L104) Maximum number of items in a batch @@ -80,7 +93,7 @@ Infinity optional onError: (error, batch, batcher) => void; ``` -Defined in: [async-batcher.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L105) +Defined in: [async-batcher.ts:110](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L110) Optional error handler for when the batch function throws. If provided, the handler will be called with the error, the batch of items that failed, and batcher instance. @@ -112,7 +125,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onItemsChange: (batcher) => void; ``` -Defined in: [async-batcher.ts:113](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L113) +Defined in: [async-batcher.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L118) Callback fired after items are added to the batcher @@ -134,7 +147,7 @@ Callback fired after items are added to the batcher optional onSettled: (batch, batcher) => void; ``` -Defined in: [async-batcher.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L117) +Defined in: [async-batcher.ts:122](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L122) Optional callback to call when a batch is settled (completed or failed) @@ -160,7 +173,7 @@ Optional callback to call when a batch is settled (completed or failed) optional onSuccess: (result, batch, batcher) => void; ``` -Defined in: [async-batcher.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L121) +Defined in: [async-batcher.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L126) Optional callback to call when a batch succeeds @@ -190,7 +203,7 @@ Optional callback to call when a batch succeeds optional started: boolean; ``` -Defined in: [async-batcher.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L130) +Defined in: [async-batcher.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L135) Whether the batcher should start processing immediately @@ -208,7 +221,7 @@ true optional throwOnError: boolean; ``` -Defined in: [async-batcher.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L136) +Defined in: [async-batcher.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L141) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -222,7 +235,7 @@ Can be explicitly set to override these defaults. optional wait: number | (asyncBatcher) => number; ``` -Defined in: [async-batcher.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L143) +Defined in: [async-batcher.ts:148](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L148) Maximum time in milliseconds to wait before processing a batch. If the wait duration has elapsed, the batch will be processed. diff --git a/docs/reference/interfaces/asyncdebounceroptions.md b/docs/reference/interfaces/asyncdebounceroptions.md index 53b27b99..35292154 100644 --- a/docs/reference/interfaces/asyncdebounceroptions.md +++ b/docs/reference/interfaces/asyncdebounceroptions.md @@ -43,13 +43,26 @@ Initial state for the async debouncer *** +### key? + +```ts +optional key: string; +``` + +Defined in: [async-debouncer.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L79) + +Optional key to identify this async debouncer instance. +If provided, the async debouncer will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### leading? ```ts optional leading: boolean; ``` -Defined in: [async-debouncer.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L79) +Defined in: [async-debouncer.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L84) Whether to execute on the leading edge of the timeout. Defaults to false. @@ -62,7 +75,7 @@ Defaults to false. optional onError: (error, args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L85) +Defined in: [async-debouncer.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L90) Optional error handler for when the debounced function throws. If provided, the handler will be called with the error and debouncer instance. @@ -94,7 +107,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onSettled: (args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L93) +Defined in: [async-debouncer.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L98) Optional callback to call when the debounced function is executed @@ -120,7 +133,7 @@ Optional callback to call when the debounced function is executed optional onSuccess: (result, args, debouncer) => void; ``` -Defined in: [async-debouncer.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L97) +Defined in: [async-debouncer.ts:102](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L102) Optional callback to call when the debounced function is executed @@ -150,7 +163,7 @@ Optional callback to call when the debounced function is executed optional throwOnError: boolean; ``` -Defined in: [async-debouncer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L107) +Defined in: [async-debouncer.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L112) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -164,7 +177,7 @@ Can be explicitly set to override these defaults. optional trailing: boolean; ``` -Defined in: [async-debouncer.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L112) +Defined in: [async-debouncer.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L117) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -177,7 +190,7 @@ Defaults to true. wait: number | (debouncer) => number; ``` -Defined in: [async-debouncer.ts:118](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L118) +Defined in: [async-debouncer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L123) Delay in milliseconds to wait after the last call before executing. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncqueueroptions.md b/docs/reference/interfaces/asyncqueueroptions.md index 7685fe32..914247da 100644 --- a/docs/reference/interfaces/asyncqueueroptions.md +++ b/docs/reference/interfaces/asyncqueueroptions.md @@ -39,7 +39,7 @@ Default position to add items to the queuer optional concurrency: number | (queuer) => number; ``` -Defined in: [async-queuer.ts:106](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L106) +Defined in: [async-queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L111) Maximum number of concurrent tasks to process. Can be a number or a function that returns a number. @@ -58,7 +58,7 @@ Can be a number or a function that returns a number. optional expirationDuration: number; ``` -Defined in: [async-queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L111) +Defined in: [async-queuer.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L116) Maximum time in milliseconds that an item can stay in the queue If not provided, items will never expire @@ -71,7 +71,7 @@ If not provided, items will never expire optional getIsExpired: (item, addedAt) => boolean; ``` -Defined in: [async-queuer.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L116) +Defined in: [async-queuer.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L121) Function to determine if an item has expired If provided, this overrides the expirationDuration behavior @@ -98,7 +98,7 @@ If provided, this overrides the expirationDuration behavior optional getItemsFrom: QueuePosition; ``` -Defined in: [async-queuer.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L121) +Defined in: [async-queuer.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L126) Default position to get items from during processing @@ -116,7 +116,7 @@ Default position to get items from during processing optional getPriority: (item) => number; ``` -Defined in: [async-queuer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L127) +Defined in: [async-queuer.ts:132](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L132) Function to determine priority of items in the queuer Higher priority items will be processed first @@ -140,7 +140,7 @@ If not provided, will use static priority values attached to tasks optional initialItems: TValue[]; ``` -Defined in: [async-queuer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L131) +Defined in: [async-queuer.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L136) Initial items to populate the queuer with @@ -152,19 +152,32 @@ Initial items to populate the queuer with optional initialState: Partial>; ``` -Defined in: [async-queuer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L135) +Defined in: [async-queuer.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L140) Initial state for the async queuer *** +### key? + +```ts +optional key: string; +``` + +Defined in: [async-queuer.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L105) + +Optional key to identify this async queuer instance. +If provided, the async queuer will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### maxSize? ```ts optional maxSize: number; ``` -Defined in: [async-queuer.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L139) +Defined in: [async-queuer.ts:144](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L144) Maximum number of items allowed in the queuer @@ -176,7 +189,7 @@ Maximum number of items allowed in the queuer optional onError: (error, item, queuer) => void; ``` -Defined in: [async-queuer.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L145) +Defined in: [async-queuer.ts:150](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L150) Optional error handler for when a task throws. If provided, the handler will be called with the error and queuer instance. @@ -208,7 +221,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onExpire: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L149) +Defined in: [async-queuer.ts:154](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L154) Callback fired whenever an item expires in the queuer @@ -234,7 +247,7 @@ Callback fired whenever an item expires in the queuer optional onItemsChange: (queuer) => void; ``` -Defined in: [async-queuer.ts:153](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L153) +Defined in: [async-queuer.ts:158](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L158) Callback fired whenever an item is added or removed from the queuer @@ -256,7 +269,7 @@ Callback fired whenever an item is added or removed from the queuer optional onReject: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:157](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L157) +Defined in: [async-queuer.ts:162](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L162) Callback fired whenever an item is rejected from being added to the queuer @@ -282,7 +295,7 @@ Callback fired whenever an item is rejected from being added to the queuer optional onSettled: (item, queuer) => void; ``` -Defined in: [async-queuer.ts:161](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L161) +Defined in: [async-queuer.ts:166](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L166) Optional callback to call when a task is settled @@ -308,7 +321,7 @@ Optional callback to call when a task is settled optional onSuccess: (result, item, queuer) => void; ``` -Defined in: [async-queuer.ts:165](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L165) +Defined in: [async-queuer.ts:170](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L170) Optional callback to call when a task succeeds @@ -338,7 +351,7 @@ Optional callback to call when a task succeeds optional started: boolean; ``` -Defined in: [async-queuer.ts:169](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L169) +Defined in: [async-queuer.ts:174](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L174) Whether the queuer should start processing tasks immediately or not. @@ -350,7 +363,7 @@ Whether the queuer should start processing tasks immediately or not. optional throwOnError: boolean; ``` -Defined in: [async-queuer.ts:175](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L175) +Defined in: [async-queuer.ts:180](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L180) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -364,7 +377,7 @@ Can be explicitly set to override these defaults. optional wait: number | (queuer) => number; ``` -Defined in: [async-queuer.ts:181](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L181) +Defined in: [async-queuer.ts:186](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L186) Time in milliseconds to wait between processing items. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/asyncratelimiteroptions.md b/docs/reference/interfaces/asyncratelimiteroptions.md index 40f9ac9d..f230a751 100644 --- a/docs/reference/interfaces/asyncratelimiteroptions.md +++ b/docs/reference/interfaces/asyncratelimiteroptions.md @@ -43,13 +43,26 @@ Initial state for the rate limiter *** +### key? + +```ts +optional key: string; +``` + +Defined in: [async-rate-limiter.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L79) + +Optional key to identify this async rate limiter instance. +If provided, the async rate limiter will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### limit ```ts limit: number | (rateLimiter) => number; ``` -Defined in: [async-rate-limiter.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L79) +Defined in: [async-rate-limiter.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L84) Maximum number of executions allowed within the time window. Can be a number or a function that returns a number. @@ -62,7 +75,7 @@ Can be a number or a function that returns a number. optional onError: (error, args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:85](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L85) +Defined in: [async-rate-limiter.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L90) Optional error handler for when the rate-limited function throws. If provided, the handler will be called with the error and rate limiter instance. @@ -94,7 +107,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onReject: (args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L93) +Defined in: [async-rate-limiter.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L98) Optional callback function that is called when an execution is rejected due to rate limiting @@ -120,7 +133,7 @@ Optional callback function that is called when an execution is rejected due to r optional onSettled: (args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L97) +Defined in: [async-rate-limiter.ts:102](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L102) Optional function to call when the rate-limited function is executed @@ -146,7 +159,7 @@ Optional function to call when the rate-limited function is executed optional onSuccess: (result, args, rateLimiter) => void; ``` -Defined in: [async-rate-limiter.ts:104](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L104) +Defined in: [async-rate-limiter.ts:109](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L109) Optional function to call when the rate-limited function is executed @@ -176,7 +189,7 @@ Optional function to call when the rate-limited function is executed optional throwOnError: boolean; ``` -Defined in: [async-rate-limiter.ts:114](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L114) +Defined in: [async-rate-limiter.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L119) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -190,7 +203,7 @@ Can be explicitly set to override these defaults. window: number | (rateLimiter) => number; ``` -Defined in: [async-rate-limiter.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L119) +Defined in: [async-rate-limiter.ts:124](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L124) Time window in milliseconds within which the limit applies. Can be a number or a function that returns a number. @@ -203,7 +216,7 @@ Can be a number or a function that returns a number. optional windowType: "fixed" | "sliding"; ``` -Defined in: [async-rate-limiter.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L126) +Defined in: [async-rate-limiter.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L131) Type of window to use for rate limiting - 'fixed': Uses a fixed window that resets after the window period diff --git a/docs/reference/interfaces/asyncthrottleroptions.md b/docs/reference/interfaces/asyncthrottleroptions.md index 277be425..521c010e 100644 --- a/docs/reference/interfaces/asyncthrottleroptions.md +++ b/docs/reference/interfaces/asyncthrottleroptions.md @@ -43,13 +43,26 @@ Initial state for the async throttler *** +### key? + +```ts +optional key: string; +``` + +Defined in: [async-throttler.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L84) + +Optional key to identify this async throttler instance. +If provided, the async throttler will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### leading? ```ts optional leading: boolean; ``` -Defined in: [async-throttler.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L84) +Defined in: [async-throttler.ts:89](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L89) Whether to execute the function immediately when called Defaults to true @@ -62,7 +75,7 @@ Defaults to true optional onError: (error, args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:90](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L90) +Defined in: [async-throttler.ts:95](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L95) Optional error handler for when the throttled function throws. If provided, the handler will be called with the error and throttler instance. @@ -94,7 +107,7 @@ This can be used alongside throwOnError - the handler will be called before any optional onSettled: (args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L98) +Defined in: [async-throttler.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L103) Optional function to call when the throttled function is executed @@ -120,7 +133,7 @@ Optional function to call when the throttled function is executed optional onSuccess: (result, args, asyncThrottler) => void; ``` -Defined in: [async-throttler.ts:105](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L105) +Defined in: [async-throttler.ts:110](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L110) Optional function to call when the throttled function is executed @@ -150,7 +163,7 @@ Optional function to call when the throttled function is executed optional throwOnError: boolean; ``` -Defined in: [async-throttler.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L115) +Defined in: [async-throttler.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L120) Whether to throw errors when they occur. Defaults to true if no onError handler is provided, false if an onError handler is provided. @@ -164,7 +177,7 @@ Can be explicitly set to override these defaults. optional trailing: boolean; ``` -Defined in: [async-throttler.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L120) +Defined in: [async-throttler.ts:125](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L125) Whether to execute the function on the trailing edge of the wait period Defaults to true @@ -177,7 +190,7 @@ Defaults to true wait: number | (throttler) => number; ``` -Defined in: [async-throttler.ts:126](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L126) +Defined in: [async-throttler.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L131) Time window in milliseconds during which the function can only be executed once. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/batcheroptions.md b/docs/reference/interfaces/batcheroptions.md index 2c44ec3d..d5bbec1e 100644 --- a/docs/reference/interfaces/batcheroptions.md +++ b/docs/reference/interfaces/batcheroptions.md @@ -56,13 +56,26 @@ Initial state for the batcher *** +### key? + +```ts +optional key: string; +``` + +Defined in: [batcher.ts:66](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L66) + +Optional key to identify this batcher instance. +If provided, the batcher will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### maxSize? ```ts optional maxSize: number; ``` -Defined in: [batcher.ts:66](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L66) +Defined in: [batcher.ts:71](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L71) Maximum number of items in a batch @@ -80,7 +93,7 @@ Infinity optional onExecute: (batch, batcher) => void; ``` -Defined in: [batcher.ts:70](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L70) +Defined in: [batcher.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L75) Callback fired after a batch is processed @@ -106,7 +119,7 @@ Callback fired after a batch is processed optional onItemsChange: (batcher) => void; ``` -Defined in: [batcher.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L74) +Defined in: [batcher.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L79) Callback fired after items are added to the batcher @@ -128,7 +141,7 @@ Callback fired after items are added to the batcher optional started: boolean; ``` -Defined in: [batcher.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L79) +Defined in: [batcher.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L84) Whether the batcher should start processing immediately @@ -146,7 +159,7 @@ true optional wait: number | (batcher) => number; ``` -Defined in: [batcher.ts:86](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L86) +Defined in: [batcher.ts:91](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L91) Maximum time in milliseconds to wait before processing a batch. If the wait duration has elapsed, the batch will be processed. diff --git a/docs/reference/interfaces/debounceroptions.md b/docs/reference/interfaces/debounceroptions.md index 9910cddd..95b8219b 100644 --- a/docs/reference/interfaces/debounceroptions.md +++ b/docs/reference/interfaces/debounceroptions.md @@ -37,19 +37,32 @@ Defaults to true. optional initialState: Partial>; ``` -Defined in: [debouncer.ts:54](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L54) +Defined in: [debouncer.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L59) Initial state for the debouncer *** +### key? + +```ts +optional key: string; +``` + +Defined in: [debouncer.ts:55](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L55) + +A key to identify the debouncer. +If provided, the debouncer will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### leading? ```ts optional leading: boolean; ``` -Defined in: [debouncer.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L60) +Defined in: [debouncer.ts:65](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L65) Whether to execute on the leading edge of the timeout. The first call will execute immediately and the rest will wait the delay. @@ -63,7 +76,7 @@ Defaults to false. optional onExecute: (args, debouncer) => void; ``` -Defined in: [debouncer.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L64) +Defined in: [debouncer.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L69) Callback function that is called after the function is executed @@ -89,7 +102,7 @@ Callback function that is called after the function is executed optional trailing: boolean; ``` -Defined in: [debouncer.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L69) +Defined in: [debouncer.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L74) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -102,7 +115,7 @@ Defaults to true. wait: number | (debouncer) => number; ``` -Defined in: [debouncer.ts:75](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L75) +Defined in: [debouncer.ts:80](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L80) Delay in milliseconds before executing the function. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/queueroptions.md b/docs/reference/interfaces/queueroptions.md index 70d3cbee..5425f916 100644 --- a/docs/reference/interfaces/queueroptions.md +++ b/docs/reference/interfaces/queueroptions.md @@ -43,7 +43,7 @@ Default position to add items to the queuer optional expirationDuration: number; ``` -Defined in: [queuer.ts:88](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L88) +Defined in: [queuer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L93) Maximum time in milliseconds that an item can stay in the queue If not provided, items will never expire @@ -56,7 +56,7 @@ If not provided, items will never expire optional getIsExpired: (item, addedAt) => boolean; ``` -Defined in: [queuer.ts:93](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L93) +Defined in: [queuer.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L98) Function to determine if an item has expired If provided, this overrides the expirationDuration behavior @@ -83,7 +83,7 @@ If provided, this overrides the expirationDuration behavior optional getItemsFrom: QueuePosition; ``` -Defined in: [queuer.ts:98](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L98) +Defined in: [queuer.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L103) Default position to get items from during processing @@ -101,7 +101,7 @@ Default position to get items from during processing optional getPriority: (item) => number; ``` -Defined in: [queuer.ts:103](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L103) +Defined in: [queuer.ts:108](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L108) Function to determine priority of items in the queuer Higher priority items will be processed first @@ -124,7 +124,7 @@ Higher priority items will be processed first optional initialItems: TValue[]; ``` -Defined in: [queuer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L107) +Defined in: [queuer.ts:112](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L112) Initial items to populate the queuer with @@ -136,19 +136,32 @@ Initial items to populate the queuer with optional initialState: Partial>; ``` -Defined in: [queuer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L111) +Defined in: [queuer.ts:116](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L116) Initial state for the queuer *** +### key? + +```ts +optional key: string; +``` + +Defined in: [queuer.ts:88](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L88) + +Optional key to identify this queuer instance. +If provided, the queuer will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### maxSize? ```ts optional maxSize: number; ``` -Defined in: [queuer.ts:115](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L115) +Defined in: [queuer.ts:120](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L120) Maximum number of items allowed in the queuer @@ -160,7 +173,7 @@ Maximum number of items allowed in the queuer optional onExecute: (item, queuer) => void; ``` -Defined in: [queuer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L119) +Defined in: [queuer.ts:124](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L124) Callback fired whenever an item is removed from the queuer @@ -186,7 +199,7 @@ Callback fired whenever an item is removed from the queuer optional onExpire: (item, queuer) => void; ``` -Defined in: [queuer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L123) +Defined in: [queuer.ts:128](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L128) Callback fired whenever an item expires in the queuer @@ -212,7 +225,7 @@ Callback fired whenever an item expires in the queuer optional onItemsChange: (queuer) => void; ``` -Defined in: [queuer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L127) +Defined in: [queuer.ts:132](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L132) Callback fired whenever an item is added or removed from the queuer @@ -234,7 +247,7 @@ Callback fired whenever an item is added or removed from the queuer optional onReject: (item, queuer) => void; ``` -Defined in: [queuer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L131) +Defined in: [queuer.ts:136](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L136) Callback fired whenever an item is rejected from being added to the queuer @@ -260,7 +273,7 @@ Callback fired whenever an item is rejected from being added to the queuer optional started: boolean; ``` -Defined in: [queuer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L135) +Defined in: [queuer.ts:140](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L140) Whether the queuer should start processing tasks immediately @@ -272,7 +285,7 @@ Whether the queuer should start processing tasks immediately optional wait: number | (queuer) => number; ``` -Defined in: [queuer.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L141) +Defined in: [queuer.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L146) Time in milliseconds to wait between processing items. Can be a number or a function that returns a number. diff --git a/docs/reference/interfaces/ratelimiteroptions.md b/docs/reference/interfaces/ratelimiteroptions.md index 9800f487..ffdc79c3 100644 --- a/docs/reference/interfaces/ratelimiteroptions.md +++ b/docs/reference/interfaces/ratelimiteroptions.md @@ -42,13 +42,26 @@ Initial state for the rate limiter *** +### key? + +```ts +optional key: string; +``` + +Defined in: [rate-limiter.ts:56](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L56) + +Optional key to identify this rate limiter instance. +If provided, the rate limiter will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### limit ```ts limit: number | (rateLimiter) => number; ``` -Defined in: [rate-limiter.ts:56](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L56) +Defined in: [rate-limiter.ts:61](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L61) Maximum number of executions allowed within the time window. Can be a number or a callback function that receives the rate limiter instance and returns a number. @@ -61,7 +74,7 @@ Can be a number or a callback function that receives the rate limiter instance a optional onExecute: (args, rateLimiter) => void; ``` -Defined in: [rate-limiter.ts:60](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L60) +Defined in: [rate-limiter.ts:65](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L65) Callback function that is called after the function is executed @@ -87,7 +100,7 @@ Callback function that is called after the function is executed optional onReject: (rateLimiter) => void; ``` -Defined in: [rate-limiter.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L64) +Defined in: [rate-limiter.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L69) Optional callback function that is called when an execution is rejected due to rate limiting @@ -109,7 +122,7 @@ Optional callback function that is called when an execution is rejected due to r window: number | (rateLimiter) => number; ``` -Defined in: [rate-limiter.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L69) +Defined in: [rate-limiter.ts:74](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L74) Time window in milliseconds within which the limit applies. Can be a number or a callback function that receives the rate limiter instance and returns a number. @@ -122,7 +135,7 @@ Can be a number or a callback function that receives the rate limiter instance a optional windowType: "fixed" | "sliding"; ``` -Defined in: [rate-limiter.ts:76](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L76) +Defined in: [rate-limiter.ts:81](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L81) Type of window to use for rate limiting - 'fixed': Uses a fixed window that resets after the window period diff --git a/docs/reference/interfaces/throttleroptions.md b/docs/reference/interfaces/throttleroptions.md index c4d9c518..6316dd58 100644 --- a/docs/reference/interfaces/throttleroptions.md +++ b/docs/reference/interfaces/throttleroptions.md @@ -43,13 +43,26 @@ Initial state for the throttler *** +### key? + +```ts +optional key: string; +``` + +Defined in: [throttler.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L64) + +A key to identify the throttler. +If provided, the throttler will be identified by this key in the devtools and PacerProvider if applicable. + +*** + ### leading? ```ts optional leading: boolean; ``` -Defined in: [throttler.ts:64](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L64) +Defined in: [throttler.ts:69](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L69) Whether to execute on the leading edge of the timeout. Defaults to true. @@ -62,7 +75,7 @@ Defaults to true. optional onExecute: (args, throttler) => void; ``` -Defined in: [throttler.ts:68](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L68) +Defined in: [throttler.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L73) Callback function that is called after the function is executed @@ -88,7 +101,7 @@ Callback function that is called after the function is executed optional trailing: boolean; ``` -Defined in: [throttler.ts:73](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L73) +Defined in: [throttler.ts:78](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L78) Whether to execute on the trailing edge of the timeout. Defaults to true. @@ -101,7 +114,7 @@ Defaults to true. wait: number | (throttler) => number; ``` -Defined in: [throttler.ts:79](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L79) +Defined in: [throttler.ts:84](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L84) Time window in milliseconds during which the function can only be executed once. Can be a number or a function that returns a number. diff --git a/docs/reference/type-aliases/queueposition.md b/docs/reference/type-aliases/queueposition.md index 4ab6460c..9f3a30bc 100644 --- a/docs/reference/type-aliases/queueposition.md +++ b/docs/reference/type-aliases/queueposition.md @@ -11,7 +11,7 @@ title: QueuePosition type QueuePosition = "front" | "back"; ``` -Defined in: [queuer.ts:170](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L170) +Defined in: [queuer.ts:176](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L176) Position type for addItem and getNextItem operations. From 5df992fa6e78abdfab33bbfd3cd692eb7cbdaaea Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Tue, 12 Aug 2025 20:59:33 -0500 Subject: [PATCH 19/50] rename devtool packages to be consistent with query devtool package names --- examples/react/queue/package.json | 2 +- examples/react/queue/src/index.tsx | 2 +- examples/react/util-comparison/package.json | 2 +- examples/react/util-comparison/src/index.tsx | 2 +- package.json | 4 ++-- .../eslint.config.js | 0 .../package.json | 2 +- .../src/devtools.tsx | 0 .../src/index.ts | 0 .../tests/index.test.ts | 0 .../tests/test-setup.ts | 0 .../tsconfig.docs.json | 0 .../tsconfig.json | 0 .../vite.config.ts | 0 .../eslint.config.js | 0 .../package.json | 2 +- .../src/devtools.tsx | 0 .../src/index.ts | 0 .../tests/index.test.ts | 0 .../tests/test-setup.ts | 0 .../tsconfig.docs.json | 0 .../tsconfig.json | 0 .../vite.config.ts | 0 pnpm-lock.yaml | 12 ++++++------ 24 files changed, 14 insertions(+), 14 deletions(-) rename packages/{pacer-react-devtools => react-pacer-devtools}/eslint.config.js (100%) rename packages/{pacer-react-devtools => react-pacer-devtools}/package.json (97%) rename packages/{pacer-react-devtools => react-pacer-devtools}/src/devtools.tsx (100%) rename packages/{pacer-react-devtools => react-pacer-devtools}/src/index.ts (100%) rename packages/{pacer-react-devtools => react-pacer-devtools}/tests/index.test.ts (100%) rename packages/{pacer-react-devtools => react-pacer-devtools}/tests/test-setup.ts (100%) rename packages/{pacer-react-devtools => react-pacer-devtools}/tsconfig.docs.json (100%) rename packages/{pacer-react-devtools => react-pacer-devtools}/tsconfig.json (100%) rename packages/{pacer-react-devtools => react-pacer-devtools}/vite.config.ts (100%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/eslint.config.js (100%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/package.json (97%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/src/devtools.tsx (100%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/src/index.ts (100%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/tests/index.test.ts (100%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/tests/test-setup.ts (100%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/tsconfig.docs.json (100%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/tsconfig.json (100%) rename packages/{pacer-solid-devtools => solid-pacer-devtools}/vite.config.ts (100%) diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index 7206e62d..8a45b163 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/pacer-react-devtools": "0.14.0", + "@tanstack/react-pacer-devtools": "0.14.0", "@tanstack/react-devtools": "0.2.2", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", diff --git a/examples/react/queue/src/index.tsx b/examples/react/queue/src/index.tsx index d1aace63..419bee91 100644 --- a/examples/react/queue/src/index.tsx +++ b/examples/react/queue/src/index.tsx @@ -1,6 +1,6 @@ import { useCallback, useState } from 'react' import ReactDOM from 'react-dom/client' -import { PacerDevtoolsPanel } from '@tanstack/pacer-react-devtools' +import { PacerDevtoolsPanel } from '@tanstack/react-pacer-devtools' import { TanstackDevtools } from '@tanstack/react-devtools' import { queue } from '@tanstack/react-pacer/queuer' diff --git a/examples/react/util-comparison/package.json b/examples/react/util-comparison/package.json index 480673df..c77f4da8 100644 --- a/examples/react/util-comparison/package.json +++ b/examples/react/util-comparison/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/pacer-react-devtools": "0.14.0", + "@tanstack/react-pacer-devtools": "0.14.0", "@tanstack/react-devtools": "0.2.2", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", diff --git a/examples/react/util-comparison/src/index.tsx b/examples/react/util-comparison/src/index.tsx index ba95270e..a47ef7f0 100644 --- a/examples/react/util-comparison/src/index.tsx +++ b/examples/react/util-comparison/src/index.tsx @@ -5,7 +5,7 @@ import { useThrottler } from '@tanstack/react-pacer/throttler' import { useRateLimiter } from '@tanstack/react-pacer/rate-limiter' import { useQueuer } from '@tanstack/react-pacer/queuer' import { useBatcher } from '@tanstack/react-pacer/batcher' -import { PacerDevtoolsPanel } from '@tanstack/pacer-react-devtools' +import { PacerDevtoolsPanel } from '@tanstack/react-pacer-devtools' import { TanstackDevtools } from '@tanstack/react-devtools' function ComparisonApp() { diff --git a/package.json b/package.json index 9c8e98fc..fd0fa7d4 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@tanstack/react-pacer": "workspace:*", "@tanstack/solid-pacer": "workspace:*", "@tanstack/pacer-devtools": "workspace:*", - "@tanstack/pacer-solid-devtools": "workspace:*", - "@tanstack/pacer-react-devtools": "workspace:*" + "@tanstack/solid-pacer-devtools": "workspace:*", + "@tanstack/react-pacer-devtools": "workspace:*" } } diff --git a/packages/pacer-react-devtools/eslint.config.js b/packages/react-pacer-devtools/eslint.config.js similarity index 100% rename from packages/pacer-react-devtools/eslint.config.js rename to packages/react-pacer-devtools/eslint.config.js diff --git a/packages/pacer-react-devtools/package.json b/packages/react-pacer-devtools/package.json similarity index 97% rename from packages/pacer-react-devtools/package.json rename to packages/react-pacer-devtools/package.json index 5d3e2f62..84bdf953 100644 --- a/packages/pacer-react-devtools/package.json +++ b/packages/react-pacer-devtools/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/pacer-react-devtools", + "name": "@tanstack/react-pacer-devtools", "version": "0.14.0", "description": "React adapter for devtools for Pacer.", "author": "Tanner Linsley", diff --git a/packages/pacer-react-devtools/src/devtools.tsx b/packages/react-pacer-devtools/src/devtools.tsx similarity index 100% rename from packages/pacer-react-devtools/src/devtools.tsx rename to packages/react-pacer-devtools/src/devtools.tsx diff --git a/packages/pacer-react-devtools/src/index.ts b/packages/react-pacer-devtools/src/index.ts similarity index 100% rename from packages/pacer-react-devtools/src/index.ts rename to packages/react-pacer-devtools/src/index.ts diff --git a/packages/pacer-react-devtools/tests/index.test.ts b/packages/react-pacer-devtools/tests/index.test.ts similarity index 100% rename from packages/pacer-react-devtools/tests/index.test.ts rename to packages/react-pacer-devtools/tests/index.test.ts diff --git a/packages/pacer-react-devtools/tests/test-setup.ts b/packages/react-pacer-devtools/tests/test-setup.ts similarity index 100% rename from packages/pacer-react-devtools/tests/test-setup.ts rename to packages/react-pacer-devtools/tests/test-setup.ts diff --git a/packages/pacer-react-devtools/tsconfig.docs.json b/packages/react-pacer-devtools/tsconfig.docs.json similarity index 100% rename from packages/pacer-react-devtools/tsconfig.docs.json rename to packages/react-pacer-devtools/tsconfig.docs.json diff --git a/packages/pacer-react-devtools/tsconfig.json b/packages/react-pacer-devtools/tsconfig.json similarity index 100% rename from packages/pacer-react-devtools/tsconfig.json rename to packages/react-pacer-devtools/tsconfig.json diff --git a/packages/pacer-react-devtools/vite.config.ts b/packages/react-pacer-devtools/vite.config.ts similarity index 100% rename from packages/pacer-react-devtools/vite.config.ts rename to packages/react-pacer-devtools/vite.config.ts diff --git a/packages/pacer-solid-devtools/eslint.config.js b/packages/solid-pacer-devtools/eslint.config.js similarity index 100% rename from packages/pacer-solid-devtools/eslint.config.js rename to packages/solid-pacer-devtools/eslint.config.js diff --git a/packages/pacer-solid-devtools/package.json b/packages/solid-pacer-devtools/package.json similarity index 97% rename from packages/pacer-solid-devtools/package.json rename to packages/solid-pacer-devtools/package.json index d36b4058..0e2e1bea 100644 --- a/packages/pacer-solid-devtools/package.json +++ b/packages/solid-pacer-devtools/package.json @@ -1,5 +1,5 @@ { - "name": "@tanstack/pacer-solid-devtools", + "name": "@tanstack/solid-pacer-devtools", "version": "0.14.0", "description": "Solid adapter for devtools for Pacer.", "author": "Tanner Linsley", diff --git a/packages/pacer-solid-devtools/src/devtools.tsx b/packages/solid-pacer-devtools/src/devtools.tsx similarity index 100% rename from packages/pacer-solid-devtools/src/devtools.tsx rename to packages/solid-pacer-devtools/src/devtools.tsx diff --git a/packages/pacer-solid-devtools/src/index.ts b/packages/solid-pacer-devtools/src/index.ts similarity index 100% rename from packages/pacer-solid-devtools/src/index.ts rename to packages/solid-pacer-devtools/src/index.ts diff --git a/packages/pacer-solid-devtools/tests/index.test.ts b/packages/solid-pacer-devtools/tests/index.test.ts similarity index 100% rename from packages/pacer-solid-devtools/tests/index.test.ts rename to packages/solid-pacer-devtools/tests/index.test.ts diff --git a/packages/pacer-solid-devtools/tests/test-setup.ts b/packages/solid-pacer-devtools/tests/test-setup.ts similarity index 100% rename from packages/pacer-solid-devtools/tests/test-setup.ts rename to packages/solid-pacer-devtools/tests/test-setup.ts diff --git a/packages/pacer-solid-devtools/tsconfig.docs.json b/packages/solid-pacer-devtools/tsconfig.docs.json similarity index 100% rename from packages/pacer-solid-devtools/tsconfig.docs.json rename to packages/solid-pacer-devtools/tsconfig.docs.json diff --git a/packages/pacer-solid-devtools/tsconfig.json b/packages/solid-pacer-devtools/tsconfig.json similarity index 100% rename from packages/pacer-solid-devtools/tsconfig.json rename to packages/solid-pacer-devtools/tsconfig.json diff --git a/packages/pacer-solid-devtools/vite.config.ts b/packages/solid-pacer-devtools/vite.config.ts similarity index 100% rename from packages/pacer-solid-devtools/vite.config.ts rename to packages/solid-pacer-devtools/vite.config.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c43ed73e..1a6b6d82 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -240,9 +240,9 @@ importers: specifier: ^19.1.1 version: 19.1.1(react@19.1.1) devDependencies: - '@tanstack/pacer-react-devtools': + '@tanstack/react-pacer-devtools': specifier: 0.14.0 - version: link:../../../packages/pacer-react-devtools + version: link:../../../packages/react-pacer-devtools '@tanstack/react-devtools': specifier: 0.2.2 version: 0.2.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.7) @@ -1132,9 +1132,9 @@ importers: specifier: ^19.1.1 version: 19.1.1(react@19.1.1) devDependencies: - '@tanstack/pacer-react-devtools': + '@tanstack/react-pacer-devtools': specifier: 0.14.0 - version: link:../../../packages/pacer-react-devtools + version: link:../../../packages/react-pacer-devtools '@tanstack/react-devtools': specifier: 0.2.2 version: 0.2.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.7) @@ -1582,7 +1582,7 @@ importers: specifier: ^2.11.8 version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) - packages/pacer-react-devtools: + packages/react-pacer-devtools: dependencies: '@tanstack/pacer-devtools': specifier: workspace:* @@ -1613,7 +1613,7 @@ importers: specifier: ^5.2.0 version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) - packages/pacer-solid-devtools: + packages/solid-pacer-devtools: dependencies: '@tanstack/pacer-devtools': specifier: workspace:* From c145ad1a4926e7d282d68e3919d1669cdea4528b Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Tue, 12 Aug 2025 21:24:14 -0500 Subject: [PATCH 20/50] fix sherif --- examples/react/queue/package.json | 2 +- examples/react/util-comparison/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index 8a45b163..44fc3f25 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -14,8 +14,8 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-pacer-devtools": "0.14.0", "@tanstack/react-devtools": "0.2.2", + "@tanstack/react-pacer-devtools": "0.14.0", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^4.7.0", diff --git a/examples/react/util-comparison/package.json b/examples/react/util-comparison/package.json index c77f4da8..effb0af3 100644 --- a/examples/react/util-comparison/package.json +++ b/examples/react/util-comparison/package.json @@ -14,8 +14,8 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-pacer-devtools": "0.14.0", "@tanstack/react-devtools": "0.2.2", + "@tanstack/react-pacer-devtools": "0.14.0", "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^4.7.0", From 548caf54052752cfae0e2704cf2d14e7c0d7f472 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Wed, 13 Aug 2025 00:17:38 -0500 Subject: [PATCH 21/50] separate left and right panels of devtools --- packages/pacer-devtools/src/devtools.tsx | 161 +++++++++++++----- .../pacer-devtools/src/styles/use-styles.ts | 143 +++++++++++++++- 2 files changed, 255 insertions(+), 49 deletions(-) diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/devtools.tsx index bf2091c4..1eb594f8 100644 --- a/packages/pacer-devtools/src/devtools.tsx +++ b/packages/pacer-devtools/src/devtools.tsx @@ -1,4 +1,4 @@ -import { For } from 'solid-js' +import { For, createSignal } from 'solid-js' import clsx from 'clsx' import { JsonTree } from '@tanstack/devtools-ui' import { usePacerState } from './context/use-context-hooks' @@ -17,61 +17,132 @@ type StateKey = | 'rateLimiterState' | 'throttlerState' -const CONTEXT_SECTIONS: Array<{ key: StateKey; label: string }> = [ - { key: 'asyncBatcherState', label: 'Async Batcher State' }, - { key: 'asyncDebouncerState', label: 'Async Debouncer State' }, - { key: 'asyncQueuerState', label: 'Async Queuer State' }, - { key: 'asyncRateLimiterState', label: 'Async Rate Limiter State' }, - { key: 'asyncThrottlerState', label: 'Async Throttler State' }, - { key: 'batcherState', label: 'Batcher State' }, - { key: 'debouncerState', label: 'Debouncer State' }, - { key: 'queuerState', label: 'Queuer State' }, - { key: 'rateLimiterState', label: 'Rate Limiter State' }, - { key: 'throttlerState', label: 'Throttler State' }, +type UtilGroup = { + key: StateKey + label: string + displayName: string +} + +const UTIL_GROUPS: Array = [ + { key: 'debouncerState', label: 'Debouncers', displayName: 'Debouncer' }, + { key: 'throttlerState', label: 'Throttlers', displayName: 'Throttler' }, + { key: 'batcherState', label: 'Batchers', displayName: 'Batcher' }, + { key: 'queuerState', label: 'Queuers', displayName: 'Queuer' }, + { + key: 'rateLimiterState', + label: 'Rate Limiters', + displayName: 'Rate Limiter', + }, + { + key: 'asyncDebouncerState', + label: 'Async Debouncers', + displayName: 'Async Debouncer', + }, + { + key: 'asyncThrottlerState', + label: 'Async Throttlers', + displayName: 'Async Throttler', + }, + { + key: 'asyncBatcherState', + label: 'Async Batchers', + displayName: 'Async Batcher', + }, + { + key: 'asyncQueuerState', + label: 'Async Queuers', + displayName: 'Async Queuer', + }, + { + key: 'asyncRateLimiterState', + label: 'Async Rate Limiters', + displayName: 'Async Rate Limiter', + }, ] -function Section({ key, label }: { key: StateKey; label: string }) { - const state = usePacerState() +function Shell() { const styles = useStyles() + const state = usePacerState() + const [selectedKey, setSelectedKey] = createSignal(null) - return ( - <> - {state[key].length === 0 ? null : ( -
-
{label}
-
- - {(inst) => } - -
-
- )} - - ) -} + // Find the selected instance + const selectedInstance = () => { + if (!selectedKey()) return null -function Shell() { - const styles = useStyles() + for (const group of UTIL_GROUPS) { + const instance = state[group.key].find( + (inst) => inst.key === selectedKey(), + ) + if (instance) return { ...instance, type: group.displayName } + } + return null + } return (
TanStack Pacer
-
- - {({ key, label }) =>
} - -
-
- ) -} - -function AnimatedInstanceCard(props: { value: any }) { - const styles = useStyles() +
+ {/* Left Panel - Util List */} +
+
Utils
+
+ + {(group) => ( + <> + {state[group.key].length > 0 && ( +
+
{group.label}
+ + {(instance) => ( +
setSelectedKey(instance.key)} + > +
{instance.key}
+
+ {instance.status} +
+
+ )} +
+
+ )} + + )} +
+
+
- return ( -
- + {/* Right Panel - State Details */} +
+
State Details
+
+ {(() => { + const instance = selectedInstance() + return instance !== null ? ( + <> +
+
{instance.type}
+
{instance.key}
+
+
+ +
+ + ) : ( +
+ Select a util from the left panel to view its state +
+ ) + })()} +
+
+
) } diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index 6587a7b9..1e74b5a5 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -13,15 +13,15 @@ const stylesFactory = () => { color: ${colors.gray[100]}; font-family: ${fontFamily.sans}; font-size: ${fontSize.md}; - min-height: 100%; + min-height: 100vh; padding: ${size[4]}; box-sizing: border-box; display: flex; flex-direction: column; gap: ${size[6]}; width: 100%; - height: 100%; - overflow-x: auto; + height: 100vh; + overflow: hidden; `, stickyHeader: css` position: sticky; @@ -32,12 +32,147 @@ const stylesFactory = () => { margin-bottom: ${size[2]}; font-size: ${fontSize.xl}; font-weight: ${font.weight.bold}; - color: ${colors.blue[400]}; + color: #84cc16; letter-spacing: 0.04em; text-transform: uppercase; border-bottom: 1px solid ${colors.darkGray[700]}; box-shadow: 0 2px 8px 0 ${colors.black + alpha[40]}; `, + mainContainer: css` + display: grid; + grid-template-columns: 1fr 1fr; + gap: ${size[4]}; + flex: 1; + min-height: 0; + overflow: hidden; + `, + leftPanel: css` + background: ${colors.darkGray[800]}; + border-radius: ${border.radius.lg}; + border: 1px solid ${colors.darkGray[700]}; + display: flex; + flex-direction: column; + overflow: hidden; + min-height: 0; + `, + rightPanel: css` + background: ${colors.darkGray[800]}; + border-radius: ${border.radius.lg}; + border: 1px solid ${colors.darkGray[700]}; + display: flex; + flex-direction: column; + overflow: hidden; + min-height: 0; + `, + panelHeader: css` + font-size: ${fontSize.lg}; + font-weight: ${font.weight.bold}; + color: ${colors.blue[400]}; + padding: ${size[4]}; + border-bottom: 1px solid ${colors.darkGray[700]}; + background: ${colors.darkGray[800]}; + `, + utilList: css` + flex: 1; + overflow-y: auto; + padding: ${size[2]}; + min-height: 0; + `, + utilGroup: css` + margin-bottom: ${size[4]}; + `, + utilGroupHeader: css` + font-size: ${fontSize.sm}; + font-weight: ${font.weight.semibold}; + color: ${colors.gray[400]}; + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: ${size[2]}; + padding: ${size[2]} ${size[3]}; + background: ${colors.darkGray[700]}; + border-radius: ${border.radius.md}; + `, + utilRow: css` + display: flex; + justify-content: space-between; + align-items: center; + padding: ${size[3]}; + margin-bottom: ${size[1]}; + background: ${colors.darkGray[700]}; + border-radius: ${border.radius.md}; + cursor: pointer; + transition: all 0.2s ease; + border: 1px solid transparent; + + &:hover { + background: ${colors.darkGray[600]}; + border-color: ${colors.darkGray[500]}; + } + `, + utilRowSelected: css` + background: ${colors.blue[900] + alpha[20]}; + border-color: ${colors.blue[500]}; + box-shadow: 0 0 0 1px ${colors.blue[500] + alpha[30]}; + `, + utilKey: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.sm}; + color: ${colors.gray[100]}; + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + `, + utilStatus: css` + font-size: ${fontSize.xs}; + color: ${colors.gray[400]}; + text-transform: uppercase; + letter-spacing: 0.05em; + padding: ${size[1]} ${size[2]}; + background: ${colors.darkGray[600]}; + border-radius: ${border.radius.sm}; + margin-left: ${size[2]}; + `, + stateDetails: css` + flex: 1; + overflow-y: auto; + padding: ${size[4]}; + min-height: 0; + `, + stateHeader: css` + margin-bottom: ${size[4]}; + padding-bottom: ${size[3]}; + border-bottom: 1px solid ${colors.darkGray[700]}; + `, + stateTitle: css` + font-size: ${fontSize.lg}; + font-weight: ${font.weight.bold}; + color: ${colors.blue[400]}; + margin-bottom: ${size[1]}; + `, + stateKey: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.sm}; + color: ${colors.gray[400]}; + word-break: break-all; + `, + stateContent: css` + background: ${colors.darkGray[700]}; + border-radius: ${border.radius.md}; + padding: ${size[3]}; + border: 1px solid ${colors.darkGray[600]}; + `, + noSelection: css` + flex: 1; + display: flex; + align-items: center; + justify-content: center; + color: ${colors.gray[500]}; + font-style: italic; + text-align: center; + padding: ${size[8]}; + `, + // Keep existing styles for backward compatibility sectionContainer: css` display: flex; flex-wrap: wrap; From f1cee1c925de39ea8518e2dcb1ffe3fba23c034e Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Wed, 13 Aug 2025 08:57:51 -0500 Subject: [PATCH 22/50] denser ui --- examples/react/util-comparison/src/index.tsx | 5 ++ .../pacer-devtools/src/styles/use-styles.ts | 50 +++++++++---------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/examples/react/util-comparison/src/index.tsx b/examples/react/util-comparison/src/index.tsx index a47ef7f0..90beb74c 100644 --- a/examples/react/util-comparison/src/index.tsx +++ b/examples/react/util-comparison/src/index.tsx @@ -23,6 +23,7 @@ function ComparisonApp() { const debouncer = useDebouncer( setDebouncedValue, { + key: 'my-debouncer', wait: 600, }, (state) => state, @@ -31,6 +32,7 @@ function ComparisonApp() { const throttler = useThrottler( setThrottledValue, { + key: 'my-throttler', wait: 600, }, (state) => state, @@ -39,6 +41,7 @@ function ComparisonApp() { const rateLimiter = useRateLimiter( setRateLimitedValue, { + key: 'my-rate-limiter', limit: 20, window: 2000, windowType: 'sliding', @@ -49,6 +52,7 @@ function ComparisonApp() { const queuer = useQueuer( setQueuedValue, { + key: 'my-queuer', wait: 100, maxSize: 50, }, @@ -63,6 +67,7 @@ function ComparisonApp() { } }, { + key: 'my-batcher', wait: 600, maxSize: 5, }, diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index 1e74b5a5..3ca4ddca 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -12,13 +12,13 @@ const stylesFactory = () => { background: ${colors.darkGray[900]}; color: ${colors.gray[100]}; font-family: ${fontFamily.sans}; - font-size: ${fontSize.md}; + font-size: ${fontSize.sm}; min-height: 100vh; - padding: ${size[4]}; + padding: ${size[2]}; box-sizing: border-box; display: flex; flex-direction: column; - gap: ${size[6]}; + gap: ${size[3]}; width: 100%; height: 100vh; overflow: hidden; @@ -28,9 +28,9 @@ const stylesFactory = () => { top: 0; z-index: 10; background: ${colors.darkGray[900]}; - padding-bottom: ${size[3]}; - margin-bottom: ${size[2]}; - font-size: ${fontSize.xl}; + padding-bottom: ${size[2]}; + margin-bottom: ${size[1]}; + font-size: ${fontSize.lg}; font-weight: ${font.weight.bold}; color: #84cc16; letter-spacing: 0.04em; @@ -41,7 +41,7 @@ const stylesFactory = () => { mainContainer: css` display: grid; grid-template-columns: 1fr 1fr; - gap: ${size[4]}; + gap: ${size[2]}; flex: 1; min-height: 0; overflow: hidden; @@ -65,30 +65,30 @@ const stylesFactory = () => { min-height: 0; `, panelHeader: css` - font-size: ${fontSize.lg}; + font-size: ${fontSize.md}; font-weight: ${font.weight.bold}; color: ${colors.blue[400]}; - padding: ${size[4]}; + padding: ${size[2]}; border-bottom: 1px solid ${colors.darkGray[700]}; background: ${colors.darkGray[800]}; `, utilList: css` flex: 1; overflow-y: auto; - padding: ${size[2]}; + padding: ${size[1]}; min-height: 0; `, utilGroup: css` - margin-bottom: ${size[4]}; + margin-bottom: ${size[2]}; `, utilGroupHeader: css` - font-size: ${fontSize.sm}; + font-size: ${fontSize.xs}; font-weight: ${font.weight.semibold}; color: ${colors.gray[400]}; text-transform: uppercase; letter-spacing: 0.05em; - margin-bottom: ${size[2]}; - padding: ${size[2]} ${size[3]}; + margin-bottom: ${size[1]}; + padding: ${size[1]} ${size[2]}; background: ${colors.darkGray[700]}; border-radius: ${border.radius.md}; `, @@ -96,7 +96,7 @@ const stylesFactory = () => { display: flex; justify-content: space-between; align-items: center; - padding: ${size[3]}; + padding: ${size[2]}; margin-bottom: ${size[1]}; background: ${colors.darkGray[700]}; border-radius: ${border.radius.md}; @@ -116,7 +116,7 @@ const stylesFactory = () => { `, utilKey: css` font-family: ${fontFamily.mono}; - font-size: ${fontSize.sm}; + font-size: ${fontSize.xs}; color: ${colors.gray[100]}; flex: 1; overflow: hidden; @@ -128,38 +128,38 @@ const stylesFactory = () => { color: ${colors.gray[400]}; text-transform: uppercase; letter-spacing: 0.05em; - padding: ${size[1]} ${size[2]}; + padding: ${size[1]} ${size[1]}; background: ${colors.darkGray[600]}; border-radius: ${border.radius.sm}; - margin-left: ${size[2]}; + margin-left: ${size[1]}; `, stateDetails: css` flex: 1; overflow-y: auto; - padding: ${size[4]}; + padding: ${size[2]}; min-height: 0; `, stateHeader: css` - margin-bottom: ${size[4]}; - padding-bottom: ${size[3]}; + margin-bottom: ${size[2]}; + padding-bottom: ${size[2]}; border-bottom: 1px solid ${colors.darkGray[700]}; `, stateTitle: css` - font-size: ${fontSize.lg}; + font-size: ${fontSize.md}; font-weight: ${font.weight.bold}; color: ${colors.blue[400]}; margin-bottom: ${size[1]}; `, stateKey: css` font-family: ${fontFamily.mono}; - font-size: ${fontSize.sm}; + font-size: ${fontSize.xs}; color: ${colors.gray[400]}; word-break: break-all; `, stateContent: css` background: ${colors.darkGray[700]}; border-radius: ${border.radius.md}; - padding: ${size[3]}; + padding: ${size[2]}; border: 1px solid ${colors.darkGray[600]}; `, noSelection: css` @@ -170,7 +170,7 @@ const stylesFactory = () => { color: ${colors.gray[500]}; font-style: italic; text-align: center; - padding: ${size[8]}; + padding: ${size[4]}; `, // Keep existing styles for backward compatibility sectionContainer: css` From 57966f65d4eecf7656997e424bc5c882d1fa9f2f Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Wed, 13 Aug 2025 12:47:23 -0500 Subject: [PATCH 23/50] better right panel, emit entire instance --- docs/reference/classes/asyncbatcher.md | 12 +- docs/reference/classes/asyncdebouncer.md | 8 +- docs/reference/classes/asyncqueuer.md | 26 ++-- docs/reference/classes/asyncratelimiter.md | 8 +- docs/reference/classes/asyncthrottler.md | 8 +- docs/reference/classes/batcher.md | 10 +- docs/reference/classes/debouncer.md | 8 +- docs/reference/classes/queuer.md | 22 +-- docs/reference/classes/ratelimiter.md | 8 +- docs/reference/classes/throttler.md | 8 +- docs/reference/functions/asyncbatch.md | 2 +- docs/reference/functions/asyncdebounce.md | 2 +- docs/reference/functions/asyncqueue.md | 2 +- docs/reference/functions/asyncratelimit.md | 2 +- docs/reference/functions/asyncthrottle.md | 2 +- docs/reference/functions/batch.md | 2 +- docs/reference/functions/debounce.md | 2 +- docs/reference/functions/queue.md | 2 +- docs/reference/functions/ratelimit.md | 2 +- docs/reference/functions/throttle.md | 2 +- docs/reference/interfaces/pacereventmap.md | 62 ++++---- docs/reference/variables/pacereventclient.md | 2 +- .../src/context/context-provider.tsx | 134 ++++++++++++------ .../pacer-devtools/src/context/context.ts | 64 ++++----- packages/pacer-devtools/src/devtools.tsx | 116 +++++++++------ .../pacer-devtools/src/styles/use-styles.ts | 39 +++++ packages/pacer/src/async-batcher.ts | 10 +- packages/pacer/src/async-debouncer.ts | 10 +- packages/pacer/src/async-queuer.ts | 11 +- packages/pacer/src/async-rate-limiter.ts | 10 +- packages/pacer/src/async-throttler.ts | 10 +- packages/pacer/src/batcher.ts | 11 +- packages/pacer/src/debouncer.ts | 10 +- packages/pacer/src/event-client.ts | 44 +++--- packages/pacer/src/queuer.ts | 11 +- packages/pacer/src/rate-limiter.ts | 10 +- packages/pacer/src/throttler.ts | 10 +- 37 files changed, 392 insertions(+), 310 deletions(-) diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index 4b48729f..26dd779a 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -156,7 +156,7 @@ Defined in: [async-batcher.ts:231](https://github.com/TanStack/pacer/blob/main/p addItem(item): void ``` -Defined in: [async-batcher.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L295) +Defined in: [async-batcher.ts:291](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L291) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -179,7 +179,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [async-batcher.ts:396](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L396) +Defined in: [async-batcher.ts:392](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L392) Removes all items from the async batcher @@ -195,7 +195,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [async-batcher.ts:370](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L370) +Defined in: [async-batcher.ts:366](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L366) Processes the current batch of items immediately @@ -211,7 +211,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [async-batcher.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L378) +Defined in: [async-batcher.ts:374](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L374) Returns a copy of all items in the async batcher @@ -227,7 +227,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [async-batcher.ts:382](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L382) +Defined in: [async-batcher.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L378) #### Returns @@ -241,7 +241,7 @@ Defined in: [async-batcher.ts:382](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:403](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L403) +Defined in: [async-batcher.ts:399](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L399) Resets the async batcher state to its default values diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index 8f02da69..d82364e0 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -130,7 +130,7 @@ Defined in: [async-debouncer.ts:184](https://github.com/TanStack/pacer/blob/main cancel(): void ``` -Defined in: [async-debouncer.ts:400](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L400) +Defined in: [async-debouncer.ts:396](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L396) Cancels any pending execution or aborts any execution in progress @@ -146,7 +146,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-debouncer.ts:352](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L352) +Defined in: [async-debouncer.ts:348](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L348) Processes the current pending execution immediately @@ -162,7 +162,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-debouncer.ts:275](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L275) +Defined in: [async-debouncer.ts:271](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L271) Attempts to execute the debounced function. If a call is already in progress, it will be queued. @@ -198,7 +198,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [async-debouncer.ts:409](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L409) +Defined in: [async-debouncer.ts:405](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L405) Resets the debouncer state to its default values diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index b09e92ac..603b5f90 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -148,7 +148,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [async-queuer.ts:413](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L413) +Defined in: [async-queuer.ts:410](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L410) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -186,7 +186,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [async-queuer.ts:717](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L717) +Defined in: [async-queuer.ts:714](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L714) Removes all pending items from the queue. Does not affect active tasks. @@ -202,7 +202,7 @@ Removes all pending items from the queue. Does not affect active tasks. execute(position?): Promise ``` -Defined in: [async-queuer.ts:539](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L539) +Defined in: [async-queuer.ts:536](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L536) Removes and returns the next item from the queue and executes the task function with it. @@ -232,7 +232,7 @@ queuer.execute('back'); flush(numberOfItems, position?): Promise ``` -Defined in: [async-queuer.ts:574](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L574) +Defined in: [async-queuer.ts:571](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L571) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -259,7 +259,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): Promise ``` -Defined in: [async-queuer.ts:588](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L588) +Defined in: [async-queuer.ts:585](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L585) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -282,7 +282,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:492](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L492) +Defined in: [async-queuer.ts:489](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L489) Removes and returns the next item from the queue without executing the task function. Use for manual queue management. Normally, use execute() to process items. @@ -314,7 +314,7 @@ queuer.getNextItem('back'); peekActiveItems(): TValue[] ``` -Defined in: [async-queuer.ts:680](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L680) +Defined in: [async-queuer.ts:677](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L677) Returns the items currently being processed (active tasks). @@ -330,7 +330,7 @@ Returns the items currently being processed (active tasks). peekAllItems(): TValue[] ``` -Defined in: [async-queuer.ts:673](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L673) +Defined in: [async-queuer.ts:670](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L670) Returns a copy of all items in the queue, including active and pending items. @@ -346,7 +346,7 @@ Returns a copy of all items in the queue, including active and pending items. peekNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:663](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L663) +Defined in: [async-queuer.ts:660](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L660) Returns the next item in the queue without removing it. @@ -375,7 +375,7 @@ queuer.peekNextItem('back'); // back peekPendingItems(): TValue[] ``` -Defined in: [async-queuer.ts:687](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L687) +Defined in: [async-queuer.ts:684](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L684) Returns the items waiting to be processed (pending tasks). @@ -391,7 +391,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [async-queuer.ts:725](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L725) +Defined in: [async-queuer.ts:722](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L722) Resets the queuer state to its default values @@ -429,7 +429,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [async-queuer.ts:694](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L694) +Defined in: [async-queuer.ts:691](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L691) Starts processing items in the queue. If already running, does nothing. @@ -445,7 +445,7 @@ Starts processing items in the queue. If already running, does nothing. stop(): void ``` -Defined in: [async-queuer.ts:704](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L704) +Defined in: [async-queuer.ts:701](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L701) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index 25fb0833..9e5ffbd7 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -151,7 +151,7 @@ Defined in: [async-rate-limiter.ts:212](https://github.com/TanStack/pacer/blob/m getMsUntilNextWindow(): number ``` -Defined in: [async-rate-limiter.ts:446](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L446) +Defined in: [async-rate-limiter.ts:442](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L442) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -169,7 +169,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [async-rate-limiter.ts:436](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L436) +Defined in: [async-rate-limiter.ts:432](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L432) Returns the number of remaining executions allowed in the current window @@ -185,7 +185,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [async-rate-limiter.ts:315](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L315) +Defined in: [async-rate-limiter.ts:311](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L311) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -233,7 +233,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [async-rate-limiter.ts:457](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L457) +Defined in: [async-rate-limiter.ts:453](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L453) Resets the rate limiter state diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index bde56b7a..c9326469 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -133,7 +133,7 @@ Defined in: [async-throttler.ts:195](https://github.com/TanStack/pacer/blob/main cancel(): void ``` -Defined in: [async-throttler.ts:435](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L435) +Defined in: [async-throttler.ts:431](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L431) Cancels any pending execution or aborts any execution in progress @@ -149,7 +149,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-throttler.ts:384](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L384) +Defined in: [async-throttler.ts:380](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L380) Processes the current pending execution immediately @@ -165,7 +165,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-throttler.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L294) +Defined in: [async-throttler.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L290) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -207,7 +207,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [async-throttler.ts:443](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L443) +Defined in: [async-throttler.ts:439](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L439) Resets the debouncer state to its default values diff --git a/docs/reference/classes/batcher.md b/docs/reference/classes/batcher.md index eb2d2192..0f6d2ddd 100644 --- a/docs/reference/classes/batcher.md +++ b/docs/reference/classes/batcher.md @@ -133,7 +133,7 @@ Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/package addItem(item): void ``` -Defined in: [batcher.ts:203](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L203) +Defined in: [batcher.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L198) Adds an item to the batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -156,7 +156,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [batcher.ts:273](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L273) +Defined in: [batcher.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L268) Removes all items from the batcher @@ -172,7 +172,7 @@ Removes all items from the batcher flush(): void ``` -Defined in: [batcher.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L251) +Defined in: [batcher.ts:246](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L246) Processes the current batch of items immediately @@ -188,7 +188,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [batcher.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L259) +Defined in: [batcher.ts:254](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L254) Returns a copy of all items in the batcher @@ -204,7 +204,7 @@ Returns a copy of all items in the batcher reset(): void ``` -Defined in: [batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L280) +Defined in: [batcher.ts:275](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L275) Resets the batcher state to its default values diff --git a/docs/reference/classes/debouncer.md b/docs/reference/classes/debouncer.md index c9e72648..f46cc32b 100644 --- a/docs/reference/classes/debouncer.md +++ b/docs/reference/classes/debouncer.md @@ -116,7 +116,7 @@ Defined in: [debouncer.ts:125](https://github.com/TanStack/pacer/blob/main/packa cancel(): void ``` -Defined in: [debouncer.ts:256](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L256) +Defined in: [debouncer.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L252) Cancels any pending execution @@ -132,7 +132,7 @@ Cancels any pending execution flush(): void ``` -Defined in: [debouncer.ts:239](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L239) +Defined in: [debouncer.ts:235](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L235) Processes the current pending execution immediately @@ -148,7 +148,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [debouncer.ts:197](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L197) +Defined in: [debouncer.ts:193](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L193) Attempts to execute the debounced function If a call is already in progress, it will be queued @@ -171,7 +171,7 @@ If a call is already in progress, it will be queued reset(): void ``` -Defined in: [debouncer.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L267) +Defined in: [debouncer.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L263) Resets the debouncer state to its default values diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index d91917fa..e97b616f 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -169,7 +169,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [queuer.ts:377](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L377) +Defined in: [queuer.ts:374](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L374) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -208,7 +208,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [queuer.ts:650](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L650) +Defined in: [queuer.ts:647](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L647) Removes all pending items from the queue. Does not affect items being processed. @@ -224,7 +224,7 @@ Removes all pending items from the queue. Does not affect items being processed. execute(position?): undefined | TValue ``` -Defined in: [queuer.ts:504](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L504) +Defined in: [queuer.ts:501](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L501) Removes and returns the next item from the queue and processes it using the provided function. @@ -253,7 +253,7 @@ queuer.execute('back'); flush(numberOfItems, position?): void ``` -Defined in: [queuer.ts:520](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L520) +Defined in: [queuer.ts:517](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L517) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -280,7 +280,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [queuer.ts:535](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L535) +Defined in: [queuer.ts:532](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L532) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -303,7 +303,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:457](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L457) +Defined in: [queuer.ts:454](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L454) Removes and returns the next item from the queue without executing the function. Use for manual queue management. Normally, use execute() to process items. @@ -334,7 +334,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [queuer.ts:618](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L618) +Defined in: [queuer.ts:615](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L615) Returns a copy of all items in the queue. @@ -350,7 +350,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:608](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L608) +Defined in: [queuer.ts:605](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L605) Returns the next item in the queue without removing it. @@ -378,7 +378,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [queuer.ts:658](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L658) +Defined in: [queuer.ts:655](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L655) Resets the queuer state to its default values @@ -416,7 +416,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [queuer.ts:625](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L625) +Defined in: [queuer.ts:622](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L622) Starts processing items in the queue. If already isRunning, does nothing. @@ -432,7 +432,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [queuer.ts:635](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L635) +Defined in: [queuer.ts:632](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L632) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/ratelimiter.md b/docs/reference/classes/ratelimiter.md index 7978bff2..84126c23 100644 --- a/docs/reference/classes/ratelimiter.md +++ b/docs/reference/classes/ratelimiter.md @@ -129,7 +129,7 @@ Defined in: [rate-limiter.ts:139](https://github.com/TanStack/pacer/blob/main/pa getMsUntilNextWindow(): number ``` -Defined in: [rate-limiter.ts:330](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L330) +Defined in: [rate-limiter.ts:326](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L326) Returns the number of milliseconds until the next execution will be possible @@ -145,7 +145,7 @@ Returns the number of milliseconds until the next execution will be possible getRemainingInWindow(): number ``` -Defined in: [rate-limiter.ts:322](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L322) +Defined in: [rate-limiter.ts:318](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L318) Returns the number of remaining executions allowed in the current window @@ -161,7 +161,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): boolean ``` -Defined in: [rate-limiter.ts:228](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L228) +Defined in: [rate-limiter.ts:224](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L224) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -196,7 +196,7 @@ rateLimiter.maybeExecute('arg1', 'arg2'); // false reset(): void ``` -Defined in: [rate-limiter.ts:341](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L341) +Defined in: [rate-limiter.ts:337](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L337) Resets the rate limiter state diff --git a/docs/reference/classes/throttler.md b/docs/reference/classes/throttler.md index c14faaab..b4792751 100644 --- a/docs/reference/classes/throttler.md +++ b/docs/reference/classes/throttler.md @@ -120,7 +120,7 @@ Defined in: [throttler.ts:133](https://github.com/TanStack/pacer/blob/main/packa cancel(): void ``` -Defined in: [throttler.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L294) +Defined in: [throttler.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L290) Cancels any pending trailing execution and clears internal state. @@ -142,7 +142,7 @@ Has no effect if there is no pending execution. flush(): void ``` -Defined in: [throttler.ts:272](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L272) +Defined in: [throttler.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L268) Processes the current pending execution immediately @@ -158,7 +158,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [throttler.ts:217](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L217) +Defined in: [throttler.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L213) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -200,7 +200,7 @@ throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [throttler.ts:305](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L305) +Defined in: [throttler.ts:301](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L301) Resets the throttler state to its default values diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index 2652703f..ad096c15 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,7 +11,7 @@ title: asyncBatch function asyncBatch(fn, options): (item) => void ``` -Defined in: [async-batcher.ts:458](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L458) +Defined in: [async-batcher.ts:454](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L454) Creates an async batcher that processes items in batches diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index b77db41f..f0f8a98e 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,7 +11,7 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-debouncer.ts:458](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L458) +Defined in: [async-debouncer.ts:454](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L454) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index ed0e47d2..ba6b1a8e 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,7 +11,7 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [async-queuer.ts:764](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L764) +Defined in: [async-queuer.ts:761](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L761) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index 752c47c4..bca39308 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,7 +11,7 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-rate-limiter.ts:528](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L528) +Defined in: [async-rate-limiter.ts:524](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L524) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index e228b36f..54d9e24d 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,7 +11,7 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-throttler.ts:491](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L491) +Defined in: [async-throttler.ts:487](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L487) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md index 26b75d6d..fb10894c 100644 --- a/docs/reference/functions/batch.md +++ b/docs/reference/functions/batch.md @@ -11,7 +11,7 @@ title: batch function batch(fn, options): (item) => void ``` -Defined in: [batcher.ts:304](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L304) +Defined in: [batcher.ts:299](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L299) Creates a batcher that processes items in batches diff --git a/docs/reference/functions/debounce.md b/docs/reference/functions/debounce.md index e1c8a667..f1cd1af5 100644 --- a/docs/reference/functions/debounce.md +++ b/docs/reference/functions/debounce.md @@ -11,7 +11,7 @@ title: debounce function debounce(fn, initialOptions): (...args) => void ``` -Defined in: [debouncer.ts:300](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L300) +Defined in: [debouncer.ts:296](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L296) Creates a debounced function that delays invoking the provided function until after a specified wait time. Multiple calls during the wait period will cancel previous pending invocations and reset the timer. diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index 39c142a2..7b4c8d9f 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -11,7 +11,7 @@ title: queue function queue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [queuer.ts:701](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L701) +Defined in: [queuer.ts:698](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L698) Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. diff --git a/docs/reference/functions/ratelimit.md b/docs/reference/functions/ratelimit.md index fa1b658e..a7fe3b80 100644 --- a/docs/reference/functions/ratelimit.md +++ b/docs/reference/functions/ratelimit.md @@ -11,7 +11,7 @@ title: rateLimit function rateLimit(fn, initialOptions): (...args) => boolean ``` -Defined in: [rate-limiter.ts:393](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L393) +Defined in: [rate-limiter.ts:389](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L389) Creates a rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/throttle.md b/docs/reference/functions/throttle.md index bad5a296..4958ebd2 100644 --- a/docs/reference/functions/throttle.md +++ b/docs/reference/functions/throttle.md @@ -11,7 +11,7 @@ title: throttle function throttle(fn, initialOptions): (...args) => void ``` -Defined in: [throttler.ts:344](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L344) +Defined in: [throttler.ts:340](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L340) Creates a throttled function that limits how often the provided function can execute. diff --git a/docs/reference/interfaces/pacereventmap.md b/docs/reference/interfaces/pacereventmap.md index 5d5a7807..81236178 100644 --- a/docs/reference/interfaces/pacereventmap.md +++ b/docs/reference/interfaces/pacereventmap.md @@ -7,104 +7,104 @@ title: PacerEventMap # Interface: PacerEventMap -Defined in: [event-client.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L15) +Defined in: [event-client.ts:13](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L13) ## Properties -### pacer:async-batcher-state +### pacer:async-batcher ```ts -pacer:async-batcher-state: WithKey>; +pacer:async-batcher: AsyncBatcher; ``` -Defined in: [event-client.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L16) +Defined in: [event-client.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L14) *** -### pacer:async-debouncer-state +### pacer:async-debouncer ```ts -pacer:async-debouncer-state: WithKey>; +pacer:async-debouncer: AsyncDebouncer; ``` -Defined in: [event-client.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L17) +Defined in: [event-client.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L15) *** -### pacer:async-queuer-state +### pacer:async-queuer ```ts -pacer:async-queuer-state: WithKey>; +pacer:async-queuer: AsyncQueuer; ``` -Defined in: [event-client.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L18) +Defined in: [event-client.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L16) *** -### pacer:async-rate-limiter-state +### pacer:async-rate-limiter ```ts -pacer:async-rate-limiter-state: WithKey>; +pacer:async-rate-limiter: AsyncRateLimiter; ``` -Defined in: [event-client.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L19) +Defined in: [event-client.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L17) *** -### pacer:async-throttler-state +### pacer:async-throttler ```ts -pacer:async-throttler-state: WithKey>; +pacer:async-throttler: AsyncThrottler; ``` -Defined in: [event-client.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L20) +Defined in: [event-client.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L18) *** -### pacer:batcher-state +### pacer:batcher ```ts -pacer:batcher-state: WithKey>; +pacer:batcher: Batcher; ``` -Defined in: [event-client.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L21) +Defined in: [event-client.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L19) *** -### pacer:debouncer-state +### pacer:debouncer ```ts -pacer:debouncer-state: WithKey>; +pacer:debouncer: Debouncer; ``` -Defined in: [event-client.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L22) +Defined in: [event-client.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L20) *** -### pacer:queuer-state +### pacer:queuer ```ts -pacer:queuer-state: WithKey>; +pacer:queuer: Queuer; ``` -Defined in: [event-client.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L23) +Defined in: [event-client.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L21) *** -### pacer:rate-limiter-state +### pacer:rate-limiter ```ts -pacer:rate-limiter-state: WithKey; +pacer:rate-limiter: RateLimiter; ``` -Defined in: [event-client.ts:24](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L24) +Defined in: [event-client.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L22) *** -### pacer:throttler-state +### pacer:throttler ```ts -pacer:throttler-state: WithKey>; +pacer:throttler: Throttler; ``` -Defined in: [event-client.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L25) +Defined in: [event-client.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L23) diff --git a/docs/reference/variables/pacereventclient.md b/docs/reference/variables/pacereventclient.md index 4f3957d1..0f01f688 100644 --- a/docs/reference/variables/pacereventclient.md +++ b/docs/reference/variables/pacereventclient.md @@ -11,4 +11,4 @@ title: pacerEventClient const pacerEventClient: PacerEventClient; ``` -Defined in: [event-client.ts:51](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L51) +Defined in: [event-client.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L49) diff --git a/packages/pacer-devtools/src/context/context-provider.tsx b/packages/pacer-devtools/src/context/context-provider.tsx index 08e07df8..dccc670f 100644 --- a/packages/pacer-devtools/src/context/context-provider.tsx +++ b/packages/pacer-devtools/src/context/context-provider.tsx @@ -21,68 +21,116 @@ export function PacerContextProvider(props: { children: any }) { const [store, setStore] = createStore(initialStore) createEffect(() => { - const cleanup = pacerEventClient.onAllPluginEvents((e) => { + const cleanup = pacerEventClient.onAllPluginEvents((_e) => { + const e = _e as unknown as { type: string; payload: any } switch (e.type) { - case 'pacer:async-batcher-state': { - const newItems = updateOrAddToArray( - store.asyncBatcherState, - e.payload, - ) - setStore({ asyncBatcherState: newItems }) + case 'pacer:async-batcher': { + setStore({ + asyncBatchers: updateOrAddToArray(store.asyncBatchers, e.payload), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:async-debouncer-state': { - const newItems = updateOrAddToArray( - store.asyncDebouncerState, - e.payload, - ) - setStore({ asyncDebouncerState: newItems }) + case 'pacer:async-debouncer': { + setStore({ + asyncDebouncers: updateOrAddToArray( + store.asyncDebouncers, + e.payload, + ), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:async-queuer-state': { - const newItems = updateOrAddToArray(store.asyncQueuerState, e.payload) - setStore({ asyncQueuerState: newItems }) + case 'pacer:async-queuer': { + setStore({ + asyncQueuers: updateOrAddToArray(store.asyncQueuers, e.payload), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:async-rate-limiter-state': { - const newItems = updateOrAddToArray( - store.asyncRateLimiterState, - e.payload, - ) - setStore({ asyncRateLimiterState: newItems }) + case 'pacer:async-rate-limiter': { + setStore({ + asyncRateLimiters: updateOrAddToArray( + store.asyncRateLimiters, + e.payload, + ), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:async-throttler-state': { - const newItems = updateOrAddToArray( - store.asyncThrottlerState, - e.payload, - ) - setStore({ asyncThrottlerState: newItems }) + case 'pacer:async-throttler': { + setStore({ + asyncThrottlers: updateOrAddToArray( + store.asyncThrottlers, + e.payload, + ), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:batcher-state': { - const newItems = updateOrAddToArray(store.batcherState, e.payload) - setStore({ batcherState: newItems }) + case 'pacer:batcher': { + setStore({ + batchers: updateOrAddToArray(store.batchers, e.payload), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:debouncer-state': { - const newItems = updateOrAddToArray(store.debouncerState, e.payload) - setStore({ debouncerState: newItems }) + case 'pacer:debouncer': { + setStore({ + debouncers: updateOrAddToArray(store.debouncers, e.payload), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:queuer-state': { - const newItems = updateOrAddToArray(store.queuerState, e.payload) - setStore({ queuerState: newItems }) + case 'pacer:queuer': { + setStore({ + queuers: updateOrAddToArray(store.queuers, e.payload), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:rate-limiter-state': { - const newItems = updateOrAddToArray(store.rateLimiterState, e.payload) - setStore({ rateLimiterState: newItems }) + case 'pacer:rate-limiter': { + setStore({ + rateLimiters: updateOrAddToArray(store.rateLimiters, e.payload), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } - case 'pacer:throttler-state': { - const newItems = updateOrAddToArray(store.throttlerState, e.payload) - setStore({ throttlerState: newItems }) + case 'pacer:throttler': { + setStore({ + throttlers: updateOrAddToArray(store.throttlers, e.payload), + lastUpdatedByKey: { + ...store.lastUpdatedByKey, + [e.payload.key]: Date.now(), + }, + }) break } } diff --git a/packages/pacer-devtools/src/context/context.ts b/packages/pacer-devtools/src/context/context.ts index 4ed31433..e1b74e65 100644 --- a/packages/pacer-devtools/src/context/context.ts +++ b/packages/pacer-devtools/src/context/context.ts @@ -1,43 +1,43 @@ import { createContext } from 'solid-js' import type { - AsyncBatcherState, - AsyncDebouncerState, - AsyncQueuerState, - AsyncRateLimiterState, - AsyncThrottlerState, - BatcherState, - DebouncerState, - QueuerState, - RateLimiterState, - ThrottlerState, + AsyncBatcher, + AsyncDebouncer, + AsyncQueuer, + AsyncRateLimiter, + AsyncThrottler, + Batcher, + Debouncer, + Queuer, + RateLimiter, + Throttler, } from '@tanstack/pacer' -type WithKey = T & { key: string } - export interface PacerContextType { - asyncBatcherState: Array>> - asyncDebouncerState: Array>> - asyncQueuerState: Array>> - asyncRateLimiterState: Array>> - asyncThrottlerState: Array>> - batcherState: Array>> - debouncerState: Array>> - queuerState: Array>> - rateLimiterState: Array> - throttlerState: Array>> + asyncBatchers: Array> + asyncDebouncers: Array> + asyncQueuers: Array> + asyncRateLimiters: Array> + asyncThrottlers: Array> + batchers: Array> + debouncers: Array> + queuers: Array> + rateLimiters: Array> + throttlers: Array> + lastUpdatedByKey: Record } export const initialStore = { - asyncBatcherState: [], - asyncDebouncerState: [], - asyncQueuerState: [], - asyncRateLimiterState: [], - asyncThrottlerState: [], - batcherState: [], - debouncerState: [], - queuerState: [], - rateLimiterState: [], - throttlerState: [], + asyncBatchers: [], + asyncDebouncers: [], + asyncQueuers: [], + asyncRateLimiters: [], + asyncThrottlers: [], + batchers: [], + debouncers: [], + queuers: [], + rateLimiters: [], + throttlers: [], + lastUpdatedByKey: {}, } export const PacerContext = createContext< diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/devtools.tsx index 1eb594f8..c5220ebb 100644 --- a/packages/pacer-devtools/src/devtools.tsx +++ b/packages/pacer-devtools/src/devtools.tsx @@ -1,4 +1,4 @@ -import { For, createSignal } from 'solid-js' +import { For, createMemo, createSignal } from 'solid-js' import clsx from 'clsx' import { JsonTree } from '@tanstack/devtools-ui' import { usePacerState } from './context/use-context-hooks' @@ -6,16 +6,16 @@ import { PacerContextProvider } from './context/context-provider' import { useStyles } from './styles/use-styles' type StateKey = - | 'asyncBatcherState' - | 'asyncDebouncerState' - | 'asyncQueuerState' - | 'asyncRateLimiterState' - | 'asyncThrottlerState' - | 'batcherState' - | 'debouncerState' - | 'queuerState' - | 'rateLimiterState' - | 'throttlerState' + | 'asyncBatchers' + | 'asyncDebouncers' + | 'asyncQueuers' + | 'asyncRateLimiters' + | 'asyncThrottlers' + | 'batchers' + | 'debouncers' + | 'queuers' + | 'rateLimiters' + | 'throttlers' type UtilGroup = { key: StateKey @@ -24,37 +24,37 @@ type UtilGroup = { } const UTIL_GROUPS: Array = [ - { key: 'debouncerState', label: 'Debouncers', displayName: 'Debouncer' }, - { key: 'throttlerState', label: 'Throttlers', displayName: 'Throttler' }, - { key: 'batcherState', label: 'Batchers', displayName: 'Batcher' }, - { key: 'queuerState', label: 'Queuers', displayName: 'Queuer' }, + { key: 'debouncers', label: 'Debouncers', displayName: 'Debouncer' }, + { key: 'throttlers', label: 'Throttlers', displayName: 'Throttler' }, + { key: 'batchers', label: 'Batchers', displayName: 'Batcher' }, + { key: 'queuers', label: 'Queuers', displayName: 'Queuer' }, { - key: 'rateLimiterState', + key: 'rateLimiters', label: 'Rate Limiters', displayName: 'Rate Limiter', }, { - key: 'asyncDebouncerState', + key: 'asyncDebouncers', label: 'Async Debouncers', displayName: 'Async Debouncer', }, { - key: 'asyncThrottlerState', + key: 'asyncThrottlers', label: 'Async Throttlers', displayName: 'Async Throttler', }, { - key: 'asyncBatcherState', + key: 'asyncBatchers', label: 'Async Batchers', displayName: 'Async Batcher', }, { - key: 'asyncQueuerState', + key: 'asyncQueuers', label: 'Async Queuers', displayName: 'Async Queuer', }, { - key: 'asyncRateLimiterState', + key: 'asyncRateLimiters', label: 'Async Rate Limiters', displayName: 'Async Rate Limiter', }, @@ -64,18 +64,26 @@ function Shell() { const styles = useStyles() const state = usePacerState() const [selectedKey, setSelectedKey] = createSignal(null) + const getGroupItems = (key: StateKey) => + (state as unknown as Record>)[key] // Find the selected instance - const selectedInstance = () => { - if (!selectedKey()) return null - + const selectedInstance = createMemo(() => { + const key = selectedKey() + if (!key) return null for (const group of UTIL_GROUPS) { - const instance = state[group.key].find( - (inst) => inst.key === selectedKey(), - ) - if (instance) return { ...instance, type: group.displayName } + const instance = getGroupItems(group.key).find((inst) => inst.key === key) + if (instance) return { instance, type: group.displayName } } return null + }) + + const getStatus = (inst: any) => { + try { + return inst.store?.state?.status ?? 'unknown' + } catch { + return 'unknown' + } } return ( @@ -85,15 +93,14 @@ function Shell() {
{/* Left Panel - Util List */}
-
Utils
{(group) => ( <> - {state[group.key].length > 0 && ( + {getGroupItems(group.key).length > 0 && (
{group.label}
- + {(instance) => (
setSelectedKey(instance.key)} + onClick={() => setSelectedKey(instance.key ?? null)} >
{instance.key}
- {instance.status} + {getStatus(instance)}
)} @@ -120,18 +127,47 @@ function Shell() { {/* Right Panel - State Details */}
-
State Details
+
Details
{(() => { - const instance = selectedInstance() - return instance !== null ? ( + const entry = selectedInstance() + return entry !== null ? ( <>
-
{instance.type}
-
{instance.key}
+
{entry.type}
+
+
Key
+
+ {entry.instance.key} +
+
Last Updated
+
+ {new Date( + (state.lastUpdatedByKey as any)[entry.instance.key] ?? + Date.now(), + ).toLocaleTimeString()} +
+
-
- +
+
+
Actions
+
No actions yet
+
+ +
+
Options
+
+ +
+
+ +
+
State
+
+ +
+
) : ( diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index 3ca4ddca..a1128720 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -162,6 +162,45 @@ const stylesFactory = () => { padding: ${size[2]}; border: 1px solid ${colors.darkGray[600]}; `, + detailsGrid: css` + display: grid; + grid-template-columns: 1fr; + gap: ${size[2]}; + align-items: start; + `, + detailSection: css` + background: ${colors.darkGray[700]}; + border: 1px solid ${colors.darkGray[600]}; + border-radius: ${border.radius.md}; + padding: ${size[2]}; + `, + detailSectionHeader: css` + font-size: ${fontSize.sm}; + font-weight: ${font.weight.bold}; + color: ${colors.gray[200]}; + margin-bottom: ${size[1]}; + text-transform: uppercase; + letter-spacing: 0.04em; + `, + infoGrid: css` + display: grid; + grid-template-columns: auto 1fr; + gap: ${size[1]}; + row-gap: ${size[1]}; + align-items: center; + `, + infoLabel: css` + color: ${colors.gray[400]}; + font-size: ${fontSize.xs}; + text-transform: uppercase; + letter-spacing: 0.05em; + `, + infoValueMono: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + color: ${colors.gray[100]}; + word-break: break-all; + `, noSelection: css` flex: 1; display: flex; diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index b5d2647d..63b69de1 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -264,7 +264,7 @@ export class AsyncBatcher { const { isExecuting, isPending, items } = combinedState const size = items.length const isEmpty = size === 0 - const finalState = { + return { ...combinedState, isEmpty, size, @@ -275,13 +275,9 @@ export class AsyncBatcher { : isEmpty ? 'idle' : 'populated', - } as const - emitChange('async-batcher-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('async-batcher', this) } #getWait = (): number => { diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index 6d6f92c8..52cf1850 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -224,7 +224,7 @@ export class AsyncDebouncer { ...newState, } const { isPending, isExecuting, settleCount } = combinedState - const finalState = { + return { ...combinedState, status: !this.#getEnabled() ? 'disabled' @@ -235,13 +235,9 @@ export class AsyncDebouncer { : settleCount > 0 ? 'settled' : 'idle', - } as const - emitChange('async-debouncer-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('async-debouncer', this) } /** diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index 39cdb9d0..bc353ea9 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -323,20 +323,17 @@ export class AsyncQueuer { const isIdle = isRunning && isEmpty && activeItems.length === 0 const status = isIdle ? 'idle' : isRunning ? 'running' : 'stopped' - const finalState = { + + return { ...combinedState, isEmpty, isFull, isIdle, size, status, - } as const - emitChange('async-queuer-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('async-queuer', this) } /** diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index c01ffc0b..3f8569a7 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -253,17 +253,13 @@ export class AsyncRateLimiter { : isExceeded ? 'exceeded' : 'idle' - const finalState = { + return { ...combinedState, isExceeded, status, - } as const - emitChange('async-rate-limiter-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('async-rate-limiter', this) } /** diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index a0d3c63b..1a25c59b 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -235,7 +235,7 @@ export class AsyncThrottler { ...newState, } const { isPending, isExecuting, settleCount } = combinedState - const finalState = { + return { ...combinedState, status: !this.#getEnabled() ? 'disabled' @@ -246,13 +246,9 @@ export class AsyncThrottler { : settleCount > 0 ? 'settled' : 'idle', - } as const - emitChange('async-throttler-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('async-throttler', this) } /** diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index c68732cf..09855fc8 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -177,19 +177,14 @@ export class Batcher { const { isPending, items } = combinedState const size = items.length const isEmpty = size === 0 - const finalState = { + return { ...combinedState, isEmpty, size, status: isPending ? 'pending' : 'idle', - } as const - - emitChange('batcher-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('batcher', this) } #getWait = (): number => { diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index 6221e307..29318637 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -160,20 +160,16 @@ export class Debouncer { ...newState, } const { isPending } = combinedState - const finalState = { + return { ...combinedState, status: !this.#getEnabled() ? 'disabled' : isPending ? 'pending' : 'idle', - } as const - emitChange('debouncer-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('debouncer', this) } /** diff --git a/packages/pacer/src/event-client.ts b/packages/pacer/src/event-client.ts index 71e156e7..bb008b09 100644 --- a/packages/pacer/src/event-client.ts +++ b/packages/pacer/src/event-client.ts @@ -1,28 +1,26 @@ import { EventClient } from '@tanstack/devtools-event-client' -import type { AsyncBatcherState } from './async-batcher' -import type { AsyncDebouncerState } from './async-debouncer' -import type { AsyncQueuerState } from './async-queuer' -import type { AsyncRateLimiterState } from './async-rate-limiter' -import type { AsyncThrottlerState } from './async-throttler' -import type { DebouncerState } from './debouncer' -import type { BatcherState } from './batcher' -import type { QueuerState } from './queuer' -import type { RateLimiterState } from './rate-limiter' -import type { ThrottlerState } from './throttler' - -type WithKey = T & { key: string } +import type { AsyncBatcher } from './async-batcher' +import type { AsyncDebouncer } from './async-debouncer' +import type { AsyncQueuer } from './async-queuer' +import type { AsyncRateLimiter } from './async-rate-limiter' +import type { AsyncThrottler } from './async-throttler' +import type { Debouncer } from './debouncer' +import type { Batcher } from './batcher' +import type { Queuer } from './queuer' +import type { RateLimiter } from './rate-limiter' +import type { Throttler } from './throttler' export interface PacerEventMap { - 'pacer:async-batcher-state': WithKey> - 'pacer:async-debouncer-state': WithKey> - 'pacer:async-queuer-state': WithKey> - 'pacer:async-rate-limiter-state': WithKey> - 'pacer:async-throttler-state': WithKey> - 'pacer:batcher-state': WithKey> - 'pacer:debouncer-state': WithKey> - 'pacer:queuer-state': WithKey> - 'pacer:rate-limiter-state': WithKey - 'pacer:throttler-state': WithKey> + 'pacer:async-batcher': AsyncBatcher + 'pacer:async-debouncer': AsyncDebouncer + 'pacer:async-queuer': AsyncQueuer + 'pacer:async-rate-limiter': AsyncRateLimiter + 'pacer:async-throttler': AsyncThrottler + 'pacer:batcher': Batcher + 'pacer:debouncer': Debouncer + 'pacer:queuer': Queuer + 'pacer:rate-limiter': RateLimiter + 'pacer:throttler': Throttler } class PacerEventClient extends EventClient { @@ -43,7 +41,7 @@ export const emitChange = < : never, >( event: TSuffix, - payload: PacerEventMap[`pacer:${TSuffix}`] & { key: string }, + payload: PacerEventMap[`pacer:${TSuffix}`], ) => { pacerEventClient.emit(event, payload) } diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index 0d095463..c0682ea7 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -306,20 +306,17 @@ export class Queuer { const isIdle = isRunning && isEmpty const status = isIdle ? 'idle' : isRunning ? 'running' : 'stopped' - const finalState = { + + return { ...combinedState, isEmpty, isFull, isIdle, size, status, - } as const - emitChange('queuer-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('queuer', this) } /** diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index a894b0e2..6aa77835 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -176,17 +176,13 @@ export class RateLimiter { : isExceeded ? 'exceeded' : 'idle' - const finalState = { + return { ...combinedState, isExceeded, status, - } as const - emitChange('rate-limiter-state', { - ...finalState, - key: this.key, - }) - return finalState + } }) + emitChange('rate-limiter', this) } /** diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index d0fcc956..664350fd 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -168,20 +168,16 @@ export class Throttler { ...newState, } const { isPending } = combinedState - const finalState = { + return { ...combinedState, status: !this.#getEnabled() ? 'disabled' : isPending ? 'pending' : 'idle', - } as const - emitChange('throttler-state', { - ...finalState, - key: this.key ?? '', - }) - return finalState + } }) + emitChange('throttler', this) } #getEnabled = (): boolean => { From dd527a0aa861448894dfce2a953091dca79cf7b5 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Wed, 13 Aug 2025 17:56:01 -0500 Subject: [PATCH 24/50] add some action buttons to devtools that kind of work --- docs/reference/classes/asyncbatcher.md | 30 ++++- docs/reference/classes/asyncdebouncer.md | 26 +++- docs/reference/classes/asyncqueuer.md | 44 ++++-- docs/reference/classes/asyncratelimiter.md | 26 +++- docs/reference/classes/asyncthrottler.md | 26 +++- docs/reference/classes/batcher.md | 28 +++- docs/reference/classes/debouncer.md | 26 +++- docs/reference/classes/queuer.md | 40 ++++-- docs/reference/classes/ratelimiter.md | 26 +++- docs/reference/classes/throttler.md | 26 +++- docs/reference/functions/asyncbatch.md | 2 +- docs/reference/functions/asyncdebounce.md | 2 +- docs/reference/functions/asyncqueue.md | 2 +- docs/reference/functions/asyncratelimit.md | 2 +- docs/reference/functions/asyncthrottle.md | 2 +- docs/reference/functions/batch.md | 2 +- docs/reference/functions/debounce.md | 2 +- docs/reference/functions/queue.md | 2 +- docs/reference/functions/ratelimit.md | 2 +- docs/reference/functions/throttle.md | 2 +- ...-provider.tsx => PacerContextProvider.tsx} | 72 +++++++++- .../src/{devtools.tsx => PacerDevtools.tsx} | 125 +++++++++++++++++- .../pacer-devtools/src/context/context.ts | 45 ------- .../src/context/use-context-hooks.ts | 13 -- packages/pacer-devtools/src/core.tsx | 2 +- .../pacer-devtools/src/styles/use-styles.ts | 55 ++++++++ packages/pacer/src/async-batcher.ts | 7 +- packages/pacer/src/async-debouncer.ts | 7 +- packages/pacer/src/async-queuer.ts | 7 +- packages/pacer/src/async-rate-limiter.ts | 7 +- packages/pacer/src/async-throttler.ts | 7 +- packages/pacer/src/batcher.ts | 7 +- packages/pacer/src/debouncer.ts | 7 +- packages/pacer/src/queuer.ts | 7 +- packages/pacer/src/rate-limiter.ts | 7 +- packages/pacer/src/throttler.ts | 7 +- 36 files changed, 540 insertions(+), 160 deletions(-) rename packages/pacer-devtools/src/{context/context-provider.tsx => PacerContextProvider.tsx} (69%) rename packages/pacer-devtools/src/{devtools.tsx => PacerDevtools.tsx} (52%) delete mode 100644 packages/pacer-devtools/src/context/context.ts delete mode 100644 packages/pacer-devtools/src/context/use-context-hooks.ts diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index 26dd779a..a1f80a22 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -150,13 +150,29 @@ Defined in: [async-batcher.ts:231](https://github.com/TanStack/pacer/blob/main/p ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [async-batcher.ts:254](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L254) + +Emits a change event for the async batcher instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### addItem() ```ts addItem(item): void ``` -Defined in: [async-batcher.ts:291](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L291) +Defined in: [async-batcher.ts:296](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L296) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -179,7 +195,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [async-batcher.ts:392](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L392) +Defined in: [async-batcher.ts:397](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L397) Removes all items from the async batcher @@ -195,7 +211,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [async-batcher.ts:366](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L366) +Defined in: [async-batcher.ts:371](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L371) Processes the current batch of items immediately @@ -211,7 +227,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [async-batcher.ts:374](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L374) +Defined in: [async-batcher.ts:379](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L379) Returns a copy of all items in the async batcher @@ -227,7 +243,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [async-batcher.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L378) +Defined in: [async-batcher.ts:383](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L383) #### Returns @@ -241,7 +257,7 @@ Defined in: [async-batcher.ts:378](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:399](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L399) +Defined in: [async-batcher.ts:404](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L404) Resets the async batcher state to its default values @@ -257,7 +273,7 @@ Resets the async batcher state to its default values setOptions(newOptions): void ``` -Defined in: [async-batcher.ts:254](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L254) +Defined in: [async-batcher.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L259) Updates the async batcher options diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index d82364e0..6bde6b40 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -124,13 +124,29 @@ Defined in: [async-debouncer.ts:184](https://github.com/TanStack/pacer/blob/main ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [async-debouncer.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L211) + +Emits a change event for the async debouncer instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### cancel() ```ts cancel(): void ``` -Defined in: [async-debouncer.ts:396](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L396) +Defined in: [async-debouncer.ts:401](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L401) Cancels any pending execution or aborts any execution in progress @@ -146,7 +162,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-debouncer.ts:348](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L348) +Defined in: [async-debouncer.ts:353](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L353) Processes the current pending execution immediately @@ -162,7 +178,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-debouncer.ts:271](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L271) +Defined in: [async-debouncer.ts:276](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L276) Attempts to execute the debounced function. If a call is already in progress, it will be queued. @@ -198,7 +214,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [async-debouncer.ts:405](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L405) +Defined in: [async-debouncer.ts:410](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L410) Resets the debouncer state to its default values @@ -214,7 +230,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-debouncer.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L211) +Defined in: [async-debouncer.ts:216](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L216) Updates the async debouncer options diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index 603b5f90..bc863010 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -139,6 +139,22 @@ Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/pa ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [async-queuer.ts:307](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L307) + +Emits a change event for the async queuer instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### addItem() ```ts @@ -148,7 +164,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [async-queuer.ts:410](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L410) +Defined in: [async-queuer.ts:415](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L415) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -186,7 +202,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [async-queuer.ts:714](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L714) +Defined in: [async-queuer.ts:719](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L719) Removes all pending items from the queue. Does not affect active tasks. @@ -202,7 +218,7 @@ Removes all pending items from the queue. Does not affect active tasks. execute(position?): Promise ``` -Defined in: [async-queuer.ts:536](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L536) +Defined in: [async-queuer.ts:541](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L541) Removes and returns the next item from the queue and executes the task function with it. @@ -232,7 +248,7 @@ queuer.execute('back'); flush(numberOfItems, position?): Promise ``` -Defined in: [async-queuer.ts:571](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L571) +Defined in: [async-queuer.ts:576](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L576) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -259,7 +275,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): Promise ``` -Defined in: [async-queuer.ts:585](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L585) +Defined in: [async-queuer.ts:590](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L590) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -282,7 +298,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:489](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L489) +Defined in: [async-queuer.ts:494](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L494) Removes and returns the next item from the queue without executing the task function. Use for manual queue management. Normally, use execute() to process items. @@ -314,7 +330,7 @@ queuer.getNextItem('back'); peekActiveItems(): TValue[] ``` -Defined in: [async-queuer.ts:677](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L677) +Defined in: [async-queuer.ts:682](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L682) Returns the items currently being processed (active tasks). @@ -330,7 +346,7 @@ Returns the items currently being processed (active tasks). peekAllItems(): TValue[] ``` -Defined in: [async-queuer.ts:670](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L670) +Defined in: [async-queuer.ts:675](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L675) Returns a copy of all items in the queue, including active and pending items. @@ -346,7 +362,7 @@ Returns a copy of all items in the queue, including active and pending items. peekNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:660](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L660) +Defined in: [async-queuer.ts:665](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L665) Returns the next item in the queue without removing it. @@ -375,7 +391,7 @@ queuer.peekNextItem('back'); // back peekPendingItems(): TValue[] ``` -Defined in: [async-queuer.ts:684](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L684) +Defined in: [async-queuer.ts:689](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L689) Returns the items waiting to be processed (pending tasks). @@ -391,7 +407,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [async-queuer.ts:722](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L722) +Defined in: [async-queuer.ts:727](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L727) Resets the queuer state to its default values @@ -407,7 +423,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [async-queuer.ts:307](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L307) +Defined in: [async-queuer.ts:312](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L312) Updates the queuer options. New options are merged with existing options. @@ -429,7 +445,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [async-queuer.ts:691](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L691) +Defined in: [async-queuer.ts:696](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L696) Starts processing items in the queue. If already running, does nothing. @@ -445,7 +461,7 @@ Starts processing items in the queue. If already running, does nothing. stop(): void ``` -Defined in: [async-queuer.ts:701](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L701) +Defined in: [async-queuer.ts:706](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L706) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index 9e5ffbd7..35eb441b 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -145,13 +145,29 @@ Defined in: [async-rate-limiter.ts:212](https://github.com/TanStack/pacer/blob/m ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [async-rate-limiter.ts:238](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L238) + +Emits a change event for the async rate limiter instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### getMsUntilNextWindow() ```ts getMsUntilNextWindow(): number ``` -Defined in: [async-rate-limiter.ts:442](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L442) +Defined in: [async-rate-limiter.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L447) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -169,7 +185,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [async-rate-limiter.ts:432](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L432) +Defined in: [async-rate-limiter.ts:437](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L437) Returns the number of remaining executions allowed in the current window @@ -185,7 +201,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [async-rate-limiter.ts:311](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L311) +Defined in: [async-rate-limiter.ts:316](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L316) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -233,7 +249,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [async-rate-limiter.ts:453](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L453) +Defined in: [async-rate-limiter.ts:458](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L458) Resets the rate limiter state @@ -249,7 +265,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [async-rate-limiter.ts:238](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L238) +Defined in: [async-rate-limiter.ts:243](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L243) Updates the async rate limiter options diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index c9326469..0e77cf65 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -127,13 +127,29 @@ Defined in: [async-throttler.ts:195](https://github.com/TanStack/pacer/blob/main ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [async-throttler.ts:222](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L222) + +Emits a change event for the async throttler instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### cancel() ```ts cancel(): void ``` -Defined in: [async-throttler.ts:431](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L431) +Defined in: [async-throttler.ts:436](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L436) Cancels any pending execution or aborts any execution in progress @@ -149,7 +165,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-throttler.ts:380](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L380) +Defined in: [async-throttler.ts:385](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L385) Processes the current pending execution immediately @@ -165,7 +181,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-throttler.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L290) +Defined in: [async-throttler.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L295) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -207,7 +223,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [async-throttler.ts:439](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L439) +Defined in: [async-throttler.ts:444](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L444) Resets the debouncer state to its default values @@ -223,7 +239,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-throttler.ts:222](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L222) +Defined in: [async-throttler.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L227) Updates the async throttler options diff --git a/docs/reference/classes/batcher.md b/docs/reference/classes/batcher.md index 0f6d2ddd..e7416364 100644 --- a/docs/reference/classes/batcher.md +++ b/docs/reference/classes/batcher.md @@ -127,13 +127,29 @@ Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/package ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [batcher.ts:167](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L167) + +Emits a change event for the batcher instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### addItem() ```ts addItem(item): void ``` -Defined in: [batcher.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L198) +Defined in: [batcher.ts:203](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L203) Adds an item to the batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -156,7 +172,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [batcher.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L268) +Defined in: [batcher.ts:273](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L273) Removes all items from the batcher @@ -172,7 +188,7 @@ Removes all items from the batcher flush(): void ``` -Defined in: [batcher.ts:246](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L246) +Defined in: [batcher.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L251) Processes the current batch of items immediately @@ -188,7 +204,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [batcher.ts:254](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L254) +Defined in: [batcher.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L259) Returns a copy of all items in the batcher @@ -204,7 +220,7 @@ Returns a copy of all items in the batcher reset(): void ``` -Defined in: [batcher.ts:275](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L275) +Defined in: [batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L280) Resets the batcher state to its default values @@ -220,7 +236,7 @@ Resets the batcher state to its default values setOptions(newOptions): void ``` -Defined in: [batcher.ts:167](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L167) +Defined in: [batcher.ts:172](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L172) Updates the batcher options diff --git a/docs/reference/classes/debouncer.md b/docs/reference/classes/debouncer.md index f46cc32b..03055b97 100644 --- a/docs/reference/classes/debouncer.md +++ b/docs/reference/classes/debouncer.md @@ -110,13 +110,29 @@ Defined in: [debouncer.ts:125](https://github.com/TanStack/pacer/blob/main/packa ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [debouncer.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L147) + +Emits a change event for the debouncer instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### cancel() ```ts cancel(): void ``` -Defined in: [debouncer.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L252) +Defined in: [debouncer.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L257) Cancels any pending execution @@ -132,7 +148,7 @@ Cancels any pending execution flush(): void ``` -Defined in: [debouncer.ts:235](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L235) +Defined in: [debouncer.ts:240](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L240) Processes the current pending execution immediately @@ -148,7 +164,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [debouncer.ts:193](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L193) +Defined in: [debouncer.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L198) Attempts to execute the debounced function If a call is already in progress, it will be queued @@ -171,7 +187,7 @@ If a call is already in progress, it will be queued reset(): void ``` -Defined in: [debouncer.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L263) +Defined in: [debouncer.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L268) Resets the debouncer state to its default values @@ -187,7 +203,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [debouncer.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L147) +Defined in: [debouncer.ts:152](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L152) Updates the debouncer options diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index e97b616f..14402b81 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -160,6 +160,22 @@ Defined in: [queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [queuer.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L290) + +Emits a change event for the queuer instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### addItem() ```ts @@ -169,7 +185,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [queuer.ts:374](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L374) +Defined in: [queuer.ts:379](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L379) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -208,7 +224,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [queuer.ts:647](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L647) +Defined in: [queuer.ts:652](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L652) Removes all pending items from the queue. Does not affect items being processed. @@ -224,7 +240,7 @@ Removes all pending items from the queue. Does not affect items being processed. execute(position?): undefined | TValue ``` -Defined in: [queuer.ts:501](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L501) +Defined in: [queuer.ts:506](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L506) Removes and returns the next item from the queue and processes it using the provided function. @@ -253,7 +269,7 @@ queuer.execute('back'); flush(numberOfItems, position?): void ``` -Defined in: [queuer.ts:517](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L517) +Defined in: [queuer.ts:522](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L522) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -280,7 +296,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [queuer.ts:532](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L532) +Defined in: [queuer.ts:537](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L537) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -303,7 +319,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:454](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L454) +Defined in: [queuer.ts:459](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L459) Removes and returns the next item from the queue without executing the function. Use for manual queue management. Normally, use execute() to process items. @@ -334,7 +350,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [queuer.ts:615](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L615) +Defined in: [queuer.ts:620](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L620) Returns a copy of all items in the queue. @@ -350,7 +366,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:605](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L605) +Defined in: [queuer.ts:610](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L610) Returns the next item in the queue without removing it. @@ -378,7 +394,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [queuer.ts:655](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L655) +Defined in: [queuer.ts:660](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L660) Resets the queuer state to its default values @@ -394,7 +410,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [queuer.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L290) +Defined in: [queuer.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L295) Updates the queuer options. New options are merged with existing options. @@ -416,7 +432,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [queuer.ts:622](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L622) +Defined in: [queuer.ts:627](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L627) Starts processing items in the queue. If already isRunning, does nothing. @@ -432,7 +448,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [queuer.ts:632](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L632) +Defined in: [queuer.ts:637](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L637) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/ratelimiter.md b/docs/reference/classes/ratelimiter.md index 84126c23..eb985ec1 100644 --- a/docs/reference/classes/ratelimiter.md +++ b/docs/reference/classes/ratelimiter.md @@ -123,13 +123,29 @@ Defined in: [rate-limiter.ts:139](https://github.com/TanStack/pacer/blob/main/pa ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [rate-limiter.ts:163](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L163) + +Emits a change event for the rate limiter instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### getMsUntilNextWindow() ```ts getMsUntilNextWindow(): number ``` -Defined in: [rate-limiter.ts:326](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L326) +Defined in: [rate-limiter.ts:331](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L331) Returns the number of milliseconds until the next execution will be possible @@ -145,7 +161,7 @@ Returns the number of milliseconds until the next execution will be possible getRemainingInWindow(): number ``` -Defined in: [rate-limiter.ts:318](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L318) +Defined in: [rate-limiter.ts:323](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L323) Returns the number of remaining executions allowed in the current window @@ -161,7 +177,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): boolean ``` -Defined in: [rate-limiter.ts:224](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L224) +Defined in: [rate-limiter.ts:229](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L229) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -196,7 +212,7 @@ rateLimiter.maybeExecute('arg1', 'arg2'); // false reset(): void ``` -Defined in: [rate-limiter.ts:337](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L337) +Defined in: [rate-limiter.ts:342](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L342) Resets the rate limiter state @@ -212,7 +228,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [rate-limiter.ts:163](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L163) +Defined in: [rate-limiter.ts:168](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L168) Updates the rate limiter options diff --git a/docs/reference/classes/throttler.md b/docs/reference/classes/throttler.md index b4792751..8829be02 100644 --- a/docs/reference/classes/throttler.md +++ b/docs/reference/classes/throttler.md @@ -114,13 +114,29 @@ Defined in: [throttler.ts:133](https://github.com/TanStack/pacer/blob/main/packa ## Methods +### \_emit() + +```ts +_emit(): void +``` + +Defined in: [throttler.ts:155](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L155) + +Emits a change event for the throttler instance. Mostly useful for devtools. + +#### Returns + +`void` + +*** + ### cancel() ```ts cancel(): void ``` -Defined in: [throttler.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L290) +Defined in: [throttler.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L295) Cancels any pending trailing execution and clears internal state. @@ -142,7 +158,7 @@ Has no effect if there is no pending execution. flush(): void ``` -Defined in: [throttler.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L268) +Defined in: [throttler.ts:273](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L273) Processes the current pending execution immediately @@ -158,7 +174,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [throttler.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L213) +Defined in: [throttler.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L218) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -200,7 +216,7 @@ throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [throttler.ts:301](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L301) +Defined in: [throttler.ts:306](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L306) Resets the throttler state to its default values @@ -216,7 +232,7 @@ Resets the throttler state to its default values setOptions(newOptions): void ``` -Defined in: [throttler.ts:155](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L155) +Defined in: [throttler.ts:160](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L160) Updates the throttler options diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index ad096c15..63dd5c44 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,7 +11,7 @@ title: asyncBatch function asyncBatch(fn, options): (item) => void ``` -Defined in: [async-batcher.ts:454](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L454) +Defined in: [async-batcher.ts:459](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L459) Creates an async batcher that processes items in batches diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index f0f8a98e..24c4ceda 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,7 +11,7 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-debouncer.ts:454](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L454) +Defined in: [async-debouncer.ts:459](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L459) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index ba6b1a8e..6b00fe41 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,7 +11,7 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [async-queuer.ts:761](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L761) +Defined in: [async-queuer.ts:766](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L766) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index bca39308..49704cdd 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,7 +11,7 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-rate-limiter.ts:524](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L524) +Defined in: [async-rate-limiter.ts:529](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L529) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index 54d9e24d..7b45875e 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,7 +11,7 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-throttler.ts:487](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L487) +Defined in: [async-throttler.ts:492](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L492) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md index fb10894c..26b75d6d 100644 --- a/docs/reference/functions/batch.md +++ b/docs/reference/functions/batch.md @@ -11,7 +11,7 @@ title: batch function batch(fn, options): (item) => void ``` -Defined in: [batcher.ts:299](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L299) +Defined in: [batcher.ts:304](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L304) Creates a batcher that processes items in batches diff --git a/docs/reference/functions/debounce.md b/docs/reference/functions/debounce.md index f1cd1af5..46ced8d6 100644 --- a/docs/reference/functions/debounce.md +++ b/docs/reference/functions/debounce.md @@ -11,7 +11,7 @@ title: debounce function debounce(fn, initialOptions): (...args) => void ``` -Defined in: [debouncer.ts:296](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L296) +Defined in: [debouncer.ts:301](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L301) Creates a debounced function that delays invoking the provided function until after a specified wait time. Multiple calls during the wait period will cancel previous pending invocations and reset the timer. diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index 7b4c8d9f..35a7bafe 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -11,7 +11,7 @@ title: queue function queue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [queuer.ts:698](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L698) +Defined in: [queuer.ts:703](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L703) Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. diff --git a/docs/reference/functions/ratelimit.md b/docs/reference/functions/ratelimit.md index a7fe3b80..82410092 100644 --- a/docs/reference/functions/ratelimit.md +++ b/docs/reference/functions/ratelimit.md @@ -11,7 +11,7 @@ title: rateLimit function rateLimit(fn, initialOptions): (...args) => boolean ``` -Defined in: [rate-limiter.ts:389](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L389) +Defined in: [rate-limiter.ts:394](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L394) Creates a rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/throttle.md b/docs/reference/functions/throttle.md index 4958ebd2..3e5d08f4 100644 --- a/docs/reference/functions/throttle.md +++ b/docs/reference/functions/throttle.md @@ -11,7 +11,7 @@ title: throttle function throttle(fn, initialOptions): (...args) => void ``` -Defined in: [throttler.ts:340](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L340) +Defined in: [throttler.ts:345](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L345) Creates a throttled function that limits how often the provided function can execute. diff --git a/packages/pacer-devtools/src/context/context-provider.tsx b/packages/pacer-devtools/src/PacerContextProvider.tsx similarity index 69% rename from packages/pacer-devtools/src/context/context-provider.tsx rename to packages/pacer-devtools/src/PacerContextProvider.tsx index dccc670f..b8401a66 100644 --- a/packages/pacer-devtools/src/context/context-provider.tsx +++ b/packages/pacer-devtools/src/PacerContextProvider.tsx @@ -1,8 +1,53 @@ import { createStore } from 'solid-js/store' -import { createEffect, onCleanup } from 'solid-js' -import { pacerEventClient } from '@tanstack/pacer' -import { PacerContext, initialStore } from './context' -import type { PacerContextType } from './context' +import { createContext, createEffect, onCleanup, useContext } from 'solid-js' +import { pacerEventClient } from '@tanstack/pacer/event-client' +import type { + AsyncBatcher, + AsyncDebouncer, + AsyncQueuer, + AsyncRateLimiter, + AsyncThrottler, + Batcher, + Debouncer, + Queuer, + RateLimiter, + Throttler, +} from '@tanstack/pacer' + +interface PacerDevtoolsContextType { + asyncBatchers: Array> + asyncDebouncers: Array> + asyncQueuers: Array> + asyncRateLimiters: Array> + asyncThrottlers: Array> + batchers: Array> + debouncers: Array> + queuers: Array> + rateLimiters: Array> + throttlers: Array> + lastUpdatedByKey: Record +} + +const initialPacerDevtoolsStore = { + asyncBatchers: [], + asyncDebouncers: [], + asyncQueuers: [], + asyncRateLimiters: [], + asyncThrottlers: [], + batchers: [], + debouncers: [], + queuers: [], + rateLimiters: [], + throttlers: [], + lastUpdatedByKey: {}, +} + +const PacerDevtoolsContext = createContext< + [ + PacerDevtoolsContextType, + (newState: Partial) => void, + ] +>([initialPacerDevtoolsStore, () => {}]) const updateOrAddToArray = ( oldArray: Array, @@ -18,7 +63,9 @@ const updateOrAddToArray = ( } export function PacerContextProvider(props: { children: any }) { - const [store, setStore] = createStore(initialStore) + const [store, setStore] = createStore( + initialPacerDevtoolsStore, + ) createEffect(() => { const cleanup = pacerEventClient.onAllPluginEvents((_e) => { @@ -138,8 +185,19 @@ export function PacerContextProvider(props: { children: any }) { onCleanup(cleanup) }) return ( - + {props.children} - + ) } + +const usePacerDevtoolsContext = () => { + const context = useContext(PacerDevtoolsContext) + + return context +} + +export const usePacerDevtoolsState = () => { + const [state] = usePacerDevtoolsContext() + return state +} diff --git a/packages/pacer-devtools/src/devtools.tsx b/packages/pacer-devtools/src/PacerDevtools.tsx similarity index 52% rename from packages/pacer-devtools/src/devtools.tsx rename to packages/pacer-devtools/src/PacerDevtools.tsx index c5220ebb..e511b432 100644 --- a/packages/pacer-devtools/src/devtools.tsx +++ b/packages/pacer-devtools/src/PacerDevtools.tsx @@ -1,8 +1,10 @@ import { For, createMemo, createSignal } from 'solid-js' import clsx from 'clsx' import { JsonTree } from '@tanstack/devtools-ui' -import { usePacerState } from './context/use-context-hooks' -import { PacerContextProvider } from './context/context-provider' +import { + PacerContextProvider, + usePacerDevtoolsState, +} from './PacerContextProvider' import { useStyles } from './styles/use-styles' type StateKey = @@ -62,7 +64,7 @@ const UTIL_GROUPS: Array = [ function Shell() { const styles = useStyles() - const state = usePacerState() + const state = usePacerDevtoolsState() const [selectedKey, setSelectedKey] = createSignal(null) const getGroupItems = (key: StateKey) => (state as unknown as Record>)[key] @@ -152,7 +154,120 @@ function Shell() {
Actions
-
No actions yet
+ {(() => { + const inst: any = entry.instance + const state = inst?.store?.state + const hasPending = state && 'isPending' in state + const hasEmpty = state && 'isEmpty' in state + const isPending = hasPending ? !!state.isPending : false + const isEmpty = hasEmpty ? state.isEmpty : undefined + + // Check which methods are available + const hasFlush = typeof inst.flush === 'function' + const hasCancel = typeof inst.cancel === 'function' + const hasReset = typeof inst.reset === 'function' + const hasClear = typeof inst.clear === 'function' + + // Determine if this is a debouncer/throttler (has isPending) + const isDebounceThrottleLike = hasPending + + // No actions if no methods available + if ( + !hasPending && + !hasFlush && + !hasCancel && + !hasReset && + !hasClear + ) { + return ( +
+ No actions available for this util +
+ ) + } + + const togglePending = () => { + const next = !isPending + inst.store.setState((prev: any) => ({ + ...prev, + isPending: next, + })) + } + + return ( +
+ {hasPending && ( + + )} + {hasFlush && ( + + )} + {hasCancel && ( + + )} + {hasReset && ( + + )} + {hasClear && ( + + )} +
+ ) + })()}
@@ -183,7 +298,7 @@ function Shell() { ) } -export default function Devtools() { +export default function PacerDevtools() { return ( diff --git a/packages/pacer-devtools/src/context/context.ts b/packages/pacer-devtools/src/context/context.ts deleted file mode 100644 index e1b74e65..00000000 --- a/packages/pacer-devtools/src/context/context.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { createContext } from 'solid-js' -import type { - AsyncBatcher, - AsyncDebouncer, - AsyncQueuer, - AsyncRateLimiter, - AsyncThrottler, - Batcher, - Debouncer, - Queuer, - RateLimiter, - Throttler, -} from '@tanstack/pacer' - -export interface PacerContextType { - asyncBatchers: Array> - asyncDebouncers: Array> - asyncQueuers: Array> - asyncRateLimiters: Array> - asyncThrottlers: Array> - batchers: Array> - debouncers: Array> - queuers: Array> - rateLimiters: Array> - throttlers: Array> - lastUpdatedByKey: Record -} - -export const initialStore = { - asyncBatchers: [], - asyncDebouncers: [], - asyncQueuers: [], - asyncRateLimiters: [], - asyncThrottlers: [], - batchers: [], - debouncers: [], - queuers: [], - rateLimiters: [], - throttlers: [], - lastUpdatedByKey: {}, -} - -export const PacerContext = createContext< - [PacerContextType, (newState: Partial) => void] ->([initialStore, () => {}]) diff --git a/packages/pacer-devtools/src/context/use-context-hooks.ts b/packages/pacer-devtools/src/context/use-context-hooks.ts deleted file mode 100644 index 85617722..00000000 --- a/packages/pacer-devtools/src/context/use-context-hooks.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useContext } from 'solid-js' -import { PacerContext } from './context' - -const usePacerContext = () => { - const context = useContext(PacerContext) - - return context -} - -export const usePacerState = () => { - const [state] = usePacerContext() - return state -} diff --git a/packages/pacer-devtools/src/core.tsx b/packages/pacer-devtools/src/core.tsx index af026f1c..add2f38e 100644 --- a/packages/pacer-devtools/src/core.tsx +++ b/packages/pacer-devtools/src/core.tsx @@ -16,7 +16,7 @@ export class PacerDevtoolsCore { } const mountTo = el const dispose = render(() => { - this.#Component = lazy(() => import('./devtools')) + this.#Component = lazy(() => import('./PacerDevtools')) const Devtools = this.#Component return ( diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index a1128720..ac6448d4 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -182,6 +182,61 @@ const stylesFactory = () => { text-transform: uppercase; letter-spacing: 0.04em; `, + actionsRow: css` + display: flex; + flex-wrap: wrap; + gap: ${size[2]}; + `, + actionButton: css` + display: inline-flex; + align-items: center; + gap: ${size[1]}; + padding: ${size[1]} ${size[2]}; + border-radius: ${border.radius.md}; + border: 1px solid ${colors.darkGray[500]}; + background: ${colors.darkGray[600]}; + color: ${colors.gray[100]}; + font-size: ${fontSize.xs}; + cursor: pointer; + user-select: none; + transition: + background 0.15s, + border-color 0.15s; + &:hover { + background: ${colors.darkGray[500]}; + border-color: ${colors.darkGray[400]}; + } + `, + actionDotBlue: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.blue[400]}; + `, + actionDotGreen: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.green[400]}; + `, + actionDotRed: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.red[400]}; + `, + actionDotYellow: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.yellow[400]}; + `, + actionDotOrange: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.pink[400]}; + `, infoGrid: css` display: grid; grid-template-columns: auto 1fr; diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 63b69de1..f01581aa 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -248,6 +248,11 @@ export class AsyncBatcher { this.#setState(this.options.initialState ?? {}) } + /** + * Emits a change event for the async batcher instance. Mostly useful for devtools. + */ + _emit = () => emitChange('async-batcher', this) + /** * Updates the async batcher options */ @@ -277,7 +282,7 @@ export class AsyncBatcher { : 'populated', } }) - emitChange('async-batcher', this) + this._emit() } #getWait = (): number => { diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index 52cf1850..fb3c1464 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -205,6 +205,11 @@ export class AsyncDebouncer { this.#setState(this.options.initialState ?? {}) } + /** + * Emits a change event for the async debouncer instance. Mostly useful for devtools. + */ + _emit = () => emitChange('async-debouncer', this) + /** * Updates the async debouncer options */ @@ -237,7 +242,7 @@ export class AsyncDebouncer { : 'idle', } }) - emitChange('async-debouncer', this) + this._emit() } /** diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index bc353ea9..1732ef00 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -301,6 +301,11 @@ export class AsyncQueuer { } } + /** + * Emits a change event for the async queuer instance. Mostly useful for devtools. + */ + _emit = () => emitChange('async-queuer', this) + /** * Updates the queuer options. New options are merged with existing options. */ @@ -333,7 +338,7 @@ export class AsyncQueuer { status, } }) - emitChange('async-queuer', this) + this._emit() } /** diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index 3f8569a7..22513116 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -232,6 +232,11 @@ export class AsyncRateLimiter { } } + /** + * Emits a change event for the async rate limiter instance. Mostly useful for devtools. + */ + _emit = () => emitChange('async-rate-limiter', this) + /** * Updates the async rate limiter options */ @@ -259,7 +264,7 @@ export class AsyncRateLimiter { status, } }) - emitChange('async-rate-limiter', this) + this._emit() } /** diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index 1a25c59b..ef7d7425 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -216,6 +216,11 @@ export class AsyncThrottler { this.#setState(this.options.initialState ?? {}) } + /** + * Emits a change event for the async throttler instance. Mostly useful for devtools. + */ + _emit = () => emitChange('async-throttler', this) + /** * Updates the async throttler options */ @@ -248,7 +253,7 @@ export class AsyncThrottler { : 'idle', } }) - emitChange('async-throttler', this) + this._emit() } /** diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index 09855fc8..6b3f840c 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -161,6 +161,11 @@ export class Batcher { this.#setState(this.options.initialState ?? {}) } + /** + * Emits a change event for the batcher instance. Mostly useful for devtools. + */ + _emit = () => emitChange('batcher', this) + /** * Updates the batcher options */ @@ -184,7 +189,7 @@ export class Batcher { status: isPending ? 'pending' : 'idle', } }) - emitChange('batcher', this) + this._emit() } #getWait = (): number => { diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index 29318637..063df6fc 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -141,6 +141,11 @@ export class Debouncer { this.#setState(this.options.initialState ?? {}) } + /** + * Emits a change event for the debouncer instance. Mostly useful for devtools. + */ + _emit = () => emitChange('debouncer', this) + /** * Updates the debouncer options */ @@ -169,7 +174,7 @@ export class Debouncer { : 'idle', } }) - emitChange('debouncer', this) + this._emit() } /** diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index c0682ea7..07393842 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -284,6 +284,11 @@ export class Queuer { } } + /** + * Emits a change event for the queuer instance. Mostly useful for devtools. + */ + _emit = () => emitChange('queuer', this) + /** * Updates the queuer options. New options are merged with existing options. */ @@ -316,7 +321,7 @@ export class Queuer { status, } }) - emitChange('queuer', this) + this._emit() } /** diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index 6aa77835..de9b21e2 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -157,6 +157,11 @@ export class RateLimiter { } } + /** + * Emits a change event for the rate limiter instance. Mostly useful for devtools. + */ + _emit = () => emitChange('rate-limiter', this) + /** * Updates the rate limiter options */ @@ -182,7 +187,7 @@ export class RateLimiter { status, } }) - emitChange('rate-limiter', this) + this._emit() } /** diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index 664350fd..278ae788 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -149,6 +149,11 @@ export class Throttler { this.#setState(this.options.initialState ?? {}) } + /** + * Emits a change event for the throttler instance. Mostly useful for devtools. + */ + _emit = () => emitChange('throttler', this) + /** * Updates the throttler options */ @@ -177,7 +182,7 @@ export class Throttler { : 'idle', } }) - emitChange('throttler', this) + this._emit() } #getEnabled = (): boolean => { From f088dc8bb4a0868d0d2cdbfe741c30ce8a02cd35 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Thu, 14 Aug 2025 17:30:31 -0500 Subject: [PATCH 25/50] event bus goes both ways --- examples/react/asyncBatch/package.json | 6 +- examples/react/asyncDebounce/package.json | 6 +- examples/react/asyncRateLimit/package.json | 6 +- examples/react/asyncThrottle/package.json | 6 +- examples/react/batch/package.json | 6 +- examples/react/debounce/package.json | 6 +- examples/react/queue/package.json | 8 +- examples/react/queue/src/index.tsx | 4 +- examples/react/rateLimit/package.json | 6 +- .../package.json | 10 +- .../react-query-queued-prefetch/package.json | 10 +- .../package.json | 10 +- examples/react/throttle/package.json | 6 +- .../useAsyncBatchedCallback/package.json | 6 +- examples/react/useAsyncBatcher/package.json | 6 +- .../useAsyncDebouncedCallback/package.json | 6 +- examples/react/useAsyncDebouncer/package.json | 6 +- .../react/useAsyncQueuedState/package.json | 6 +- examples/react/useAsyncQueuer/package.json | 6 +- .../react/useAsyncRateLimiter/package.json | 6 +- .../package.json | 6 +- examples/react/useAsyncThrottler/package.json | 6 +- .../react/useBatchedCallback/package.json | 6 +- examples/react/useBatcher/package.json | 6 +- .../react/useDebouncedCallback/package.json | 6 +- examples/react/useDebouncedState/package.json | 6 +- examples/react/useDebouncedValue/package.json | 6 +- examples/react/useDebouncer/package.json | 6 +- examples/react/useQueuedState/package.json | 6 +- examples/react/useQueuedValue/package.json | 6 +- examples/react/useQueuer/package.json | 6 +- .../react/useQueuerWithPersister/package.json | 6 +- .../react/useRateLimitedCallback/package.json | 6 +- .../react/useRateLimitedState/package.json | 6 +- .../react/useRateLimitedValue/package.json | 6 +- examples/react/useRateLimiter/package.json | 6 +- .../useRateLimiterWithPersister/package.json | 6 +- .../react/useThrottledCallback/package.json | 6 +- examples/react/useThrottledState/package.json | 6 +- examples/react/useThrottledValue/package.json | 6 +- examples/react/useThrottler/package.json | 6 +- examples/react/util-comparison/package.json | 8 +- examples/react/util-comparison/src/index.tsx | 4 +- examples/solid/asyncBatch/package.json | 4 +- examples/solid/asyncDebounce/package.json | 4 +- examples/solid/asyncRateLimit/package.json | 4 +- examples/solid/asyncThrottle/package.json | 4 +- examples/solid/batch/package.json | 4 +- .../solid/createAsyncBatcher/package.json | 4 +- .../solid/createAsyncDebouncer/package.json | 4 +- examples/solid/createAsyncQueuer/package.json | 4 +- .../solid/createAsyncRateLimiter/package.json | 4 +- .../solid/createAsyncThrottler/package.json | 4 +- examples/solid/createBatcher/package.json | 4 +- .../solid/createDebouncedSignal/package.json | 4 +- .../solid/createDebouncedValue/package.json | 4 +- examples/solid/createDebouncer/package.json | 4 +- examples/solid/createQueuer/package.json | 4 +- .../createRateLimitedSignal/package.json | 4 +- .../solid/createRateLimitedValue/package.json | 4 +- examples/solid/createRateLimiter/package.json | 4 +- .../solid/createThrottledSignal/package.json | 4 +- .../solid/createThrottledValue/package.json | 4 +- examples/solid/createThrottler/package.json | 4 +- examples/solid/debounce/package.json | 4 +- examples/solid/queue/package.json | 4 +- examples/solid/rateLimit/package.json | 4 +- examples/solid/throttle/package.json | 4 +- package.json | 10 +- packages/pacer-devtools/package.json | 2 +- .../src/PacerContextProvider.tsx | 20 +- packages/pacer-devtools/src/PacerDevtools.tsx | 58 +- .../pacer-devtools/src/styles/use-styles.ts | 6 + packages/pacer/src/async-batcher.ts | 2 +- packages/pacer/src/async-debouncer.ts | 2 +- packages/pacer/src/async-queuer.ts | 2 +- packages/pacer/src/async-rate-limiter.ts | 2 +- packages/pacer/src/async-throttler.ts | 2 +- packages/pacer/src/batcher.ts | 2 +- packages/pacer/src/debouncer.ts | 2 +- packages/pacer/src/event-client.ts | 30 +- packages/pacer/src/queuer.ts | 11 +- packages/pacer/src/rate-limiter.ts | 2 +- packages/pacer/src/throttler.ts | 2 +- packages/react-pacer-devtools/package.json | 4 +- packages/react-pacer/package.json | 6 +- packages/solid-pacer/package.json | 2 +- pnpm-lock.yaml | 1964 +++++++++-------- 88 files changed, 1350 insertions(+), 1151 deletions(-) diff --git a/examples/react/asyncBatch/package.json b/examples/react/asyncBatch/package.json index 0b8cc9e8..52ede284 100644 --- a/examples/react/asyncBatch/package.json +++ b/examples/react/asyncBatch/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.9", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^4.7.0", - "vite": "^7.0.6" + "@vitejs/plugin-react": "^5.0.0", + "vite": "^7.1.2" }, "browserslist": { "production": [ diff --git a/examples/react/asyncDebounce/package.json b/examples/react/asyncDebounce/package.json index c4d1ef09..91e0bd46 100644 --- a/examples/react/asyncDebounce/package.json +++ b/examples/react/asyncDebounce/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.9", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^4.7.0", - "vite": "^7.0.6" + "@vitejs/plugin-react": "^5.0.0", + "vite": "^7.1.2" }, "browserslist": { "production": [ diff --git a/examples/react/asyncRateLimit/package.json b/examples/react/asyncRateLimit/package.json index 9eda5ca6..9f3aa819 100644 --- a/examples/react/asyncRateLimit/package.json +++ b/examples/react/asyncRateLimit/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.9", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^4.7.0", - "vite": "^7.0.6" + "@vitejs/plugin-react": "^5.0.0", + "vite": "^7.1.2" }, "browserslist": { "production": [ diff --git a/examples/react/asyncThrottle/package.json b/examples/react/asyncThrottle/package.json index 74bc125e..4cba66a8 100644 --- a/examples/react/asyncThrottle/package.json +++ b/examples/react/asyncThrottle/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.9", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^4.7.0", - "vite": "^7.0.6" + "@vitejs/plugin-react": "^5.0.0", + "vite": "^7.1.2" }, "browserslist": { "production": [ diff --git a/examples/react/batch/package.json b/examples/react/batch/package.json index 867045d9..1bea2172 100644 --- a/examples/react/batch/package.json +++ b/examples/react/batch/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.9", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^4.7.0", - "vite": "^7.0.6" + "@vitejs/plugin-react": "^5.0.0", + "vite": "^7.1.2" }, "browserslist": { "production": [ diff --git a/examples/react/debounce/package.json b/examples/react/debounce/package.json index 3f908c9f..000816f0 100644 --- a/examples/react/debounce/package.json +++ b/examples/react/debounce/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.9", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^4.7.0", - "vite": "^7.0.6" + "@vitejs/plugin-react": "^5.0.0", + "vite": "^7.1.2" }, "browserslist": { "production": [ diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index 44fc3f25..48a26382 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -14,12 +14,12 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-devtools": "0.2.2", + "@tanstack/react-devtools": "0.4.0", "@tanstack/react-pacer-devtools": "0.14.0", - "@types/react": "^19.1.9", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^4.7.0", - "vite": "^7.0.6" + "@vitejs/plugin-react": "^5.0.0", + "vite": "^7.1.2" }, "browserslist": { "production": [ diff --git a/examples/react/queue/src/index.tsx b/examples/react/queue/src/index.tsx index 419bee91..8ffb47cd 100644 --- a/examples/react/queue/src/index.tsx +++ b/examples/react/queue/src/index.tsx @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import ReactDOM from 'react-dom/client' import { PacerDevtoolsPanel } from '@tanstack/react-pacer-devtools' -import { TanstackDevtools } from '@tanstack/react-devtools' +import { TanStackDevtools } from '@tanstack/react-devtools' import { queue } from '@tanstack/react-pacer/queuer' function App1() { @@ -213,7 +213,7 @@ root.render(
-
- { const e = _e as unknown as { type: string; payload: any } switch (e.type) { - case 'pacer:async-batcher': { + case 'pacer:AsyncBatcher': { setStore({ asyncBatchers: updateOrAddToArray(store.asyncBatchers, e.payload), lastUpdatedByKey: { @@ -81,7 +81,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:async-debouncer': { + case 'pacer:AsyncDebouncer': { setStore({ asyncDebouncers: updateOrAddToArray( store.asyncDebouncers, @@ -94,7 +94,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:async-queuer': { + case 'pacer:AsyncQueuer': { setStore({ asyncQueuers: updateOrAddToArray(store.asyncQueuers, e.payload), lastUpdatedByKey: { @@ -104,7 +104,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:async-rate-limiter': { + case 'pacer:AsyncRateLimiter': { setStore({ asyncRateLimiters: updateOrAddToArray( store.asyncRateLimiters, @@ -117,7 +117,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:async-throttler': { + case 'pacer:AsyncThrottler': { setStore({ asyncThrottlers: updateOrAddToArray( store.asyncThrottlers, @@ -130,7 +130,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:batcher': { + case 'pacer:Batcher': { setStore({ batchers: updateOrAddToArray(store.batchers, e.payload), lastUpdatedByKey: { @@ -140,7 +140,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:debouncer': { + case 'pacer:Debouncer': { setStore({ debouncers: updateOrAddToArray(store.debouncers, e.payload), lastUpdatedByKey: { @@ -150,7 +150,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:queuer': { + case 'pacer:Queuer': { setStore({ queuers: updateOrAddToArray(store.queuers, e.payload), lastUpdatedByKey: { @@ -160,7 +160,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:rate-limiter': { + case 'pacer:RateLimiter': { setStore({ rateLimiters: updateOrAddToArray(store.rateLimiters, e.payload), lastUpdatedByKey: { @@ -170,7 +170,7 @@ export function PacerContextProvider(props: { children: any }) { }) break } - case 'pacer:throttler': { + case 'pacer:Throttler': { setStore({ throttlers: updateOrAddToArray(store.throttlers, e.payload), lastUpdatedByKey: { diff --git a/packages/pacer-devtools/src/PacerDevtools.tsx b/packages/pacer-devtools/src/PacerDevtools.tsx index e511b432..c2ae3539 100644 --- a/packages/pacer-devtools/src/PacerDevtools.tsx +++ b/packages/pacer-devtools/src/PacerDevtools.tsx @@ -1,6 +1,7 @@ import { For, createMemo, createSignal } from 'solid-js' import clsx from 'clsx' import { JsonTree } from '@tanstack/devtools-ui' +import { pacerEventClient } from '@tanstack/pacer' import { PacerContextProvider, usePacerDevtoolsState, @@ -155,7 +156,10 @@ function Shell() {
Actions
{(() => { - const inst: any = entry.instance + const util = entry.instance + const utilName = entry.type + const emitName = `d-${utilName}` as any + const inst: any = util const state = inst?.store?.state const hasPending = state && 'isPending' in state const hasEmpty = state && 'isEmpty' in state @@ -167,9 +171,14 @@ function Shell() { const hasCancel = typeof inst.cancel === 'function' const hasReset = typeof inst.reset === 'function' const hasClear = typeof inst.clear === 'function' + const hasStart = typeof inst.start === 'function' + const hasStop = typeof inst.stop === 'function' + const hasStartStop = hasStart && hasStop + + // Get running state if available + const isRunning = state?.isRunning ?? true // Determine if this is a debouncer/throttler (has isPending) - const isDebounceThrottleLike = hasPending // No actions if no methods available if ( @@ -201,7 +210,7 @@ function Shell() { class={styles().actionButton} onClick={() => { togglePending() - inst._emit() + pacerEventClient.emit(emitName, inst) }} > @@ -215,10 +224,15 @@ function Shell() { class={styles().actionButton} onClick={() => { inst.flush() - inst._emit() + pacerEventClient.emit(emitName, inst) }} disabled={ - isDebounceThrottleLike ? !isPending : isEmpty + (['Debouncer', 'Throttler'].includes( + utilName, + ) && + !isPending) || + (['Batcher', 'Queuer'].includes(utilName) && + isEmpty) } > @@ -230,10 +244,15 @@ function Shell() { class={styles().actionButton} onClick={() => { inst.cancel() - inst._emit() + pacerEventClient.emit(emitName, inst) }} disabled={ - isDebounceThrottleLike ? !isPending : false + (['Debouncer', 'Throttler'].includes( + utilName, + ) && + !isPending) || + (['Batcher', 'Queuer'].includes(utilName) && + isEmpty) } > @@ -245,7 +264,7 @@ function Shell() { class={styles().actionButton} onClick={() => { inst.reset() - inst._emit() + pacerEventClient.emit(emitName, inst) }} > @@ -257,14 +276,33 @@ function Shell() { class={styles().actionButton} onClick={() => { inst.clear() - inst._emit() + pacerEventClient.emit(emitName, inst) }} - disabled={isEmpty} + disabled={ + ['Batcher', 'Queuer'].includes(utilName) && + isEmpty + } > Clear )} + {hasStartStop && ( + + )}
) })()} diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index ac6448d4..6fa84943 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -237,6 +237,12 @@ const stylesFactory = () => { border-radius: 9999px; background: ${colors.pink[400]}; `, + actionDotPurple: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.purple[400]}; + `, infoGrid: css` display: grid; grid-template-columns: auto 1fr; diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index f01581aa..a47c1adf 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -251,7 +251,7 @@ export class AsyncBatcher { /** * Emits a change event for the async batcher instance. Mostly useful for devtools. */ - _emit = () => emitChange('async-batcher', this) + _emit = () => emitChange('AsyncBatcher', this) /** * Updates the async batcher options diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index fb3c1464..dcf2c650 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -208,7 +208,7 @@ export class AsyncDebouncer { /** * Emits a change event for the async debouncer instance. Mostly useful for devtools. */ - _emit = () => emitChange('async-debouncer', this) + _emit = () => emitChange('AsyncDebouncer', this) /** * Updates the async debouncer options diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index 1732ef00..149c5dd8 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -304,7 +304,7 @@ export class AsyncQueuer { /** * Emits a change event for the async queuer instance. Mostly useful for devtools. */ - _emit = () => emitChange('async-queuer', this) + _emit = () => emitChange('AsyncQueuer', this) /** * Updates the queuer options. New options are merged with existing options. diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index 22513116..fb9d0464 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -235,7 +235,7 @@ export class AsyncRateLimiter { /** * Emits a change event for the async rate limiter instance. Mostly useful for devtools. */ - _emit = () => emitChange('async-rate-limiter', this) + _emit = () => emitChange('AsyncRateLimiter', this) /** * Updates the async rate limiter options diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index ef7d7425..16d726db 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -219,7 +219,7 @@ export class AsyncThrottler { /** * Emits a change event for the async throttler instance. Mostly useful for devtools. */ - _emit = () => emitChange('async-throttler', this) + _emit = () => emitChange('AsyncThrottler', this) /** * Updates the async throttler options diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index 6b3f840c..3e74d461 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -164,7 +164,7 @@ export class Batcher { /** * Emits a change event for the batcher instance. Mostly useful for devtools. */ - _emit = () => emitChange('batcher', this) + _emit = () => emitChange('Batcher', this) /** * Updates the batcher options diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index 063df6fc..ba364138 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -144,7 +144,7 @@ export class Debouncer { /** * Emits a change event for the debouncer instance. Mostly useful for devtools. */ - _emit = () => emitChange('debouncer', this) + _emit = () => emitChange('Debouncer', this) /** * Updates the debouncer options diff --git a/packages/pacer/src/event-client.ts b/packages/pacer/src/event-client.ts index bb008b09..0313a675 100644 --- a/packages/pacer/src/event-client.ts +++ b/packages/pacer/src/event-client.ts @@ -11,16 +11,26 @@ import type { RateLimiter } from './rate-limiter' import type { Throttler } from './throttler' export interface PacerEventMap { - 'pacer:async-batcher': AsyncBatcher - 'pacer:async-debouncer': AsyncDebouncer - 'pacer:async-queuer': AsyncQueuer - 'pacer:async-rate-limiter': AsyncRateLimiter - 'pacer:async-throttler': AsyncThrottler - 'pacer:batcher': Batcher - 'pacer:debouncer': Debouncer - 'pacer:queuer': Queuer - 'pacer:rate-limiter': RateLimiter - 'pacer:throttler': Throttler + 'pacer:d-AsyncBatcher': AsyncBatcher + 'pacer:d-AsyncDebouncer': AsyncDebouncer + 'pacer:d-AsyncQueuer': AsyncQueuer + 'pacer:d-AsyncRateLimiter': AsyncRateLimiter + 'pacer:d-AsyncThrottler': AsyncThrottler + 'pacer:d-Batcher': Batcher + 'pacer:d-Debouncer': Debouncer + 'pacer:d-Queuer': Queuer + 'pacer:d-RateLimiter': RateLimiter + 'pacer:d-Throttler': Throttler + 'pacer:AsyncBatcher': AsyncBatcher + 'pacer:AsyncDebouncer': AsyncDebouncer + 'pacer:AsyncQueuer': AsyncQueuer + 'pacer:AsyncRateLimiter': AsyncRateLimiter + 'pacer:AsyncThrottler': AsyncThrottler + 'pacer:Batcher': Batcher + 'pacer:Debouncer': Debouncer + 'pacer:Queuer': Queuer + 'pacer:RateLimiter': RateLimiter + 'pacer:Throttler': Throttler } class PacerEventClient extends EventClient { diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index 07393842..66d4cd00 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' export interface QueuerState { /** @@ -282,12 +282,18 @@ export class Queuer { this.addItem(item, this.options.addItemsTo ?? 'back', isLast) } } + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-Queuer') { + this.#setState(event.payload.store.state) + this.setOptions(event.payload.options) + } + }) } /** * Emits a change event for the queuer instance. Mostly useful for devtools. */ - _emit = () => emitChange('queuer', this) + _emit = () => emitChange('Queuer', this) /** * Updates the queuer options. New options are merged with existing options. @@ -523,6 +529,7 @@ export class Queuer { numberOfItems: number = this.store.state.items.length, position?: QueuePosition, ): void => { + console.log('flush from queuer') this.#clearTimeout() // clear any pending timeout for (let i = 0; i < numberOfItems; i++) { this.execute(position) diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index de9b21e2..0e56e739 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -160,7 +160,7 @@ export class RateLimiter { /** * Emits a change event for the rate limiter instance. Mostly useful for devtools. */ - _emit = () => emitChange('rate-limiter', this) + _emit = () => emitChange('RateLimiter', this) /** * Updates the rate limiter options diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index 278ae788..0705ade8 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -152,7 +152,7 @@ export class Throttler { /** * Emits a change event for the throttler instance. Mostly useful for devtools. */ - _emit = () => emitChange('throttler', this) + _emit = () => emitChange('Throttler', this) /** * Updates the throttler options diff --git a/packages/react-pacer-devtools/package.json b/packages/react-pacer-devtools/package.json index 84bdf953..62f47b1a 100644 --- a/packages/react-pacer-devtools/package.json +++ b/packages/react-pacer-devtools/package.json @@ -67,8 +67,8 @@ "@tanstack/pacer-devtools": "workspace:*" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^1.52.3", - "@vitejs/plugin-react": "^4.7.0", + "@eslint-react/eslint-plugin": "^1.52.4", + "@vitejs/plugin-react": "^5.0.0", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0" } diff --git a/packages/react-pacer/package.json b/packages/react-pacer/package.json index 280af70e..d9058021 100644 --- a/packages/react-pacer/package.json +++ b/packages/react-pacer/package.json @@ -175,9 +175,9 @@ "@tanstack/react-store": "^0.7.3" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^1.52.3", - "@types/react": "^19.1.9", - "@vitejs/plugin-react": "^4.7.0", + "@eslint-react/eslint-plugin": "^1.52.4", + "@types/react": "^19.1.10", + "@vitejs/plugin-react": "^5.0.0", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0", "react": "^19.1.1" diff --git a/packages/solid-pacer/package.json b/packages/solid-pacer/package.json index 51973db2..002d70db 100644 --- a/packages/solid-pacer/package.json +++ b/packages/solid-pacer/package.json @@ -175,7 +175,7 @@ "@tanstack/solid-store": "^0.7.3" }, "devDependencies": { - "solid-js": "^1.9.7", + "solid-js": "^1.9.9", "vite-plugin-solid": "^2.11.8" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a6b6d82..eb7731cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,19 +22,19 @@ importers: version: 1.2.0 '@tanstack/config': specifier: 0.20.0 - version: 0.20.0(@types/node@24.1.0)(@typescript-eslint/utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2))(rollup@4.44.1)(typescript@5.9.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 0.20.0(@types/node@24.2.1)(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) '@testing-library/jest-dom': - specifier: ^6.6.4 - version: 6.6.4 + specifier: ^6.7.0 + version: 6.7.0 '@types/node': - specifier: ^24.1.0 - version: 24.1.0 + specifier: ^24.2.1 + version: 24.2.1 eslint: - specifier: ^9.32.0 - version: 9.32.0(jiti@2.4.2) + specifier: ^9.33.0 + version: 9.33.0(jiti@2.4.2) eslint-plugin-unused-imports: specifier: ^4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -43,13 +43,13 @@ importers: version: 26.1.0 knip: specifier: ^5.62.0 - version: 5.62.0(@types/node@24.1.0)(typescript@5.9.2) + version: 5.62.0(@types/node@24.2.1)(typescript@5.9.2) markdown-link-extractor: specifier: ^4.0.2 version: 4.0.2 nx: - specifier: ^21.3.10 - version: 21.3.10 + specifier: ^21.3.11 + version: 21.3.11 premove: specifier: ^4.0.0 version: 4.0.0 @@ -72,11 +72,11 @@ importers: specifier: 5.9.2 version: 5.9.2 vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0) + version: 3.2.4(@types/node@24.2.1)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncBatch: dependencies: @@ -91,17 +91,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncDebounce: dependencies: @@ -116,17 +116,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncRateLimit: dependencies: @@ -141,17 +141,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncThrottle: dependencies: @@ -166,17 +166,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/batch: dependencies: @@ -191,17 +191,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/debounce: dependencies: @@ -216,17 +216,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/queue: dependencies: @@ -240,24 +240,24 @@ importers: specifier: ^19.1.1 version: 19.1.1(react@19.1.1) devDependencies: + '@tanstack/react-devtools': + specifier: 0.4.0 + version: 0.4.0(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.14.0 version: link:../../../packages/react-pacer-devtools - '@tanstack/react-devtools': - specifier: 0.2.2 - version: 0.2.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.7) '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/rateLimit: dependencies: @@ -272,17 +272,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-debounced-prefetch: dependencies: @@ -290,11 +290,11 @@ importers: specifier: ^0.15.0 version: link:../../../packages/react-pacer '@tanstack/react-query': - specifier: ^5.84.1 - version: 5.84.1(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(react@19.1.1) '@tanstack/react-query-devtools': - specifier: ^5.84.1 - version: 5.84.1(@tanstack/react-query@5.84.1(react@19.1.1))(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(@tanstack/react-query@5.85.3(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -303,17 +303,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-queued-prefetch: dependencies: @@ -321,11 +321,11 @@ importers: specifier: ^0.15.0 version: link:../../../packages/react-pacer '@tanstack/react-query': - specifier: ^5.84.1 - version: 5.84.1(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(react@19.1.1) '@tanstack/react-query-devtools': - specifier: ^5.84.1 - version: 5.84.1(@tanstack/react-query@5.84.1(react@19.1.1))(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(@tanstack/react-query@5.85.3(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -334,17 +334,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-throttled-prefetch: dependencies: @@ -352,11 +352,11 @@ importers: specifier: ^0.15.0 version: link:../../../packages/react-pacer '@tanstack/react-query': - specifier: ^5.84.1 - version: 5.84.1(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(react@19.1.1) '@tanstack/react-query-devtools': - specifier: ^5.84.1 - version: 5.84.1(@tanstack/react-query@5.84.1(react@19.1.1))(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(@tanstack/react-query@5.85.3(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -365,17 +365,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/throttle: dependencies: @@ -390,17 +390,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatchedCallback: dependencies: @@ -415,17 +415,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatcher: dependencies: @@ -440,17 +440,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncedCallback: dependencies: @@ -465,17 +465,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncer: dependencies: @@ -490,17 +490,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuedState: dependencies: @@ -515,17 +515,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuer: dependencies: @@ -540,17 +540,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiter: dependencies: @@ -568,17 +568,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiterWithPersister: dependencies: @@ -596,17 +596,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncThrottler: dependencies: @@ -621,17 +621,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatchedCallback: dependencies: @@ -646,17 +646,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatcher: dependencies: @@ -671,17 +671,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedCallback: dependencies: @@ -696,17 +696,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedState: dependencies: @@ -721,17 +721,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedValue: dependencies: @@ -746,17 +746,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncer: dependencies: @@ -771,17 +771,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedState: dependencies: @@ -796,17 +796,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedValue: dependencies: @@ -821,17 +821,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuer: dependencies: @@ -849,17 +849,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuerWithPersister: dependencies: @@ -877,17 +877,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedCallback: dependencies: @@ -902,17 +902,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedState: dependencies: @@ -927,17 +927,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedValue: dependencies: @@ -952,17 +952,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiter: dependencies: @@ -980,17 +980,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiterWithPersister: dependencies: @@ -1008,17 +1008,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledCallback: dependencies: @@ -1033,17 +1033,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledState: dependencies: @@ -1058,17 +1058,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledValue: dependencies: @@ -1083,17 +1083,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottler: dependencies: @@ -1108,17 +1108,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/util-comparison: dependencies: @@ -1132,24 +1132,24 @@ importers: specifier: ^19.1.1 version: 19.1.1(react@19.1.1) devDependencies: + '@tanstack/react-devtools': + specifier: 0.4.0 + version: 0.4.0(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.14.0 version: link:../../../packages/react-pacer-devtools - '@tanstack/react-devtools': - specifier: 0.2.2 - version: 0.2.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.7) '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/solid/asyncBatch: dependencies: @@ -1157,15 +1157,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncDebounce: dependencies: @@ -1173,15 +1173,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncRateLimit: dependencies: @@ -1189,15 +1189,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncThrottle: dependencies: @@ -1205,15 +1205,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/batch: dependencies: @@ -1221,15 +1221,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncBatcher: dependencies: @@ -1237,15 +1237,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncDebouncer: dependencies: @@ -1253,15 +1253,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncQueuer: dependencies: @@ -1269,15 +1269,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncRateLimiter: dependencies: @@ -1285,15 +1285,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncThrottler: dependencies: @@ -1301,15 +1301,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createBatcher: dependencies: @@ -1317,15 +1317,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedSignal: dependencies: @@ -1333,15 +1333,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedValue: dependencies: @@ -1349,15 +1349,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncer: dependencies: @@ -1365,15 +1365,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createQueuer: dependencies: @@ -1381,15 +1381,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedSignal: dependencies: @@ -1397,15 +1397,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedValue: dependencies: @@ -1413,15 +1413,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimiter: dependencies: @@ -1429,15 +1429,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledSignal: dependencies: @@ -1445,15 +1445,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledValue: dependencies: @@ -1461,15 +1461,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottler: dependencies: @@ -1477,15 +1477,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/debounce: dependencies: @@ -1493,15 +1493,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/queue: dependencies: @@ -1509,15 +1509,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/rateLimit: dependencies: @@ -1525,15 +1525,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/throttle: dependencies: @@ -1541,15 +1541,15 @@ importers: specifier: ^0.13.1 version: link:../../../packages/solid-pacer solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) packages/pacer: dependencies: @@ -1564,7 +1564,7 @@ importers: dependencies: '@tanstack/devtools-ui': specifier: ^0.3.0 - version: 0.3.0(csstype@3.1.3)(solid-js@1.9.7) + version: 0.3.0(csstype@3.1.3)(solid-js@1.9.9) '@tanstack/pacer': specifier: '>=0.14.0' version: link:../pacer @@ -1575,87 +1575,74 @@ importers: specifier: ^2.1.16 version: 2.1.16(csstype@3.1.3) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: ^1.9.9 + version: 1.9.9 devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) - packages/react-pacer-devtools: + packages/react-pacer: dependencies: - '@tanstack/pacer-devtools': + '@tanstack/pacer': specifier: workspace:* - version: link:../pacer-devtools - '@types/react': - specifier: '>=16.8' - version: 19.1.9 - '@types/react-dom': - specifier: '>=16.8' - version: 19.1.7(@types/react@19.1.9) - react: - specifier: '>=16.8' - version: 19.1.1 + version: link:../pacer + '@tanstack/react-store': + specifier: ^0.7.3 + version: 0.7.3(react-dom@19.1.0(react@19.1.1))(react@19.1.1) react-dom: specifier: '>=16.8' - version: 19.1.1(react@19.1.1) + version: 19.1.0(react@19.1.1) devDependencies: '@eslint-react/eslint-plugin': - specifier: ^1.52.3 - version: 1.52.3(eslint@9.32.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + specifier: ^1.52.4 + version: 1.52.4(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + '@types/react': + specifier: ^19.1.10 + version: 19.1.10 '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.32.0(jiti@2.4.2)) + version: 19.1.0-rc.2(eslint@9.33.0(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.33.0(jiti@2.4.2)) + react: + specifier: ^19.1.1 + version: 19.1.1 - packages/solid-pacer-devtools: + packages/react-pacer-devtools: dependencies: '@tanstack/pacer-devtools': specifier: workspace:* version: link:../pacer-devtools - solid-js: - specifier: '>=1.9.7' - version: 1.9.7 - devDependencies: - vite-plugin-solid: - specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) - - packages/react-pacer: - dependencies: - '@tanstack/pacer': - specifier: workspace:* - version: link:../pacer - '@tanstack/react-store': - specifier: ^0.7.3 - version: 0.7.3(react-dom@19.1.0(react@19.1.1))(react@19.1.1) + '@types/react': + specifier: '>=16.8' + version: 19.1.9 + '@types/react-dom': + specifier: '>=16.8' + version: 19.1.7(@types/react@19.1.9) + react: + specifier: '>=16.8' + version: 19.1.1 react-dom: specifier: '>=16.8' - version: 19.1.0(react@19.1.1) + version: 19.1.1(react@19.1.1) devDependencies: '@eslint-react/eslint-plugin': - specifier: ^1.52.3 - version: 1.52.3(eslint@9.32.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) - '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^1.52.4 + version: 1.52.4(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.32.0(jiti@2.4.2)) + version: 19.1.0-rc.2(eslint@9.33.0(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) - react: - specifier: ^19.1.1 - version: 19.1.1 + version: 5.2.0(eslint@9.33.0(jiti@2.4.2)) packages/solid-pacer: dependencies: @@ -1664,14 +1651,27 @@ importers: version: link:../pacer '@tanstack/solid-store': specifier: ^0.7.3 - version: 0.7.3(solid-js@1.9.7) + version: 0.7.3(solid-js@1.9.9) devDependencies: solid-js: - specifier: ^1.9.7 + specifier: ^1.9.9 + version: 1.9.9 + vite-plugin-solid: + specifier: ^2.11.8 + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + + packages/solid-pacer-devtools: + dependencies: + '@tanstack/pacer-devtools': + specifier: workspace:* + version: link:../pacer-devtools + solid-js: + specifier: '>=1.9.7' version: 1.9.7 + devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.7)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) packages: @@ -2163,20 +2163,20 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@1.52.3': - resolution: {integrity: sha512-71afQeBz0t5FqxLPfOgfQy2703t4T4tM5ooF/swIfUljCQxrFvIYivzYU67wrwLSnmkSfFJKp99bUCz7L3IP4Q==} + '@eslint-react/ast@1.52.4': + resolution: {integrity: sha512-zsNZXrVzFhtnc+Wx6TiREwek6zKDEkFEaW1DyG6K3iR8ibGm9PuR16iYWDWsRL/YfQz9ZGHVapHO7jNthDVSvg==} engines: {node: '>=18.18.0'} - '@eslint-react/core@1.52.3': - resolution: {integrity: sha512-N/fY3q1V0F81OzKGn0ZopmHY+OQHYQiS49MvpSWhNciL+TDxOo4CSt+wayMz5/9G/B/PwGB68eprjow0AaTYzA==} + '@eslint-react/core@1.52.4': + resolution: {integrity: sha512-cqS4FbQ3wSowk/73+NHI21jC9sbnAbCWIAPRWe8EpM+g5yrqYMydriI1vTMO7g93LSTAknc+mGdwI/Fi8Y991A==} engines: {node: '>=18.18.0'} - '@eslint-react/eff@1.52.3': - resolution: {integrity: sha512-CU07yUuHrrBbb8C82via3GrAXkSMbcpxd6f18f/jjEmMAXzKbN2yq1t0GfG7iwIyZexDZ7R3QBa9ksk6iwtDAA==} + '@eslint-react/eff@1.52.4': + resolution: {integrity: sha512-n2r2ncw8pTA7WuMI4aM9R4kPNiXaF8o0lH6X/pa/XP/hhVKO6u6R2uoLV8ltm53UZVVY+6qz92hRiLoTwefd3A==} engines: {node: '>=18.18.0'} - '@eslint-react/eslint-plugin@1.52.3': - resolution: {integrity: sha512-5hR4BF4m6DRXeBKSlJ7kcFolZdXxA6tf1lyq21UbeM8jUmY/qqMBotMTfhjkUdrhqL8/kGk3HCELpntYZ5n69Q==} + '@eslint-react/eslint-plugin@1.52.4': + resolution: {integrity: sha512-oUbmUUFkt/1OCiIO5Oy+66bMGlVNt5SMnEPmxXY77tTQ9vQUQQDdVJ2lUGVZr61IpINW2Y/has78GMNCjONsgQ==} engines: {node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2185,28 +2185,28 @@ packages: typescript: optional: true - '@eslint-react/kit@1.52.3': - resolution: {integrity: sha512-IOsfaRSih7VdL9ZDjuqc7kjOlHOQOaK6hkSENK64dUcvcl6YwHk8/JXfV/glHTp3JxXrPSazBrnZKNXk0DzjKg==} + '@eslint-react/kit@1.52.4': + resolution: {integrity: sha512-w1o8Qh/3rWQBIFB/ENS9A/EeGhUkAheYWeA4uHLuLMZ4ULwXU2c6aw3QZ9MW12lJ5JNWKiu3MuszVHTQmYUM/Q==} engines: {node: '>=18.18.0'} - '@eslint-react/shared@1.52.3': - resolution: {integrity: sha512-+0/2SOkNxLKBtYVLx/BCNo5xTn+dxkzP6C63gQ2ehNudMAt3zf2DouD62cHSSbl+eSAgc0zWYg8ssm5ksLN4xw==} + '@eslint-react/shared@1.52.4': + resolution: {integrity: sha512-ckRfgtBpsEGQgS9x2N/u+TB67UeASzYclQdlbhn29Y3/G3lvYTrXEyo49jZKVkpBW8ewSQAlwqUeipOrfv27XA==} engines: {node: '>=18.18.0'} - '@eslint-react/var@1.52.3': - resolution: {integrity: sha512-i2dfgoH93MHJNXqzS0vYIIpI2e6djIfzdnpMRHUyBYjTHFSPapE7RhcHFrAVPUrd85cUxIPW3pkTKAhkhUhYeA==} + '@eslint-react/var@1.52.4': + resolution: {integrity: sha512-tckDIawDTtpG3UVg/XEqxULq669B7Br2q84Hh3d3pTPojUamRZ+zbWY3gwyS+JS9iQ1lI9aOInQISdKzRuGWKQ==} engines: {node: '>=18.18.0'} '@eslint/config-array@0.21.0': resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': @@ -2217,16 +2217,16 @@ packages: resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.32.0': - resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} + '@eslint/js@9.33.0': + resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@faker-js/faker@9.9.0': @@ -2338,53 +2338,53 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nx/nx-darwin-arm64@21.3.10': - resolution: {integrity: sha512-umYmO5xE9e7BtVzOYWurjeZEpqO/KnFDl+sLf58EzKOBf+tWDp1PVTpmuYhPxjlH6WkVaYCTA62L3SkIahKZ+w==} + '@nx/nx-darwin-arm64@21.3.11': + resolution: {integrity: sha512-qXZrW6kfsfGG9n4cWugR2v8ys7P1SsbQuFahlbNSTd7g+ZxozaOnc7tyxW9XuY84KQ35HwP/QSu1E13fK5CXwQ==} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@21.3.10': - resolution: {integrity: sha512-f2vl8ba5IyG/3fhvrUARg/xKviONhg5FHmev5krSIRYdFXsCNgI8qX251/Wxr7zjABnARdwfEZcWMTY4QRXovA==} + '@nx/nx-darwin-x64@21.3.11': + resolution: {integrity: sha512-6NJEIGRITpFZYptJtr/wdnVuidAS/wONMMSwX5rgAqh5A9teI0vxZVOgG6n5f6NQyqEDvZ9ytcIvLsQWA4kJFg==} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@21.3.10': - resolution: {integrity: sha512-Tl0haFCRj+1Updj+KZYOxdhNlrp0CUiGIGo0n3S4ruuwtqSmSdwPb7ZGIvIHSQloX2k7CP/oRQw68HoUmsnIyA==} + '@nx/nx-freebsd-x64@21.3.11': + resolution: {integrity: sha512-9VZOM9mutzuZCUgijHXrIl3NgKt2CWuH/awLqDS8ijhLs6WfI5TYTa+mFwx90dfZZ4y/jy6XWXa2Ee3OShf7Hg==} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@21.3.10': - resolution: {integrity: sha512-3siCCKhlaBp3a56KbkPyixoW7m/H1Cx6vfMxBHro3qqG8m7NYQ5Iy/Ih8G1ghAhr1KoKeXMPAoEglZVbFXDypQ==} + '@nx/nx-linux-arm-gnueabihf@21.3.11': + resolution: {integrity: sha512-a05tAySKDEWt0TGoSnWp/l5+HL/CDJQkHfI9pXho85oDSkVRzhOInAn1EeZB/F+Q3PnJFsMHMhbuu2/nm3uYJA==} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@21.3.10': - resolution: {integrity: sha512-9Phr9FBVDr86QQ32Qxf7GyfBpgPfYDf0TWkWZe/EhR3UijoCM3a2WMyoLWxhl+oTkjxQVBP7adqToh7Da0hyuQ==} + '@nx/nx-linux-arm64-gnu@21.3.11': + resolution: {integrity: sha512-MPeivf0ptNpzQYvww6zHIqVbE5dTT2isl/WqzGyy7NgSeYDpFXmouDCQaeKxo5WytMVRCvCw/NnWTQuCK6TjnA==} cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@21.3.10': - resolution: {integrity: sha512-TxgwIXOFrCbBz3xlP+aCil+KaHH6pRLA+JW4RD0ZMes/iP+99R+/+gKznw7CEkpXkzX194gGTe2NlM45129uEg==} + '@nx/nx-linux-arm64-musl@21.3.11': + resolution: {integrity: sha512-/hJpc4VJsbxDEreXt5Ka9HJ3TBEHgIa9y/i+H9MmWOeapCdH1Edhx58Heuv9OaX7kK8Y8q0cSicv0dJCghiTjA==} cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@21.3.10': - resolution: {integrity: sha512-UNIEt/i4OpGvjS8ds/m2lv/4C6SmaWTzIfok59TL/8BG0ab5x/lADdKd6OBbvhmDiBdz+As3uLiCN03uRsz95Q==} + '@nx/nx-linux-x64-gnu@21.3.11': + resolution: {integrity: sha512-pTBHuloqTxpTHa/fdKjHkFFsfW16mEcTp37HDtoQpjPfcd9nO8CYO8OClaewr9khNqCnSbCLfSoIg/alnb7BWw==} cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@21.3.10': - resolution: {integrity: sha512-/ETUG3auZjQmWliaHQQFr/cqb493HGShDrcJYa0Zd67TZeUHsYY5lc71u6pA7d+aP/r51RToamxpDK0cGmqINQ==} + '@nx/nx-linux-x64-musl@21.3.11': + resolution: {integrity: sha512-OhFjURB68rd6xld8t8fiNpopF2E7v+8/jfbpsku9c0gdV2UhzoxCeZwooe7qhQjCcjVO8JNOs4dAf7qs1VtpMw==} cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@21.3.10': - resolution: {integrity: sha512-xBOzmfjB695KkFZ3a2IblN/Vb6I9LlDbIV2I1X/Ks8jdK0q1Fh+mqZWDfOUuBr5oKcUPD5pZiH/vpr5mBssLig==} + '@nx/nx-win32-arm64-msvc@21.3.11': + resolution: {integrity: sha512-pGE2Td13oEj7aeogwCL+2fjmpabQVSduKfGOTlt4YoMlM0w0bXYSWqwiGBMKbMA50qkhnVapwwkuWF38PgCIxg==} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@21.3.10': - resolution: {integrity: sha512-TZPwjF1adI8FCJp7MmgXNtnwuW1AOBSiPEHLz2RM8cJKBc7rlmXw/MWhnYhz2lkZQ+vpndoLGtpinYo5cp/NQA==} + '@nx/nx-win32-x64-msvc@21.3.11': + resolution: {integrity: sha512-KJqLL/Zyx96hs+7pKbo/fsU7ZTFSLeZLnYQu05o6fvJJ5I1+p85t212/7vkbKKWJncyMospQdzLr3zLG3A/u8A==} cpu: [x64] os: [win32] @@ -2457,8 +2457,8 @@ packages: resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/pluginutils@1.0.0-beta.30': + resolution: {integrity: sha512-whXaSoNUFiyDAjkUF8OBpOm77Szdbk5lGNqFe6CbVbJFrhCCPinCbRA3NjawwlNHla1No7xvXXh+CpSxnPfUEw==} '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} @@ -2667,20 +2667,14 @@ packages: resolution: {integrity: sha512-78AAfg9KfSDE+pQLRJo20bxX3A40ea14kFqNmzuMb7zFJNfR5L87kAEOju6QXu7cbk9r2r7EEV2a8PgHOsD7Kg==} engines: {node: '>=18'} - '@tanstack/devtools-ui@0.2.2': - resolution: {integrity: sha512-G2gRyoGpjtr25w9BqQzPbefiJ9WALWYLOVxVr+NoqOLDA680nUO5KJjp7oLZMfnKssWxACgulaQ3DUmGGJuysQ==} - engines: {node: '>=18'} - peerDependencies: - solid-js: '>=1.9.7' - '@tanstack/devtools-ui@0.3.0': resolution: {integrity: sha512-lyP0eM6juIWn8zgI8xI32Lh86gCnjUyNePE9F7Bfgkv5taILmmJAHW5Mme4T2ufv7L8NLwOiBY/bZYnP4zev0w==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/devtools@0.3.0': - resolution: {integrity: sha512-uxj3MM2/ZlQDlhnBoUSlJC8oneJ+sPh6hK0kgiKZAEgrlUvZfUNgKGhrmMHZaAGl/WEglhZoxXwvvo9HAFT8yw==} + '@tanstack/devtools@0.4.0': + resolution: {integrity: sha512-3LrVUMI/s76XxYbygecOueXPrUf9gDc700iebQrBZ0ZvDmZDB/Umwa84gNx6NAxfQyI24lvB0IqQ8lp970oDSg==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' @@ -2697,14 +2691,14 @@ packages: resolution: {integrity: sha512-RC0yRBFJvGuR58tKQUIkMXVEiATXgESIc+3/NTqoCC7D2YOF4fZGmHGYIanFEPQH7EGfQ5+Bwi+H6BOtKnymtw==} engines: {node: '>=18'} - '@tanstack/query-core@5.83.1': - resolution: {integrity: sha512-OG69LQgT7jSp+5pPuCfzltq/+7l2xoweggjme9vlbCPa/d7D7zaqv5vN/S82SzSYZ4EDLTxNO1PWrv49RAS64Q==} + '@tanstack/query-core@5.85.3': + resolution: {integrity: sha512-9Ne4USX83nHmRuEYs78LW+3lFEEO2hBDHu7mrdIgAFx5Zcrs7ker3n/i8p4kf6OgKExmaDN5oR0efRD7i2J0DQ==} '@tanstack/query-devtools@5.84.0': resolution: {integrity: sha512-fbF3n+z1rqhvd9EoGp5knHkv3p5B2Zml1yNRjh7sNXklngYI5RVIWUrUjZ1RIcEoscarUb0+bOvIs5x9dwzOXQ==} - '@tanstack/react-devtools@0.2.2': - resolution: {integrity: sha512-Ig8ZYqUPJ+nwRvF/RpkQHPbgEkrL3b2PjeYBgXgT5OemyRUlmG12UutvMBV+bJuBsSOKHrNf29IvzC0Vw9Bt1A==} + '@tanstack/react-devtools@0.4.0': + resolution: {integrity: sha512-QkN0WcbwKjYa107yEYOau+yhaay3XXwL2Ue+V0JxzaBOhvbnFI9tDzvIx7T1NZs8qEUgSjsqmMj/H81cISs2EA==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -2719,14 +2713,14 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-query-devtools@5.84.1': - resolution: {integrity: sha512-nle+OQ9B3Z3EG2R3ixvaNcJ6OeqGwmAc5iMDW6Vj+emLZkWRrN3BDsrzZQu414n34lpxplnC7z1jmKuU/scHCQ==} + '@tanstack/react-query-devtools@5.85.3': + resolution: {integrity: sha512-WSVweCE1Kh1BVvPDHAmLgGT+GGTJQ9+a7bVqzD+zUiUTht+salJjYm5nikpMNaHFPJV102TCYdvgHgBXtURRNg==} peerDependencies: - '@tanstack/react-query': ^5.84.1 + '@tanstack/react-query': ^5.85.3 react: ^18 || ^19 - '@tanstack/react-query@5.84.1': - resolution: {integrity: sha512-zo7EUygcWJMQfFNWDSG7CBhy8irje/XY0RDVKKV4IQJAysb+ZJkkJPcnQi+KboyGUgT+SQebRFoTqLuTtfoDLw==} + '@tanstack/react-query@5.85.3': + resolution: {integrity: sha512-AqU8TvNh5GVIE8I+TUU0noryBRy7gOY0XhSayVXmOPll4UkZeLWKDwi0rtWOZbwLRCbyxorfJ5DIjDqE7GXpcQ==} peerDependencies: react: ^18 || ^19 @@ -2752,8 +2746,8 @@ packages: resolution: {integrity: sha512-WpL1C9iR5/U7g3GpvHIssN5QvKnDnWhW05BQhaD6bAqoPCkQyBepxUF8ZRO4IGZRGVAZeMVqTbUA05BAQH/88g==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.6.4': - resolution: {integrity: sha512-xDXgLjVunjHqczScfkCJ9iyjdNOVHvvCdqHSSxwM9L0l/wHkTRum67SDc020uAlCoqktJplgO2AAQeLP1wgqDQ==} + '@testing-library/jest-dom@6.7.0': + resolution: {integrity: sha512-RI2e97YZ7MRa+vxP4UUnMuMFL2buSsf0ollxUbTgrbPLKhMn8KVTx7raS6DYjC7v1NDVrioOvaShxsguLNISCA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@tybys/wasm-util@0.10.0': @@ -2798,14 +2792,17 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.1.0': - resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==} + '@types/node@24.2.1': + resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} '@types/react-dom@19.1.7': resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} peerDependencies: '@types/react': ^19.0.0 + '@types/react@19.1.10': + resolution: {integrity: sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==} + '@types/react@19.1.9': resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} @@ -2833,16 +2830,32 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/project-service@8.39.1': + resolution: {integrity: sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.37.0': resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.39.1': + resolution: {integrity: sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.37.0': resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/tsconfig-utils@8.39.1': + resolution: {integrity: sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.37.0': resolution: {integrity: sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2850,16 +2863,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/type-utils@8.39.1': + resolution: {integrity: sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.37.0': resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.39.1': + resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.37.0': resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.39.1': + resolution: {integrity: sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.37.0': resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2867,10 +2897,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.39.1': + resolution: {integrity: sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.37.0': resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.39.1': + resolution: {integrity: sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -2966,9 +3007,9 @@ packages: cpu: [x64] os: [win32] - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vitejs/plugin-react@5.0.0': + resolution: {integrity: sha512-Jx9JfsTa05bYkS9xo0hkofp2dCmp1blrKjw9JONs5BTHOvJCgLbaPSuZLGSVJW6u2qe0tc4eevY0+gSNNi0YCw==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3529,8 +3570,8 @@ packages: peerDependencies: eslint: '>=7' - eslint-plugin-react-debug@1.52.3: - resolution: {integrity: sha512-mbyk+K0/NqydAHpTGj/6w8Py8unOpUCqhg42NnxQtFCL9G7pTEiEk2eDjnQAi4Up00THP4nYvjfnuiTf1ZKaIw==} + eslint-plugin-react-debug@1.52.4: + resolution: {integrity: sha512-6D6CUWP2sL1KYEGmNdudnj1Dt3tqy7e/XhVMkdQ6j/pw1M5HpQE6xK15B5WlvWfJWTYo4g15NXfuJKMHXNGHQw==} engines: {node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3539,8 +3580,8 @@ packages: typescript: optional: true - eslint-plugin-react-dom@1.52.3: - resolution: {integrity: sha512-HUMzOYrgRdT6di+OMMJWBCbIB9yY3YUkLvDhExsfap0HX3X1EpZutEWdQg4CMthF2rslYMMF2cnN5pOVrQ5Rkw==} + eslint-plugin-react-dom@1.52.4: + resolution: {integrity: sha512-UVt3T48F48Nbl40eqSzwkjpUnLnobj0St7EwpbItMhEOgcwjle8Jrxe2odetQBCuwPZ0dkeH0yE1PbAlNfQU/A==} engines: {node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3549,8 +3590,8 @@ packages: typescript: optional: true - eslint-plugin-react-hooks-extra@1.52.3: - resolution: {integrity: sha512-1UXAhkgbFsMlY+eEII6rLSksRIvnlnNEZxRqUTixNf4e05u5+48RUqqZr7rRdkfVhr+1DPO1sIx8wQGAiN7IoQ==} + eslint-plugin-react-hooks-extra@1.52.4: + resolution: {integrity: sha512-GUjMLCg8fRzM9cHXSTJximuYINUVmAJE5R/9J/lonDwRHf8vWG+KjsZXXdRfZExFgLRcwl/3OS4d1hnpIsowaw==} engines: {node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3565,8 +3606,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@1.52.3: - resolution: {integrity: sha512-sfemWPC9VX5T7TVJk6OKQkTux8pnyVIwBOZbDntWnfCqV6B74MIvY2nGr9TEn8DFVWbMoTxVQY0MGlREcrbZsA==} + eslint-plugin-react-naming-convention@1.52.4: + resolution: {integrity: sha512-gv9HnUgseL2U9Cra3QQzxX2BapL+JnGgZzjoGxOuljInUWIqc5TQulpTlz4Tch3ZWlNGhwgHTKkFEziAO2c5Cg==} engines: {node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3575,8 +3616,8 @@ packages: typescript: optional: true - eslint-plugin-react-web-api@1.52.3: - resolution: {integrity: sha512-Hd05kVsGmSHBZpQsQDueobfLHDywXP6Ne+dPf24Ev3mMKi5XMkLZ/sD+JmJKyNYvkWMwB1Wn4gl1aIz7HneKeQ==} + eslint-plugin-react-web-api@1.52.4: + resolution: {integrity: sha512-/n9QlX8Ol2GgXvQZ/a7QcCMZjr29Mk/N4KV09uyDB4tTxJdv/fQEvSm93FDtqM2OPuvA058oyWOM3ruHhGf8uw==} engines: {node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3585,8 +3626,8 @@ packages: typescript: optional: true - eslint-plugin-react-x@1.52.3: - resolution: {integrity: sha512-Sds4CXHtdgaCdzoypcY3DSshS0JtK2Eh+QbpUAPUqs0UWQ3qtQKxY0nntTSYeF+GXDfOdAYDkl/8+VFpHQwIKg==} + eslint-plugin-react-x@1.52.4: + resolution: {integrity: sha512-znbM7mbL7tgm2PQbSAZ83jX2JTxpbXJQZk2vpJH98iEZCwcVvC3joiI6szLyyykAqFgldmpghebxvBnVw+aZMQ==} engines: {node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3619,8 +3660,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.32.0: - resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} + eslint@9.33.0: + resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4296,8 +4337,8 @@ packages: nwsapi@2.2.18: resolution: {integrity: sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==} - nx@21.3.10: - resolution: {integrity: sha512-am85Vntk1UQVzGjFltNzrb9b7Lhz8nPDRXkC0BJXBoG6w0T9Qf8k/3bwbo8nzZgREdVIUFO5dvOZ6gWUZw/UFA==} + nx@21.3.11: + resolution: {integrity: sha512-nj2snZ3mHZnbHcoB3NUdxbch9L1sQKV1XccLs1B79fmI/N5oOgWgctm/bWoZH2UH5b4A8ZLAMTsC6YnSJGbcaw==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -4693,6 +4734,9 @@ packages: solid-js@1.9.7: resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} + solid-js@1.9.9: + resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} + solid-refresh@0.6.3: resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} peerDependencies: @@ -4872,8 +4916,8 @@ packages: peerDependencies: typescript: '>=4.0.0' - ts-pattern@5.7.1: - resolution: {integrity: sha512-EGs8PguQqAAUIcQfK4E9xdXxB6s2GK4sJfT/vcc9V1ELIvC4LH/zXu2t/5fajtv6oiRCxdv7BgtVK3vWgROxag==} + ts-pattern@5.8.0: + resolution: {integrity: sha512-kIjN2qmWiHnhgr5DAkAafF9fwb0T5OhMVSWrm8XEdTFnX6+wfXwYOFjeF86UZ54vduqiR7BfqScFmXSzSaH8oA==} tsconfck@3.1.5: resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} @@ -4942,8 +4986,8 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} undici@6.21.3: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} @@ -5018,8 +5062,8 @@ packages: vite: optional: true - vite@7.0.6: - resolution: {integrity: sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==} + vite@7.1.2: + resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -5239,8 +5283,8 @@ packages: zod@3.25.72: resolution: {integrity: sha512-Cl+fe4dNL4XumOBNBsr0lHfA80PQiZXHI4xEMTEr8gt6aGz92t3lBA32e71j9+JeF/VAYvdfBnuwJs+BMx/BrA==} - zod@4.0.5: - resolution: {integrity: sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==} + zod@4.0.17: + resolution: {integrity: sha512-1PHjlYRevNxxdy2JZ8JcNAw7rX8V9P1AKkP+x/xZfxB0K5FYfuV+Ug6P/6NVSR2jHQ+FzDDoDHS04nYUsOIyLQ==} snapshots: @@ -5835,100 +5879,100 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.4.2))': dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint-react/ast@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/ast@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@eslint-react/eff': 1.52.3 - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) string-ts: 2.2.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': - dependencies: - '@eslint-react/ast': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/core@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + dependencies: + '@eslint-react/ast': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/shared': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/var': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) birecord: 0.1.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/eff@1.52.3': {} - - '@eslint-react/eslint-plugin@1.52.3(eslint@9.32.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2)': - dependencies: - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) - eslint-plugin-react-debug: 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-dom: 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-hooks-extra: 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-naming-convention: 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-web-api: 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-x: 1.52.3(eslint@9.32.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + '@eslint-react/eff@1.52.4': {} + + '@eslint-react/eslint-plugin@1.52.4(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2)': + dependencies: + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/shared': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) + eslint-plugin-react-debug: 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-react-dom: 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-react-hooks-extra: 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-react-naming-convention: 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-react-web-api: 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-react-x: 1.52.4(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - ts-api-utils - '@eslint-react/kit@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/kit@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@eslint-react/eff': 1.52.3 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - ts-pattern: 5.7.1 - zod: 4.0.5 + '@eslint-react/eff': 1.52.4 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + ts-pattern: 5.8.0 + zod: 4.0.17 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/shared@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - ts-pattern: 5.7.1 - zod: 4.0.5 + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + ts-pattern: 5.8.0 + zod: 4.0.17 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/var@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@eslint-react/ast': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/eff': 1.52.3 - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) string-ts: 2.2.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 transitivePeerDependencies: - eslint - supports-color @@ -5942,9 +5986,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.3.1': {} - '@eslint/core@0.15.1': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 @@ -5964,13 +6008,13 @@ snapshots: '@eslint/js@9.31.0': {} - '@eslint/js@9.32.0': {} + '@eslint/js@9.33.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.2 levn: 0.4.1 '@faker-js/faker@9.9.0': {} @@ -6053,23 +6097,23 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@microsoft/api-extractor-model@7.29.6(@types/node@24.1.0)': + '@microsoft/api-extractor-model@7.29.6(@types/node@24.2.1)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@24.1.0) + '@rushstack/node-core-library': 5.7.0(@types/node@24.2.1) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@24.1.0)': + '@microsoft/api-extractor@7.47.7(@types/node@24.2.1)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@24.1.0) + '@microsoft/api-extractor-model': 7.29.6(@types/node@24.2.1) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@24.1.0) + '@rushstack/node-core-library': 5.7.0(@types/node@24.2.1) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@24.1.0) - '@rushstack/ts-command-line': 4.22.6(@types/node@24.1.0) + '@rushstack/terminal': 0.14.0(@types/node@24.2.1) + '@rushstack/ts-command-line': 4.22.6(@types/node@24.2.1) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -6120,34 +6164,34 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nx/nx-darwin-arm64@21.3.10': + '@nx/nx-darwin-arm64@21.3.11': optional: true - '@nx/nx-darwin-x64@21.3.10': + '@nx/nx-darwin-x64@21.3.11': optional: true - '@nx/nx-freebsd-x64@21.3.10': + '@nx/nx-freebsd-x64@21.3.11': optional: true - '@nx/nx-linux-arm-gnueabihf@21.3.10': + '@nx/nx-linux-arm-gnueabihf@21.3.11': optional: true - '@nx/nx-linux-arm64-gnu@21.3.10': + '@nx/nx-linux-arm64-gnu@21.3.11': optional: true - '@nx/nx-linux-arm64-musl@21.3.10': + '@nx/nx-linux-arm64-musl@21.3.11': optional: true - '@nx/nx-linux-x64-gnu@21.3.10': + '@nx/nx-linux-x64-gnu@21.3.11': optional: true - '@nx/nx-linux-x64-musl@21.3.10': + '@nx/nx-linux-x64-musl@21.3.11': optional: true - '@nx/nx-win32-arm64-msvc@21.3.10': + '@nx/nx-win32-arm64-msvc@21.3.11': optional: true - '@nx/nx-win32-x64-msvc@21.3.10': + '@nx/nx-win32-x64-msvc@21.3.11': optional: true '@oxc-resolver/binding-darwin-arm64@11.1.0': @@ -6193,7 +6237,7 @@ snapshots: '@publint/pack@0.1.2': {} - '@rolldown/pluginutils@1.0.0-beta.27': {} + '@rolldown/pluginutils@1.0.0-beta.30': {} '@rollup/pluginutils@5.1.4(rollup@4.44.1)': dependencies: @@ -6263,7 +6307,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true - '@rushstack/node-core-library@5.7.0(@types/node@24.1.0)': + '@rushstack/node-core-library@5.7.0(@types/node@24.2.1)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -6274,23 +6318,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.2.1 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@24.1.0)': + '@rushstack/terminal@0.14.0(@types/node@24.2.1)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@24.1.0) + '@rushstack/node-core-library': 5.7.0(@types/node@24.2.1) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.2.1 - '@rushstack/ts-command-line@4.22.6(@types/node@24.1.0)': + '@rushstack/ts-command-line@4.22.6(@types/node@24.2.1)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@24.1.0) + '@rushstack/terminal': 0.14.0(@types/node@24.2.1) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -6327,32 +6371,32 @@ snapshots: '@size-limit/file': 11.2.0(size-limit@11.2.0) size-limit: 11.2.0 - '@solid-primitives/event-listener@2.4.3(solid-js@1.9.7)': + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.9)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) - solid-js: 1.9.7 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) + solid-js: 1.9.9 - '@solid-primitives/keyboard@1.3.3(solid-js@1.9.7)': + '@solid-primitives/keyboard@1.3.3(solid-js@1.9.9)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) - solid-js: 1.9.7 + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.9) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) + solid-js: 1.9.9 - '@solid-primitives/rootless@1.5.2(solid-js@1.9.7)': + '@solid-primitives/rootless@1.5.2(solid-js@1.9.9)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) - solid-js: 1.9.7 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) + solid-js: 1.9.9 - '@solid-primitives/utils@6.3.2(solid-js@1.9.7)': + '@solid-primitives/utils@6.3.2(solid-js@1.9.9)': dependencies: - solid-js: 1.9.7 + solid-js: 1.9.9 - '@stylistic/eslint-plugin@5.2.0(eslint@9.32.0(jiti@2.4.2))': + '@stylistic/eslint-plugin@5.2.0(eslint@9.33.0(jiti@2.4.2))': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) '@typescript-eslint/types': 8.37.0 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -6369,12 +6413,12 @@ snapshots: transitivePeerDependencies: - encoding - '@tanstack/config@0.20.0(@types/node@24.1.0)(@typescript-eslint/utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2))(rollup@4.44.1)(typescript@5.9.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/config@0.20.0(@types/node@24.2.1)(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': dependencies: - '@tanstack/eslint-config': 0.3.0(@typescript-eslint/utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@tanstack/eslint-config': 0.3.0(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) '@tanstack/publish-config': 0.2.0 '@tanstack/typedoc-config': 0.2.0(typescript@5.9.2) - '@tanstack/vite-config': 0.2.0(@types/node@24.1.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + '@tanstack/vite-config': 0.2.0(@types/node@24.2.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -6394,44 +6438,37 @@ snapshots: '@tanstack/devtools-event-client@0.2.1': {} - '@tanstack/devtools-ui@0.2.2(csstype@3.1.3)(solid-js@1.9.7)': - dependencies: - goober: 2.1.16(csstype@3.1.3) - solid-js: 1.9.7 - transitivePeerDependencies: - - csstype - - '@tanstack/devtools-ui@0.3.0(csstype@3.1.3)(solid-js@1.9.7)': + '@tanstack/devtools-ui@0.3.0(csstype@3.1.3)(solid-js@1.9.9)': dependencies: goober: 2.1.16(csstype@3.1.3) - solid-js: 1.9.7 + solid-js: 1.9.9 transitivePeerDependencies: - csstype - '@tanstack/devtools@0.3.0(csstype@3.1.3)(solid-js@1.9.7)': + '@tanstack/devtools@0.4.0(csstype@3.1.3)(solid-js@1.9.9)': dependencies: - '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.7) + '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.9) '@tanstack/devtools-event-bus': 0.2.1 - '@tanstack/devtools-ui': 0.2.2(csstype@3.1.3)(solid-js@1.9.7) + '@tanstack/devtools-ui': 0.3.0(csstype@3.1.3)(solid-js@1.9.9) clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) - solid-js: 1.9.7 + solid-js: 1.9.9 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/eslint-config@0.3.0(@typescript-eslint/utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@tanstack/eslint-config@0.3.0(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@eslint/js': 9.31.0 - '@stylistic/eslint-plugin': 5.2.0(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-n: 17.21.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-pnpm: 1.0.0(eslint@9.32.0(jiti@2.4.2)) + '@stylistic/eslint-plugin': 5.2.0(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-n: 17.21.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-pnpm: 1.0.0(eslint@9.33.0(jiti@2.4.2)) globals: 16.3.0 jsonc-eslint-parser: 2.4.0 - typescript-eslint: 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - vue-eslint-parser: 10.2.0(eslint@9.32.0(jiti@2.4.2)) + typescript-eslint: 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + vue-eslint-parser: 10.2.0(eslint@9.33.0(jiti@2.4.2)) yaml-eslint-parser: 1.3.0 transitivePeerDependencies: - '@typescript-eslint/utils' @@ -6451,15 +6488,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/query-core@5.83.1': {} + '@tanstack/query-core@5.85.3': {} '@tanstack/query-devtools@5.84.0': {} - '@tanstack/react-devtools@0.2.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.7)': + '@tanstack/react-devtools@0.4.0(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)': dependencies: - '@tanstack/devtools': 0.3.0(csstype@3.1.3)(solid-js@1.9.7) - '@types/react': 19.1.9 - '@types/react-dom': 19.1.7(@types/react@19.1.9) + '@tanstack/devtools': 0.4.0(csstype@3.1.3)(solid-js@1.9.9) + '@types/react': 19.1.10 + '@types/react-dom': 19.1.7(@types/react@19.1.10) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -6474,15 +6511,15 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@tanstack/react-query-devtools@5.84.1(@tanstack/react-query@5.84.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-query-devtools@5.85.3(@tanstack/react-query@5.85.3(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/query-devtools': 5.84.0 - '@tanstack/react-query': 5.84.1(react@19.1.1) + '@tanstack/react-query': 5.85.3(react@19.1.1) react: 19.1.1 - '@tanstack/react-query@5.84.1(react@19.1.1)': + '@tanstack/react-query@5.85.3(react@19.1.1)': dependencies: - '@tanstack/query-core': 5.83.1 + '@tanstack/query-core': 5.85.3 react: 19.1.1 '@tanstack/react-store@0.7.3(react-dom@19.1.0(react@19.1.1))(react@19.1.1)': @@ -6492,10 +6529,10 @@ snapshots: react-dom: 19.1.0(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) - '@tanstack/solid-store@0.7.3(solid-js@1.9.7)': + '@tanstack/solid-store@0.7.3(solid-js@1.9.9)': dependencies: '@tanstack/store': 0.7.2 - solid-js: 1.9.7 + solid-js: 1.9.9 '@tanstack/store@0.7.2': {} @@ -6507,12 +6544,12 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.2.0(@types/node@24.1.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/vite-config@0.2.0(@types/node@24.2.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.44.1) - vite-plugin-dts: 4.2.3(@types/node@24.1.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) - vite-plugin-externalize-deps: 0.9.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-dts: 4.2.3(@types/node@24.2.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-externalize-deps: 0.9.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - rollup @@ -6520,13 +6557,12 @@ snapshots: - typescript - vite - '@testing-library/jest-dom@6.6.4': + '@testing-library/jest-dom@6.7.0': dependencies: '@adobe/css-tools': 4.4.2 aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.21 picocolors: 1.1.1 redent: 3.0.0 @@ -6568,7 +6604,7 @@ snapshots: '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 24.1.0 + '@types/node': 24.2.1 '@types/deep-eql@4.0.2': {} @@ -6582,29 +6618,37 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@24.1.0': + '@types/node@24.2.1': + dependencies: + undici-types: 7.10.0 + + '@types/react-dom@19.1.7(@types/react@19.1.10)': dependencies: - undici-types: 7.8.0 + '@types/react': 19.1.10 '@types/react-dom@19.1.7(@types/react@19.1.9)': dependencies: '@types/react': 19.1.9 + '@types/react@19.1.10': + dependencies: + csstype: 3.1.3 + '@types/react@19.1.9': dependencies: csstype: 3.1.3 '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/parser': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.37.0 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -6613,14 +6657,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/types': 8.37.0 '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.37.0 debug: 4.4.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -6634,22 +6678,52 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + debug: 4.4.1 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.37.0': dependencies: '@typescript-eslint/types': 8.37.0 '@typescript-eslint/visitor-keys': 8.37.0 + '@typescript-eslint/scope-manager@8.39.1': + dependencies: + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.37.0 '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + debug: 4.4.1 + eslint: 9.33.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) debug: 4.4.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -6657,6 +6731,8 @@ snapshots: '@typescript-eslint/types@8.37.0': {} + '@typescript-eslint/types@8.39.1': {} + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.2)': dependencies: '@typescript-eslint/project-service': 8.37.0(typescript@5.9.2) @@ -6673,13 +6749,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/project-service': 8.39.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/visitor-keys': 8.39.1 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/types': 8.37.0 '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -6689,6 +6792,11 @@ snapshots: '@typescript-eslint/types': 8.37.0 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.39.1': + dependencies: + '@typescript-eslint/types': 8.39.1 + eslint-visitor-keys: 4.2.1 + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -6748,15 +6856,15 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': + '@vitejs/plugin-react@5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) - '@rolldown/pluginutils': 1.0.0-beta.27 + '@rolldown/pluginutils': 1.0.0-beta.30 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -6768,13 +6876,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -7292,9 +7400,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.32.0(jiti@2.4.2)): + eslint-compat-utils@0.5.1(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) semver: 7.7.2 eslint-import-context@0.1.9(unrs-resolver@1.11.1): @@ -7313,19 +7421,19 @@ snapshots: - supports-color optional: true - eslint-plugin-es-x@7.8.0(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-es-x@7.8.0(eslint@9.33.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.32.0(jiti@2.4.2) - eslint-compat-utils: 0.5.1(eslint@9.32.0(jiti@2.4.2)) + eslint: 9.33.0(jiti@2.4.2) + eslint-compat-utils: 0.5.1(eslint@9.33.0(jiti@2.4.2)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)): dependencies: '@typescript-eslint/types': 8.37.0 comment-parser: 1.4.1 debug: 4.4.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 9.0.5 @@ -7333,17 +7441,17 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-n@17.21.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-n@17.21.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) enhanced-resolve: 5.18.1 - eslint: 9.32.0(jiti@2.4.2) - eslint-plugin-es-x: 7.8.0(eslint@9.32.0(jiti@2.4.2)) + eslint: 9.33.0(jiti@2.4.2) + eslint-plugin-es-x: 7.8.0(eslint@9.33.0(jiti@2.4.2)) get-tsconfig: 4.10.1 globals: 15.15.0 ignore: 5.3.2 @@ -7353,9 +7461,9 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-pnpm@1.0.0(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-pnpm@1.0.0(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) find-up-simple: 1.0.1 jsonc-eslint-parser: 2.4.0 pathe: 2.0.3 @@ -7363,149 +7471,149 @@ snapshots: tinyglobby: 0.2.14 yaml-eslint-parser: 1.3.0 - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.33.0(jiti@2.4.2)): dependencies: '@babel/core': 7.26.10 '@babel/parser': 7.27.0 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) hermes-parser: 0.25.1 zod: 3.24.2 zod-validation-error: 3.4.0(zod@3.24.2) transitivePeerDependencies: - supports-color - eslint-plugin-react-debug@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + eslint-plugin-react-debug@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/core': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/shared': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/var': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-react-dom@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/core': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/shared': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/var': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) compare-versions: 6.1.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + eslint-plugin-react-hooks-extra@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/core': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/shared': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/var': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.2.0(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) - eslint-plugin-react-naming-convention@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-react-naming-convention@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: - '@eslint-react/ast': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + '@eslint-react/ast': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/core': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/shared': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/var': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + eslint-plugin-react-web-api@1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/core': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/shared': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/var': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.52.3(eslint@9.32.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/eff': 1.52.3 - '@eslint-react/kit': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-react-x@1.52.4(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/core': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/eff': 1.52.4 + '@eslint-react/kit': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/shared': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/var': 1.52.4(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) compare-versions: 6.1.1 - eslint: 9.32.0(jiti@2.4.2) - is-immutable-type: 5.0.1(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) + is-immutable-type: 5.0.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) string-ts: 2.2.1 - ts-pattern: 5.7.1 + ts-pattern: 5.8.0 optionalDependencies: ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) eslint-scope@8.4.0: dependencies: @@ -7516,16 +7624,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.32.0(jiti@2.4.2): + eslint@9.33.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.32.0 - '@eslint/plugin-kit': 0.3.4 + '@eslint/js': 9.33.0 + '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 @@ -7862,10 +7970,10 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-immutable-type@5.0.1(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): + is-immutable-type@5.0.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: - '@typescript-eslint/type-utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.9.2) ts-declaration-location: 1.0.7(typescript@5.9.2) typescript: 5.9.2 @@ -7992,10 +8100,10 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.62.0(@types/node@24.1.0)(typescript@5.9.2): + knip@5.62.0(@types/node@24.2.1)(typescript@5.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 24.1.0 + '@types/node': 24.2.1 fast-glob: 3.3.3 formatly: 0.2.4 jiti: 2.4.2 @@ -8175,7 +8283,7 @@ snapshots: nwsapi@2.2.18: {} - nx@21.3.10: + nx@21.3.11: dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -8213,16 +8321,16 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 21.3.10 - '@nx/nx-darwin-x64': 21.3.10 - '@nx/nx-freebsd-x64': 21.3.10 - '@nx/nx-linux-arm-gnueabihf': 21.3.10 - '@nx/nx-linux-arm64-gnu': 21.3.10 - '@nx/nx-linux-arm64-musl': 21.3.10 - '@nx/nx-linux-x64-gnu': 21.3.10 - '@nx/nx-linux-x64-musl': 21.3.10 - '@nx/nx-win32-arm64-msvc': 21.3.10 - '@nx/nx-win32-x64-msvc': 21.3.10 + '@nx/nx-darwin-arm64': 21.3.11 + '@nx/nx-darwin-x64': 21.3.11 + '@nx/nx-freebsd-x64': 21.3.11 + '@nx/nx-linux-arm-gnueabihf': 21.3.11 + '@nx/nx-linux-arm64-gnu': 21.3.11 + '@nx/nx-linux-arm64-musl': 21.3.11 + '@nx/nx-linux-x64-gnu': 21.3.11 + '@nx/nx-linux-x64-musl': 21.3.11 + '@nx/nx-win32-arm64-msvc': 21.3.11 + '@nx/nx-win32-x64-msvc': 21.3.11 transitivePeerDependencies: - debug @@ -8599,6 +8707,12 @@ snapshots: seroval: 1.3.2 seroval-plugins: 1.3.2(seroval@1.3.2) + solid-js@1.9.9: + dependencies: + csstype: 3.1.3 + seroval: 1.3.2 + seroval-plugins: 1.3.2(seroval@1.3.2) + solid-refresh@0.6.3(solid-js@1.9.7): dependencies: '@babel/generator': 7.28.0 @@ -8608,6 +8722,15 @@ snapshots: transitivePeerDependencies: - supports-color + solid-refresh@0.6.3(solid-js@1.9.9): + dependencies: + '@babel/generator': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/types': 7.28.0 + solid-js: 1.9.9 + transitivePeerDependencies: + - supports-color + source-map-js@1.2.1: {} source-map@0.6.1: {} @@ -8761,7 +8884,7 @@ snapshots: picomatch: 4.0.2 typescript: 5.9.2 - ts-pattern@5.7.1: {} + ts-pattern@5.8.0: {} tsconfck@3.1.5(typescript@5.9.2): optionalDependencies: @@ -8805,13 +8928,13 @@ snapshots: typescript: 5.9.2 yaml: 2.7.0 - typescript-eslint@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): + typescript-eslint@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/parser': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/parser': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.37.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -8824,7 +8947,7 @@ snapshots: ufo@1.5.4: {} - undici-types@7.8.0: {} + undici-types@7.10.0: {} undici@6.21.3: {} @@ -8874,13 +8997,13 @@ snapshots: validate-html-nesting@1.2.2: {} - vite-node@3.2.4(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -8895,9 +9018,9 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@24.1.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-dts@4.2.3(@types/node@24.2.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@24.1.0) + '@microsoft/api-extractor': 7.47.7(@types/node@24.2.1) '@rollup/pluginutils': 5.1.4(rollup@4.44.1) '@volar/typescript': 2.4.12 '@vue/language-core': 2.1.6(typescript@5.9.2) @@ -8908,17 +9031,17 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-externalize-deps@0.9.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.6.4)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.7)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.28.0 '@types/babel__core': 7.20.5 @@ -8926,25 +9049,40 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.7 solid-refresh: 0.6.3(solid-js@1.9.7) - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.0.6(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + optionalDependencies: + '@testing-library/jest-dom': 6.7.0 + transitivePeerDependencies: + - supports-color + + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + dependencies: + '@babel/core': 7.28.0 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.5(@babel/core@7.28.0) + merge-anything: 5.1.7 + solid-js: 1.9.9 + solid-refresh: 0.6.3(solid-js@1.9.9) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) optionalDependencies: - '@testing-library/jest-dom': 6.6.4 + '@testing-library/jest-dom': 6.7.0 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.9.2) optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0): + vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.4.6(picomatch@4.0.3) @@ -8953,21 +9091,21 @@ snapshots: rollup: 4.44.1 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.2.1 fsevents: 2.3.3 jiti: 2.4.2 tsx: 4.19.3 yaml: 2.8.0 - vitefu@1.0.6(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vitefu@1.0.6(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) - vitest@3.2.4(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0): + vitest@3.2.4(@types/node@24.2.1)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -8985,11 +9123,11 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.1.0 + '@types/node': 24.2.1 jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -9007,10 +9145,10 @@ snapshots: vscode-uri@3.1.0: {} - vue-eslint-parser@10.2.0(eslint@9.32.0(jiti@2.4.2)): + vue-eslint-parser@10.2.0(eslint@9.33.0(jiti@2.4.2)): dependencies: debug: 4.4.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -9119,4 +9257,4 @@ snapshots: zod@3.25.72: {} - zod@4.0.5: {} + zod@4.0.17: {} From 7e853c03234df4fae18b97d85c881548c027cbda Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Thu, 14 Aug 2025 19:20:10 -0500 Subject: [PATCH 26/50] all utils listen to devtools --- docs/reference/classes/asyncbatcher.md | 16 +-- docs/reference/classes/asyncdebouncer.md | 12 +- docs/reference/classes/asyncqueuer.md | 30 ++-- docs/reference/classes/asyncratelimiter.md | 12 +- docs/reference/classes/asyncthrottler.md | 12 +- docs/reference/classes/batcher.md | 14 +- docs/reference/classes/debouncer.md | 12 +- docs/reference/classes/queuer.md | 26 ++-- docs/reference/classes/ratelimiter.md | 12 +- docs/reference/classes/throttler.md | 12 +- docs/reference/functions/asyncbatch.md | 2 +- docs/reference/functions/asyncdebounce.md | 2 +- docs/reference/functions/asyncqueue.md | 2 +- docs/reference/functions/asyncratelimit.md | 2 +- docs/reference/functions/asyncthrottle.md | 2 +- docs/reference/functions/batch.md | 2 +- docs/reference/functions/debounce.md | 2 +- docs/reference/functions/queue.md | 2 +- docs/reference/functions/ratelimit.md | 2 +- docs/reference/functions/throttle.md | 2 +- docs/reference/interfaces/pacereventmap.md | 140 ++++++++++++++++--- docs/reference/variables/pacereventclient.md | 2 +- packages/pacer/src/async-batcher.ts | 9 +- packages/pacer/src/async-debouncer.ts | 9 +- packages/pacer/src/async-queuer.ts | 9 +- packages/pacer/src/async-rate-limiter.ts | 9 +- packages/pacer/src/async-throttler.ts | 9 +- packages/pacer/src/batcher.ts | 9 +- packages/pacer/src/debouncer.ts | 9 +- packages/pacer/src/rate-limiter.ts | 9 +- packages/pacer/src/throttler.ts | 9 +- 31 files changed, 282 insertions(+), 119 deletions(-) diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index a1f80a22..fc5e71f5 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -156,7 +156,7 @@ Defined in: [async-batcher.ts:231](https://github.com/TanStack/pacer/blob/main/p _emit(): void ``` -Defined in: [async-batcher.ts:254](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L254) +Defined in: [async-batcher.ts:261](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L261) Emits a change event for the async batcher instance. Mostly useful for devtools. @@ -172,7 +172,7 @@ Emits a change event for the async batcher instance. Mostly useful for devtools. addItem(item): void ``` -Defined in: [async-batcher.ts:296](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L296) +Defined in: [async-batcher.ts:303](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L303) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -195,7 +195,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [async-batcher.ts:397](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L397) +Defined in: [async-batcher.ts:404](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L404) Removes all items from the async batcher @@ -211,7 +211,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [async-batcher.ts:371](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L371) +Defined in: [async-batcher.ts:378](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L378) Processes the current batch of items immediately @@ -227,7 +227,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [async-batcher.ts:379](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L379) +Defined in: [async-batcher.ts:386](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L386) Returns a copy of all items in the async batcher @@ -243,7 +243,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [async-batcher.ts:383](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L383) +Defined in: [async-batcher.ts:390](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L390) #### Returns @@ -257,7 +257,7 @@ Defined in: [async-batcher.ts:383](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:404](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L404) +Defined in: [async-batcher.ts:411](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L411) Resets the async batcher state to its default values @@ -273,7 +273,7 @@ Resets the async batcher state to its default values setOptions(newOptions): void ``` -Defined in: [async-batcher.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L259) +Defined in: [async-batcher.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L266) Updates the async batcher options diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index 6bde6b40..a7807796 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -130,7 +130,7 @@ Defined in: [async-debouncer.ts:184](https://github.com/TanStack/pacer/blob/main _emit(): void ``` -Defined in: [async-debouncer.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L211) +Defined in: [async-debouncer.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L218) Emits a change event for the async debouncer instance. Mostly useful for devtools. @@ -146,7 +146,7 @@ Emits a change event for the async debouncer instance. Mostly useful for devtool cancel(): void ``` -Defined in: [async-debouncer.ts:401](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L401) +Defined in: [async-debouncer.ts:408](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L408) Cancels any pending execution or aborts any execution in progress @@ -162,7 +162,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-debouncer.ts:353](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L353) +Defined in: [async-debouncer.ts:360](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L360) Processes the current pending execution immediately @@ -178,7 +178,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-debouncer.ts:276](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L276) +Defined in: [async-debouncer.ts:283](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L283) Attempts to execute the debounced function. If a call is already in progress, it will be queued. @@ -214,7 +214,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [async-debouncer.ts:410](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L410) +Defined in: [async-debouncer.ts:417](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L417) Resets the debouncer state to its default values @@ -230,7 +230,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-debouncer.ts:216](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L216) +Defined in: [async-debouncer.ts:223](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L223) Updates the async debouncer options diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index bc863010..991eaeaf 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -145,7 +145,7 @@ Defined in: [async-queuer.ts:267](https://github.com/TanStack/pacer/blob/main/pa _emit(): void ``` -Defined in: [async-queuer.ts:307](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L307) +Defined in: [async-queuer.ts:314](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L314) Emits a change event for the async queuer instance. Mostly useful for devtools. @@ -164,7 +164,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [async-queuer.ts:415](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L415) +Defined in: [async-queuer.ts:422](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L422) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -202,7 +202,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [async-queuer.ts:719](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L719) +Defined in: [async-queuer.ts:726](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L726) Removes all pending items from the queue. Does not affect active tasks. @@ -218,7 +218,7 @@ Removes all pending items from the queue. Does not affect active tasks. execute(position?): Promise ``` -Defined in: [async-queuer.ts:541](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L541) +Defined in: [async-queuer.ts:548](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L548) Removes and returns the next item from the queue and executes the task function with it. @@ -248,7 +248,7 @@ queuer.execute('back'); flush(numberOfItems, position?): Promise ``` -Defined in: [async-queuer.ts:576](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L576) +Defined in: [async-queuer.ts:583](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L583) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -275,7 +275,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): Promise ``` -Defined in: [async-queuer.ts:590](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L590) +Defined in: [async-queuer.ts:597](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L597) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -298,7 +298,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:494](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L494) +Defined in: [async-queuer.ts:501](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L501) Removes and returns the next item from the queue without executing the task function. Use for manual queue management. Normally, use execute() to process items. @@ -330,7 +330,7 @@ queuer.getNextItem('back'); peekActiveItems(): TValue[] ``` -Defined in: [async-queuer.ts:682](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L682) +Defined in: [async-queuer.ts:689](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L689) Returns the items currently being processed (active tasks). @@ -346,7 +346,7 @@ Returns the items currently being processed (active tasks). peekAllItems(): TValue[] ``` -Defined in: [async-queuer.ts:675](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L675) +Defined in: [async-queuer.ts:682](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L682) Returns a copy of all items in the queue, including active and pending items. @@ -362,7 +362,7 @@ Returns a copy of all items in the queue, including active and pending items. peekNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:665](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L665) +Defined in: [async-queuer.ts:672](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L672) Returns the next item in the queue without removing it. @@ -391,7 +391,7 @@ queuer.peekNextItem('back'); // back peekPendingItems(): TValue[] ``` -Defined in: [async-queuer.ts:689](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L689) +Defined in: [async-queuer.ts:696](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L696) Returns the items waiting to be processed (pending tasks). @@ -407,7 +407,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [async-queuer.ts:727](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L727) +Defined in: [async-queuer.ts:734](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L734) Resets the queuer state to its default values @@ -423,7 +423,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [async-queuer.ts:312](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L312) +Defined in: [async-queuer.ts:319](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L319) Updates the queuer options. New options are merged with existing options. @@ -445,7 +445,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [async-queuer.ts:696](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L696) +Defined in: [async-queuer.ts:703](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L703) Starts processing items in the queue. If already running, does nothing. @@ -461,7 +461,7 @@ Starts processing items in the queue. If already running, does nothing. stop(): void ``` -Defined in: [async-queuer.ts:706](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L706) +Defined in: [async-queuer.ts:713](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L713) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index 35eb441b..e6f4e750 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -151,7 +151,7 @@ Defined in: [async-rate-limiter.ts:212](https://github.com/TanStack/pacer/blob/m _emit(): void ``` -Defined in: [async-rate-limiter.ts:238](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L238) +Defined in: [async-rate-limiter.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L245) Emits a change event for the async rate limiter instance. Mostly useful for devtools. @@ -167,7 +167,7 @@ Emits a change event for the async rate limiter instance. Mostly useful for devt getMsUntilNextWindow(): number ``` -Defined in: [async-rate-limiter.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L447) +Defined in: [async-rate-limiter.ts:454](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L454) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -185,7 +185,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [async-rate-limiter.ts:437](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L437) +Defined in: [async-rate-limiter.ts:444](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L444) Returns the number of remaining executions allowed in the current window @@ -201,7 +201,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [async-rate-limiter.ts:316](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L316) +Defined in: [async-rate-limiter.ts:323](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L323) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -249,7 +249,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [async-rate-limiter.ts:458](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L458) +Defined in: [async-rate-limiter.ts:465](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L465) Resets the rate limiter state @@ -265,7 +265,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [async-rate-limiter.ts:243](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L243) +Defined in: [async-rate-limiter.ts:250](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L250) Updates the async rate limiter options diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index 0e77cf65..4e2d0a2c 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -133,7 +133,7 @@ Defined in: [async-throttler.ts:195](https://github.com/TanStack/pacer/blob/main _emit(): void ``` -Defined in: [async-throttler.ts:222](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L222) +Defined in: [async-throttler.ts:229](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L229) Emits a change event for the async throttler instance. Mostly useful for devtools. @@ -149,7 +149,7 @@ Emits a change event for the async throttler instance. Mostly useful for devtool cancel(): void ``` -Defined in: [async-throttler.ts:436](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L436) +Defined in: [async-throttler.ts:443](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L443) Cancels any pending execution or aborts any execution in progress @@ -165,7 +165,7 @@ Cancels any pending execution or aborts any execution in progress flush(): Promise> ``` -Defined in: [async-throttler.ts:385](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L385) +Defined in: [async-throttler.ts:392](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L392) Processes the current pending execution immediately @@ -181,7 +181,7 @@ Processes the current pending execution immediately maybeExecute(...args): Promise> ``` -Defined in: [async-throttler.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L295) +Defined in: [async-throttler.ts:302](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L302) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -223,7 +223,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [async-throttler.ts:444](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L444) +Defined in: [async-throttler.ts:451](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L451) Resets the debouncer state to its default values @@ -239,7 +239,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-throttler.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L227) +Defined in: [async-throttler.ts:234](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L234) Updates the async throttler options diff --git a/docs/reference/classes/batcher.md b/docs/reference/classes/batcher.md index e7416364..b945d2f3 100644 --- a/docs/reference/classes/batcher.md +++ b/docs/reference/classes/batcher.md @@ -133,7 +133,7 @@ Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/package _emit(): void ``` -Defined in: [batcher.ts:167](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L167) +Defined in: [batcher.ts:174](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L174) Emits a change event for the batcher instance. Mostly useful for devtools. @@ -149,7 +149,7 @@ Emits a change event for the batcher instance. Mostly useful for devtools. addItem(item): void ``` -Defined in: [batcher.ts:203](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L203) +Defined in: [batcher.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L210) Adds an item to the batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -172,7 +172,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [batcher.ts:273](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L273) +Defined in: [batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L280) Removes all items from the batcher @@ -188,7 +188,7 @@ Removes all items from the batcher flush(): void ``` -Defined in: [batcher.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L251) +Defined in: [batcher.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L258) Processes the current batch of items immediately @@ -204,7 +204,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [batcher.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L259) +Defined in: [batcher.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L266) Returns a copy of all items in the batcher @@ -220,7 +220,7 @@ Returns a copy of all items in the batcher reset(): void ``` -Defined in: [batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L280) +Defined in: [batcher.ts:287](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L287) Resets the batcher state to its default values @@ -236,7 +236,7 @@ Resets the batcher state to its default values setOptions(newOptions): void ``` -Defined in: [batcher.ts:172](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L172) +Defined in: [batcher.ts:179](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L179) Updates the batcher options diff --git a/docs/reference/classes/debouncer.md b/docs/reference/classes/debouncer.md index 03055b97..6aab3c59 100644 --- a/docs/reference/classes/debouncer.md +++ b/docs/reference/classes/debouncer.md @@ -116,7 +116,7 @@ Defined in: [debouncer.ts:125](https://github.com/TanStack/pacer/blob/main/packa _emit(): void ``` -Defined in: [debouncer.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L147) +Defined in: [debouncer.ts:154](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L154) Emits a change event for the debouncer instance. Mostly useful for devtools. @@ -132,7 +132,7 @@ Emits a change event for the debouncer instance. Mostly useful for devtools. cancel(): void ``` -Defined in: [debouncer.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L257) +Defined in: [debouncer.ts:264](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L264) Cancels any pending execution @@ -148,7 +148,7 @@ Cancels any pending execution flush(): void ``` -Defined in: [debouncer.ts:240](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L240) +Defined in: [debouncer.ts:247](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L247) Processes the current pending execution immediately @@ -164,7 +164,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [debouncer.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L198) +Defined in: [debouncer.ts:205](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L205) Attempts to execute the debounced function If a call is already in progress, it will be queued @@ -187,7 +187,7 @@ If a call is already in progress, it will be queued reset(): void ``` -Defined in: [debouncer.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L268) +Defined in: [debouncer.ts:275](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L275) Resets the debouncer state to its default values @@ -203,7 +203,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [debouncer.ts:152](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L152) +Defined in: [debouncer.ts:159](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L159) Updates the debouncer options diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index 14402b81..afaca037 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -166,7 +166,7 @@ Defined in: [queuer.ts:251](https://github.com/TanStack/pacer/blob/main/packages _emit(): void ``` -Defined in: [queuer.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L290) +Defined in: [queuer.ts:296](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L296) Emits a change event for the queuer instance. Mostly useful for devtools. @@ -185,7 +185,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [queuer.ts:379](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L379) +Defined in: [queuer.ts:385](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L385) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -224,7 +224,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [queuer.ts:652](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L652) +Defined in: [queuer.ts:659](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L659) Removes all pending items from the queue. Does not affect items being processed. @@ -240,7 +240,7 @@ Removes all pending items from the queue. Does not affect items being processed. execute(position?): undefined | TValue ``` -Defined in: [queuer.ts:506](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L506) +Defined in: [queuer.ts:512](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L512) Removes and returns the next item from the queue and processes it using the provided function. @@ -269,7 +269,7 @@ queuer.execute('back'); flush(numberOfItems, position?): void ``` -Defined in: [queuer.ts:522](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L522) +Defined in: [queuer.ts:528](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L528) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -296,7 +296,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [queuer.ts:537](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L537) +Defined in: [queuer.ts:544](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L544) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -319,7 +319,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:459](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L459) +Defined in: [queuer.ts:465](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L465) Removes and returns the next item from the queue without executing the function. Use for manual queue management. Normally, use execute() to process items. @@ -350,7 +350,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [queuer.ts:620](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L620) +Defined in: [queuer.ts:627](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L627) Returns a copy of all items in the queue. @@ -366,7 +366,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:610](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L610) +Defined in: [queuer.ts:617](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L617) Returns the next item in the queue without removing it. @@ -394,7 +394,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [queuer.ts:660](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L660) +Defined in: [queuer.ts:667](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L667) Resets the queuer state to its default values @@ -410,7 +410,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [queuer.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L295) +Defined in: [queuer.ts:301](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L301) Updates the queuer options. New options are merged with existing options. @@ -432,7 +432,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [queuer.ts:627](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L627) +Defined in: [queuer.ts:634](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L634) Starts processing items in the queue. If already isRunning, does nothing. @@ -448,7 +448,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [queuer.ts:637](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L637) +Defined in: [queuer.ts:644](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L644) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/ratelimiter.md b/docs/reference/classes/ratelimiter.md index eb985ec1..e56c7c81 100644 --- a/docs/reference/classes/ratelimiter.md +++ b/docs/reference/classes/ratelimiter.md @@ -129,7 +129,7 @@ Defined in: [rate-limiter.ts:139](https://github.com/TanStack/pacer/blob/main/pa _emit(): void ``` -Defined in: [rate-limiter.ts:163](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L163) +Defined in: [rate-limiter.ts:170](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L170) Emits a change event for the rate limiter instance. Mostly useful for devtools. @@ -145,7 +145,7 @@ Emits a change event for the rate limiter instance. Mostly useful for devtools. getMsUntilNextWindow(): number ``` -Defined in: [rate-limiter.ts:331](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L331) +Defined in: [rate-limiter.ts:338](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L338) Returns the number of milliseconds until the next execution will be possible @@ -161,7 +161,7 @@ Returns the number of milliseconds until the next execution will be possible getRemainingInWindow(): number ``` -Defined in: [rate-limiter.ts:323](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L323) +Defined in: [rate-limiter.ts:330](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L330) Returns the number of remaining executions allowed in the current window @@ -177,7 +177,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): boolean ``` -Defined in: [rate-limiter.ts:229](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L229) +Defined in: [rate-limiter.ts:236](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L236) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -212,7 +212,7 @@ rateLimiter.maybeExecute('arg1', 'arg2'); // false reset(): void ``` -Defined in: [rate-limiter.ts:342](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L342) +Defined in: [rate-limiter.ts:349](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L349) Resets the rate limiter state @@ -228,7 +228,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [rate-limiter.ts:168](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L168) +Defined in: [rate-limiter.ts:175](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L175) Updates the rate limiter options diff --git a/docs/reference/classes/throttler.md b/docs/reference/classes/throttler.md index 8829be02..52c3551d 100644 --- a/docs/reference/classes/throttler.md +++ b/docs/reference/classes/throttler.md @@ -120,7 +120,7 @@ Defined in: [throttler.ts:133](https://github.com/TanStack/pacer/blob/main/packa _emit(): void ``` -Defined in: [throttler.ts:155](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L155) +Defined in: [throttler.ts:162](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L162) Emits a change event for the throttler instance. Mostly useful for devtools. @@ -136,7 +136,7 @@ Emits a change event for the throttler instance. Mostly useful for devtools. cancel(): void ``` -Defined in: [throttler.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L295) +Defined in: [throttler.ts:302](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L302) Cancels any pending trailing execution and clears internal state. @@ -158,7 +158,7 @@ Has no effect if there is no pending execution. flush(): void ``` -Defined in: [throttler.ts:273](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L273) +Defined in: [throttler.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L280) Processes the current pending execution immediately @@ -174,7 +174,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [throttler.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L218) +Defined in: [throttler.ts:225](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L225) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -216,7 +216,7 @@ throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [throttler.ts:306](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L306) +Defined in: [throttler.ts:313](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L313) Resets the throttler state to its default values @@ -232,7 +232,7 @@ Resets the throttler state to its default values setOptions(newOptions): void ``` -Defined in: [throttler.ts:160](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L160) +Defined in: [throttler.ts:167](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L167) Updates the throttler options diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index 63dd5c44..6be8eae8 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,7 +11,7 @@ title: asyncBatch function asyncBatch(fn, options): (item) => void ``` -Defined in: [async-batcher.ts:459](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L459) +Defined in: [async-batcher.ts:466](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L466) Creates an async batcher that processes items in batches diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index 24c4ceda..b7e56452 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,7 +11,7 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-debouncer.ts:459](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L459) +Defined in: [async-debouncer.ts:466](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L466) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index 6b00fe41..8e0b335b 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,7 +11,7 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [async-queuer.ts:766](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L766) +Defined in: [async-queuer.ts:773](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L773) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index 49704cdd..6ed57e2f 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,7 +11,7 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-rate-limiter.ts:529](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L529) +Defined in: [async-rate-limiter.ts:536](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L536) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index 7b45875e..9c77d0b8 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,7 +11,7 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-throttler.ts:492](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L492) +Defined in: [async-throttler.ts:499](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L499) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md index 26b75d6d..66fe74e3 100644 --- a/docs/reference/functions/batch.md +++ b/docs/reference/functions/batch.md @@ -11,7 +11,7 @@ title: batch function batch(fn, options): (item) => void ``` -Defined in: [batcher.ts:304](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L304) +Defined in: [batcher.ts:311](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L311) Creates a batcher that processes items in batches diff --git a/docs/reference/functions/debounce.md b/docs/reference/functions/debounce.md index 46ced8d6..7af67e6a 100644 --- a/docs/reference/functions/debounce.md +++ b/docs/reference/functions/debounce.md @@ -11,7 +11,7 @@ title: debounce function debounce(fn, initialOptions): (...args) => void ``` -Defined in: [debouncer.ts:301](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L301) +Defined in: [debouncer.ts:308](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L308) Creates a debounced function that delays invoking the provided function until after a specified wait time. Multiple calls during the wait period will cancel previous pending invocations and reset the timer. diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index 35a7bafe..0583dbdc 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -11,7 +11,7 @@ title: queue function queue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [queuer.ts:703](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L703) +Defined in: [queuer.ts:710](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L710) Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. diff --git a/docs/reference/functions/ratelimit.md b/docs/reference/functions/ratelimit.md index 82410092..8209527c 100644 --- a/docs/reference/functions/ratelimit.md +++ b/docs/reference/functions/ratelimit.md @@ -11,7 +11,7 @@ title: rateLimit function rateLimit(fn, initialOptions): (...args) => boolean ``` -Defined in: [rate-limiter.ts:394](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L394) +Defined in: [rate-limiter.ts:401](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L401) Creates a rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/throttle.md b/docs/reference/functions/throttle.md index 3e5d08f4..7521d6f6 100644 --- a/docs/reference/functions/throttle.md +++ b/docs/reference/functions/throttle.md @@ -11,7 +11,7 @@ title: throttle function throttle(fn, initialOptions): (...args) => void ``` -Defined in: [throttler.ts:345](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L345) +Defined in: [throttler.ts:352](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L352) Creates a throttled function that limits how often the provided function can execute. diff --git a/docs/reference/interfaces/pacereventmap.md b/docs/reference/interfaces/pacereventmap.md index 81236178..c3b2c862 100644 --- a/docs/reference/interfaces/pacereventmap.md +++ b/docs/reference/interfaces/pacereventmap.md @@ -11,100 +11,200 @@ Defined in: [event-client.ts:13](https://github.com/TanStack/pacer/blob/main/pac ## Properties -### pacer:async-batcher +### pacer:AsyncBatcher ```ts -pacer:async-batcher: AsyncBatcher; +pacer:AsyncBatcher: AsyncBatcher; +``` + +Defined in: [event-client.ts:24](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L24) + +*** + +### pacer:AsyncDebouncer + +```ts +pacer:AsyncDebouncer: AsyncDebouncer; +``` + +Defined in: [event-client.ts:25](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L25) + +*** + +### pacer:AsyncQueuer + +```ts +pacer:AsyncQueuer: AsyncQueuer; +``` + +Defined in: [event-client.ts:26](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L26) + +*** + +### pacer:AsyncRateLimiter + +```ts +pacer:AsyncRateLimiter: AsyncRateLimiter; +``` + +Defined in: [event-client.ts:27](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L27) + +*** + +### pacer:AsyncThrottler + +```ts +pacer:AsyncThrottler: AsyncThrottler; +``` + +Defined in: [event-client.ts:28](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L28) + +*** + +### pacer:Batcher + +```ts +pacer:Batcher: Batcher; +``` + +Defined in: [event-client.ts:29](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L29) + +*** + +### pacer:d-AsyncBatcher + +```ts +pacer:d-AsyncBatcher: AsyncBatcher; ``` Defined in: [event-client.ts:14](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L14) *** -### pacer:async-debouncer +### pacer:d-AsyncDebouncer ```ts -pacer:async-debouncer: AsyncDebouncer; +pacer:d-AsyncDebouncer: AsyncDebouncer; ``` Defined in: [event-client.ts:15](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L15) *** -### pacer:async-queuer +### pacer:d-AsyncQueuer ```ts -pacer:async-queuer: AsyncQueuer; +pacer:d-AsyncQueuer: AsyncQueuer; ``` Defined in: [event-client.ts:16](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L16) *** -### pacer:async-rate-limiter +### pacer:d-AsyncRateLimiter ```ts -pacer:async-rate-limiter: AsyncRateLimiter; +pacer:d-AsyncRateLimiter: AsyncRateLimiter; ``` Defined in: [event-client.ts:17](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L17) *** -### pacer:async-throttler +### pacer:d-AsyncThrottler ```ts -pacer:async-throttler: AsyncThrottler; +pacer:d-AsyncThrottler: AsyncThrottler; ``` Defined in: [event-client.ts:18](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L18) *** -### pacer:batcher +### pacer:d-Batcher ```ts -pacer:batcher: Batcher; +pacer:d-Batcher: Batcher; ``` Defined in: [event-client.ts:19](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L19) *** -### pacer:debouncer +### pacer:d-Debouncer ```ts -pacer:debouncer: Debouncer; +pacer:d-Debouncer: Debouncer; ``` Defined in: [event-client.ts:20](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L20) *** -### pacer:queuer +### pacer:d-Queuer ```ts -pacer:queuer: Queuer; +pacer:d-Queuer: Queuer; ``` Defined in: [event-client.ts:21](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L21) *** -### pacer:rate-limiter +### pacer:d-RateLimiter ```ts -pacer:rate-limiter: RateLimiter; +pacer:d-RateLimiter: RateLimiter; ``` Defined in: [event-client.ts:22](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L22) *** -### pacer:throttler +### pacer:d-Throttler ```ts -pacer:throttler: Throttler; +pacer:d-Throttler: Throttler; ``` Defined in: [event-client.ts:23](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L23) + +*** + +### pacer:Debouncer + +```ts +pacer:Debouncer: Debouncer; +``` + +Defined in: [event-client.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L30) + +*** + +### pacer:Queuer + +```ts +pacer:Queuer: Queuer; +``` + +Defined in: [event-client.ts:31](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L31) + +*** + +### pacer:RateLimiter + +```ts +pacer:RateLimiter: RateLimiter; +``` + +Defined in: [event-client.ts:32](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L32) + +*** + +### pacer:Throttler + +```ts +pacer:Throttler: Throttler; +``` + +Defined in: [event-client.ts:33](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L33) diff --git a/docs/reference/variables/pacereventclient.md b/docs/reference/variables/pacereventclient.md index 0f01f688..8fde7e62 100644 --- a/docs/reference/variables/pacereventclient.md +++ b/docs/reference/variables/pacereventclient.md @@ -11,4 +11,4 @@ title: pacerEventClient const pacerEventClient: PacerEventClient; ``` -Defined in: [event-client.ts:49](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L49) +Defined in: [event-client.ts:59](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/event-client.ts#L59) diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index a47c1adf..da835006 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { OptionalKeys } from './types' export interface AsyncBatcherState { @@ -246,6 +246,13 @@ export class AsyncBatcher { throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } this.#setState(this.options.initialState ?? {}) + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-AsyncBatcher') { + this.#setState(event.payload.store.state as AsyncBatcherState) + this.setOptions(event.payload.options) + } + }) } /** diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index dcf2c650..f8ce26a4 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncDebouncerState { @@ -203,6 +203,13 @@ export class AsyncDebouncer { throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } this.#setState(this.options.initialState ?? {}) + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-AsyncDebouncer') { + this.#setState(event.payload.store.state as AsyncDebouncerState) + this.setOptions(event.payload.options) + } + }) } /** diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index 149c5dd8..000c048c 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { OptionalKeys } from './types' import type { QueuePosition } from './queuer' @@ -299,6 +299,13 @@ export class AsyncQueuer { this.addItem(item, this.options.addItemsTo ?? 'back', isLast) } } + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-AsyncQueuer') { + this.#setState(event.payload.store.state) + this.setOptions(event.payload.options) + } + }) } /** diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index fb9d0464..e7f58a44 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { AnyAsyncFunction } from './types' export interface AsyncRateLimiterState { @@ -230,6 +230,13 @@ export class AsyncRateLimiter { for (const executionTime of this.#getExecutionTimesInWindow()) { this.#setCleanupTimeout(executionTime) } + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-AsyncRateLimiter') { + this.#setState(event.payload.store.state as AsyncRateLimiterState) + this.setOptions(event.payload.options) + } + }) } /** diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index 16d726db..0eccea83 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncThrottlerState { @@ -214,6 +214,13 @@ export class AsyncThrottler { throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } this.#setState(this.options.initialState ?? {}) + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-AsyncThrottler') { + this.#setState(event.payload.store.state as AsyncThrottlerState) + this.setOptions(event.payload.options) + } + }) } /** diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index 3e74d461..2608f49d 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { OptionalKeys } from './types' export interface BatcherState { @@ -159,6 +159,13 @@ export class Batcher { ...initialOptions, } this.#setState(this.options.initialState ?? {}) + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-Batcher') { + this.#setState(event.payload.store.state as BatcherState) + this.setOptions(event.payload.options) + } + }) } /** diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index ba364138..b6328be7 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { AnyFunction } from './types' export interface DebouncerState { @@ -139,6 +139,13 @@ export class Debouncer { ...initialOptions, } this.#setState(this.options.initialState ?? {}) + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-Debouncer') { + this.#setState(event.payload.store.state as DebouncerState) + this.setOptions(event.payload.options) + } + }) } /** diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index 0e56e739..7af9a086 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { AnyFunction } from './types' export interface RateLimiterState { @@ -155,6 +155,13 @@ export class RateLimiter { for (const executionTime of this.#getExecutionTimesInWindow()) { this.#setCleanupTimeout(executionTime) } + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-RateLimiter') { + this.#setState(event.payload.store.state as RateLimiterState) + this.setOptions(event.payload.options) + } + }) } /** diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index 0705ade8..c58b5c60 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -1,6 +1,6 @@ import { Store } from '@tanstack/store' import { createKey, parseFunctionOrValue } from './utils' -import { emitChange } from './event-client' +import { emitChange, pacerEventClient } from './event-client' import type { AnyFunction } from './types' export interface ThrottlerState { @@ -147,6 +147,13 @@ export class Throttler { ...initialOptions, } this.#setState(this.options.initialState ?? {}) + + pacerEventClient.onAllPluginEvents((event) => { + if (event.type === 'pacer:d-Throttler') { + this.#setState(event.payload.store.state as ThrottlerState) + this.setOptions(event.payload.options) + } + }) } /** From 2a50176524c09e86cd4659feabb0516e52d9c340 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Thu, 14 Aug 2025 19:33:32 -0500 Subject: [PATCH 27/50] remove console log --- packages/pacer/src/queuer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index 66d4cd00..8fa3a0d8 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -529,7 +529,6 @@ export class Queuer { numberOfItems: number = this.store.state.items.length, position?: QueuePosition, ): void => { - console.log('flush from queuer') this.#clearTimeout() // clear any pending timeout for (let i = 0; i < numberOfItems; i++) { this.execute(position) From fa451f3211b615ae0bdc1051d8bfb239b57b3225 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 15 Aug 2025 00:34:35 +0000 Subject: [PATCH 28/50] ci: apply automated fixes --- docs/reference/classes/queuer.md | 14 +++++++------- docs/reference/functions/queue.md | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index afaca037..3ca7d57f 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -224,7 +224,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [queuer.ts:659](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L659) +Defined in: [queuer.ts:658](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L658) Removes all pending items from the queue. Does not affect items being processed. @@ -296,7 +296,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [queuer.ts:544](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L544) +Defined in: [queuer.ts:543](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L543) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -350,7 +350,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [queuer.ts:627](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L627) +Defined in: [queuer.ts:626](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L626) Returns a copy of all items in the queue. @@ -366,7 +366,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:617](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L617) +Defined in: [queuer.ts:616](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L616) Returns the next item in the queue without removing it. @@ -394,7 +394,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [queuer.ts:667](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L667) +Defined in: [queuer.ts:666](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L666) Resets the queuer state to its default values @@ -432,7 +432,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [queuer.ts:634](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L634) +Defined in: [queuer.ts:633](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L633) Starts processing items in the queue. If already isRunning, does nothing. @@ -448,7 +448,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [queuer.ts:644](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L644) +Defined in: [queuer.ts:643](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L643) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index 0583dbdc..63433437 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -11,7 +11,7 @@ title: queue function queue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [queuer.ts:710](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L710) +Defined in: [queuer.ts:709](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L709) Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. From 75414d21714d421c2284398b1b662766e0ed6610 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Thu, 14 Aug 2025 19:35:10 -0500 Subject: [PATCH 29/50] sync package versions --- examples/react/useAsyncRetryer/package.json | 6 +-- pnpm-lock.yaml | 45 +++++++++++++++++---- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/examples/react/useAsyncRetryer/package.json b/examples/react/useAsyncRetryer/package.json index 99d2327e..3d07f61c 100644 --- a/examples/react/useAsyncRetryer/package.json +++ b/examples/react/useAsyncRetryer/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.9", + "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^4.7.0", - "vite": "^7.0.6" + "@vitejs/plugin-react": "^5.0.0", + "vite": "^7.1.2" }, "browserslist": { "production": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 29c971db..c1506cd3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -612,7 +612,7 @@ importers: dependencies: '@tanstack/react-pacer': specifier: ^0.14.0 - version: link:../../../packages/react-pacer + version: 0.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -621,17 +621,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.9 - version: 19.1.9 + specifier: ^19.1.10 + version: 19.1.10 '@types/react-dom': specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.2.1)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncThrottler: dependencies: @@ -2708,6 +2708,10 @@ packages: resolution: {integrity: sha512-7OsrYscWEPojIRqh9byyyv2W+jm/3WaDckVnuQgf7a86YPhtN93fHa3hsKquJE/IbMX/FK0EDHi+DPAXwvZ5ZA==} engines: {node: '>=18'} + '@tanstack/pacer@0.13.0': + resolution: {integrity: sha512-eCV3BIn+If4YGMgRbB315CvhyggmBhV85NmBH4uAA2kop6fOJh5GAWsvgsQOqYt0EFhHcjUwQ1eIhqw9aohuOQ==} + engines: {node: '>=18'} + '@tanstack/persister@0.1.1': resolution: {integrity: sha512-XUewm2+D0K84ZSuWm1oMHfqw/flmO7IzCc+316php/XChgbMe30DStp1cF2Uc4IV0cI0G4hDq2RX3+NTxTIvWg==} engines: {node: '>=18'} @@ -2731,6 +2735,13 @@ packages: react: '>=16.8' react-dom: '>=16.8' + '@tanstack/react-pacer@0.14.0': + resolution: {integrity: sha512-K5wR61esBjnO+o5XnagE4twOUtNmNb6WF0+ARQRs68tViq4mNGwKuDHm0OuqAN+7Vq8k41horjiVAj24d6V1vw==} + engines: {node: '>=18'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + '@tanstack/react-persister@0.1.1': resolution: {integrity: sha512-bERMba9+dDOWKJLV5dR6+pKq+xRYyuCsK1Te5Ygs2WiXdvAVLMnNjJIOkIhZ9uihbQvyBIbYPAlb9sCfSgvYWg==} engines: {node: '>=18'} @@ -6502,6 +6513,10 @@ snapshots: - supports-color - typescript + '@tanstack/pacer@0.13.0': + dependencies: + '@tanstack/store': 0.7.2 + '@tanstack/persister@0.1.1': {} '@tanstack/publish-config@0.2.0': @@ -6530,6 +6545,13 @@ snapshots: - solid-js - utf-8-validate + '@tanstack/react-pacer@0.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/pacer': 0.13.0 + '@tanstack/react-store': 0.7.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + '@tanstack/react-persister@0.1.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/persister': 0.1.1 @@ -6554,6 +6576,13 @@ snapshots: react-dom: 19.1.0(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) + '@tanstack/react-store@0.7.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/store': 0.7.2 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + use-sync-external-store: 1.5.0(react@19.1.1) + '@tanstack/solid-store@0.7.3(solid-js@1.9.9)': dependencies: '@tanstack/store': 0.7.2 From 5c5d6c91bdde5a6fbbc7604a5e8ab6715cc2c49b Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 15 Aug 2025 00:36:15 +0000 Subject: [PATCH 30/50] ci: apply automated fixes --- docs/reference/classes/queuer.md | 14 +++++++------- docs/reference/functions/queue.md | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index afaca037..3ca7d57f 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -224,7 +224,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [queuer.ts:659](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L659) +Defined in: [queuer.ts:658](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L658) Removes all pending items from the queue. Does not affect items being processed. @@ -296,7 +296,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [queuer.ts:544](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L544) +Defined in: [queuer.ts:543](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L543) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -350,7 +350,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [queuer.ts:627](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L627) +Defined in: [queuer.ts:626](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L626) Returns a copy of all items in the queue. @@ -366,7 +366,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:617](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L617) +Defined in: [queuer.ts:616](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L616) Returns the next item in the queue without removing it. @@ -394,7 +394,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [queuer.ts:667](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L667) +Defined in: [queuer.ts:666](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L666) Resets the queuer state to its default values @@ -432,7 +432,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [queuer.ts:634](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L634) +Defined in: [queuer.ts:633](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L633) Starts processing items in the queue. If already isRunning, does nothing. @@ -448,7 +448,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [queuer.ts:644](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L644) +Defined in: [queuer.ts:643](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L643) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index 0583dbdc..63433437 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -11,7 +11,7 @@ title: queue function queue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [queuer.ts:710](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L710) +Defined in: [queuer.ts:709](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L709) Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. From 6b372da8b9558df27231febae34fc3d875b48bbe Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Sat, 16 Aug 2025 17:20:32 -0500 Subject: [PATCH 31/50] break up devtools components --- packages/pacer-devtools/package.json | 1 + packages/pacer-devtools/src/PacerDevtools.tsx | 339 +----------------- .../src/components/ActionButtons.tsx | 147 ++++++++ .../src/components/DetailsPanel.tsx | 61 ++++ .../pacer-devtools/src/components/Shell.tsx | 108 ++++++ .../src/components/StateHeader.tsx | 57 +++ .../src/components/UtilList.tsx | 49 +++ .../src/components/util-groups.ts | 54 +++ .../pacer-devtools/src/styles/use-styles.ts | 60 +++- pnpm-lock.yaml | 8 + 10 files changed, 538 insertions(+), 346 deletions(-) create mode 100644 packages/pacer-devtools/src/components/ActionButtons.tsx create mode 100644 packages/pacer-devtools/src/components/DetailsPanel.tsx create mode 100644 packages/pacer-devtools/src/components/Shell.tsx create mode 100644 packages/pacer-devtools/src/components/StateHeader.tsx create mode 100644 packages/pacer-devtools/src/components/UtilList.tsx create mode 100644 packages/pacer-devtools/src/components/util-groups.ts diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json index 573a27c4..5fad6239 100644 --- a/packages/pacer-devtools/package.json +++ b/packages/pacer-devtools/package.json @@ -63,6 +63,7 @@ "dependencies": { "@tanstack/devtools-ui": "^0.3.0", "clsx": "^2.1.1", + "dayjs": "^1.11.13", "goober": "^2.1.16", "solid-js": "^1.9.9" }, diff --git a/packages/pacer-devtools/src/PacerDevtools.tsx b/packages/pacer-devtools/src/PacerDevtools.tsx index c2ae3539..83a8a614 100644 --- a/packages/pacer-devtools/src/PacerDevtools.tsx +++ b/packages/pacer-devtools/src/PacerDevtools.tsx @@ -1,340 +1,5 @@ -import { For, createMemo, createSignal } from 'solid-js' -import clsx from 'clsx' -import { JsonTree } from '@tanstack/devtools-ui' -import { pacerEventClient } from '@tanstack/pacer' -import { - PacerContextProvider, - usePacerDevtoolsState, -} from './PacerContextProvider' -import { useStyles } from './styles/use-styles' - -type StateKey = - | 'asyncBatchers' - | 'asyncDebouncers' - | 'asyncQueuers' - | 'asyncRateLimiters' - | 'asyncThrottlers' - | 'batchers' - | 'debouncers' - | 'queuers' - | 'rateLimiters' - | 'throttlers' - -type UtilGroup = { - key: StateKey - label: string - displayName: string -} - -const UTIL_GROUPS: Array = [ - { key: 'debouncers', label: 'Debouncers', displayName: 'Debouncer' }, - { key: 'throttlers', label: 'Throttlers', displayName: 'Throttler' }, - { key: 'batchers', label: 'Batchers', displayName: 'Batcher' }, - { key: 'queuers', label: 'Queuers', displayName: 'Queuer' }, - { - key: 'rateLimiters', - label: 'Rate Limiters', - displayName: 'Rate Limiter', - }, - { - key: 'asyncDebouncers', - label: 'Async Debouncers', - displayName: 'Async Debouncer', - }, - { - key: 'asyncThrottlers', - label: 'Async Throttlers', - displayName: 'Async Throttler', - }, - { - key: 'asyncBatchers', - label: 'Async Batchers', - displayName: 'Async Batcher', - }, - { - key: 'asyncQueuers', - label: 'Async Queuers', - displayName: 'Async Queuer', - }, - { - key: 'asyncRateLimiters', - label: 'Async Rate Limiters', - displayName: 'Async Rate Limiter', - }, -] - -function Shell() { - const styles = useStyles() - const state = usePacerDevtoolsState() - const [selectedKey, setSelectedKey] = createSignal(null) - const getGroupItems = (key: StateKey) => - (state as unknown as Record>)[key] - - // Find the selected instance - const selectedInstance = createMemo(() => { - const key = selectedKey() - if (!key) return null - for (const group of UTIL_GROUPS) { - const instance = getGroupItems(group.key).find((inst) => inst.key === key) - if (instance) return { instance, type: group.displayName } - } - return null - }) - - const getStatus = (inst: any) => { - try { - return inst.store?.state?.status ?? 'unknown' - } catch { - return 'unknown' - } - } - - return ( -
-
TanStack Pacer
- -
- {/* Left Panel - Util List */} -
-
- - {(group) => ( - <> - {getGroupItems(group.key).length > 0 && ( -
-
{group.label}
- - {(instance) => ( -
setSelectedKey(instance.key ?? null)} - > -
{instance.key}
-
- {getStatus(instance)} -
-
- )} -
-
- )} - - )} -
-
-
- - {/* Right Panel - State Details */} -
-
Details
-
- {(() => { - const entry = selectedInstance() - return entry !== null ? ( - <> -
-
{entry.type}
-
-
Key
-
- {entry.instance.key} -
-
Last Updated
-
- {new Date( - (state.lastUpdatedByKey as any)[entry.instance.key] ?? - Date.now(), - ).toLocaleTimeString()} -
-
-
-
-
-
Actions
- {(() => { - const util = entry.instance - const utilName = entry.type - const emitName = `d-${utilName}` as any - const inst: any = util - const state = inst?.store?.state - const hasPending = state && 'isPending' in state - const hasEmpty = state && 'isEmpty' in state - const isPending = hasPending ? !!state.isPending : false - const isEmpty = hasEmpty ? state.isEmpty : undefined - - // Check which methods are available - const hasFlush = typeof inst.flush === 'function' - const hasCancel = typeof inst.cancel === 'function' - const hasReset = typeof inst.reset === 'function' - const hasClear = typeof inst.clear === 'function' - const hasStart = typeof inst.start === 'function' - const hasStop = typeof inst.stop === 'function' - const hasStartStop = hasStart && hasStop - - // Get running state if available - const isRunning = state?.isRunning ?? true - - // Determine if this is a debouncer/throttler (has isPending) - - // No actions if no methods available - if ( - !hasPending && - !hasFlush && - !hasCancel && - !hasReset && - !hasClear - ) { - return ( -
- No actions available for this util -
- ) - } - - const togglePending = () => { - const next = !isPending - inst.store.setState((prev: any) => ({ - ...prev, - isPending: next, - })) - } - - return ( -
- {hasPending && ( - - )} - {hasFlush && ( - - )} - {hasCancel && ( - - )} - {hasReset && ( - - )} - {hasClear && ( - - )} - {hasStartStop && ( - - )} -
- ) - })()} -
- -
-
Options
-
- -
-
- -
-
State
-
- -
-
-
- - ) : ( -
- Select a util from the left panel to view its state -
- ) - })()} -
-
-
-
- ) -} +import { PacerContextProvider } from './PacerContextProvider' +import { Shell } from './components/Shell' export default function PacerDevtools() { return ( diff --git a/packages/pacer-devtools/src/components/ActionButtons.tsx b/packages/pacer-devtools/src/components/ActionButtons.tsx new file mode 100644 index 00000000..babde0e8 --- /dev/null +++ b/packages/pacer-devtools/src/components/ActionButtons.tsx @@ -0,0 +1,147 @@ +import { pacerEventClient } from '@tanstack/pacer' +import { useStyles } from '../styles/use-styles' + +type ActionButtonsProps = { + instance: any + utilName: string +} + +export function ActionButtons(props: ActionButtonsProps) { + const styles = useStyles() + const utilInstance = props.instance + const utilState = utilInstance?.store?.state + const hasPending = utilState && 'isPending' in utilState + const hasEmpty = utilState && 'isEmpty' in utilState + const isPending = hasPending ? !!utilState.isPending : false + const isEmpty = hasEmpty ? utilState.isEmpty : undefined + + const hasFlush = typeof utilInstance.flush === 'function' + const hasCancel = typeof utilInstance.cancel === 'function' + const hasReset = typeof utilInstance.reset === 'function' + const hasClear = typeof utilInstance.clear === 'function' + const hasStart = typeof utilInstance.start === 'function' + const hasStop = typeof utilInstance.stop === 'function' + const hasStartStop = hasStart && hasStop + + const isRunning = utilState?.isRunning ?? true + + if (!hasPending && !hasFlush && !hasCancel && !hasReset && !hasClear) { + return ( +
+ No actions available for this util +
+ ) + } + + const emitName = `d-${props.utilName}` as any + + return ( +
+ {hasPending && ( + + )} + {hasFlush && ( + + )} + {hasCancel && ( + + )} + {hasReset && ( + + )} + {hasClear && ( + + )} + {hasStartStop && ( + + )} +
+ ) +} diff --git a/packages/pacer-devtools/src/components/DetailsPanel.tsx b/packages/pacer-devtools/src/components/DetailsPanel.tsx new file mode 100644 index 00000000..a3329687 --- /dev/null +++ b/packages/pacer-devtools/src/components/DetailsPanel.tsx @@ -0,0 +1,61 @@ +import { JsonTree } from '@tanstack/devtools-ui' +import { useStyles } from '../styles/use-styles' +import { ActionButtons } from './ActionButtons' +import { StateHeader } from './StateHeader' + +type DetailsPanelProps = { + selectedInstance: () => { instance: any; type: string } | null + lastUpdatedByKey: () => Record +} + +export function DetailsPanel(props: DetailsPanelProps) { + const styles = useStyles() + + return ( +
+ {(() => { + const entry = props.selectedInstance() + if (!entry) { + return ( +
+ Select a util from the left panel to view its state +
+ ) + } + + return ( + <> + + +
+
+
Actions
+ +
+ +
+
State
+
+ +
+
+ +
+
Options
+
+ +
+
+
+ + ) + })()} +
+ ) +} diff --git a/packages/pacer-devtools/src/components/Shell.tsx b/packages/pacer-devtools/src/components/Shell.tsx new file mode 100644 index 00000000..2f9c0cd5 --- /dev/null +++ b/packages/pacer-devtools/src/components/Shell.tsx @@ -0,0 +1,108 @@ +import { createMemo, createSignal, onCleanup, onMount } from 'solid-js' +import { useStyles } from '../styles/use-styles' +import { usePacerDevtoolsState } from '../PacerContextProvider' +import { UTIL_GROUPS } from './util-groups' +import { UtilList } from './UtilList' +import { DetailsPanel } from './DetailsPanel' +import type { StateKey } from './util-groups' + +export function Shell() { + const styles = useStyles() + const state = usePacerDevtoolsState() + const [selectedKey, setSelectedKey] = createSignal(null) + const [leftPanelWidth, setLeftPanelWidth] = createSignal(300) + const [isDragging, setIsDragging] = createSignal(false) + + const getGroupItems = (key: StateKey) => + (state as unknown as Record>)[key] + + const selectedInstance = createMemo(() => { + const key = selectedKey() + if (!key) return null + for (const group of UTIL_GROUPS) { + const instance = getGroupItems(group.key).find((inst) => inst.key === key) + if (instance) return { instance, type: group.displayName } + } + return null + }) + + const getStatus = (inst: any) => { + try { + return inst.store?.state?.status ?? 'unknown' + } catch { + return 'unknown' + } + } + + let dragStartX = 0 + let dragStartWidth = 0 + + const handleMouseDown = (e: MouseEvent) => { + e.preventDefault() + setIsDragging(true) + document.body.style.cursor = 'col-resize' + dragStartX = e.clientX + dragStartWidth = leftPanelWidth() + } + + const handleMouseMove = (e: MouseEvent) => { + if (!isDragging()) return + + const deltaX = e.clientX - dragStartX + const newWidth = Math.max(150, Math.min(800, dragStartWidth + deltaX)) + setLeftPanelWidth(newWidth) + } + + const handleMouseUp = () => { + setIsDragging(false) + document.body.style.cursor = '' + } + + onMount(() => { + document.addEventListener('mousemove', handleMouseMove) + document.addEventListener('mouseup', handleMouseUp) + }) + + onCleanup(() => { + document.removeEventListener('mousemove', handleMouseMove) + document.removeEventListener('mouseup', handleMouseUp) + }) + + return ( +
+
TanStack Pacer
+ +
+
+
Utils
+ +
+ +
+ +
+
Details
+ state.lastUpdatedByKey} + /> +
+
+
+ ) +} diff --git a/packages/pacer-devtools/src/components/StateHeader.tsx b/packages/pacer-devtools/src/components/StateHeader.tsx new file mode 100644 index 00000000..71090db0 --- /dev/null +++ b/packages/pacer-devtools/src/components/StateHeader.tsx @@ -0,0 +1,57 @@ +import dayjs from 'dayjs' +import relativeTime from 'dayjs/plugin/relativeTime' +import { createSignal, onCleanup, onMount } from 'solid-js' +import { useStyles } from '../styles/use-styles' + +dayjs.extend(relativeTime) + +type StateHeaderProps = { + selectedInstance: () => { instance: any; type: string } | null + lastUpdatedByKey: () => Record +} + +export function StateHeader(props: StateHeaderProps) { + const styles = useStyles() + const [now, setNow] = createSignal(Date.now()) + + onMount(() => { + const interval = setInterval(() => { + setNow(Date.now()) + }, 1000) + + onCleanup(() => { + clearInterval(interval) + }) + }) + + const entry = props.selectedInstance() + if (!entry) return null + + const key = entry.instance.key as string + const updatedAt = props.lastUpdatedByKey()[key] ?? Date.now() + + const getRelativeTime = () => { + const diffMs = now() - updatedAt + const diffSeconds = Math.floor(diffMs / 1000) + + if (diffSeconds < 60) { + return `${diffSeconds} second${diffSeconds !== 1 ? 's' : ''} ago` + } + + return dayjs(updatedAt).fromNow() + } + + return ( +
+
{entry.type}
+
+
Key
+
{key}
+
Last Updated
+
+ {new Date(updatedAt).toLocaleTimeString()} ({getRelativeTime()}) +
+
+
+ ) +} diff --git a/packages/pacer-devtools/src/components/UtilList.tsx b/packages/pacer-devtools/src/components/UtilList.tsx new file mode 100644 index 00000000..791598ab --- /dev/null +++ b/packages/pacer-devtools/src/components/UtilList.tsx @@ -0,0 +1,49 @@ +import { For } from 'solid-js' +import clsx from 'clsx' +import { useStyles } from '../styles/use-styles' +import { UTIL_GROUPS } from './util-groups' +import type { StateKey } from './util-groups' + +type UtilListProps = { + selectedKey: () => string | null + setSelectedKey: (key: string | null) => void + getGroupItems: (key: StateKey) => Array + getStatus: (inst: any) => string +} + +export function UtilList(props: UtilListProps) { + const styles = useStyles() + + return ( +
+ + {(group) => ( + <> + {props.getGroupItems(group.key).length > 0 && ( +
+
{group.label}
+ + {(instance) => ( +
props.setSelectedKey(instance.key ?? null)} + > +
{instance.key}
+
+ {props.getStatus(instance)} +
+
+ )} +
+
+ )} + + )} +
+
+ ) +} diff --git a/packages/pacer-devtools/src/components/util-groups.ts b/packages/pacer-devtools/src/components/util-groups.ts new file mode 100644 index 00000000..f7f8dacc --- /dev/null +++ b/packages/pacer-devtools/src/components/util-groups.ts @@ -0,0 +1,54 @@ +export type StateKey = + | 'asyncBatchers' + | 'asyncDebouncers' + | 'asyncQueuers' + | 'asyncRateLimiters' + | 'asyncThrottlers' + | 'batchers' + | 'debouncers' + | 'queuers' + | 'rateLimiters' + | 'throttlers' + +type UtilGroup = { + key: StateKey + label: string + displayName: string +} + +export const UTIL_GROUPS: Array = [ + { key: 'debouncers', label: 'Debouncers', displayName: 'Debouncer' }, + { key: 'throttlers', label: 'Throttlers', displayName: 'Throttler' }, + { key: 'batchers', label: 'Batchers', displayName: 'Batcher' }, + { key: 'queuers', label: 'Queuers', displayName: 'Queuer' }, + { + key: 'rateLimiters', + label: 'Rate Limiters', + displayName: 'Rate Limiter', + }, + { + key: 'asyncDebouncers', + label: 'Async Debouncers', + displayName: 'Async Debouncer', + }, + { + key: 'asyncThrottlers', + label: 'Async Throttlers', + displayName: 'Async Throttler', + }, + { + key: 'asyncBatchers', + label: 'Async Batchers', + displayName: 'Async Batcher', + }, + { + key: 'asyncQueuers', + label: 'Async Queuers', + displayName: 'Async Queuer', + }, + { + key: 'asyncRateLimiters', + label: 'Async Rate Limiters', + displayName: 'Async Rate Limiter', + }, +] diff --git a/packages/pacer-devtools/src/styles/use-styles.ts b/packages/pacer-devtools/src/styles/use-styles.ts index 6fa84943..251f8f7b 100644 --- a/packages/pacer-devtools/src/styles/use-styles.ts +++ b/packages/pacer-devtools/src/styles/use-styles.ts @@ -13,14 +13,11 @@ const stylesFactory = () => { color: ${colors.gray[100]}; font-family: ${fontFamily.sans}; font-size: ${fontSize.sm}; - min-height: 100vh; - padding: ${size[2]}; box-sizing: border-box; display: flex; flex-direction: column; - gap: ${size[3]}; width: 100%; - height: 100vh; + height: 100%; overflow: hidden; `, stickyHeader: css` @@ -28,8 +25,7 @@ const stylesFactory = () => { top: 0; z-index: 10; background: ${colors.darkGray[900]}; - padding-bottom: ${size[2]}; - margin-bottom: ${size[1]}; + padding: ${size[2]}; font-size: ${fontSize.lg}; font-weight: ${font.weight.bold}; color: #84cc16; @@ -37,14 +33,49 @@ const stylesFactory = () => { text-transform: uppercase; border-bottom: 1px solid ${colors.darkGray[700]}; box-shadow: 0 2px 8px 0 ${colors.black + alpha[40]}; + flex-shrink: 0; `, mainContainer: css` - display: grid; - grid-template-columns: 1fr 1fr; - gap: ${size[2]}; + display: flex; flex: 1; min-height: 0; overflow: hidden; + gap: ${size[2]}; + padding: ${size[2]}; + padding-top: 0; + `, + dragHandle: css` + width: 4px; + background: ${colors.darkGray[600]}; + cursor: col-resize; + position: relative; + transition: background 0.2s ease; + user-select: none; + + &:hover { + background: ${colors.blue[500]}; + } + + &.dragging { + background: ${colors.blue[600]}; + } + + &::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 2px; + height: 20px; + background: ${colors.darkGray[400]}; + border-radius: 1px; + } + + &:hover::after, + &.dragging::after { + background: ${colors.blue[300]}; + } `, leftPanel: css` background: ${colors.darkGray[800]}; @@ -54,6 +85,7 @@ const stylesFactory = () => { flex-direction: column; overflow: hidden; min-height: 0; + flex: 1; `, rightPanel: css` background: ${colors.darkGray[800]}; @@ -63,6 +95,7 @@ const stylesFactory = () => { flex-direction: column; overflow: hidden; min-height: 0; + flex: 1; `, panelHeader: css` font-size: ${fontSize.md}; @@ -71,6 +104,7 @@ const stylesFactory = () => { padding: ${size[2]}; border-bottom: 1px solid ${colors.darkGray[700]}; background: ${colors.darkGray[800]}; + flex-shrink: 0; `, utilList: css` flex: 1; @@ -206,6 +240,14 @@ const stylesFactory = () => { background: ${colors.darkGray[500]}; border-color: ${colors.darkGray[400]}; } + &:disabled { + opacity: 0.5; + cursor: not-allowed; + &:hover { + background: ${colors.darkGray[600]}; + border-color: ${colors.darkGray[500]}; + } + } `, actionDotBlue: css` width: 6px; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb7731cd..d7d807f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1571,6 +1571,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 goober: specifier: ^2.1.16 version: 2.1.16(csstype@3.1.3) @@ -3362,6 +3365,9 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -7249,6 +7255,8 @@ snapshots: dataloader@1.4.0: {} + dayjs@1.11.13: {} + de-indent@1.0.2: {} debug@3.2.7: From 05a046a5326febf974bd9ee319b2d1ed2113f896 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Mon, 18 Aug 2025 07:59:50 -0500 Subject: [PATCH 32/50] default options --- examples/react/useAsyncBatcher/src/index.tsx | 2 +- .../react/useAsyncDebouncer/src/index.tsx | 46 ++++++++----------- examples/react/useAsyncQueuer/src/index.tsx | 2 +- .../react/useAsyncRateLimiter/src/index.tsx | 4 +- .../react/useAsyncThrottler/src/index.tsx | 4 +- examples/react/useBatcher/src/index.tsx | 2 +- examples/react/useDebouncer/src/index.tsx | 2 +- examples/react/useQueuer/src/index.tsx | 2 +- examples/react/useRateLimiter/src/index.tsx | 2 +- examples/react/useThrottler/src/index.tsx | 2 +- .../src/provider/PacerProvider.tsx | 13 ++++-- 11 files changed, 38 insertions(+), 43 deletions(-) diff --git a/examples/react/useAsyncBatcher/src/index.tsx b/examples/react/useAsyncBatcher/src/index.tsx index af588817..7ebff2dc 100644 --- a/examples/react/useAsyncBatcher/src/index.tsx +++ b/examples/react/useAsyncBatcher/src/index.tsx @@ -219,7 +219,7 @@ const root = ReactDOM.createRoot(document.getElementById('root')!) root.render( // optionally, provide default options to an optional PacerProvider + + + ) : null, + ) +} + let mounted = true -root.render( - // optionally, provide default options to an optional PacerProvider - - - , -) +renderApp(mounted) -// demo unmounting and cancellation document.addEventListener('keydown', (e) => { if (e.shiftKey && e.key === 'Enter') { mounted = !mounted - root.render( - mounted ? ( - // optionally, provide default options to an optional PacerProvider - - - - ) : null, - ) + renderApp(mounted) } }) diff --git a/examples/react/useAsyncQueuer/src/index.tsx b/examples/react/useAsyncQueuer/src/index.tsx index 6ae40ca7..b59f23a0 100644 --- a/examples/react/useAsyncQueuer/src/index.tsx +++ b/examples/react/useAsyncQueuer/src/index.tsx @@ -146,7 +146,7 @@ const root = ReactDOM.createRoot(document.getElementById('root')!) root.render( // optionally, provide default options to an optional PacerProvider { mounted ? ( // optionally, provide default options to an optional PacerProvider { mounted ? ( // optionally, provide default options to an optional PacerProvider (null) export interface PacerProviderProps { children: ReactNode - options?: PacerProviderOptions + defaultOptions?: PacerProviderOptions } -export function PacerProvider({ children, options = {} }: PacerProviderProps) { +export function PacerProvider({ + children, + defaultOptions = {}, +}: PacerProviderProps) { const contextValue: PacerContextValue = { - options, + defaultOptions, } return ( @@ -58,5 +61,5 @@ export function usePacerContext() { export function useDefaultPacerOptions() { const context = useContext(PacerContext) - return context?.options ?? {} + return context?.defaultOptions ?? {} } From e42387e8a72449bec3f7c75130a0405f966f03ff Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 13:00:56 +0000 Subject: [PATCH 33/50] ci: apply automated fixes --- .../react/reference/functions/usedefaultpaceroptions.md | 2 +- docs/framework/react/reference/functions/usepacercontext.md | 2 +- .../react/reference/interfaces/pacerproviderprops.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/framework/react/reference/functions/usedefaultpaceroptions.md b/docs/framework/react/reference/functions/usedefaultpaceroptions.md index 532cd830..a5fb75f6 100644 --- a/docs/framework/react/reference/functions/usedefaultpaceroptions.md +++ b/docs/framework/react/reference/functions/usedefaultpaceroptions.md @@ -11,7 +11,7 @@ title: useDefaultPacerOptions function useDefaultPacerOptions(): PacerProviderOptions ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:59](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L59) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:62](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L62) ## Returns diff --git a/docs/framework/react/reference/functions/usepacercontext.md b/docs/framework/react/reference/functions/usepacercontext.md index 4937efd5..f5b38619 100644 --- a/docs/framework/react/reference/functions/usepacercontext.md +++ b/docs/framework/react/reference/functions/usepacercontext.md @@ -11,7 +11,7 @@ title: usePacerContext function usePacerContext(): null | PacerContextValue ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:55](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L55) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:58](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L58) ## Returns diff --git a/docs/framework/react/reference/interfaces/pacerproviderprops.md b/docs/framework/react/reference/interfaces/pacerproviderprops.md index 49380176..5841e9d6 100644 --- a/docs/framework/react/reference/interfaces/pacerproviderprops.md +++ b/docs/framework/react/reference/interfaces/pacerproviderprops.md @@ -21,10 +21,10 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:39](https://github.com/T *** -### options? +### defaultOptions? ```ts -optional options: PacerProviderOptions; +optional defaultOptions: PacerProviderOptions; ``` Defined in: [react-pacer/src/provider/PacerProvider.tsx:40](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L40) From 471337b39ed95a8ecb47924d912f532608e18c4d Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 00:16:35 +0000 Subject: [PATCH 34/50] ci: apply automated fixes --- packages/pacer/src/queuer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index 77319564..fe3277a2 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -287,7 +287,7 @@ export class Queuer { this.addItem(item, this.options.addItemsTo ?? 'back', isLast) } } - + pacerEventClient.on('d-Queuer', (event) => { if (event.payload.key !== this.key) return this.#setState(event.payload.store.state) From 4eabc6ca184c8a20037164301f45a070ca46fa24 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Thu, 28 Aug 2025 13:49:32 -0500 Subject: [PATCH 35/50] package upgrades --- examples/react/asyncBatch/package.json | 6 +- examples/react/asyncDebounce/package.json | 6 +- examples/react/asyncRateLimit/package.json | 6 +- examples/react/asyncThrottle/package.json | 6 +- examples/react/batch/package.json | 6 +- examples/react/debounce/package.json | 6 +- examples/react/queue/package.json | 8 +- examples/react/rateLimit/package.json | 6 +- .../package.json | 6 +- .../react-query-queued-prefetch/package.json | 6 +- .../package.json | 6 +- examples/react/throttle/package.json | 6 +- .../useAsyncBatchedCallback/package.json | 6 +- examples/react/useAsyncBatcher/package.json | 6 +- .../useAsyncDebouncedCallback/package.json | 6 +- examples/react/useAsyncDebouncer/package.json | 6 +- .../react/useAsyncQueuedState/package.json | 6 +- examples/react/useAsyncQueuer/package.json | 6 +- .../react/useAsyncRateLimiter/package.json | 6 +- .../package.json | 6 +- examples/react/useAsyncRetryer/package.json | 8 +- examples/react/useAsyncThrottler/package.json | 6 +- .../react/useBatchedCallback/package.json | 6 +- examples/react/useBatcher/package.json | 6 +- .../react/useDebouncedCallback/package.json | 6 +- examples/react/useDebouncedState/package.json | 6 +- examples/react/useDebouncedValue/package.json | 6 +- examples/react/useDebouncer/package.json | 6 +- examples/react/useQueuedState/package.json | 6 +- examples/react/useQueuedValue/package.json | 6 +- examples/react/useQueuer/package.json | 8 +- .../react/useQueuerWithPersister/package.json | 6 +- .../react/useRateLimitedCallback/package.json | 6 +- .../react/useRateLimitedState/package.json | 6 +- .../react/useRateLimitedValue/package.json | 6 +- examples/react/useRateLimiter/package.json | 6 +- .../useRateLimiterWithPersister/package.json | 6 +- .../react/useThrottledCallback/package.json | 6 +- examples/react/useThrottledState/package.json | 6 +- examples/react/useThrottledValue/package.json | 6 +- examples/react/useThrottler/package.json | 6 +- examples/react/util-comparison/package.json | 8 +- examples/solid/createQueuer/package.json | 2 +- examples/solid/queue/package.json | 2 +- package.json | 12 +- packages/pacer-devtools/package.json | 6 +- packages/pacer/package.json | 2 +- packages/react-pacer-devtools/package.json | 2 +- packages/react-pacer/package.json | 6 +- packages/solid-pacer/package.json | 2 +- pnpm-lock.yaml | 1895 +++++++++-------- 51 files changed, 1109 insertions(+), 1080 deletions(-) diff --git a/examples/react/asyncBatch/package.json b/examples/react/asyncBatch/package.json index 16e13205..3e54a5f0 100644 --- a/examples/react/asyncBatch/package.json +++ b/examples/react/asyncBatch/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/asyncDebounce/package.json b/examples/react/asyncDebounce/package.json index d3a18f55..02ba7574 100644 --- a/examples/react/asyncDebounce/package.json +++ b/examples/react/asyncDebounce/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/asyncRateLimit/package.json b/examples/react/asyncRateLimit/package.json index a04d3829..accd0d56 100644 --- a/examples/react/asyncRateLimit/package.json +++ b/examples/react/asyncRateLimit/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/asyncThrottle/package.json b/examples/react/asyncThrottle/package.json index 04fd3aef..f607de15 100644 --- a/examples/react/asyncThrottle/package.json +++ b/examples/react/asyncThrottle/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/batch/package.json b/examples/react/batch/package.json index 29e37042..382648ae 100644 --- a/examples/react/batch/package.json +++ b/examples/react/batch/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/debounce/package.json b/examples/react/debounce/package.json index 27173a30..20dacc97 100644 --- a/examples/react/debounce/package.json +++ b/examples/react/debounce/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index 20a14331..b84e2114 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -14,11 +14,11 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-devtools": "0.4.2", + "@tanstack/react-devtools": "0.5.3", "@tanstack/react-pacer-devtools": "0.1.0", - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/rateLimit/package.json b/examples/react/rateLimit/package.json index ff03c2d1..9e8a9a86 100644 --- a/examples/react/rateLimit/package.json +++ b/examples/react/rateLimit/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/react-query-debounced-prefetch/package.json b/examples/react/react-query-debounced-prefetch/package.json index 75ca5296..5e3fca49 100644 --- a/examples/react/react-query-debounced-prefetch/package.json +++ b/examples/react/react-query-debounced-prefetch/package.json @@ -16,9 +16,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/react-query-queued-prefetch/package.json b/examples/react/react-query-queued-prefetch/package.json index fcade7e6..0ce4c1a2 100644 --- a/examples/react/react-query-queued-prefetch/package.json +++ b/examples/react/react-query-queued-prefetch/package.json @@ -16,9 +16,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/react-query-throttled-prefetch/package.json b/examples/react/react-query-throttled-prefetch/package.json index c7561a4a..70db5024 100644 --- a/examples/react/react-query-throttled-prefetch/package.json +++ b/examples/react/react-query-throttled-prefetch/package.json @@ -16,9 +16,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/throttle/package.json b/examples/react/throttle/package.json index 808d1ab4..4b972eb0 100644 --- a/examples/react/throttle/package.json +++ b/examples/react/throttle/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncBatchedCallback/package.json b/examples/react/useAsyncBatchedCallback/package.json index be0167ff..08d6d98d 100644 --- a/examples/react/useAsyncBatchedCallback/package.json +++ b/examples/react/useAsyncBatchedCallback/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncBatcher/package.json b/examples/react/useAsyncBatcher/package.json index 9320c02a..9f554d90 100644 --- a/examples/react/useAsyncBatcher/package.json +++ b/examples/react/useAsyncBatcher/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncDebouncedCallback/package.json b/examples/react/useAsyncDebouncedCallback/package.json index 2fa61048..2a66c44a 100644 --- a/examples/react/useAsyncDebouncedCallback/package.json +++ b/examples/react/useAsyncDebouncedCallback/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncDebouncer/package.json b/examples/react/useAsyncDebouncer/package.json index 7679fe28..fa79aab7 100644 --- a/examples/react/useAsyncDebouncer/package.json +++ b/examples/react/useAsyncDebouncer/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncQueuedState/package.json b/examples/react/useAsyncQueuedState/package.json index 4eb8d40c..5a5acbb2 100644 --- a/examples/react/useAsyncQueuedState/package.json +++ b/examples/react/useAsyncQueuedState/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncQueuer/package.json b/examples/react/useAsyncQueuer/package.json index b58d5c1c..d91bdfcb 100644 --- a/examples/react/useAsyncQueuer/package.json +++ b/examples/react/useAsyncQueuer/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncRateLimiter/package.json b/examples/react/useAsyncRateLimiter/package.json index 25c03aa1..8d2e5583 100644 --- a/examples/react/useAsyncRateLimiter/package.json +++ b/examples/react/useAsyncRateLimiter/package.json @@ -15,9 +15,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncRateLimiterWithPersister/package.json b/examples/react/useAsyncRateLimiterWithPersister/package.json index 81a8a9c2..aa4ab283 100644 --- a/examples/react/useAsyncRateLimiterWithPersister/package.json +++ b/examples/react/useAsyncRateLimiterWithPersister/package.json @@ -15,9 +15,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useAsyncRetryer/package.json b/examples/react/useAsyncRetryer/package.json index 3d07f61c..ecf59fbb 100644 --- a/examples/react/useAsyncRetryer/package.json +++ b/examples/react/useAsyncRetryer/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.0", - "vite": "^7.1.2" + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", + "vite": "^7.1.3" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncThrottler/package.json b/examples/react/useAsyncThrottler/package.json index dd863a0e..090cb5a8 100644 --- a/examples/react/useAsyncThrottler/package.json +++ b/examples/react/useAsyncThrottler/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useBatchedCallback/package.json b/examples/react/useBatchedCallback/package.json index f92a0cff..8236bc13 100644 --- a/examples/react/useBatchedCallback/package.json +++ b/examples/react/useBatchedCallback/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useBatcher/package.json b/examples/react/useBatcher/package.json index 890e4bee..28b62d11 100644 --- a/examples/react/useBatcher/package.json +++ b/examples/react/useBatcher/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useDebouncedCallback/package.json b/examples/react/useDebouncedCallback/package.json index 0dd02e67..226260ad 100644 --- a/examples/react/useDebouncedCallback/package.json +++ b/examples/react/useDebouncedCallback/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useDebouncedState/package.json b/examples/react/useDebouncedState/package.json index c0005405..03bc7bfc 100644 --- a/examples/react/useDebouncedState/package.json +++ b/examples/react/useDebouncedState/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useDebouncedValue/package.json b/examples/react/useDebouncedValue/package.json index 33a957f6..7c732aeb 100644 --- a/examples/react/useDebouncedValue/package.json +++ b/examples/react/useDebouncedValue/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useDebouncer/package.json b/examples/react/useDebouncer/package.json index 6ef0fadd..b8599e2a 100644 --- a/examples/react/useDebouncer/package.json +++ b/examples/react/useDebouncer/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useQueuedState/package.json b/examples/react/useQueuedState/package.json index 38d171b4..d495ad9c 100644 --- a/examples/react/useQueuedState/package.json +++ b/examples/react/useQueuedState/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useQueuedValue/package.json b/examples/react/useQueuedValue/package.json index 17b45ee6..551f8df3 100644 --- a/examples/react/useQueuedValue/package.json +++ b/examples/react/useQueuedValue/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useQueuer/package.json b/examples/react/useQueuer/package.json index bbceb6e3..066be2d1 100644 --- a/examples/react/useQueuer/package.json +++ b/examples/react/useQueuer/package.json @@ -15,11 +15,11 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-devtools": "0.4.2", + "@tanstack/react-devtools": "0.5.3", "@tanstack/react-pacer-devtools": "0.1.0", - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useQueuerWithPersister/package.json b/examples/react/useQueuerWithPersister/package.json index 9dbf63d0..516fc792 100644 --- a/examples/react/useQueuerWithPersister/package.json +++ b/examples/react/useQueuerWithPersister/package.json @@ -15,9 +15,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useRateLimitedCallback/package.json b/examples/react/useRateLimitedCallback/package.json index 6e63c54f..0d3a9447 100644 --- a/examples/react/useRateLimitedCallback/package.json +++ b/examples/react/useRateLimitedCallback/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useRateLimitedState/package.json b/examples/react/useRateLimitedState/package.json index 01129a3b..fe82e792 100644 --- a/examples/react/useRateLimitedState/package.json +++ b/examples/react/useRateLimitedState/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useRateLimitedValue/package.json b/examples/react/useRateLimitedValue/package.json index 335a4c28..8e40ef6d 100644 --- a/examples/react/useRateLimitedValue/package.json +++ b/examples/react/useRateLimitedValue/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useRateLimiter/package.json b/examples/react/useRateLimiter/package.json index 356c313d..45eb2199 100644 --- a/examples/react/useRateLimiter/package.json +++ b/examples/react/useRateLimiter/package.json @@ -15,9 +15,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useRateLimiterWithPersister/package.json b/examples/react/useRateLimiterWithPersister/package.json index 1d5148e8..ecb2ce04 100644 --- a/examples/react/useRateLimiterWithPersister/package.json +++ b/examples/react/useRateLimiterWithPersister/package.json @@ -15,9 +15,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useThrottledCallback/package.json b/examples/react/useThrottledCallback/package.json index 63277343..81ae2abc 100644 --- a/examples/react/useThrottledCallback/package.json +++ b/examples/react/useThrottledCallback/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useThrottledState/package.json b/examples/react/useThrottledState/package.json index 17ad4a1c..c7ce12ad 100644 --- a/examples/react/useThrottledState/package.json +++ b/examples/react/useThrottledState/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useThrottledValue/package.json b/examples/react/useThrottledValue/package.json index ee654bed..f8b8fec3 100644 --- a/examples/react/useThrottledValue/package.json +++ b/examples/react/useThrottledValue/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/useThrottler/package.json b/examples/react/useThrottler/package.json index cc4fb43b..270cbb50 100644 --- a/examples/react/useThrottler/package.json +++ b/examples/react/useThrottler/package.json @@ -14,9 +14,9 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/react/util-comparison/package.json b/examples/react/util-comparison/package.json index 6739e383..baf1dd9a 100644 --- a/examples/react/util-comparison/package.json +++ b/examples/react/util-comparison/package.json @@ -14,11 +14,11 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-devtools": "0.4.2", + "@tanstack/react-devtools": "0.5.3", "@tanstack/react-pacer-devtools": "0.1.0", - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.3" }, "browserslist": { diff --git a/examples/solid/createQueuer/package.json b/examples/solid/createQueuer/package.json index 7ee2ccd1..425a0ae1 100644 --- a/examples/solid/createQueuer/package.json +++ b/examples/solid/createQueuer/package.json @@ -9,7 +9,7 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/solid-devtools": "0.4.2", + "@tanstack/solid-devtools": "0.5.3", "@tanstack/solid-pacer": "^0.14.1", "@tanstack/solid-pacer-devtools": "0.1.0", "solid-js": "^1.9.9" diff --git a/examples/solid/queue/package.json b/examples/solid/queue/package.json index f8fc5ac9..9582bddc 100644 --- a/examples/solid/queue/package.json +++ b/examples/solid/queue/package.json @@ -9,7 +9,7 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/solid-devtools": "0.4.2", + "@tanstack/solid-devtools": "0.5.3", "@tanstack/solid-pacer": "^0.14.1", "@tanstack/solid-pacer-devtools": "0.1.0", "solid-js": "^1.9.9" diff --git a/package.json b/package.json index 4cfaf518..115ddd93 100644 --- a/package.json +++ b/package.json @@ -53,19 +53,19 @@ ], "devDependencies": { "@changesets/cli": "^2.29.6", - "@faker-js/faker": "^9.9.0", + "@faker-js/faker": "^10.0.0", "@size-limit/preset-small-lib": "^11.2.0", "@svitejs/changesets-changelog-github-compact": "^1.2.0", - "@tanstack/config": "0.20.0", - "@testing-library/jest-dom": "^6.7.0", + "@tanstack/config": "0.20.1", + "@testing-library/jest-dom": "^6.8.0", "@types/node": "^24.3.0", - "eslint": "^9.33.0", + "eslint": "^9.34.0", "eslint-plugin-unused-imports": "^4.2.0", "fast-glob": "^3.3.3", "jsdom": "^26.1.0", - "knip": "^5.62.0", + "knip": "^5.63.0", "markdown-link-extractor": "^4.0.2", - "nx": "^21.4.0", + "nx": "^21.4.1", "premove": "^4.0.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json index 756dc6c9..118fa829 100644 --- a/packages/pacer-devtools/package.json +++ b/packages/pacer-devtools/package.json @@ -71,10 +71,10 @@ "@tanstack/pacer": ">=0.15.0" }, "dependencies": { - "@tanstack/devtools-ui": "^0.3.1", - "@tanstack/solid-store": "^0.7.3", + "@tanstack/devtools-ui": "^0.3.2", + "@tanstack/solid-store": "^0.7.4", "clsx": "^2.1.1", - "dayjs": "^1.11.13", + "dayjs": "^1.11.15", "goober": "^2.1.16", "solid-js": "^1.9.9" }, diff --git a/packages/pacer/package.json b/packages/pacer/package.json index 74d05667..4a497cf5 100644 --- a/packages/pacer/package.json +++ b/packages/pacer/package.json @@ -192,6 +192,6 @@ }, "dependencies": { "@tanstack/devtools-event-client": "^0.2.2", - "@tanstack/store": "^0.7.2" + "@tanstack/store": "^0.7.4" } } diff --git a/packages/react-pacer-devtools/package.json b/packages/react-pacer-devtools/package.json index 554ab5b8..c6a4add0 100644 --- a/packages/react-pacer-devtools/package.json +++ b/packages/react-pacer-devtools/package.json @@ -78,7 +78,7 @@ }, "devDependencies": { "@eslint-react/eslint-plugin": "^1.52.6", - "@vitejs/plugin-react": "^5.0.1", + "@vitejs/plugin-react": "^5.0.2", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0" } diff --git a/packages/react-pacer/package.json b/packages/react-pacer/package.json index 5536b654..6381f3d4 100644 --- a/packages/react-pacer/package.json +++ b/packages/react-pacer/package.json @@ -192,12 +192,12 @@ }, "dependencies": { "@tanstack/pacer": "workspace:*", - "@tanstack/react-store": "^0.7.3" + "@tanstack/react-store": "^0.7.4" }, "devDependencies": { "@eslint-react/eslint-plugin": "^1.52.6", - "@types/react": "^19.1.10", - "@vitejs/plugin-react": "^5.0.1", + "@types/react": "^19.1.12", + "@vitejs/plugin-react": "^5.0.2", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0", "react": "^19.1.1" diff --git a/packages/solid-pacer/package.json b/packages/solid-pacer/package.json index 6ac4d77e..a407c7b5 100644 --- a/packages/solid-pacer/package.json +++ b/packages/solid-pacer/package.json @@ -172,7 +172,7 @@ }, "dependencies": { "@tanstack/pacer": "workspace:*", - "@tanstack/solid-store": "^0.7.3" + "@tanstack/solid-store": "^0.7.4" }, "devDependencies": { "solid-js": "^1.9.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26189fe2..865bf747 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^2.29.6 version: 2.29.6(@types/node@24.3.0) '@faker-js/faker': - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^10.0.0 + version: 10.0.0 '@size-limit/preset-small-lib': specifier: ^11.2.0 version: 11.2.0(size-limit@11.2.0) @@ -21,20 +21,20 @@ importers: specifier: ^1.2.0 version: 1.2.0 '@tanstack/config': - specifier: 0.20.0 - version: 0.20.0(@types/node@24.3.0)(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: 0.20.1 + version: 0.20.1(@types/node@24.3.0)(@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) '@testing-library/jest-dom': - specifier: ^6.7.0 - version: 6.7.0 + specifier: ^6.8.0 + version: 6.8.0 '@types/node': specifier: ^24.3.0 version: 24.3.0 eslint: - specifier: ^9.33.0 - version: 9.33.0(jiti@2.4.2) + specifier: ^9.34.0 + version: 9.34.0(jiti@2.5.1) eslint-plugin-unused-imports: specifier: ^4.2.0 - version: 4.2.0(@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)) + version: 4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -42,14 +42,14 @@ importers: specifier: ^26.1.0 version: 26.1.0 knip: - specifier: ^5.62.0 - version: 5.62.0(@types/node@24.3.0)(typescript@5.9.2) + specifier: ^5.63.0 + version: 5.63.0(@types/node@24.3.0)(typescript@5.9.2) markdown-link-extractor: specifier: ^4.0.2 version: 4.0.2 nx: - specifier: ^21.4.0 - version: 21.4.0 + specifier: ^21.4.1 + version: 21.4.1 premove: specifier: ^4.0.0 version: 4.0.0 @@ -73,10 +73,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0) + version: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncBatch: dependencies: @@ -91,17 +91,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncDebounce: dependencies: @@ -116,17 +116,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncRateLimit: dependencies: @@ -141,17 +141,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncThrottle: dependencies: @@ -166,17 +166,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/batch: dependencies: @@ -191,17 +191,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/debounce: dependencies: @@ -216,17 +216,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/queue: dependencies: @@ -241,23 +241,23 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@tanstack/react-devtools': - specifier: 0.4.2 - version: 0.4.2(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + specifier: 0.5.3 + version: 0.5.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.1.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/rateLimit: dependencies: @@ -272,17 +272,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-debounced-prefetch: dependencies: @@ -303,17 +303,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-queued-prefetch: dependencies: @@ -334,17 +334,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-throttled-prefetch: dependencies: @@ -365,17 +365,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/throttle: dependencies: @@ -390,17 +390,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatchedCallback: dependencies: @@ -415,17 +415,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatcher: dependencies: @@ -440,17 +440,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncedCallback: dependencies: @@ -465,17 +465,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncer: dependencies: @@ -490,17 +490,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuedState: dependencies: @@ -515,17 +515,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuer: dependencies: @@ -540,17 +540,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiter: dependencies: @@ -568,17 +568,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiterWithPersister: dependencies: @@ -596,17 +596,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRetryer: dependencies: @@ -621,17 +621,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.0 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.2 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.3 + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncThrottler: dependencies: @@ -646,17 +646,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatchedCallback: dependencies: @@ -671,17 +671,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatcher: dependencies: @@ -696,17 +696,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedCallback: dependencies: @@ -721,17 +721,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedState: dependencies: @@ -746,17 +746,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedValue: dependencies: @@ -771,17 +771,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncer: dependencies: @@ -796,17 +796,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedState: dependencies: @@ -821,17 +821,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedValue: dependencies: @@ -846,17 +846,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuer: dependencies: @@ -874,23 +874,23 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@tanstack/react-devtools': - specifier: 0.4.2 - version: 0.4.2(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + specifier: 0.5.3 + version: 0.5.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.1.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuerWithPersister: dependencies: @@ -908,17 +908,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedCallback: dependencies: @@ -933,17 +933,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedState: dependencies: @@ -958,17 +958,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedValue: dependencies: @@ -983,17 +983,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiter: dependencies: @@ -1011,17 +1011,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiterWithPersister: dependencies: @@ -1039,17 +1039,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledCallback: dependencies: @@ -1064,17 +1064,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledState: dependencies: @@ -1089,17 +1089,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledValue: dependencies: @@ -1114,17 +1114,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottler: dependencies: @@ -1139,17 +1139,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/react/util-comparison: dependencies: @@ -1164,23 +1164,23 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@tanstack/react-devtools': - specifier: 0.4.2 - version: 0.4.2(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + specifier: 0.5.3 + version: 0.5.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.1.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@types/react-dom': - specifier: ^19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) examples/solid/asyncBatch: dependencies: @@ -1193,10 +1193,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncDebounce: dependencies: @@ -1209,10 +1209,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncRateLimit: dependencies: @@ -1225,10 +1225,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncThrottle: dependencies: @@ -1241,10 +1241,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/batch: dependencies: @@ -1257,10 +1257,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncBatcher: dependencies: @@ -1273,10 +1273,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncDebouncer: dependencies: @@ -1289,10 +1289,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncQueuer: dependencies: @@ -1305,10 +1305,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncRateLimiter: dependencies: @@ -1321,10 +1321,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncThrottler: dependencies: @@ -1337,10 +1337,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createBatcher: dependencies: @@ -1353,10 +1353,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedSignal: dependencies: @@ -1369,10 +1369,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedValue: dependencies: @@ -1385,10 +1385,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncer: dependencies: @@ -1401,16 +1401,16 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createQueuer: dependencies: '@tanstack/solid-devtools': - specifier: 0.4.2 - version: 0.4.2(csstype@3.1.3)(solid-js@1.9.9) + specifier: 0.5.3 + version: 0.5.3(csstype@3.1.3)(solid-js@1.9.9) '@tanstack/solid-pacer': specifier: ^0.14.1 version: link:../../../packages/solid-pacer @@ -1423,10 +1423,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedSignal: dependencies: @@ -1439,10 +1439,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedValue: dependencies: @@ -1455,10 +1455,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimiter: dependencies: @@ -1471,10 +1471,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledSignal: dependencies: @@ -1487,10 +1487,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledValue: dependencies: @@ -1503,10 +1503,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottler: dependencies: @@ -1519,10 +1519,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/debounce: dependencies: @@ -1535,16 +1535,16 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/queue: dependencies: '@tanstack/solid-devtools': - specifier: 0.4.2 - version: 0.4.2(csstype@3.1.3)(solid-js@1.9.9) + specifier: 0.5.3 + version: 0.5.3(csstype@3.1.3)(solid-js@1.9.9) '@tanstack/solid-pacer': specifier: ^0.14.1 version: link:../../../packages/solid-pacer @@ -1557,10 +1557,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/rateLimit: dependencies: @@ -1573,10 +1573,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/throttle: dependencies: @@ -1589,10 +1589,10 @@ importers: devDependencies: vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) packages/pacer: dependencies: @@ -1600,26 +1600,26 @@ importers: specifier: ^0.2.2 version: 0.2.2 '@tanstack/store': - specifier: ^0.7.2 - version: 0.7.2 + specifier: ^0.7.4 + version: 0.7.4 packages/pacer-devtools: dependencies: '@tanstack/devtools-ui': - specifier: ^0.3.1 - version: 0.3.1(csstype@3.1.3)(solid-js@1.9.9) + specifier: ^0.3.2 + version: 0.3.2(csstype@3.1.3)(solid-js@1.9.9) '@tanstack/pacer': specifier: '>=0.15.0' version: link:../pacer '@tanstack/solid-store': - specifier: ^0.7.3 - version: 0.7.3(solid-js@1.9.9) + specifier: ^0.7.4 + version: 0.7.4(solid-js@1.9.9) clsx: specifier: ^2.1.1 version: 2.1.1 dayjs: - specifier: ^1.11.13 - version: 1.11.13 + specifier: ^1.11.15 + version: 1.11.15 goober: specifier: ^2.1.16 version: 2.1.16(csstype@3.1.3) @@ -1629,7 +1629,7 @@ importers: devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) packages/react-pacer: dependencies: @@ -1637,27 +1637,27 @@ importers: specifier: workspace:* version: link:../pacer '@tanstack/react-store': - specifier: ^0.7.3 - version: 0.7.3(react-dom@19.1.0(react@19.1.1))(react@19.1.1) + specifier: ^0.7.4 + version: 0.7.4(react-dom@19.1.0(react@19.1.1))(react@19.1.1) react-dom: specifier: '>=16.8' version: 19.1.0(react@19.1.1) devDependencies: '@eslint-react/eslint-plugin': specifier: ^1.52.6 - version: 1.52.6(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + version: 1.52.6(eslint@9.34.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) '@types/react': - specifier: ^19.1.10 - version: 19.1.10 + specifier: ^19.1.12 + version: 19.1.12 '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.33.0(jiti@2.4.2)) + version: 19.1.0-rc.2(eslint@9.34.0(jiti@2.5.1)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.33.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.34.0(jiti@2.5.1)) react: specifier: ^19.1.1 version: 19.1.1 @@ -1682,16 +1682,16 @@ importers: devDependencies: '@eslint-react/eslint-plugin': specifier: ^1.52.6 - version: 1.52.6(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + version: 1.52.6(eslint@9.34.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) '@vitejs/plugin-react': - specifier: ^5.0.1 - version: 5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.33.0(jiti@2.4.2)) + version: 19.1.0-rc.2(eslint@9.34.0(jiti@2.5.1)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.33.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.34.0(jiti@2.5.1)) packages/solid-pacer: dependencies: @@ -1699,15 +1699,15 @@ importers: specifier: workspace:* version: link:../pacer '@tanstack/solid-store': - specifier: ^0.7.3 - version: 0.7.3(solid-js@1.9.9) + specifier: ^0.7.4 + version: 0.7.4(solid-js@1.9.9) devDependencies: solid-js: specifier: ^1.9.9 version: 1.9.9 vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) packages/solid-pacer-devtools: dependencies: @@ -1720,7 +1720,7 @@ importers: devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.7)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.7)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) packages: @@ -2077,12 +2077,21 @@ packages: '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@esbuild/aix-ppc64@0.25.0': resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} @@ -2293,12 +2302,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.33.0': - resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} + '@eslint/js@9.34.0': + resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -2309,9 +2314,9 @@ packages: resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@faker-js/faker@9.9.0': - resolution: {integrity: sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==} - engines: {node: '>=18.0.0', npm: '>=9.0.0'} + '@faker-js/faker@10.0.0': + resolution: {integrity: sha512-UollFEUkVXutsaP+Vndjxar40Gs5JL2HeLcl8xO1QAjJgOdhc3OmBFWyEylS+RddWaaBiAzH+5/17PLQJwDiLw==} + engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'} '@gerrit0/mini-shiki@1.27.2': resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} @@ -2406,15 +2411,15 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@napi-rs/wasm-runtime@0.2.10': - resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + '@napi-rs/wasm-runtime@1.0.3': + resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2427,118 +2432,148 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nx/nx-darwin-arm64@21.4.0': - resolution: {integrity: sha512-GDa/zycRzRA3jaaHNOBJGKoUFyylcWIv8ANf0OSdj4D92coSn8W1I2F95k9HSoACY4nLLp6hh9F9dLAaCw0GjQ==} + '@nx/nx-darwin-arm64@21.4.1': + resolution: {integrity: sha512-9BbkQnxGEDNX2ESbW4Zdrq1i09y6HOOgTuGbMJuy4e8F8rU/motMUqOpwmFgLHkLgPNZiOC2VXht3or/kQcpOg==} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@21.4.0': - resolution: {integrity: sha512-MNE5Dr7E2eckapk9P/kMtBYZsUmPlnhAYphGTqn3cE8kbe4DdoNB+QPkXK13IgYq3isSyRu5GLyPPxgqz+E2iw==} + '@nx/nx-darwin-x64@21.4.1': + resolution: {integrity: sha512-dnkmap1kc6aLV8CW1ihjsieZyaDDjlIB5QA2reTCLNSdTV446K6Fh0naLdaoG4ZkF27zJA/qBOuAaLzRHFJp3g==} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@21.4.0': - resolution: {integrity: sha512-2cMcAEqFsBXU8PoL0X7HWSoOhYchOcQ9pQ3W+TJ/r7FV9uwavwKQxzNXfK95Bx33T6D4AY0/vCAeOpaqFFrt0A==} + '@nx/nx-freebsd-x64@21.4.1': + resolution: {integrity: sha512-RpxDBGOPeDqJjpbV7F3lO/w1aIKfLyG/BM0OpJfTgFVpUIl50kMj5M1m4W9A8kvYkfOD9pDbUaWszom7d57yjg==} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@21.4.0': - resolution: {integrity: sha512-zoc7hBcTS2fmBdbhWCGwlDaTZA7+w/Gb7f6GcAUl4NOx1gT99nuFrQ8XtrmTkIq/YzOhVok/4K82O3CHV7N4qw==} + '@nx/nx-linux-arm-gnueabihf@21.4.1': + resolution: {integrity: sha512-2OyBoag2738XWmWK3ZLBuhaYb7XmzT3f8HzomggLDJoDhwDekjgRoNbTxogAAj6dlXSeuPjO81BSlIfXQcth3w==} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@21.4.0': - resolution: {integrity: sha512-IgHuZyPoAXFYKodjpgb47Dtec6eg1FKKWyZyybn4RvPfp42DlofMASNjUZtjDOilK0vq5FWNOu0C8F3jeGSjqA==} + '@nx/nx-linux-arm64-gnu@21.4.1': + resolution: {integrity: sha512-2pg7/zjBDioUWJ3OY8Ixqy64eokKT5sh4iq1bk22bxOCf676aGrAu6khIxy4LBnPIdO0ZOK7KCJ7xOFP4phZqA==} cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@21.4.0': - resolution: {integrity: sha512-Q4RE4rXiH0n+KO71l2V6b5U8sVX24p+81BK0Hi93HgR7WSSMtikTZ3RO8JO3zCIRSJxbjyS8xNiw7F2W3OzmPQ==} + '@nx/nx-linux-arm64-musl@21.4.1': + resolution: {integrity: sha512-whNxh12au/inQtkZju1ZfXSqDS0hCh/anzVCXfLYWFstdwv61XiRmFCSHeN0gRDthlncXFdgKoT1bGG5aMYLtA==} cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@21.4.0': - resolution: {integrity: sha512-xdKpl0SI+ILqzwd2TAuSH6tA5WHoYRhdbBO3J8NvLga/3b8NxdEN/vLb2FzfsWMu81O0IOJ6pMxGE7N6zps9sg==} + '@nx/nx-linux-x64-gnu@21.4.1': + resolution: {integrity: sha512-UHw57rzLio0AUDXV3l+xcxT3LjuXil7SHj+H8aYmXTpXktctQU2eYGOs5ATqJ1avVQRSejJugHF0i8oLErC28A==} cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@21.4.0': - resolution: {integrity: sha512-p0Enow79yrdvF3djXohQx8fxp86f8LpQxD0ec4Y0VGT+3xQWSVsnehhiYkPQp3doEj2u/rBJjop6ITfE/Z09Sw==} + '@nx/nx-linux-x64-musl@21.4.1': + resolution: {integrity: sha512-qqE2Gy/DwOLIyePjM7GLHp/nDLZJnxHmqTeCiTQCp/BdbmqjRkSUz5oL+Uua0SNXaTu5hjAfvjXAhSTgBwVO6g==} cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@21.4.0': - resolution: {integrity: sha512-nrl89vb/0k8h04hhakzU57cs/dDl9K8xncKBsKKbIDxgd8gRO/KYzEEU/H+QE/jDB/vavm3Q7uxmUpJ5ysIitw==} + '@nx/nx-win32-arm64-msvc@21.4.1': + resolution: {integrity: sha512-NtEzMiRrSm2DdL4ntoDdjeze8DBrfZvLtx3Dq6+XmOhwnigR6umfWfZ6jbluZpuSQcxzQNVifqirdaQKYaYwDQ==} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@21.4.0': - resolution: {integrity: sha512-LaPLZjFy59+oIgZm0zSlhcMI8ZICAxEvm0A9VUexxeIj/Od6jmW9BV1tmIpQ0x1G8tN6sFGBt8hBxHNeLFfh1w==} + '@nx/nx-win32-x64-msvc@21.4.1': + resolution: {integrity: sha512-gpG+Y4G/mxGrfkUls6IZEuuBxRaKLMSEoVFLMb9JyyaLEDusn+HJ1m90XsOedjNLBHGMFigsd/KCCsXfFn4njg==} cpu: [x64] os: [win32] - '@oxc-resolver/binding-darwin-arm64@11.1.0': - resolution: {integrity: sha512-n9y3Lb1+BwsOtm3BmXSUPu3iDtTq7Sf0gX4e+izFTfNrj+u6uTKqbmlq8ggV8CRdg1zGUaCvKNvg/9q3C/19gg==} + '@oxc-resolver/binding-android-arm-eabi@11.7.1': + resolution: {integrity: sha512-K0gF1mD6CYMAuX0dMWe6XW1Js00xCOBh/+ZAAJReQMa4+jmAk3bIeitsc8VnDthDbzOOKp3riizP3o/tBvNpgw==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.7.1': + resolution: {integrity: sha512-O1XEX/KxKX7baPgYHahP+3vT+9f4gasPA0px4DYrjy1mN9wWQqJPLLo/PO3cBw3qI3qRaaiAGT3eJSs8rKu8mA==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.7.1': + resolution: {integrity: sha512-OSCJlXUTvGoal5dTMkdacmXL2R3YQ+97R7NMSdjkUVnh3TxvGBhoF9OebqY3PR7w2gQaY5LX+Ju+dYeHGBCGgw==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.1.0': - resolution: {integrity: sha512-2aJTPN9/lTmq0xw1YYsy5GDPkTyp92EoYRtw9nVgGErwMvA87duuLnIdoztYk66LGa3g5y4RgOaEapZbK7132A==} + '@oxc-resolver/binding-darwin-x64@11.7.1': + resolution: {integrity: sha512-d0jKwK4r4Yw19xSijyt7wHZT77xh3v4GnJSbvEiPavLms27zqc//BqYJUSp9XgOTOkyFQ+oHno47JNiLTnsSnQ==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.1.0': - resolution: {integrity: sha512-GoPEd9GvEyuS1YyqvAhAlccZeBEyHFkrHPEhS/+UTPcrzDzZ16ckJSmZtwOPhci5FWHK/th4L6NPiOnDLGFrqQ==} + '@oxc-resolver/binding-freebsd-x64@11.7.1': + resolution: {integrity: sha512-oNch5OpAnxFjukDZ5GJkuEDEPPYDirm10q2cJcbK0SETVM0rY+ou1cLqJAJC9R/dULbqGKC9fv2kuyuw9M6Fig==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.1.0': - resolution: {integrity: sha512-mQdQDTbw2/RcJKvMi8RAmDECuEC4waM5jeUBn8Cz1pLVddH8MfYJgKbZJUATBNNaHjw/u+Sq9Q1tcJbm8dhpYQ==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.7.1': + resolution: {integrity: sha512-ldUPUfV/0L56fTSfzUo86Bmgov8SAfau8Q4Y3WiAiQi6WHLA239abTZZViLZuXvrC+4RQF/kD0ySqKfBjW/X9g==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.7.1': + resolution: {integrity: sha512-M+ORXlPV0dXCHleqOYLjKHwxn9kDmcJqnJ7zGZ07vggaxOCnpM6zqyGS92YTTyeYre2AqO3Xrx1D4rnUeozI8g==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.1.0': - resolution: {integrity: sha512-HDFQiPl7cX2DVXFlulWOinjqXa5Rj4ydFY9xJCwWAHGx2LmqwLDD8MI0UrHVUaHhLLWn54vjGtwsJK94dtkCwg==} + '@oxc-resolver/binding-linux-arm64-gnu@11.7.1': + resolution: {integrity: sha512-ukHZp9Vm07AlxqdOLFf8Bj4inzpt+ISbbODvwwHxX32GfcMLWYYJGAYWc13IGhWoElvWnI7D1M9ifDGyTNRGzg==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-arm64-musl@11.1.0': - resolution: {integrity: sha512-0TFcZSVUQPV1r6sFUf7U2fz0mFCaqh5qMlb2zCioZj0C+xUJghC8bz88/qQUc5SA5K4gqg0WEOXzdqz/mXCLLA==} + '@oxc-resolver/binding-linux-arm64-musl@11.7.1': + resolution: {integrity: sha512-atkZ1OIt6t90kjQz1iqq6cN3OpfPG5zUJlO64Vd1ieYeqHRkOFeRgnWEobTePUHi34NlYr7mNZqIaAg7gjPUFg==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-gnu@11.1.0': - resolution: {integrity: sha512-crG0iy5U9ac99Xkt9trWo5YvtCoSpPUrNZMeUVDkIy1qy1znfv66CveOgCm0G5TwooIIWLJrtFUqi0AkazS3fw==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.7.1': + resolution: {integrity: sha512-HGgV4z3JwVF4Qvg2a1GhDnqn8mKLihy5Gp4rMfqNIAlERPSyIxo8oPQIL1XQKLYyyrkEEO99uwM+4cQGwhtbpQ==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.7.1': + resolution: {integrity: sha512-+vCO7iOR1s6VGefV02R2a702IASNWhSNm/MrR8RcWjKChmU0G+d1iC0oToUrGC4ovAEfstx2/O8EkROnfcLgrA==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.7.1': + resolution: {integrity: sha512-3folNmS5gYNFy/9HYzLcdeThqAGvDJU0gQKrhHn7RPWQa58yZ0ZPpBMk6KRSSO61+wkchkL+0sdcLsoe5wZW8g==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-s390x-gnu@11.1.0': - resolution: {integrity: sha512-aPemnsn/FXADFu7/VnSprO8uVb9UhNVdBdrIlAREh3s7LoW1QksKyP8/DlFe0o2E79MRQ3XF1ONOgW5zLcUmzA==} + '@oxc-resolver/binding-linux-s390x-gnu@11.7.1': + resolution: {integrity: sha512-Ceo4z6g8vqPUKADROFL0b7MoyXlUdOBYCxTDu/fhd/5I3Ydk2S6bxkjJdzpBdlu+h2Z+eS9lTHFvkwkaORMPzw==} cpu: [s390x] os: [linux] - '@oxc-resolver/binding-linux-x64-gnu@11.1.0': - resolution: {integrity: sha512-eMQ0Iue4Bs0jabCIHiEJbZMPoczdx1oBGOiNS/ykCE76Oos/Hb5uD1FB+Vw4agP2cAxzcp8zHO7MpEW450yswg==} + '@oxc-resolver/binding-linux-x64-gnu@11.7.1': + resolution: {integrity: sha512-QyFW5e43imQLxiBpCImhOiP4hY9coWGjroEm8elDqGNNaA7vXooaMQS2N3avMQawSaKhsb/3RemxaZ852XG38Q==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-linux-x64-musl@11.1.0': - resolution: {integrity: sha512-5IjxRv0vWiGb102QmwF+ljutUWA1+BZbdW+58lFOVzVVo29L+m5PrEtijY5kK0FMTDvwb/xFXpGq3/vQx+bpSg==} + '@oxc-resolver/binding-linux-x64-musl@11.7.1': + resolution: {integrity: sha512-JhuCqCqktqQyQVc37V+eDiP3buCIuyCLpb92tUEyAP8nY3dy2b/ojMrH1ZNnJUlfY/67AqoZPL6nQGAB2WA3Sg==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-wasm32-wasi@11.1.0': - resolution: {integrity: sha512-+yz7LYHKW1GK+fJoHh9JibgIWDeBHf5wiu1tgDD92y5eLFEBxP+CjJ2caTZnVRREH74l03twOfcTR9EaLsEidQ==} + '@oxc-resolver/binding-wasm32-wasi@11.7.1': + resolution: {integrity: sha512-sMXm5Z2rfBwkCUespZBJCPhCVbgh/fpYQ23BQs0PmnvWoXrGQHWvnvg1p/GYmleN+nwe8strBjfutirZFiC5lA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.1.0': - resolution: {integrity: sha512-aTF/1TIq9v86Qy3++YFhKJVKXYSTO54yRRWIXwzpgGvZu41acjN/UsNOG7C2QFy/xdkitrZf1awYgawSqNox3g==} + '@oxc-resolver/binding-win32-arm64-msvc@11.7.1': + resolution: {integrity: sha512-C/Sam1RJi/h/F618IB/H3pCOhTf+2ArdTqrqQolN8ARV35iWTSezgy6qPjQGj7aWn/9M5vgtCInfS2SwnkBJ4w==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.1.0': - resolution: {integrity: sha512-CxalsPMU4oSoZviLMaw01RhLglyN7jrUUhTDRv4pYGcsRxxt5S7e/wO9P/lm5BYgAAq4TtP5MkGuGuMrm//a0g==} + '@oxc-resolver/binding-win32-ia32-msvc@11.7.1': + resolution: {integrity: sha512-iNRgJxOkfmxeq9DiF9S4jtw3vq5kkAm6dsP4RPxoAO/WsShPPHOSlTpOqyB8bSj5Bt9DBLRoI43XcNfDKgM+jA==} + cpu: [ia32] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.7.1': + resolution: {integrity: sha512-MXS81efp8pu2MkjEPu+nDhgoyHwdWUygXYSzIh3gV2A8/qF0PVEzH+EpmKR7Pl8dEZIaG1YXA+CO6bmNZT8oSw==} cpu: [x64] os: [win32] @@ -2546,8 +2581,8 @@ packages: resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} - '@rolldown/pluginutils@1.0.0-beta.32': - resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} + '@rolldown/pluginutils@1.0.0-beta.34': + resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} @@ -2729,8 +2764,8 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@stylistic/eslint-plugin@5.2.0': - resolution: {integrity: sha512-RCEdbREv9EBiToUBQTlRhVYKG093I6ZnnQ990j08eJ6uRZh71DXkOnoxtTLfDQ6utVCVQzrhZFHZP0zfrfOIjA==} + '@stylistic/eslint-plugin@5.2.3': + resolution: {integrity: sha512-oY7GVkJGVMI5benlBDCaRrSC1qPasafyv5dOBLLv5MTilMGnErKhO6ziEfodDDIZbo5QxPUNW360VudJOFODMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -2744,32 +2779,32 @@ packages: resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} - '@tanstack/config@0.20.0': - resolution: {integrity: sha512-q6P0aYj7X65biWDKkKFQ4feQoxF8Bcxd3U3CU5zjBt9sgUrc/w8kEfHoGy0cHtgsTSMLfPrzaAtvp6hTbofZmw==} + '@tanstack/config@0.20.1': + resolution: {integrity: sha512-fvhOAY0FMw8F7O4RLVSje7thdKM0R1Es6k4wPkDG4m518UJijgL9ysZO8L+YmeEeldK81jZtMdRcGUOc0goa2g==} engines: {node: '>=18'} - '@tanstack/devtools-event-bus@0.2.1': - resolution: {integrity: sha512-JMq3AmrQR2LH9P8Rcj1MTq8Iq/mPk/PyuqSw1L0hO2Wl8G1oz5ue31fS8u8lIgOCVR/mGdJah18p+Pj5OosRJA==} + '@tanstack/devtools-event-bus@0.3.0': + resolution: {integrity: sha512-fPeJPL1sNee7haVfR+hItXJvCdU9dxm/oa/NDwiM25k8sSMe8OsVIuzluYNWfM0URQVRUZ1yzOeOeB8ssmEA8w==} engines: {node: '>=18'} '@tanstack/devtools-event-client@0.2.2': resolution: {integrity: sha512-EnVT9P4H8Z6wX9Z2WUT1K29AcRsDAo0GuOsJPgWi2khP/DB7ZUmQ+OUBO9xBbxYeHBJk6/nvMuucJgyYBwhYhA==} engines: {node: '>=18'} - '@tanstack/devtools-ui@0.3.1': - resolution: {integrity: sha512-vTbdo7aXm0tHYXTiRamee/73OHHahmMg/I4sxrmJWBscMP/NER234qrjPCHzAfzq/w4ddcJIVvXQjGJmBE0bfw==} + '@tanstack/devtools-ui@0.3.2': + resolution: {integrity: sha512-aCIZG3gojPpogApg15VUsZRw8WX048ipLBlvJ7kaCIZl68zxjrd6PGv/l7E6gfZpVPrs5QtFzx8SDziRUamx/A==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/devtools@0.4.1': - resolution: {integrity: sha512-5Yym7c2BC0QJy4qP2ERkbgYwQVbpWflmcLWAv7Alt6rE1y66p9Fon3KtLvMDuZpfXcrM0W82bBp5PfplKfa8rg==} + '@tanstack/devtools@0.6.1': + resolution: {integrity: sha512-zjwGqWAG2lMTdM6Bmh+VZ4K2HB/atGEWBYeq6nAwIs0fMC48EufDj4UIektKHiuzNng4b/BUoncKT4XwuefwiA==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/eslint-config@0.3.0': - resolution: {integrity: sha512-7OsrYscWEPojIRqh9byyyv2W+jm/3WaDckVnuQgf7a86YPhtN93fHa3hsKquJE/IbMX/FK0EDHi+DPAXwvZ5ZA==} + '@tanstack/eslint-config@0.3.1': + resolution: {integrity: sha512-t9A1epZWk0iUmLQxuLfo0MaBVmvtrpg3E7Y9N6+8InVlqdYOHaGLRqjwZ/nbzXkScqobei2nNXtjBZmkioJuhQ==} engines: {node: '>=18'} '@tanstack/pacer@0.13.0': @@ -2790,8 +2825,8 @@ packages: '@tanstack/query-devtools@5.84.0': resolution: {integrity: sha512-fbF3n+z1rqhvd9EoGp5knHkv3p5B2Zml1yNRjh7sNXklngYI5RVIWUrUjZ1RIcEoscarUb0+bOvIs5x9dwzOXQ==} - '@tanstack/react-devtools@0.4.2': - resolution: {integrity: sha512-DySdBOA7lJ6TYSwVlCJV+uWoNns827KhrO0fFwzTHB+wuwb3O/tdt65jHUryDGukAOhr5SAsWSfkQZzCNL1x9A==} + '@tanstack/react-devtools@0.5.3': + resolution: {integrity: sha512-x3A4Zk+D2+A0aMR+iITTTZGXrxX7atRgSVyyN0NtIMkr/K8UdNVcSRwnx/vhw5Z6nWjcFbu6OCRSD+l7UXaIBw==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -2830,20 +2865,29 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/solid-devtools@0.4.2': - resolution: {integrity: sha512-G8IoDusAyuPMEszfN/9B4NWwSPAn3Ao/5E2uCafS9Ev223j1uqcllr/2dZ0mnUx4bnNH+1pbFMT+YP87lj8e2A==} + '@tanstack/react-store@0.7.4': + resolution: {integrity: sha512-DyG1e5Qz/c1cNLt/NdFbCA7K1QGuFXQYT6EfUltYMJoQ4LzBOGnOl5IjuxepNcRtmIKkGpmdMzdFZEkevgU9bQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/solid-devtools@0.5.3': + resolution: {integrity: sha512-zQ30E4mhC8QYXOJsi5NJms0ftxpeMZGam1ZVdLfdEHr6Br843fkcOYKDx8U89qGadKvJkzdVypIahLYsKNBGxg==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/solid-store@0.7.3': - resolution: {integrity: sha512-fEdiGQdlzG/eS4lOaIWvKp94hopVZiDZ2IgrQ9ntu5QtLPXOABq/2VDSQI7jkx43e3AdLdvlXVrljxw2BVB9tw==} + '@tanstack/solid-store@0.7.4': + resolution: {integrity: sha512-PoR8zUf48L9ACFSwlem6x28251cWyxGAUKu9VlsObnjaKRwWvgbT2XOU9FIprOPxmWtZc8gF1zThg5O0xQnAEw==} peerDependencies: solid-js: ^1.6.0 '@tanstack/store@0.7.2': resolution: {integrity: sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==} + '@tanstack/store@0.7.4': + resolution: {integrity: sha512-F1XqZQici1Aq6WigEfcxJSml92nW+85Om8ElBMokPNg5glCYVOmPkZGIQeieYFxcPiKTfwo0MTOQpUyJtwncrg==} + '@tanstack/typedoc-config@0.2.0': resolution: {integrity: sha512-1ak0ZirlLRxd3dNNOFnMoYORBeC83nK4C+OiXpE0dxsO8ZVrBqCtNCKr8SG+W9zICXcWGiFu9qYLsgNKTayOqw==} engines: {node: '>=18'} @@ -2852,8 +2896,8 @@ packages: resolution: {integrity: sha512-WpL1C9iR5/U7g3GpvHIssN5QvKnDnWhW05BQhaD6bAqoPCkQyBepxUF8ZRO4IGZRGVAZeMVqTbUA05BAQH/88g==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.7.0': - resolution: {integrity: sha512-RI2e97YZ7MRa+vxP4UUnMuMFL2buSsf0ollxUbTgrbPLKhMn8KVTx7raS6DYjC7v1NDVrioOvaShxsguLNISCA==} + '@testing-library/jest-dom@6.8.0': + resolution: {integrity: sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@tybys/wasm-util@0.10.0': @@ -2906,8 +2950,13 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.10': - resolution: {integrity: sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==} + '@types/react-dom@19.1.9': + resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.12': + resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} '@types/react@19.1.9': resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} @@ -2915,26 +2964,20 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.37.0': - resolution: {integrity: sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==} + '@typescript-eslint/eslint-plugin@8.41.0': + resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.37.0 + '@typescript-eslint/parser': ^8.41.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.37.0': - resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} + '@typescript-eslint/parser@8.41.0': + resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/project-service@8.37.0': - resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/project-service@8.39.1': resolution: {integrity: sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==} @@ -2942,19 +2985,19 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.37.0': - resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} + '@typescript-eslint/project-service@8.41.0': + resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.39.1': resolution: {integrity: sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.37.0': - resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} + '@typescript-eslint/scope-manager@8.41.0': + resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/tsconfig-utils@8.39.1': resolution: {integrity: sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==} @@ -2962,12 +3005,11 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.37.0': - resolution: {integrity: sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==} + '@typescript-eslint/tsconfig-utils@8.41.0': + resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/type-utils@8.39.1': resolution: {integrity: sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==} @@ -2976,19 +3018,20 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.37.0': - resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} + '@typescript-eslint/type-utils@8.41.0': + resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@8.39.1': resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.37.0': - resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} + '@typescript-eslint/types@8.41.0': + resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/typescript-estree@8.39.1': resolution: {integrity: sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==} @@ -2996,12 +3039,11 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.37.0': - resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} + '@typescript-eslint/typescript-estree@8.41.0': + resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@8.39.1': resolution: {integrity: sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==} @@ -3010,14 +3052,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.37.0': - resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} + '@typescript-eslint/utils@8.41.0': + resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@8.39.1': resolution: {integrity: sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.41.0': + resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -3113,8 +3162,8 @@ packages: cpu: [x64] os: [win32] - '@vitejs/plugin-react@5.0.1': - resolution: {integrity: sha512-DE4UNaBXwtVoDJ0ccBdLVjFTWL70NRuWNCxEieTI3lrq9ORB9aOCQEKstwDXBl87NvFdbqh/p7eINGyj0BthJA==} + '@vitejs/plugin-react@5.0.2': + resolution: {integrity: sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3468,8 +3517,8 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dayjs@1.11.15: + resolution: {integrity: sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ==} de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -3662,17 +3711,12 @@ packages: eslint-import-resolver-node: optional: true - eslint-plugin-n@17.21.0: - resolution: {integrity: sha512-1+iZ8We4ZlwVMtb/DcHG3y5/bZOdazIpa/4TySo22MLKdwrLcfrX0hbadnCvykSQCCmkAnWmIP8jZVb2AAq29A==} + eslint-plugin-n@17.21.3: + resolution: {integrity: sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' - eslint-plugin-pnpm@1.0.0: - resolution: {integrity: sha512-tyEA10k7psB9HFCx8R4/bU4JS2tSKfXaCnrCcis+1R4FucfMIc6HgcFl4msZbwY2I0D9Vec3xAEkXV0aPechhQ==} - peerDependencies: - eslint: ^9.0.0 - eslint-plugin-react-compiler@19.1.0-rc.2: resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} @@ -3769,8 +3813,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.33.0: - resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} + eslint@9.34.0: + resolution: {integrity: sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3786,10 +3830,6 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -3883,10 +3923,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-up-simple@1.0.1: - resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} - engines: {node: '>=18'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3919,8 +3955,8 @@ packages: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} - formatly@0.2.4: - resolution: {integrity: sha512-lIN7GpcvX/l/i24r/L9bnJ0I8Qn01qijWpQpDDvTLL29nKqSaJJu4h20+7VJ6m2CAhQ2/En/GbxDiHCzq/0MyA==} + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} engines: {node: '>=18.3.0'} hasBin: true @@ -4176,6 +4212,10 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -4224,10 +4264,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@2.4.0: - resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -4244,8 +4280,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@5.62.0: - resolution: {integrity: sha512-hfTUVzmrMNMT1khlZfAYmBABeehwWUUrizLQoLamoRhSFkygsGIXWx31kaWKBgEaIVL77T3Uz7IxGvSw+CvQ6A==} + knip@5.63.0: + resolution: {integrity: sha512-xIFIi/uvLW0S/AQqwggN6UVRKBOQ1Ya7jBfQzllswZplr2si5C616/5wCcWc/eoi1PLJgPgJQLxqYq1aiYpqwg==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: @@ -4447,8 +4483,8 @@ packages: nwsapi@2.2.18: resolution: {integrity: sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==} - nx@21.4.0: - resolution: {integrity: sha512-BRymw8B8qs24RvqfroUVIRcxvMf1euONpi5+OMqvjZOSy5LTFTggrLwEg6GYIb1lj5kO53TTnZ/Wxj0m8tPKxQ==} + nx@21.4.1: + resolution: {integrity: sha512-nD8NjJGYk5wcqiATzlsLauvyrSHV2S2YmM2HBIKqTTwVP2sey07MF3wDB9U2BwxIjboahiITQ6pfqFgB79TF2A==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -4481,8 +4517,8 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - oxc-resolver@11.1.0: - resolution: {integrity: sha512-/W/9O6m7lkDJMIXtXvNKXE6THIoNWwstsKpR/R8+yI9e7vC9wu92MDqLBxkgckZ2fTFmKEjozTxVibHBaRUgCA==} + oxc-resolver@11.7.1: + resolution: {integrity: sha512-PzbEnD6NKTCFVKkUZtmQcX69ajdfM33RqI5kyb8mH9EdIqEUS00cWSXN0lsgYrtdTMzwo0EKKoH7hnGg6EDraQ==} p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} @@ -4578,9 +4614,6 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pnpm-workspace-yaml@1.0.0: - resolution: {integrity: sha512-2RKg3khFgX/oeKIQnxxlj+OUoKbaZjBt7EsmQiLfl8AHZKMIpLmXLRPptZ5eq2Rlumh2gILs6OWNky5dzP+f8A==} - postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -4833,8 +4866,8 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smol-toml@1.3.4: - resolution: {integrity: sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==} + smol-toml@1.4.2: + resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} engines: {node: '>= 18'} solid-js@1.9.7: @@ -5065,12 +5098,12 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.37.0: - resolution: {integrity: sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==} + typescript-eslint@8.41.0: + resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} @@ -5344,15 +5377,6 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml-eslint-parser@1.3.0: - resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==} - engines: {node: ^14.17.0 || >=16.0.0} - - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} - hasBin: true - yaml@2.8.0: resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} engines: {node: '>= 14.6'} @@ -5963,14 +5987,30 @@ snapshots: '@emnapi/wasi-threads': 1.0.2 tslib: 2.8.1 + '@emnapi/core@1.4.5': + dependencies: + '@emnapi/wasi-threads': 1.0.4 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.2': dependencies: tslib: 2.8.1 + '@emnapi/wasi-threads@1.0.4': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.25.0': optional: true @@ -6046,19 +6086,19 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.5.1))': dependencies: - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint-react/ast@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/ast@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-react/eff': 1.52.6 '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) string-ts: 2.2.1 ts-pattern: 5.8.0 transitivePeerDependencies: @@ -6066,17 +6106,17 @@ snapshots: - supports-color - typescript - '@eslint-react/core@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/core@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-react/ast': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/shared': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/var': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) birecord: 0.1.1 ts-pattern: 5.8.0 transitivePeerDependencies: @@ -6086,32 +6126,32 @@ snapshots: '@eslint-react/eff@1.52.6': {} - '@eslint-react/eslint-plugin@1.52.6(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2)': + '@eslint-react/eslint-plugin@1.52.6(eslint@9.34.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2)': dependencies: '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/shared': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) - eslint-plugin-react-debug: 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-dom: 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-hooks-extra: 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-naming-convention: 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-web-api: 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-react-x: 1.52.6(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) + eslint-plugin-react-debug: 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-react-dom: 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-react-hooks-extra: 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-react-naming-convention: 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-react-web-api: 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-react-x: 1.52.6(eslint@9.34.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - ts-api-utils - '@eslint-react/kit@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/kit@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-react/eff': 1.52.6 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) ts-pattern: 5.8.0 zod: 4.0.17 transitivePeerDependencies: @@ -6119,11 +6159,11 @@ snapshots: - supports-color - typescript - '@eslint-react/shared@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/shared@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) ts-pattern: 5.8.0 zod: 4.0.17 transitivePeerDependencies: @@ -6131,13 +6171,13 @@ snapshots: - supports-color - typescript - '@eslint-react/var@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@eslint-react/var@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-react/ast': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@eslint-react/eff': 1.52.6 '@typescript-eslint/scope-manager': 8.39.1 '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) string-ts: 2.2.1 ts-pattern: 5.8.0 transitivePeerDependencies: @@ -6173,9 +6213,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.31.0': {} - - '@eslint/js@9.33.0': {} + '@eslint/js@9.34.0': {} '@eslint/object-schema@2.1.6': {} @@ -6184,7 +6222,7 @@ snapshots: '@eslint/core': 0.15.2 levn: 0.4.1 - '@faker-js/faker@9.9.0': {} + '@faker-js/faker@10.0.0': {} '@gerrit0/mini-shiki@1.27.2': dependencies: @@ -6306,13 +6344,6 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@napi-rs/wasm-runtime@0.2.10': - dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.9.0 - optional: true - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.4.3 @@ -6326,6 +6357,13 @@ snapshots: '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 + '@napi-rs/wasm-runtime@1.0.3': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6338,86 +6376,104 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nx/nx-darwin-arm64@21.4.0': + '@nx/nx-darwin-arm64@21.4.1': + optional: true + + '@nx/nx-darwin-x64@21.4.1': + optional: true + + '@nx/nx-freebsd-x64@21.4.1': optional: true - '@nx/nx-darwin-x64@21.4.0': + '@nx/nx-linux-arm-gnueabihf@21.4.1': optional: true - '@nx/nx-freebsd-x64@21.4.0': + '@nx/nx-linux-arm64-gnu@21.4.1': optional: true - '@nx/nx-linux-arm-gnueabihf@21.4.0': + '@nx/nx-linux-arm64-musl@21.4.1': optional: true - '@nx/nx-linux-arm64-gnu@21.4.0': + '@nx/nx-linux-x64-gnu@21.4.1': optional: true - '@nx/nx-linux-arm64-musl@21.4.0': + '@nx/nx-linux-x64-musl@21.4.1': optional: true - '@nx/nx-linux-x64-gnu@21.4.0': + '@nx/nx-win32-arm64-msvc@21.4.1': optional: true - '@nx/nx-linux-x64-musl@21.4.0': + '@nx/nx-win32-x64-msvc@21.4.1': optional: true - '@nx/nx-win32-arm64-msvc@21.4.0': + '@oxc-resolver/binding-android-arm-eabi@11.7.1': optional: true - '@nx/nx-win32-x64-msvc@21.4.0': + '@oxc-resolver/binding-android-arm64@11.7.1': optional: true - '@oxc-resolver/binding-darwin-arm64@11.1.0': + '@oxc-resolver/binding-darwin-arm64@11.7.1': optional: true - '@oxc-resolver/binding-darwin-x64@11.1.0': + '@oxc-resolver/binding-darwin-x64@11.7.1': optional: true - '@oxc-resolver/binding-freebsd-x64@11.1.0': + '@oxc-resolver/binding-freebsd-x64@11.7.1': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.1.0': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.7.1': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.1.0': + '@oxc-resolver/binding-linux-arm-musleabihf@11.7.1': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.1.0': + '@oxc-resolver/binding-linux-arm64-gnu@11.7.1': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.1.0': + '@oxc-resolver/binding-linux-arm64-musl@11.7.1': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.1.0': + '@oxc-resolver/binding-linux-ppc64-gnu@11.7.1': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.1.0': + '@oxc-resolver/binding-linux-riscv64-gnu@11.7.1': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.1.0': + '@oxc-resolver/binding-linux-riscv64-musl@11.7.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.1.0': + '@oxc-resolver/binding-linux-s390x-gnu@11.7.1': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.7.1': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.7.1': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.7.1': dependencies: - '@napi-rs/wasm-runtime': 0.2.10 + '@napi-rs/wasm-runtime': 1.0.3 optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.1.0': + '@oxc-resolver/binding-win32-arm64-msvc@11.7.1': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.1.0': + '@oxc-resolver/binding-win32-ia32-msvc@11.7.1': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.7.1': optional: true '@publint/pack@0.1.2': {} - '@rolldown/pluginutils@1.0.0-beta.32': {} + '@rolldown/pluginutils@1.0.0-beta.34': {} '@rollup/pluginutils@5.1.4(rollup@4.44.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 4.44.1 @@ -6566,11 +6622,11 @@ snapshots: dependencies: solid-js: 1.9.9 - '@stylistic/eslint-plugin@5.2.0(eslint@9.33.0(jiti@2.4.2))': + '@stylistic/eslint-plugin@5.2.3(eslint@9.34.0(jiti@2.5.1))': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) - '@typescript-eslint/types': 8.37.0 - eslint: 9.33.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + '@typescript-eslint/types': 8.39.1 + eslint: 9.34.0(jiti@2.5.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -6587,12 +6643,12 @@ snapshots: transitivePeerDependencies: - encoding - '@tanstack/config@0.20.0(@types/node@24.3.0)(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/config@0.20.1(@types/node@24.3.0)(@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: - '@tanstack/eslint-config': 0.3.0(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@tanstack/eslint-config': 0.3.1(@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@tanstack/publish-config': 0.2.0 '@tanstack/typedoc-config': 0.2.0(typescript@5.9.2) - '@tanstack/vite-config': 0.2.0(@types/node@24.3.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + '@tanstack/vite-config': 0.2.0(@types/node@24.3.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -6603,7 +6659,7 @@ snapshots: - typescript - vite - '@tanstack/devtools-event-bus@0.2.1': + '@tanstack/devtools-event-bus@0.3.0': dependencies: ws: 8.18.3 transitivePeerDependencies: @@ -6612,7 +6668,7 @@ snapshots: '@tanstack/devtools-event-client@0.2.2': {} - '@tanstack/devtools-ui@0.3.1(csstype@3.1.3)(solid-js@1.9.9)': + '@tanstack/devtools-ui@0.3.2(csstype@3.1.3)(solid-js@1.9.9)': dependencies: clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) @@ -6620,11 +6676,11 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools@0.4.1(csstype@3.1.3)(solid-js@1.9.9)': + '@tanstack/devtools@0.6.1(csstype@3.1.3)(solid-js@1.9.9)': dependencies: '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.9) - '@tanstack/devtools-event-bus': 0.2.1 - '@tanstack/devtools-ui': 0.3.1(csstype@3.1.3)(solid-js@1.9.9) + '@tanstack/devtools-event-bus': 0.3.0 + '@tanstack/devtools-ui': 0.3.2(csstype@3.1.3)(solid-js@1.9.9) clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.9 @@ -6633,18 +6689,15 @@ snapshots: - csstype - utf-8-validate - '@tanstack/eslint-config@0.3.0(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@tanstack/eslint-config@0.3.1(@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint/js': 9.31.0 - '@stylistic/eslint-plugin': 5.2.0(eslint@9.33.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)) - eslint-plugin-n: 17.21.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-pnpm: 1.0.0(eslint@9.33.0(jiti@2.4.2)) + '@eslint/js': 9.34.0 + '@stylistic/eslint-plugin': 5.2.3(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)) + eslint-plugin-n: 17.21.3(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) globals: 16.3.0 - jsonc-eslint-parser: 2.4.0 - typescript-eslint: 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - vue-eslint-parser: 10.2.0(eslint@9.33.0(jiti@2.4.2)) - yaml-eslint-parser: 1.3.0 + typescript-eslint: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + vue-eslint-parser: 10.2.0(eslint@9.34.0(jiti@2.5.1)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint @@ -6654,7 +6707,7 @@ snapshots: '@tanstack/pacer@0.13.0': dependencies: - '@tanstack/store': 0.7.2 + '@tanstack/store': 0.7.4 '@tanstack/persister@0.1.1': {} @@ -6671,11 +6724,11 @@ snapshots: '@tanstack/query-devtools@5.84.0': {} - '@tanstack/react-devtools@0.4.2(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)': + '@tanstack/react-devtools@0.5.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)': dependencies: - '@tanstack/devtools': 0.4.1(csstype@3.1.3)(solid-js@1.9.9) - '@types/react': 19.1.10 - '@types/react-dom': 19.1.7(@types/react@19.1.10) + '@tanstack/devtools': 0.6.1(csstype@3.1.3)(solid-js@1.9.9) + '@types/react': 19.1.12 + '@types/react-dom': 19.1.9(@types/react@19.1.12) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -6708,36 +6761,38 @@ snapshots: '@tanstack/query-core': 5.85.5 react: 19.1.1 - '@tanstack/react-store@0.7.3(react-dom@19.1.0(react@19.1.1))(react@19.1.1)': + '@tanstack/react-store@0.7.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/store': 0.7.2 react: 19.1.1 - react-dom: 19.1.0(react@19.1.1) + react-dom: 19.1.1(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) - '@tanstack/react-store@0.7.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-store@0.7.4(react-dom@19.1.0(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/store': 0.7.2 + '@tanstack/store': 0.7.4 react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react-dom: 19.1.0(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) - '@tanstack/solid-devtools@0.4.2(csstype@3.1.3)(solid-js@1.9.9)': + '@tanstack/solid-devtools@0.5.3(csstype@3.1.3)(solid-js@1.9.9)': dependencies: - '@tanstack/devtools': 0.4.1(csstype@3.1.3)(solid-js@1.9.9) + '@tanstack/devtools': 0.6.1(csstype@3.1.3)(solid-js@1.9.9) solid-js: 1.9.9 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/solid-store@0.7.3(solid-js@1.9.9)': + '@tanstack/solid-store@0.7.4(solid-js@1.9.9)': dependencies: - '@tanstack/store': 0.7.2 + '@tanstack/store': 0.7.4 solid-js: 1.9.9 '@tanstack/store@0.7.2': {} + '@tanstack/store@0.7.4': {} + '@tanstack/typedoc-config@0.2.0(typescript@5.9.2)': dependencies: typedoc: 0.27.9(typescript@5.9.2) @@ -6746,12 +6801,12 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.2.0(@types/node@24.3.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/vite-config@0.2.0(@types/node@24.3.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.44.1) - vite-plugin-dts: 4.2.3(@types/node@24.3.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) - vite-plugin-externalize-deps: 0.9.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-dts: 4.2.3(@types/node@24.3.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-externalize-deps: 0.9.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - rollup @@ -6759,7 +6814,7 @@ snapshots: - typescript - vite - '@testing-library/jest-dom@6.7.0': + '@testing-library/jest-dom@6.8.0': dependencies: '@adobe/css-tools': 4.4.2 aria-query: 5.3.2 @@ -6824,15 +6879,15 @@ snapshots: dependencies: undici-types: 7.10.0 - '@types/react-dom@19.1.7(@types/react@19.1.10)': - dependencies: - '@types/react': 19.1.10 - '@types/react-dom@19.1.7(@types/react@19.1.9)': dependencies: '@types/react': 19.1.9 - '@types/react@19.1.10': + '@types/react-dom@19.1.9(@types/react@19.1.12)': + dependencies: + '@types/react': 19.1.12 + + '@types/react@19.1.12': dependencies: csstype: 3.1.3 @@ -6842,15 +6897,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/utils': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.37.0 - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/type-utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.41.0 + eslint: 9.34.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -6859,98 +6914,82 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.37.0 + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.41.0 debug: 4.4.1 - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.37.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.2) - '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.37.0': - dependencies: - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/visitor-keys': 8.37.0 - '@typescript-eslint/scope-manager@8.39.1': dependencies: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 - '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.2)': + '@typescript-eslint/scope-manager@8.41.0': dependencies: - typescript: 5.9.2 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - debug: 4.4.1 - eslint: 9.33.0(jiti@2.4.2) - ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) debug: 4.4.1 - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.37.0': {} - - '@typescript-eslint/types@8.39.1': {} - - '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.37.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.2) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/visitor-keys': 8.37.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 + eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color + '@typescript-eslint/types@8.39.1': {} + + '@typescript-eslint/types@8.41.0': {} + '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.2)': dependencies: '@typescript-eslint/project-service': 8.39.1(typescript@5.9.2) @@ -6967,38 +7006,54 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.37.0 - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/utils@8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) '@typescript-eslint/scope-manager': 8.39.1 '@typescript-eslint/types': 8.39.1 '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.37.0': + '@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.37.0 - eslint-visitor-keys: 4.2.1 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color '@typescript-eslint/visitor-keys@8.39.1': dependencies: '@typescript-eslint/types': 8.39.1 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.41.0': + dependencies: + '@typescript-eslint/types': 8.41.0 + eslint-visitor-keys: 4.2.1 + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -7058,15 +7113,15 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@5.0.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': + '@vitejs/plugin-react@5.0.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.3 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3) - '@rolldown/pluginutils': 1.0.0-beta.32 + '@rolldown/pluginutils': 1.0.0-beta.34 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -7078,13 +7133,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -7126,7 +7181,7 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.3 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -7451,7 +7506,7 @@ snapshots: dataloader@1.4.0: {} - dayjs@1.11.13: {} + dayjs@1.11.15: {} de-indent@1.0.2: {} @@ -7604,9 +7659,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.33.0(jiti@2.4.2)): + eslint-compat-utils@0.5.1(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) semver: 7.7.2 eslint-import-context@0.1.9(unrs-resolver@1.11.1): @@ -7625,19 +7680,19 @@ snapshots: - supports-color optional: true - eslint-plugin-es-x@7.8.0(eslint@9.33.0(jiti@2.4.2)): + eslint-plugin-es-x@7.8.0(eslint@9.34.0(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.33.0(jiti@2.4.2) - eslint-compat-utils: 0.5.1(eslint@9.33.0(jiti@2.4.2)) + eslint: 9.34.0(jiti@2.5.1) + eslint-compat-utils: 0.5.1(eslint@9.34.0(jiti@2.5.1)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.34.0(jiti@2.5.1)): dependencies: - '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/types': 8.39.1 comment-parser: 1.4.1 debug: 4.4.1 - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 9.0.5 @@ -7645,61 +7700,51 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-n@17.21.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-n@17.21.3(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) enhanced-resolve: 5.18.1 - eslint: 9.33.0(jiti@2.4.2) - eslint-plugin-es-x: 7.8.0(eslint@9.33.0(jiti@2.4.2)) + eslint: 9.34.0(jiti@2.5.1) + eslint-plugin-es-x: 7.8.0(eslint@9.34.0(jiti@2.5.1)) get-tsconfig: 4.10.1 globals: 15.15.0 + globrex: 0.1.2 ignore: 5.3.2 - minimatch: 9.0.5 semver: 7.7.2 ts-declaration-location: 1.0.7(typescript@5.9.2) transitivePeerDependencies: - typescript - eslint-plugin-pnpm@1.0.0(eslint@9.33.0(jiti@2.4.2)): - dependencies: - eslint: 9.33.0(jiti@2.4.2) - find-up-simple: 1.0.1 - jsonc-eslint-parser: 2.4.0 - pathe: 2.0.3 - pnpm-workspace-yaml: 1.0.0 - tinyglobby: 0.2.14 - yaml-eslint-parser: 1.3.0 - - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.33.0(jiti@2.4.2)): + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.34.0(jiti@2.5.1)): dependencies: '@babel/core': 7.26.10 '@babel/parser': 7.27.0 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) hermes-parser: 0.25.1 zod: 3.24.2 zod-validation-error: 3.4.0(zod@3.24.2) transitivePeerDependencies: - supports-color - eslint-plugin-react-debug@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-react-debug@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-react/ast': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/core': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/shared': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/var': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) string-ts: 2.2.1 ts-pattern: 5.8.0 optionalDependencies: @@ -7707,19 +7752,19 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-react-dom@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-react/ast': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/core': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/shared': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/var': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.1 '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) compare-versions: 6.1.1 - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) string-ts: 2.2.1 ts-pattern: 5.8.0 optionalDependencies: @@ -7727,19 +7772,19 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-react-hooks-extra@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-react/ast': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/core': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/shared': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/var': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) string-ts: 2.2.1 ts-pattern: 5.8.0 optionalDependencies: @@ -7747,23 +7792,23 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.2.0(eslint@9.33.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) - eslint-plugin-react-naming-convention@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-react-naming-convention@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-react/ast': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/core': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/shared': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/var': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) string-ts: 2.2.1 ts-pattern: 5.8.0 optionalDependencies: @@ -7771,18 +7816,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-react-web-api@1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@eslint-react/ast': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/core': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/shared': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/var': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.1 '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) string-ts: 2.2.1 ts-pattern: 5.8.0 optionalDependencies: @@ -7790,21 +7835,21 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.52.6(eslint@9.33.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2): + eslint-plugin-react-x@1.52.6(eslint@9.34.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2): dependencies: - '@eslint-react/ast': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/core': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/ast': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/core': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@eslint-react/eff': 1.52.6 - '@eslint-react/kit': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/shared': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@eslint-react/var': 1.52.6(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@eslint-react/kit': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/shared': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/var': 1.52.6(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) compare-versions: 6.1.1 - eslint: 9.33.0(jiti@2.4.2) - is-immutable-type: 5.0.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) + is-immutable-type: 5.0.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) string-ts: 2.2.1 ts-pattern: 5.8.0 optionalDependencies: @@ -7813,11 +7858,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)): + eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1)): dependencies: - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) eslint-scope@8.4.0: dependencies: @@ -7828,15 +7873,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.33.0(jiti@2.4.2): + eslint@9.34.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.33.0 + '@eslint/js': 9.34.0 '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -7866,7 +7911,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 2.5.1 transitivePeerDependencies: - supports-color @@ -7878,12 +7923,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} esquery@1.6.0: @@ -7958,8 +7997,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-up-simple@1.0.1: {} - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -7988,7 +8025,7 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 - formatly@0.2.4: + formatly@0.3.0: dependencies: fd-package-json: 2.0.0 @@ -8168,10 +8205,10 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-immutable-type@5.0.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + is-immutable-type@5.0.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/type-utils': 8.39.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) ts-declaration-location: 1.0.7(typescript@5.9.2) typescript: 5.9.2 @@ -8219,6 +8256,8 @@ snapshots: jiti@2.4.2: {} + jiti@2.5.1: {} + jju@1.4.0: {} js-tokens@4.0.0: {} @@ -8273,13 +8312,6 @@ snapshots: json5@2.2.3: {} - jsonc-eslint-parser@2.4.0: - dependencies: - acorn: 8.15.0 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - semver: 7.7.2 - jsonc-parser@3.2.0: {} jsonfile@4.0.0: @@ -8298,19 +8330,19 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.62.0(@types/node@24.3.0)(typescript@5.9.2): + knip@5.63.0(@types/node@24.3.0)(typescript@5.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 '@types/node': 24.3.0 fast-glob: 3.3.3 - formatly: 0.2.4 - jiti: 2.4.2 + formatly: 0.3.0 + jiti: 2.5.1 js-yaml: 4.1.0 minimist: 1.2.8 - oxc-resolver: 11.1.0 + oxc-resolver: 11.7.1 picocolors: 1.1.1 - picomatch: 4.0.2 - smol-toml: 1.3.4 + picomatch: 4.0.3 + smol-toml: 1.4.2 strip-json-comments: 5.0.2 typescript: 5.9.2 zod: 3.25.72 @@ -8481,7 +8513,7 @@ snapshots: nwsapi@2.2.18: {} - nx@21.4.0: + nx@21.4.1: dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -8519,16 +8551,16 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 21.4.0 - '@nx/nx-darwin-x64': 21.4.0 - '@nx/nx-freebsd-x64': 21.4.0 - '@nx/nx-linux-arm-gnueabihf': 21.4.0 - '@nx/nx-linux-arm64-gnu': 21.4.0 - '@nx/nx-linux-arm64-musl': 21.4.0 - '@nx/nx-linux-x64-gnu': 21.4.0 - '@nx/nx-linux-x64-musl': 21.4.0 - '@nx/nx-win32-arm64-msvc': 21.4.0 - '@nx/nx-win32-x64-msvc': 21.4.0 + '@nx/nx-darwin-arm64': 21.4.1 + '@nx/nx-darwin-x64': 21.4.1 + '@nx/nx-freebsd-x64': 21.4.1 + '@nx/nx-linux-arm-gnueabihf': 21.4.1 + '@nx/nx-linux-arm64-gnu': 21.4.1 + '@nx/nx-linux-arm64-musl': 21.4.1 + '@nx/nx-linux-x64-gnu': 21.4.1 + '@nx/nx-linux-x64-musl': 21.4.1 + '@nx/nx-win32-arm64-msvc': 21.4.1 + '@nx/nx-win32-x64-msvc': 21.4.1 transitivePeerDependencies: - debug @@ -8568,21 +8600,29 @@ snapshots: outdent@0.5.0: {} - oxc-resolver@11.1.0: + oxc-resolver@11.7.1: + dependencies: + napi-postinstall: 0.3.2 optionalDependencies: - '@oxc-resolver/binding-darwin-arm64': 11.1.0 - '@oxc-resolver/binding-darwin-x64': 11.1.0 - '@oxc-resolver/binding-freebsd-x64': 11.1.0 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.1.0 - '@oxc-resolver/binding-linux-arm64-gnu': 11.1.0 - '@oxc-resolver/binding-linux-arm64-musl': 11.1.0 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.1.0 - '@oxc-resolver/binding-linux-s390x-gnu': 11.1.0 - '@oxc-resolver/binding-linux-x64-gnu': 11.1.0 - '@oxc-resolver/binding-linux-x64-musl': 11.1.0 - '@oxc-resolver/binding-wasm32-wasi': 11.1.0 - '@oxc-resolver/binding-win32-arm64-msvc': 11.1.0 - '@oxc-resolver/binding-win32-x64-msvc': 11.1.0 + '@oxc-resolver/binding-android-arm-eabi': 11.7.1 + '@oxc-resolver/binding-android-arm64': 11.7.1 + '@oxc-resolver/binding-darwin-arm64': 11.7.1 + '@oxc-resolver/binding-darwin-x64': 11.7.1 + '@oxc-resolver/binding-freebsd-x64': 11.7.1 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.7.1 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.7.1 + '@oxc-resolver/binding-linux-arm64-gnu': 11.7.1 + '@oxc-resolver/binding-linux-arm64-musl': 11.7.1 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.7.1 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.7.1 + '@oxc-resolver/binding-linux-riscv64-musl': 11.7.1 + '@oxc-resolver/binding-linux-s390x-gnu': 11.7.1 + '@oxc-resolver/binding-linux-x64-gnu': 11.7.1 + '@oxc-resolver/binding-linux-x64-musl': 11.7.1 + '@oxc-resolver/binding-wasm32-wasi': 11.7.1 + '@oxc-resolver/binding-win32-arm64-msvc': 11.7.1 + '@oxc-resolver/binding-win32-ia32-msvc': 11.7.1 + '@oxc-resolver/binding-win32-x64-msvc': 11.7.1 p-filter@2.1.0: dependencies: @@ -8661,10 +8701,6 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 - pnpm-workspace-yaml@1.0.0: - dependencies: - yaml: 2.8.0 - postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -8895,7 +8931,7 @@ snapshots: slash@3.0.0: {} - smol-toml@1.3.4: {} + smol-toml@1.4.2: {} solid-js@1.9.7: dependencies: @@ -9105,7 +9141,7 @@ snapshots: typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2))): dependencies: typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.2)) - yaml: 2.7.0 + yaml: 2.8.0 typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2)): dependencies: @@ -9118,15 +9154,15 @@ snapshots: markdown-it: 14.1.0 minimatch: 9.0.5 typescript: 5.9.2 - yaml: 2.7.0 + yaml: 2.8.0 - typescript-eslint@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): + typescript-eslint@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/parser': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.37.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -9189,13 +9225,13 @@ snapshots: validate-html-nesting@1.2.2: {} - vite-node@3.2.4(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -9210,7 +9246,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@24.3.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-dts@4.2.3(@types/node@24.3.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@24.3.0) '@rollup/pluginutils': 5.1.4(rollup@4.44.1) @@ -9223,17 +9259,17 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-externalize-deps@0.9.0(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.7)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.7)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.28.0 '@types/babel__core': 7.20.5 @@ -9241,14 +9277,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.7 solid-refresh: 0.6.3(solid-js@1.9.7) - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.0.6(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) optionalDependencies: - '@testing-library/jest-dom': 6.7.0 + '@testing-library/jest-dom': 6.8.0 transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.7.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.28.0 '@types/babel__core': 7.20.5 @@ -9256,25 +9292,25 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.0.6(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) optionalDependencies: - '@testing-library/jest-dom': 6.7.0 + '@testing-library/jest-dom': 6.8.0 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.9.2) optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0): + vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.3) @@ -9285,19 +9321,19 @@ snapshots: optionalDependencies: '@types/node': 24.3.0 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.5.1 tsx: 4.19.3 yaml: 2.8.0 - vitefu@1.0.6(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)): + vitefu@1.0.6(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) - vitest@3.2.4(@types/node@24.3.0)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0): + vitest@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -9315,8 +9351,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.3.0 @@ -9337,10 +9373,10 @@ snapshots: vscode-uri@3.1.0: {} - vue-eslint-parser@10.2.0(eslint@9.33.0(jiti@2.4.2)): + vue-eslint-parser@10.2.0(eslint@9.34.0(jiti@2.5.1)): dependencies: debug: 4.4.1 - eslint: 9.33.0(jiti@2.4.2) + eslint: 9.34.0(jiti@2.5.1) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -9412,13 +9448,6 @@ snapshots: yallist@4.0.0: {} - yaml-eslint-parser@1.3.0: - dependencies: - eslint-visitor-keys: 3.4.3 - yaml: 2.7.0 - - yaml@2.7.0: {} - yaml@2.8.0: {} yargs-parser@21.1.1: {} From 2d065df6aa80f366b3f2760271c6b6d389c47cba Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Thu, 18 Sep 2025 21:45:08 -0500 Subject: [PATCH 36/50] update lock file --- pnpm-lock.yaml | 58 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ec669eb..078e9530 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -608,6 +608,31 @@ importers: specifier: ^7.1.5 version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + examples/react/useAsyncRetryer: + dependencies: + '@tanstack/react-pacer': + specifier: ^0.14.0 + version: 0.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: + specifier: ^19.1.1 + version: 19.1.1 + react-dom: + specifier: ^19.1.1 + version: 19.1.1(react@19.1.1) + devDependencies: + '@types/react': + specifier: ^19.1.12 + version: 19.1.12 + '@types/react-dom': + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.12) + '@vitejs/plugin-react': + specifier: ^5.0.2 + version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + vite: + specifier: ^7.1.3 + version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + examples/react/useAsyncThrottler: dependencies: '@tanstack/react-pacer': @@ -2788,6 +2813,10 @@ packages: resolution: {integrity: sha512-t9A1epZWk0iUmLQxuLfo0MaBVmvtrpg3E7Y9N6+8InVlqdYOHaGLRqjwZ/nbzXkScqobei2nNXtjBZmkioJuhQ==} engines: {node: '>=18'} + '@tanstack/pacer@0.13.0': + resolution: {integrity: sha512-eCV3BIn+If4YGMgRbB315CvhyggmBhV85NmBH4uAA2kop6fOJh5GAWsvgsQOqYt0EFhHcjUwQ1eIhqw9aohuOQ==} + engines: {node: '>=18'} + '@tanstack/persister@0.1.1': resolution: {integrity: sha512-XUewm2+D0K84ZSuWm1oMHfqw/flmO7IzCc+316php/XChgbMe30DStp1cF2Uc4IV0cI0G4hDq2RX3+NTxTIvWg==} engines: {node: '>=18'} @@ -2856,9 +2885,6 @@ packages: '@tanstack/store@0.7.5': resolution: {integrity: sha512-qd/OjkjaFRKqKU4Yjipaen/EOB9MyEg6Wr9fW103RBPACf1ZcKhbhcu2S5mj5IgdPib6xFIgCUti/mKVkl+fRw==} - '@tanstack/store@0.7.4': - resolution: {integrity: sha512-F1XqZQici1Aq6WigEfcxJSml92nW+85Om8ElBMokPNg5glCYVOmPkZGIQeieYFxcPiKTfwo0MTOQpUyJtwncrg==} - '@tanstack/typedoc-config@0.2.0': resolution: {integrity: sha512-1ak0ZirlLRxd3dNNOFnMoYORBeC83nK4C+OiXpE0dxsO8ZVrBqCtNCKr8SG+W9zICXcWGiFu9qYLsgNKTayOqw==} engines: {node: '>=18'} @@ -2998,10 +3024,6 @@ packages: resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.41.0': - resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -6643,7 +6665,7 @@ snapshots: '@tanstack/pacer@0.13.0': dependencies: - '@tanstack/store': 0.7.4 + '@tanstack/store': 0.7.5 '@tanstack/persister@0.1.1': {} @@ -6676,7 +6698,7 @@ snapshots: '@tanstack/react-pacer@0.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/pacer': 0.13.0 - '@tanstack/react-store': 0.7.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-store': 0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -6701,14 +6723,14 @@ snapshots: dependencies: '@tanstack/store': 0.7.5 react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react-dom: 19.1.0(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) - '@tanstack/react-store@0.7.4(react-dom@19.1.0(react@19.1.1))(react@19.1.1)': + '@tanstack/react-store@0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/store': 0.7.4 + '@tanstack/store': 0.7.5 react: 19.1.1 - react-dom: 19.1.0(react@19.1.1) + react-dom: 19.1.1(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) '@tanstack/solid-devtools@0.6.7(csstype@3.1.3)(solid-js@1.9.9)': @@ -6727,8 +6749,6 @@ snapshots: '@tanstack/store@0.7.5': {} - '@tanstack/store@0.7.4': {} - '@tanstack/typedoc-config@0.2.0(typescript@5.9.2)': dependencies: typedoc: 0.27.9(typescript@5.9.2) @@ -6867,7 +6887,6 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) '@typescript-eslint/types': 8.43.0 debug: 4.4.1 - eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -6890,6 +6909,8 @@ snapshots: eslint: 9.35.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 + transitivePeerDependencies: + - supports-color '@typescript-eslint/types@8.39.1': {} @@ -6927,11 +6948,6 @@ snapshots: '@typescript-eslint/types': 8.43.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.41.0': - dependencies: - '@typescript-eslint/types': 8.41.0 - eslint-visitor-keys: 4.2.1 - '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true From a179bb6ed633043e665a05f7f9432f8c25764df0 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Mon, 29 Sep 2025 15:30:30 -0500 Subject: [PATCH 37/50] delete --- .../react-pacer-devtools/src/devtools.tsx | 19 ------------------ .../solid-pacer-devtools/src/devtools.tsx | 20 ------------------- 2 files changed, 39 deletions(-) delete mode 100644 packages/react-pacer-devtools/src/devtools.tsx delete mode 100644 packages/solid-pacer-devtools/src/devtools.tsx diff --git a/packages/react-pacer-devtools/src/devtools.tsx b/packages/react-pacer-devtools/src/devtools.tsx deleted file mode 100644 index 6654e5df..00000000 --- a/packages/react-pacer-devtools/src/devtools.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react' -import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' - -interface PacerDevtoolsReactInit {} - -export const PacerDevtoolsPanel = (_props?: PacerDevtoolsReactInit) => { - const devToolRef = useRef(null) - - const [devtools] = useState(() => new PacerDevtoolsCore({})) - useEffect(() => { - if (devToolRef.current) { - devtools.mount(devToolRef.current) - } - - return () => devtools.unmount() - }, [devtools]) - - return
-} diff --git a/packages/solid-pacer-devtools/src/devtools.tsx b/packages/solid-pacer-devtools/src/devtools.tsx deleted file mode 100644 index 01266de1..00000000 --- a/packages/solid-pacer-devtools/src/devtools.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { PacerDevtoolsCore } from '@tanstack/pacer-devtools' -import { createSignal, onCleanup, onMount } from 'solid-js' - -interface PacerDevtoolsSolidInit {} - -export const PacerDevtoolsPanel = (_props?: PacerDevtoolsSolidInit) => { - let devToolRef: HTMLDivElement | undefined - const [devtools] = createSignal(new PacerDevtoolsCore({})) - onMount(() => { - if (devToolRef) { - devtools().mount(devToolRef) - - onCleanup(() => { - devtools().unmount() - }) - } - }) - - return
-} From 6daa67f7e2537440c3d63d3e8c3ae3f43010c3ba Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Tue, 30 Sep 2025 16:36:36 -0500 Subject: [PATCH 38/50] package upgrades --- examples/react/asyncBatch/package.json | 6 +- examples/react/asyncDebounce/package.json | 6 +- examples/react/asyncRateLimit/package.json | 6 +- examples/react/asyncThrottle/package.json | 6 +- examples/react/batch/package.json | 6 +- examples/react/debounce/package.json | 6 +- examples/react/queue/package.json | 8 +- examples/react/rateLimit/package.json | 6 +- .../package.json | 10 +- .../react-query-queued-prefetch/package.json | 10 +- .../package.json | 10 +- examples/react/throttle/package.json | 6 +- .../useAsyncBatchedCallback/package.json | 6 +- examples/react/useAsyncBatcher/package.json | 6 +- .../useAsyncDebouncedCallback/package.json | 6 +- examples/react/useAsyncDebouncer/package.json | 6 +- .../react/useAsyncQueuedState/package.json | 6 +- examples/react/useAsyncQueuer/package.json | 6 +- .../react/useAsyncRateLimiter/package.json | 6 +- .../package.json | 6 +- examples/react/useAsyncRetryer/package.json | 6 +- examples/react/useAsyncThrottler/package.json | 6 +- .../react/useBatchedCallback/package.json | 6 +- examples/react/useBatcher/package.json | 6 +- .../react/useDebouncedCallback/package.json | 6 +- examples/react/useDebouncedState/package.json | 6 +- examples/react/useDebouncedValue/package.json | 6 +- examples/react/useDebouncer/package.json | 6 +- examples/react/useQueuedState/package.json | 6 +- examples/react/useQueuedValue/package.json | 6 +- examples/react/useQueuer/package.json | 8 +- .../react/useQueuerWithPersister/package.json | 6 +- .../react/useRateLimitedCallback/package.json | 6 +- .../react/useRateLimitedState/package.json | 6 +- .../react/useRateLimitedValue/package.json | 6 +- examples/react/useRateLimiter/package.json | 6 +- .../useRateLimiterWithPersister/package.json | 6 +- .../react/useThrottledCallback/package.json | 6 +- examples/react/useThrottledState/package.json | 6 +- examples/react/useThrottledValue/package.json | 6 +- examples/react/useThrottler/package.json | 6 +- examples/react/util-comparison/package.json | 8 +- examples/solid/asyncBatch/package.json | 2 +- examples/solid/asyncDebounce/package.json | 2 +- examples/solid/asyncRateLimit/package.json | 2 +- examples/solid/asyncThrottle/package.json | 2 +- examples/solid/batch/package.json | 2 +- .../solid/createAsyncBatcher/package.json | 2 +- .../solid/createAsyncDebouncer/package.json | 2 +- examples/solid/createAsyncQueuer/package.json | 2 +- .../solid/createAsyncRateLimiter/package.json | 2 +- .../solid/createAsyncThrottler/package.json | 2 +- examples/solid/createBatcher/package.json | 2 +- .../solid/createDebouncedSignal/package.json | 2 +- .../solid/createDebouncedValue/package.json | 2 +- examples/solid/createDebouncer/package.json | 2 +- examples/solid/createQueuer/package.json | 4 +- .../createRateLimitedSignal/package.json | 2 +- .../solid/createRateLimitedValue/package.json | 2 +- examples/solid/createRateLimiter/package.json | 2 +- .../solid/createThrottledSignal/package.json | 2 +- .../solid/createThrottledValue/package.json | 2 +- examples/solid/createThrottler/package.json | 2 +- examples/solid/debounce/package.json | 2 +- examples/solid/queue/package.json | 4 +- examples/solid/rateLimit/package.json | 2 +- examples/solid/throttle/package.json | 2 +- package.json | 18 +- packages/pacer-devtools/package.json | 4 +- packages/pacer/package.json | 4 +- packages/react-pacer-devtools/package.json | 4 +- packages/react-pacer/package.json | 8 +- packages/solid-pacer/package.json | 2 +- pnpm-lock.yaml | 2447 +++++++++-------- 74 files changed, 1410 insertions(+), 1401 deletions(-) diff --git a/examples/react/asyncBatch/package.json b/examples/react/asyncBatch/package.json index 877a2302..a07c2507 100644 --- a/examples/react/asyncBatch/package.json +++ b/examples/react/asyncBatch/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/asyncDebounce/package.json b/examples/react/asyncDebounce/package.json index a2cdf372..08ca7289 100644 --- a/examples/react/asyncDebounce/package.json +++ b/examples/react/asyncDebounce/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/asyncRateLimit/package.json b/examples/react/asyncRateLimit/package.json index 1e70e216..278991aa 100644 --- a/examples/react/asyncRateLimit/package.json +++ b/examples/react/asyncRateLimit/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/asyncThrottle/package.json b/examples/react/asyncThrottle/package.json index 5bb32f28..6d5e18e5 100644 --- a/examples/react/asyncThrottle/package.json +++ b/examples/react/asyncThrottle/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/batch/package.json b/examples/react/batch/package.json index 77706f95..93e2c63b 100644 --- a/examples/react/batch/package.json +++ b/examples/react/batch/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/debounce/package.json b/examples/react/debounce/package.json index 3e79c101..f3a99863 100644 --- a/examples/react/debounce/package.json +++ b/examples/react/debounce/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index 4610cc80..77f37f69 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -14,12 +14,12 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-devtools": "0.6.7", + "@tanstack/react-devtools": "0.7.0", "@tanstack/react-pacer-devtools": "0.3.0", - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/rateLimit/package.json b/examples/react/rateLimit/package.json index 5935e439..3157ee2c 100644 --- a/examples/react/rateLimit/package.json +++ b/examples/react/rateLimit/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/react-query-debounced-prefetch/package.json b/examples/react/react-query-debounced-prefetch/package.json index ea36aeec..4e8c31a8 100644 --- a/examples/react/react-query-debounced-prefetch/package.json +++ b/examples/react/react-query-debounced-prefetch/package.json @@ -10,16 +10,16 @@ }, "dependencies": { "@tanstack/react-pacer": "^0.16.3", - "@tanstack/react-query": "^5.87.4", - "@tanstack/react-query-devtools": "^5.87.4", + "@tanstack/react-query": "^5.90.2", + "@tanstack/react-query-devtools": "^5.90.2", "react": "^19.1.1", "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/react-query-queued-prefetch/package.json b/examples/react/react-query-queued-prefetch/package.json index cb41987c..78d7cfa8 100644 --- a/examples/react/react-query-queued-prefetch/package.json +++ b/examples/react/react-query-queued-prefetch/package.json @@ -10,16 +10,16 @@ }, "dependencies": { "@tanstack/react-pacer": "^0.16.3", - "@tanstack/react-query": "^5.87.4", - "@tanstack/react-query-devtools": "^5.87.4", + "@tanstack/react-query": "^5.90.2", + "@tanstack/react-query-devtools": "^5.90.2", "react": "^19.1.1", "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/react-query-throttled-prefetch/package.json b/examples/react/react-query-throttled-prefetch/package.json index 40919dfe..16cd5035 100644 --- a/examples/react/react-query-throttled-prefetch/package.json +++ b/examples/react/react-query-throttled-prefetch/package.json @@ -10,16 +10,16 @@ }, "dependencies": { "@tanstack/react-pacer": "^0.16.3", - "@tanstack/react-query": "^5.87.4", - "@tanstack/react-query-devtools": "^5.87.4", + "@tanstack/react-query": "^5.90.2", + "@tanstack/react-query-devtools": "^5.90.2", "react": "^19.1.1", "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/throttle/package.json b/examples/react/throttle/package.json index c5742bbc..17b67b7c 100644 --- a/examples/react/throttle/package.json +++ b/examples/react/throttle/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncBatchedCallback/package.json b/examples/react/useAsyncBatchedCallback/package.json index cfc6cbbd..ce585583 100644 --- a/examples/react/useAsyncBatchedCallback/package.json +++ b/examples/react/useAsyncBatchedCallback/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncBatcher/package.json b/examples/react/useAsyncBatcher/package.json index f15fff26..0010d330 100644 --- a/examples/react/useAsyncBatcher/package.json +++ b/examples/react/useAsyncBatcher/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncDebouncedCallback/package.json b/examples/react/useAsyncDebouncedCallback/package.json index 71156115..f8a505ea 100644 --- a/examples/react/useAsyncDebouncedCallback/package.json +++ b/examples/react/useAsyncDebouncedCallback/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncDebouncer/package.json b/examples/react/useAsyncDebouncer/package.json index 1595e349..744e44c7 100644 --- a/examples/react/useAsyncDebouncer/package.json +++ b/examples/react/useAsyncDebouncer/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncQueuedState/package.json b/examples/react/useAsyncQueuedState/package.json index 03e90f08..05f012b6 100644 --- a/examples/react/useAsyncQueuedState/package.json +++ b/examples/react/useAsyncQueuedState/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncQueuer/package.json b/examples/react/useAsyncQueuer/package.json index 49f25b1c..110b2494 100644 --- a/examples/react/useAsyncQueuer/package.json +++ b/examples/react/useAsyncQueuer/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncRateLimiter/package.json b/examples/react/useAsyncRateLimiter/package.json index 99db56b3..a15e7505 100644 --- a/examples/react/useAsyncRateLimiter/package.json +++ b/examples/react/useAsyncRateLimiter/package.json @@ -15,10 +15,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncRateLimiterWithPersister/package.json b/examples/react/useAsyncRateLimiterWithPersister/package.json index 7d1d7523..0da4fa46 100644 --- a/examples/react/useAsyncRateLimiterWithPersister/package.json +++ b/examples/react/useAsyncRateLimiterWithPersister/package.json @@ -15,10 +15,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncRetryer/package.json b/examples/react/useAsyncRetryer/package.json index ecf59fbb..f99314ad 100644 --- a/examples/react/useAsyncRetryer/package.json +++ b/examples/react/useAsyncRetryer/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.3" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useAsyncThrottler/package.json b/examples/react/useAsyncThrottler/package.json index 9d15cab6..9a70bcaa 100644 --- a/examples/react/useAsyncThrottler/package.json +++ b/examples/react/useAsyncThrottler/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useBatchedCallback/package.json b/examples/react/useBatchedCallback/package.json index a103b0df..8bbd825e 100644 --- a/examples/react/useBatchedCallback/package.json +++ b/examples/react/useBatchedCallback/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useBatcher/package.json b/examples/react/useBatcher/package.json index 9f365adb..1f733f93 100644 --- a/examples/react/useBatcher/package.json +++ b/examples/react/useBatcher/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useDebouncedCallback/package.json b/examples/react/useDebouncedCallback/package.json index d583ed90..6b144cd4 100644 --- a/examples/react/useDebouncedCallback/package.json +++ b/examples/react/useDebouncedCallback/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useDebouncedState/package.json b/examples/react/useDebouncedState/package.json index ab64bf45..f797b005 100644 --- a/examples/react/useDebouncedState/package.json +++ b/examples/react/useDebouncedState/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useDebouncedValue/package.json b/examples/react/useDebouncedValue/package.json index 5251cb6b..56ec0d8e 100644 --- a/examples/react/useDebouncedValue/package.json +++ b/examples/react/useDebouncedValue/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useDebouncer/package.json b/examples/react/useDebouncer/package.json index cd0a7336..fef91d47 100644 --- a/examples/react/useDebouncer/package.json +++ b/examples/react/useDebouncer/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useQueuedState/package.json b/examples/react/useQueuedState/package.json index 557468d7..958b7d19 100644 --- a/examples/react/useQueuedState/package.json +++ b/examples/react/useQueuedState/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useQueuedValue/package.json b/examples/react/useQueuedValue/package.json index 4990ee15..d910f40f 100644 --- a/examples/react/useQueuedValue/package.json +++ b/examples/react/useQueuedValue/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useQueuer/package.json b/examples/react/useQueuer/package.json index 51d48e6d..7ef5ca55 100644 --- a/examples/react/useQueuer/package.json +++ b/examples/react/useQueuer/package.json @@ -15,12 +15,12 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-devtools": "0.6.7", + "@tanstack/react-devtools": "0.7.0", "@tanstack/react-pacer-devtools": "0.3.0", - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useQueuerWithPersister/package.json b/examples/react/useQueuerWithPersister/package.json index c18c7117..f8a5f070 100644 --- a/examples/react/useQueuerWithPersister/package.json +++ b/examples/react/useQueuerWithPersister/package.json @@ -15,10 +15,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useRateLimitedCallback/package.json b/examples/react/useRateLimitedCallback/package.json index aa7eead2..5fb192da 100644 --- a/examples/react/useRateLimitedCallback/package.json +++ b/examples/react/useRateLimitedCallback/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useRateLimitedState/package.json b/examples/react/useRateLimitedState/package.json index be93b3ab..67838db0 100644 --- a/examples/react/useRateLimitedState/package.json +++ b/examples/react/useRateLimitedState/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useRateLimitedValue/package.json b/examples/react/useRateLimitedValue/package.json index 3771b9ec..6e0e82c3 100644 --- a/examples/react/useRateLimitedValue/package.json +++ b/examples/react/useRateLimitedValue/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useRateLimiter/package.json b/examples/react/useRateLimiter/package.json index d2900eb4..2f25ca50 100644 --- a/examples/react/useRateLimiter/package.json +++ b/examples/react/useRateLimiter/package.json @@ -15,10 +15,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useRateLimiterWithPersister/package.json b/examples/react/useRateLimiterWithPersister/package.json index b41c23de..f4cce41f 100644 --- a/examples/react/useRateLimiterWithPersister/package.json +++ b/examples/react/useRateLimiterWithPersister/package.json @@ -15,10 +15,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useThrottledCallback/package.json b/examples/react/useThrottledCallback/package.json index ad0fbe16..d9b65fdb 100644 --- a/examples/react/useThrottledCallback/package.json +++ b/examples/react/useThrottledCallback/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useThrottledState/package.json b/examples/react/useThrottledState/package.json index 74221765..dfabb4f0 100644 --- a/examples/react/useThrottledState/package.json +++ b/examples/react/useThrottledState/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useThrottledValue/package.json b/examples/react/useThrottledValue/package.json index 59884fce..29cf9f86 100644 --- a/examples/react/useThrottledValue/package.json +++ b/examples/react/useThrottledValue/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/useThrottler/package.json b/examples/react/useThrottler/package.json index e2e9ac88..be7e81fd 100644 --- a/examples/react/useThrottler/package.json +++ b/examples/react/useThrottler/package.json @@ -14,10 +14,10 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/react/util-comparison/package.json b/examples/react/util-comparison/package.json index 0a6907f5..c12d3ce5 100644 --- a/examples/react/util-comparison/package.json +++ b/examples/react/util-comparison/package.json @@ -14,12 +14,12 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@tanstack/react-devtools": "0.6.7", + "@tanstack/react-devtools": "0.7.0", "@tanstack/react-pacer-devtools": "0.3.0", - "@types/react": "^19.1.12", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", - "vite": "^7.1.5" + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" }, "browserslist": { "production": [ diff --git a/examples/solid/asyncBatch/package.json b/examples/solid/asyncBatch/package.json index edf68d8e..bfc42159 100644 --- a/examples/solid/asyncBatch/package.json +++ b/examples/solid/asyncBatch/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/asyncDebounce/package.json b/examples/solid/asyncDebounce/package.json index 41a685dd..82785f33 100644 --- a/examples/solid/asyncDebounce/package.json +++ b/examples/solid/asyncDebounce/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/asyncRateLimit/package.json b/examples/solid/asyncRateLimit/package.json index b0a42da8..9971ac96 100644 --- a/examples/solid/asyncRateLimit/package.json +++ b/examples/solid/asyncRateLimit/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/asyncThrottle/package.json b/examples/solid/asyncThrottle/package.json index 1489b6d1..693dc9de 100644 --- a/examples/solid/asyncThrottle/package.json +++ b/examples/solid/asyncThrottle/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/batch/package.json b/examples/solid/batch/package.json index a7df42f3..e94d3714 100644 --- a/examples/solid/batch/package.json +++ b/examples/solid/batch/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createAsyncBatcher/package.json b/examples/solid/createAsyncBatcher/package.json index b3a2f960..43e2bf1a 100644 --- a/examples/solid/createAsyncBatcher/package.json +++ b/examples/solid/createAsyncBatcher/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createAsyncDebouncer/package.json b/examples/solid/createAsyncDebouncer/package.json index 964740fa..3199218f 100644 --- a/examples/solid/createAsyncDebouncer/package.json +++ b/examples/solid/createAsyncDebouncer/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createAsyncQueuer/package.json b/examples/solid/createAsyncQueuer/package.json index 4bfe0c40..3e24ef32 100644 --- a/examples/solid/createAsyncQueuer/package.json +++ b/examples/solid/createAsyncQueuer/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createAsyncRateLimiter/package.json b/examples/solid/createAsyncRateLimiter/package.json index ceb13fd5..51e0fd66 100644 --- a/examples/solid/createAsyncRateLimiter/package.json +++ b/examples/solid/createAsyncRateLimiter/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createAsyncThrottler/package.json b/examples/solid/createAsyncThrottler/package.json index 424ed013..bb1585a4 100644 --- a/examples/solid/createAsyncThrottler/package.json +++ b/examples/solid/createAsyncThrottler/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createBatcher/package.json b/examples/solid/createBatcher/package.json index 8694ce3b..64b726a3 100644 --- a/examples/solid/createBatcher/package.json +++ b/examples/solid/createBatcher/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createDebouncedSignal/package.json b/examples/solid/createDebouncedSignal/package.json index 44a39669..93bc24d2 100644 --- a/examples/solid/createDebouncedSignal/package.json +++ b/examples/solid/createDebouncedSignal/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createDebouncedValue/package.json b/examples/solid/createDebouncedValue/package.json index 248ff2d3..1f1bc033 100644 --- a/examples/solid/createDebouncedValue/package.json +++ b/examples/solid/createDebouncedValue/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createDebouncer/package.json b/examples/solid/createDebouncer/package.json index 77b8d54b..bb0a110a 100644 --- a/examples/solid/createDebouncer/package.json +++ b/examples/solid/createDebouncer/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createQueuer/package.json b/examples/solid/createQueuer/package.json index c20077da..5daea36d 100644 --- a/examples/solid/createQueuer/package.json +++ b/examples/solid/createQueuer/package.json @@ -9,13 +9,13 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/solid-devtools": "0.6.7", + "@tanstack/solid-devtools": "0.7.0", "@tanstack/solid-pacer": "^0.14.3", "@tanstack/solid-pacer-devtools": "0.3.0", "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createRateLimitedSignal/package.json b/examples/solid/createRateLimitedSignal/package.json index 93cafee7..79f5f507 100644 --- a/examples/solid/createRateLimitedSignal/package.json +++ b/examples/solid/createRateLimitedSignal/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createRateLimitedValue/package.json b/examples/solid/createRateLimitedValue/package.json index c532df1b..ea3db0fe 100644 --- a/examples/solid/createRateLimitedValue/package.json +++ b/examples/solid/createRateLimitedValue/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createRateLimiter/package.json b/examples/solid/createRateLimiter/package.json index ef649d6e..45fea341 100644 --- a/examples/solid/createRateLimiter/package.json +++ b/examples/solid/createRateLimiter/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createThrottledSignal/package.json b/examples/solid/createThrottledSignal/package.json index aa550bad..6c6ad9cf 100644 --- a/examples/solid/createThrottledSignal/package.json +++ b/examples/solid/createThrottledSignal/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createThrottledValue/package.json b/examples/solid/createThrottledValue/package.json index 712ba8e8..101f5f93 100644 --- a/examples/solid/createThrottledValue/package.json +++ b/examples/solid/createThrottledValue/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/createThrottler/package.json b/examples/solid/createThrottler/package.json index aa015d0f..4cb502a0 100644 --- a/examples/solid/createThrottler/package.json +++ b/examples/solid/createThrottler/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/debounce/package.json b/examples/solid/debounce/package.json index ab26d3b9..62ef735d 100644 --- a/examples/solid/debounce/package.json +++ b/examples/solid/debounce/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/queue/package.json b/examples/solid/queue/package.json index e7fa8d39..b97b8b28 100644 --- a/examples/solid/queue/package.json +++ b/examples/solid/queue/package.json @@ -9,13 +9,13 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/solid-devtools": "0.6.7", + "@tanstack/solid-devtools": "0.7.0", "@tanstack/solid-pacer": "^0.14.3", "@tanstack/solid-pacer-devtools": "0.3.0", "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/rateLimit/package.json b/examples/solid/rateLimit/package.json index 3fc32f5b..9f187bd3 100644 --- a/examples/solid/rateLimit/package.json +++ b/examples/solid/rateLimit/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/examples/solid/throttle/package.json b/examples/solid/throttle/package.json index c0ce2a81..4e1ca067 100644 --- a/examples/solid/throttle/package.json +++ b/examples/solid/throttle/package.json @@ -13,7 +13,7 @@ "solid-js": "^1.9.9" }, "devDependencies": { - "vite": "^7.1.5", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "browserslist": { diff --git a/package.json b/package.json index dcb903d3..b8801b94 100644 --- a/package.json +++ b/package.json @@ -57,24 +57,24 @@ "@faker-js/faker": "^10.0.0", "@size-limit/preset-small-lib": "^11.2.0", "@svitejs/changesets-changelog-github-compact": "^1.2.0", - "@tanstack/config": "0.20.1", - "@testing-library/jest-dom": "^6.8.0", - "@types/node": "^24.3.1", - "eslint": "^9.35.0", + "@tanstack/config": "0.20.3", + "@testing-library/jest-dom": "^6.9.0", + "@types/node": "^24.6.0", + "eslint": "^9.36.0", "eslint-plugin-unused-imports": "^4.2.0", "fast-glob": "^3.3.3", - "jsdom": "^26.1.0", - "knip": "^5.63.1", + "jsdom": "^27.0.0", + "knip": "^5.64.1", "markdown-link-extractor": "^4.0.2", - "nx": "^21.5.2", + "nx": "^21.6.2", "premove": "^4.0.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", - "publint": "^0.3.12", + "publint": "^0.3.13", "sherif": "^1.6.1", "size-limit": "^11.2.0", "typescript": "5.9.2", - "vite": "^7.1.5", + "vite": "^7.1.7", "vitest": "^3.2.4" }, "overrides": { diff --git a/packages/pacer-devtools/package.json b/packages/pacer-devtools/package.json index 2e56be84..40edb8b6 100644 --- a/packages/pacer-devtools/package.json +++ b/packages/pacer-devtools/package.json @@ -62,8 +62,8 @@ "@tanstack/pacer": ">=0.15.0" }, "dependencies": { - "@tanstack/devtools-ui": "^0.3.4", - "@tanstack/solid-store": "^0.7.5", + "@tanstack/devtools-ui": "^0.3.5", + "@tanstack/solid-store": "^0.7.7", "clsx": "^2.1.1", "dayjs": "^1.11.18", "goober": "^2.1.16", diff --git a/packages/pacer/package.json b/packages/pacer/package.json index 52861bfb..86d83924 100644 --- a/packages/pacer/package.json +++ b/packages/pacer/package.json @@ -191,7 +191,7 @@ "build": "vite build" }, "dependencies": { - "@tanstack/devtools-event-client": "^0.2.5", - "@tanstack/store": "^0.7.5" + "@tanstack/devtools-event-client": "^0.3.2", + "@tanstack/store": "^0.7.7" } } diff --git a/packages/react-pacer-devtools/package.json b/packages/react-pacer-devtools/package.json index eda3994d..6cce5e8b 100644 --- a/packages/react-pacer-devtools/package.json +++ b/packages/react-pacer-devtools/package.json @@ -68,8 +68,8 @@ "@tanstack/pacer-devtools": "workspace:*" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^1.53.1", - "@vitejs/plugin-react": "^5.0.2", + "@eslint-react/eslint-plugin": "^2.0.3", + "@vitejs/plugin-react": "^5.0.4", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0" } diff --git a/packages/react-pacer/package.json b/packages/react-pacer/package.json index 6e1bee51..ca30a9c2 100644 --- a/packages/react-pacer/package.json +++ b/packages/react-pacer/package.json @@ -192,12 +192,12 @@ }, "dependencies": { "@tanstack/pacer": "workspace:*", - "@tanstack/react-store": "^0.7.5" + "@tanstack/react-store": "^0.7.7" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^1.53.1", - "@types/react": "^19.1.12", - "@vitejs/plugin-react": "^5.0.2", + "@eslint-react/eslint-plugin": "^2.0.3", + "@types/react": "^19.1.16", + "@vitejs/plugin-react": "^5.0.4", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0", "react": "^19.1.1" diff --git a/packages/solid-pacer/package.json b/packages/solid-pacer/package.json index 89f87605..b08c38de 100644 --- a/packages/solid-pacer/package.json +++ b/packages/solid-pacer/package.json @@ -172,7 +172,7 @@ }, "dependencies": { "@tanstack/pacer": "workspace:*", - "@tanstack/solid-store": "^0.7.5" + "@tanstack/solid-store": "^0.7.7" }, "devDependencies": { "solid-js": "^1.9.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 078e9530..4cd6f30f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.29.7 - version: 2.29.7(@types/node@24.3.1) + version: 2.29.7(@types/node@24.6.0) '@faker-js/faker': specifier: ^10.0.0 version: 10.0.0 @@ -21,35 +21,35 @@ importers: specifier: ^1.2.0 version: 1.2.0 '@tanstack/config': - specifier: 0.20.1 - version: 0.20.1(@types/node@24.3.1)(@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: 0.20.3 + version: 0.20.3(@types/node@24.6.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) '@testing-library/jest-dom': - specifier: ^6.8.0 - version: 6.8.0 + specifier: ^6.9.0 + version: 6.9.0 '@types/node': - specifier: ^24.3.1 - version: 24.3.1 + specifier: ^24.6.0 + version: 24.6.0 eslint: - specifier: ^9.35.0 - version: 9.35.0(jiti@2.5.1) + specifier: ^9.36.0 + version: 9.36.0(jiti@2.6.0) eslint-plugin-unused-imports: specifier: ^4.2.0 - version: 4.2.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)) + version: 4.2.0(@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0)) fast-glob: specifier: ^3.3.3 version: 3.3.3 jsdom: - specifier: ^26.1.0 - version: 26.1.0 + specifier: ^27.0.0 + version: 27.0.0(postcss@8.5.6) knip: - specifier: ^5.63.1 - version: 5.63.1(@types/node@24.3.1)(typescript@5.9.2) + specifier: ^5.64.1 + version: 5.64.1(@types/node@24.6.0)(typescript@5.9.2) markdown-link-extractor: specifier: ^4.0.2 version: 4.0.2 nx: - specifier: ^21.5.2 - version: 21.5.2 + specifier: ^21.6.2 + version: 21.6.2 premove: specifier: ^4.0.0 version: 4.0.0 @@ -60,8 +60,8 @@ importers: specifier: ^3.4.0 version: 3.4.0(prettier@3.6.2)(svelte@5.22.6) publint: - specifier: ^0.3.12 - version: 0.3.12 + specifier: ^0.3.13 + version: 0.3.13 sherif: specifier: ^1.6.1 version: 1.6.1 @@ -72,11 +72,11 @@ importers: specifier: 5.9.2 version: 5.9.2 vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(jiti@2.5.1)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0) + version: 3.2.4(@types/node@24.6.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncBatch: dependencies: @@ -91,17 +91,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncDebounce: dependencies: @@ -116,17 +116,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncRateLimit: dependencies: @@ -141,17 +141,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncThrottle: dependencies: @@ -166,17 +166,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/batch: dependencies: @@ -191,17 +191,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/debounce: dependencies: @@ -216,17 +216,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/queue: dependencies: @@ -241,23 +241,23 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@tanstack/react-devtools': - specifier: 0.6.7 - version: 0.6.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + specifier: 0.7.0 + version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.3.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/rateLimit: dependencies: @@ -272,17 +272,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-debounced-prefetch: dependencies: @@ -290,11 +290,11 @@ importers: specifier: ^0.16.3 version: link:../../../packages/react-pacer '@tanstack/react-query': - specifier: ^5.87.4 - version: 5.87.4(react@19.1.1) + specifier: ^5.90.2 + version: 5.90.2(react@19.1.1) '@tanstack/react-query-devtools': - specifier: ^5.87.4 - version: 5.87.4(@tanstack/react-query@5.87.4(react@19.1.1))(react@19.1.1) + specifier: ^5.90.2 + version: 5.90.2(@tanstack/react-query@5.90.2(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -303,17 +303,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-queued-prefetch: dependencies: @@ -321,11 +321,11 @@ importers: specifier: ^0.16.3 version: link:../../../packages/react-pacer '@tanstack/react-query': - specifier: ^5.87.4 - version: 5.87.4(react@19.1.1) + specifier: ^5.90.2 + version: 5.90.2(react@19.1.1) '@tanstack/react-query-devtools': - specifier: ^5.87.4 - version: 5.87.4(@tanstack/react-query@5.87.4(react@19.1.1))(react@19.1.1) + specifier: ^5.90.2 + version: 5.90.2(@tanstack/react-query@5.90.2(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -334,17 +334,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-throttled-prefetch: dependencies: @@ -352,11 +352,11 @@ importers: specifier: ^0.16.3 version: link:../../../packages/react-pacer '@tanstack/react-query': - specifier: ^5.87.4 - version: 5.87.4(react@19.1.1) + specifier: ^5.90.2 + version: 5.90.2(react@19.1.1) '@tanstack/react-query-devtools': - specifier: ^5.87.4 - version: 5.87.4(@tanstack/react-query@5.87.4(react@19.1.1))(react@19.1.1) + specifier: ^5.90.2 + version: 5.90.2(@tanstack/react-query@5.90.2(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -365,17 +365,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/throttle: dependencies: @@ -390,17 +390,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatchedCallback: dependencies: @@ -415,17 +415,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatcher: dependencies: @@ -440,17 +440,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncedCallback: dependencies: @@ -465,17 +465,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncer: dependencies: @@ -490,17 +490,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuedState: dependencies: @@ -515,17 +515,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuer: dependencies: @@ -540,17 +540,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiter: dependencies: @@ -568,17 +568,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiterWithPersister: dependencies: @@ -596,17 +596,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRetryer: dependencies: @@ -621,17 +621,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.3 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncThrottler: dependencies: @@ -646,17 +646,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatchedCallback: dependencies: @@ -671,17 +671,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatcher: dependencies: @@ -696,17 +696,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedCallback: dependencies: @@ -721,17 +721,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedState: dependencies: @@ -746,17 +746,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedValue: dependencies: @@ -771,17 +771,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncer: dependencies: @@ -796,17 +796,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedState: dependencies: @@ -821,17 +821,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedValue: dependencies: @@ -846,17 +846,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuer: dependencies: @@ -874,23 +874,23 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@tanstack/react-devtools': - specifier: 0.6.7 - version: 0.6.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + specifier: 0.7.0 + version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.3.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuerWithPersister: dependencies: @@ -908,17 +908,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedCallback: dependencies: @@ -933,17 +933,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedState: dependencies: @@ -958,17 +958,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedValue: dependencies: @@ -983,17 +983,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiter: dependencies: @@ -1011,17 +1011,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiterWithPersister: dependencies: @@ -1039,17 +1039,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledCallback: dependencies: @@ -1064,17 +1064,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledState: dependencies: @@ -1089,17 +1089,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledValue: dependencies: @@ -1114,17 +1114,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottler: dependencies: @@ -1139,17 +1139,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/util-comparison: dependencies: @@ -1164,23 +1164,23 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@tanstack/react-devtools': - specifier: 0.6.7 - version: 0.6.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + specifier: 0.7.0 + version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.3.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/solid/asyncBatch: dependencies: @@ -1192,11 +1192,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncDebounce: dependencies: @@ -1208,11 +1208,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncRateLimit: dependencies: @@ -1224,11 +1224,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncThrottle: dependencies: @@ -1240,11 +1240,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/batch: dependencies: @@ -1256,11 +1256,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncBatcher: dependencies: @@ -1272,11 +1272,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncDebouncer: dependencies: @@ -1288,11 +1288,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncQueuer: dependencies: @@ -1304,11 +1304,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncRateLimiter: dependencies: @@ -1320,11 +1320,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncThrottler: dependencies: @@ -1336,11 +1336,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createBatcher: dependencies: @@ -1352,11 +1352,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedSignal: dependencies: @@ -1368,11 +1368,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedValue: dependencies: @@ -1384,11 +1384,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncer: dependencies: @@ -1400,17 +1400,17 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createQueuer: dependencies: '@tanstack/solid-devtools': - specifier: 0.6.7 - version: 0.6.7(csstype@3.1.3)(solid-js@1.9.9) + specifier: 0.7.0 + version: 0.7.0(csstype@3.1.3)(solid-js@1.9.9) '@tanstack/solid-pacer': specifier: ^0.14.3 version: link:../../../packages/solid-pacer @@ -1422,11 +1422,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedSignal: dependencies: @@ -1438,11 +1438,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedValue: dependencies: @@ -1454,11 +1454,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimiter: dependencies: @@ -1470,11 +1470,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledSignal: dependencies: @@ -1486,11 +1486,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledValue: dependencies: @@ -1502,11 +1502,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottler: dependencies: @@ -1518,11 +1518,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/debounce: dependencies: @@ -1534,17 +1534,17 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/queue: dependencies: '@tanstack/solid-devtools': - specifier: 0.6.7 - version: 0.6.7(csstype@3.1.3)(solid-js@1.9.9) + specifier: 0.7.0 + version: 0.7.0(csstype@3.1.3)(solid-js@1.9.9) '@tanstack/solid-pacer': specifier: ^0.14.3 version: link:../../../packages/solid-pacer @@ -1556,11 +1556,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/rateLimit: dependencies: @@ -1572,11 +1572,11 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/throttle: dependencies: @@ -1588,32 +1588,32 @@ importers: version: 1.9.9 devDependencies: vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/pacer: dependencies: '@tanstack/devtools-event-client': - specifier: ^0.2.5 - version: 0.2.5 + specifier: ^0.3.2 + version: 0.3.2 '@tanstack/store': - specifier: ^0.7.5 - version: 0.7.5 + specifier: ^0.7.7 + version: 0.7.7 packages/pacer-devtools: dependencies: '@tanstack/devtools-ui': - specifier: ^0.3.4 - version: 0.3.4(csstype@3.1.3)(solid-js@1.9.9) + specifier: ^0.3.5 + version: 0.3.5(csstype@3.1.3)(solid-js@1.9.9) '@tanstack/pacer': specifier: '>=0.15.0' version: link:../pacer '@tanstack/solid-store': - specifier: ^0.7.5 - version: 0.7.5(solid-js@1.9.9) + specifier: ^0.7.7 + version: 0.7.7(solid-js@1.9.9) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -1629,7 +1629,7 @@ importers: devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/react-pacer: dependencies: @@ -1637,27 +1637,27 @@ importers: specifier: workspace:* version: link:../pacer '@tanstack/react-store': - specifier: ^0.7.5 - version: 0.7.5(react-dom@19.1.0(react@19.1.1))(react@19.1.1) + specifier: ^0.7.7 + version: 0.7.7(react-dom@19.1.0(react@19.1.1))(react@19.1.1) react-dom: specifier: '>=16.8' version: 19.1.0(react@19.1.1) devDependencies: '@eslint-react/eslint-plugin': - specifier: ^1.53.1 - version: 1.53.1(eslint@9.35.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + specifier: ^2.0.3 + version: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) '@types/react': - specifier: ^19.1.12 - version: 19.1.12 + specifier: ^19.1.16 + version: 19.1.16 '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.35.0(jiti@2.5.1)) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.6.0)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.35.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.36.0(jiti@2.6.0)) react: specifier: ^19.1.1 version: 19.1.1 @@ -1681,17 +1681,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@eslint-react/eslint-plugin': - specifier: ^1.53.1 - version: 1.53.1(eslint@9.35.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + specifier: ^2.0.3 + version: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) '@vitejs/plugin-react': - specifier: ^5.0.2 - version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.35.0(jiti@2.5.1)) + version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.6.0)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.35.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.36.0(jiti@2.6.0)) packages/solid-pacer: dependencies: @@ -1699,15 +1699,15 @@ importers: specifier: workspace:* version: link:../pacer '@tanstack/solid-store': - specifier: ^0.7.5 - version: 0.7.5(solid-js@1.9.9) + specifier: ^0.7.7 + version: 0.7.7(solid-js@1.9.9) devDependencies: solid-js: specifier: ^1.9.9 version: 1.9.9 vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/solid-pacer-devtools: dependencies: @@ -1720,7 +1720,7 @@ importers: devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.7)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.7)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages: @@ -1731,8 +1731,14 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@asamuzakjp/css-color@2.8.3': - resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} + '@asamuzakjp/css-color@4.0.5': + resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} + + '@asamuzakjp/dom-selector@6.5.6': + resolution: {integrity: sha512-Mj3Hu9ymlsERd7WOsUKNUZnJYL4IZ/I9wVVYgtvOsWYiEFbkQ4G7VRIh2USxTVW4BBDIsLG+gBUgqOqf2Kvqow==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} @@ -1758,8 +1764,8 @@ packages: resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.3': - resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} '@babel/generator@7.26.9': @@ -1888,8 +1894,8 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.3': - resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} '@babel/parser@7.27.0': @@ -1907,6 +1913,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-proposal-private-methods@7.18.6': resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -1960,8 +1971,8 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.3': - resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} '@babel/types@7.26.9': @@ -1980,6 +1991,10 @@ packages: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + '@changesets/apply-release-plan@7.0.13': resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} @@ -2046,49 +2061,46 @@ packages: resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} engines: {node: '>=v18'} - '@csstools/color-helpers@5.0.2': - resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} - '@csstools/css-calc@2.1.2': - resolution: {integrity: sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-color-parser@3.0.8': - resolution: {integrity: sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==} + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + '@csstools/css-syntax-patches-for-csstree@1.0.14': + resolution: {integrity: sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==} engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - '@emnapi/runtime@1.5.0': resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -2242,12 +2254,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2258,39 +2264,36 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@1.53.1': - resolution: {integrity: sha512-qvUC99ewtriJp9quVEOvZ6+RHcsMLfVQ0OhZ4/LupZUDhjW7GiX1dxJsFaxHdJ9rLNLhQyLSPmbAToeqUrSruQ==} - engines: {node: '>=18.18.0'} + '@eslint-react/ast@2.0.4': + resolution: {integrity: sha512-n05swQRVYbeAi0kLXrnrxHmfacptOOlZzpCKSt8L2fobVx+xgMc0w+trRnyrlwcjGnf3IC1ZYT8h/AuqE4OJdw==} + engines: {node: '>=20.19.0'} - '@eslint-react/core@1.53.1': - resolution: {integrity: sha512-8prroos5/Uvvh8Tjl1HHCpq4HWD3hV9tYkm7uXgKA6kqj0jHlgRcQzuO6ZPP7feBcK3uOeug7xrq03BuG8QKCA==} - engines: {node: '>=18.18.0'} + '@eslint-react/core@2.0.4': + resolution: {integrity: sha512-TJDvUdID0fUhXrOlgK992WhEV2qOvmYdjE+bPLVLPFU2eVk0li0L+G9w+KWKDzUdIS2OVjIxmDWdg98eqJOyfQ==} + engines: {node: '>=20.19.0'} - '@eslint-react/eff@1.53.1': - resolution: {integrity: sha512-uq20lPRAmsWRjIZm+mAV/2kZsU2nDqn5IJslxGWe3Vfdw23hoyhEw3S1KKlxbftwbTvsZjKvVP0iw3bZo/NUpg==} - engines: {node: '>=18.18.0'} + '@eslint-react/eff@2.0.4': + resolution: {integrity: sha512-5+cEbTkpjP+sEszzOEF4lW176uSaez7S0t1jqXBQ0RortHVrm9OGPY9zx2ehNozYa2hqvztQa6mgmRMZGeC8xg==} + engines: {node: '>=20.19.0'} - '@eslint-react/eslint-plugin@1.53.1': - resolution: {integrity: sha512-JZ2ciXNCC9CtBBAqYtwWH+Jy/7ZzLw+whei8atP4Fxsbh+Scs30MfEwBzuiEbNw6uF9eZFfPidchpr5RaEhqxg==} - engines: {node: '>=18.18.0'} + '@eslint-react/eslint-plugin@2.0.4': + resolution: {integrity: sha512-jrYOfOW5YYJMQfekn3SctF0QD2WhVrjqrJ1yw+FBEMgL3eie7Jxkm4OerDVGP5+M6kjAaEew89ifNsMJKKNRbQ==} + engines: {node: '>=20.19.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + eslint: ^9.36.0 + typescript: ^5.9.2 - '@eslint-react/kit@1.53.1': - resolution: {integrity: sha512-zOi2le9V4rMrJvQV4OeedGvMGvDT46OyFPOwXKs7m0tQu5vXVJ8qwIPaVQT1n/WIuvOg49OfmAVaHpGxK++xLQ==} - engines: {node: '>=18.18.0'} + '@eslint-react/kit@2.0.4': + resolution: {integrity: sha512-v/kG7X+vfMIfquKZOtXMgfZPp6+tVds97mBpmvQvpivd5XYLM3SrR/cODa0EpvOy6mF0XO4RCkJqjAptaJKKew==} + engines: {node: '>=20.19.0'} - '@eslint-react/shared@1.53.1': - resolution: {integrity: sha512-gomJQmFqQgQVI3Ra4vTMG/s6a4bx3JqeNiTBjxBJt4C9iGaBj458GkP4LJHX7TM6xUzX+fMSKOPX7eV3C/+UCw==} - engines: {node: '>=18.18.0'} + '@eslint-react/shared@2.0.4': + resolution: {integrity: sha512-nO1pO8GBNiFyoSFfplHG/cni0INs70OoKIgZtnKkm73L99h2sxX1S+ZH+f5p2vzltDYVaiJ41xzwMuuf+57ubA==} + engines: {node: '>=20.19.0'} - '@eslint-react/var@1.53.1': - resolution: {integrity: sha512-yzwopvPntcHU7mmDvWzRo1fb8QhjD8eDRRohD11rTV1u7nWO4QbJi0pOyugQakvte1/W11Y0Vr8Of0Ojk/A6zg==} - engines: {node: '>=18.18.0'} + '@eslint-react/var@2.0.4': + resolution: {integrity: sha512-lgw3Hv8vH3dh9e7FacX+IoBdfckvg1j77Nlei4T7kYzj4ziD0wziwQ6foLfKwfdvbgHbw2pBJmkwgs0iSC6w6w==} + engines: {node: '>=20.19.0'} '@eslint/config-array@0.21.0': resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} @@ -2308,8 +2311,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.35.0': - resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} + '@eslint/js@9.36.0': + resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -2375,6 +2378,9 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -2423,8 +2429,8 @@ packages: '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - '@napi-rs/wasm-runtime@1.0.4': - resolution: {integrity: sha512-+ZEtJPp8EF8h4kN6rLQECRor00H7jtDgBVtttIUoxuDkXLiQMaSBqju3LV/IEsMvqVG5pviUvR4jYhIA1xNm8w==} + '@napi-rs/wasm-runtime@1.0.5': + resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2488,98 +2494,98 @@ packages: cpu: [x64] os: [win32] - '@oxc-resolver/binding-android-arm-eabi@11.7.2': - resolution: {integrity: sha512-ITflrd9l5pFPXW10w1gOGJqmyeO6LTO/yiXb3st4Uqr6bcPxCdsXZXAZop3QsSeE8DjjfGXv3Ws+Fb2KmYeCrA==} + '@oxc-resolver/binding-android-arm-eabi@11.8.4': + resolution: {integrity: sha512-6BjMji0TcvQfJ4EoSunOSyu/SiyHKficBD0V3Y0NxF0beaNnnZ7GYEi2lHmRNnRCuIPK8IuVqQ6XizYau+CkKw==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.7.2': - resolution: {integrity: sha512-mjEqCGOZHBpIkjSskW0jkhhVSnaREMmXYW5oDaJKBx86kFSiufEjo8duLTwjRekQ0JlwlEtWiXA759eO4TJ7/w==} + '@oxc-resolver/binding-android-arm64@11.8.4': + resolution: {integrity: sha512-SxF4X6rzCBS9XNPXKZGoIHIABjfGmtQpEgRBDzpDHx5VTuLAUmwLTHXnVBAZoX5bmnhF79RiMElavzFdJ2cA1A==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.7.2': - resolution: {integrity: sha512-sXgElUiNredwvWshUXKL7RbBr6ovSthg3fCTQViY8/jfWKnDRKhUFZiCwABma0CWXC1X2Ij6EkZj40cufRM0bA==} + '@oxc-resolver/binding-darwin-arm64@11.8.4': + resolution: {integrity: sha512-8zWeERrzgscAniE6kh1TQ4E7GJyglYsvdoKrHYLBCbHWD+0/soffiwAYxZuckKEQSc2RXMSPjcu+JTCALaY0Dw==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.7.2': - resolution: {integrity: sha512-EOqYSn1+L5KsShn5lZ303eU9MqjxHNzA7GOHthIcVXfCPtJ+zL89wXh25F+J7mSwiDilp444+rR1hc5Lh+eEWg==} + '@oxc-resolver/binding-darwin-x64@11.8.4': + resolution: {integrity: sha512-BUwggKz8Hi5uEQ0AeVTSun1+sp4lzNcItn+L7fDsHu5Cx0Zueuo10BtVm+dIwmYVVPL5oGYOeD0fS7MKAazKiw==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.7.2': - resolution: {integrity: sha512-Dyvdj++qc5ANVN3JzqJVAlb+IMUtYLPyLaiPFW4+JfvAQFf/iYkpFQv7maeXhhR+GK3rI+PUQXP2HSIiPsClRg==} + '@oxc-resolver/binding-freebsd-x64@11.8.4': + resolution: {integrity: sha512-fPO5TQhnn8gA6yP4o49lc4Gn8KeDwAp9uYd4PlE3Q00JVqU6cY9WecDhYHrWtiFcyoZ8UVBlIxuhRqT/DP4Z4A==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.7.2': - resolution: {integrity: sha512-wUSx/QqggWowrAiyTSci5YUdHvRFpeBbCn2pUwT8XwDoSY2CBuMYR5qzm68ijjzmrv/XyMhl9HxBLy8/UbczWQ==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.8.4': + resolution: {integrity: sha512-QuNbdUaVGiP0W0GrXsvCDZjqeL4lZGU7aXlx/S2tCvyTk3wh6skoiLJgqUf/eeqXfUPnzTfntYqyfolzCAyBYA==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.7.2': - resolution: {integrity: sha512-6w91XhCno0OMqv+UqiuMahasl87Ae8sdSSEFBLF2ic+ySZg+BPpFO5VYUBtdSFJ6gWy7R66JudB5HUJpMbMZlA==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.8.4': + resolution: {integrity: sha512-p/zLMfza8OsC4BDKxqeZ9Qel+4eA/oiMSyKLRkMrTgt6OWQq1d5nHntjfG35Abcw4ev6Q9lRU3NOW5hj0xlUbw==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.7.2': - resolution: {integrity: sha512-S2FQ4cYK7JgmTCy0ay5UIUiRTrQdtKUSaAoC+En9yqaoZwHxcQy9HJ53k5jiAPIJnDR0NgAaOl3q11PUxd58XQ==} + '@oxc-resolver/binding-linux-arm64-gnu@11.8.4': + resolution: {integrity: sha512-bvJF9wWxF1+a5YZATlS5JojpOMC7OsnTatA6sXVHoOb7MIigjledYB5ZMAeRrnWWexRMiEX3YSaA46oSfOzmOg==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-arm64-musl@11.7.2': - resolution: {integrity: sha512-4Dq8KAJZ4RNe7uSISsoP2/O7fc/rZWqxgkch/5eqa0N0gHMrHd9moGzvdV9Hi9oRSnuTmHzRQTqy02S5L3Rc/g==} + '@oxc-resolver/binding-linux-arm64-musl@11.8.4': + resolution: {integrity: sha512-gf4nwGBfu+EFwOn5p7/T7VF4jmIdfodwJS9MRkOBHvuAm3LQgCX7O6d3Y80mm0TV7ZMRD/trfW628rHfd5++vQ==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-ppc64-gnu@11.7.2': - resolution: {integrity: sha512-/w0wJkrtcjvPUNthhmhbG269ySFgxr/DQCYzhBxICKWbiafmNvJTnmYGtEZKoI+wwnukFL8TT7LWbu7hzdp7mw==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.8.4': + resolution: {integrity: sha512-T120R5GIzRd41rYWWKCI6cSYrZjmRQzf3X4xeE1WX396Uabz5DX8KU7RnVHihSK+KDxccCVOFBxcH3ITd+IEpw==} cpu: [ppc64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-gnu@11.7.2': - resolution: {integrity: sha512-sFg880S4QCzBw4yqgPDi48sAxGT1iRW6Gd+C/FW2WYXsDK7dnHgWQ8f6Rp509fHGkPAe+G2ZypjrgPhZP4Btew==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.8.4': + resolution: {integrity: sha512-PVG7SxBFFjAaQ76p9O/0Xt5mTBlziRwpck+6cRNhy/hbWY/hSt8BFfPqw0EDSfnl40Uuh+NPsHFMnaWWyxbQEg==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-musl@11.7.2': - resolution: {integrity: sha512-dypXqqwA67fVVpVUedpmHNEYn5vRe/y6zoAvDTfy7Se8QIbkeRvrp1EOL+Q8tfxMM72tdMxgOrfyvJ5SPRgy9Q==} + '@oxc-resolver/binding-linux-riscv64-musl@11.8.4': + resolution: {integrity: sha512-L0OklUhM2qLGaKvPSyKmwWpoijfc++VJtPyVgz031ShOXyo0WjD0ZGzusyJMsA1a/gdulAmN6CQ/0Sf4LGXEcw==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-s390x-gnu@11.7.2': - resolution: {integrity: sha512-aYDSyViNixd3YpUNcPvfhxAYUiBIPNXfVriTTHEz1ftNg+PglYrOZl5IAssj9uveO6pn2PpNOp/zAezeTtlwmA==} + '@oxc-resolver/binding-linux-s390x-gnu@11.8.4': + resolution: {integrity: sha512-18Ajz5hqO4cRGuoHzLFUsIPod9GIaIRDiXFg2m6CS3NgVdHx7iCZscplYH7KtjdE42M8nGWYMyyq5BOk7QVgPw==} cpu: [s390x] os: [linux] - '@oxc-resolver/binding-linux-x64-gnu@11.7.2': - resolution: {integrity: sha512-/f5rmPZYeD2/d/siP6wvGGOQsupl074qtvPfSteQnWLIM5lWuUDa/53atjYMJHRHFhfQ7b4B3l84TaO8lszAkA==} + '@oxc-resolver/binding-linux-x64-gnu@11.8.4': + resolution: {integrity: sha512-uHvH4RyYBdQ/lFGV9H+R1ScHg6EBnAhE3mnX+u+mO/btnalvg7j80okuHf8Qw0tLQiP5P1sEBoVeE6zviXY9IA==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-linux-x64-musl@11.7.2': - resolution: {integrity: sha512-5x9CGGTZfGWtemVnkNu4ZjqH4X9Oy+Ovm4wSlQTiKgpwCrSDjj0s4tITqiMif0mkWgoErxpdzfD8+hKQkOIgtw==} + '@oxc-resolver/binding-linux-x64-musl@11.8.4': + resolution: {integrity: sha512-X5z44qh5DdJfVhcqXAQFTDFUpcxdpf6DT/lHL5CFcdQGIZxatjc7gFUy05IXPI9xwfq39RValjJBvFovUk9XBw==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-wasm32-wasi@11.7.2': - resolution: {integrity: sha512-UlUxMVChYfi8nmuT9h9I7rQOfini6b40Ud4zYSeel5Qk8GvUT6eysVXAb+AUCJHMnuFCo6jgGqtXYb3yB5CWEQ==} + '@oxc-resolver/binding-wasm32-wasi@11.8.4': + resolution: {integrity: sha512-z3906y+cd8RRhBGNwHRrRAFxnKjXsBeL3+rdQjZpBrUyrhhsaV5iKD/ROx64FNJ9GjL/9mfon8A5xx/McYIqHA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.7.2': - resolution: {integrity: sha512-9S/VfFcl/Tty7TI/ijXgoh05YUzCwP1ApDZxPU8OPFoVTOqnFPQzR8ysR3i/ajQEcEaiCop0aIqXd0xt7wTxNg==} + '@oxc-resolver/binding-win32-arm64-msvc@11.8.4': + resolution: {integrity: sha512-70vXFs74uA3X5iYOkpclbkWlQEF+MI325uAQ+Or2n8HJip2T0SEmuBlyw/sRL2E8zLC4oocb+1g25fmzlDVkmg==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.7.2': - resolution: {integrity: sha512-6ruLagAgDx2CCYWVTJJofee4Lq9Oo9wBmKKZowNPwLgurSTGPO0zQDjPvytQ1PjJuOGisqCVLARBsMwbM20mvA==} + '@oxc-resolver/binding-win32-ia32-msvc@11.8.4': + resolution: {integrity: sha512-SEOUAzTvr+nyMia3nx1dMtD7YUxZwuhQ3QAPnxy21261Lj0yT3JY4EIfwWH54lAWWfMdRSRRMFuGeF/dq7XjEw==} cpu: [ia32] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.7.2': - resolution: {integrity: sha512-gp4xNjGkeeNPxjutTSB1AkYm7JQQof6s7wswzzAKuVZO82L1q4HcOz8QYa5PKPP+r2VHUAJAI+FO/X0pNfWn3w==} + '@oxc-resolver/binding-win32-x64-msvc@11.8.4': + resolution: {integrity: sha512-1gARIQsOPOU7LJ7jvMyPmZEVMapL/PymeG3J7naOdLZDrIZKX6CTvgawJmETYKt+8icP8M6KbBinrVkKVqFd+A==} cpu: [x64] os: [win32] @@ -2587,8 +2593,8 @@ packages: resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} - '@rolldown/pluginutils@1.0.0-beta.34': - resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} + '@rolldown/pluginutils@1.0.0-beta.38': + resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} @@ -2770,8 +2776,8 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@stylistic/eslint-plugin@5.3.1': - resolution: {integrity: sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==} + '@stylistic/eslint-plugin@5.4.0': + resolution: {integrity: sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -2785,32 +2791,32 @@ packages: resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} - '@tanstack/config@0.20.1': - resolution: {integrity: sha512-fvhOAY0FMw8F7O4RLVSje7thdKM0R1Es6k4wPkDG4m518UJijgL9ysZO8L+YmeEeldK81jZtMdRcGUOc0goa2g==} + '@tanstack/config@0.20.3': + resolution: {integrity: sha512-RDz7vI1FSkocPda882nhEQoshU5F2bB5hTV/gXtB6krm/LTqMpK18ngvKtI1gbSd2RbsKCFtpJxqag3lvPgzgg==} engines: {node: '>=18'} '@tanstack/devtools-event-bus@0.3.2': resolution: {integrity: sha512-yJT2As/drc+Epu0nsqCsJaKaLcaNGufiNxSlp/+/oeTD0jsBxF9/PJBfh66XVpYXkKr97b8689mSu7QMef0Rrw==} engines: {node: '>=18'} - '@tanstack/devtools-event-client@0.2.5': - resolution: {integrity: sha512-iVdqw879KETXyyPHc3gQR5Ld0GjlPLk7bKenBUhzr3+z1FiQZvsbfgYfRRokTSPcgwANAV7aA2Uv05nx5xWT8A==} + '@tanstack/devtools-event-client@0.3.2': + resolution: {integrity: sha512-gkvph/YMCFUfAca75EsJBJnhbKitDGix7vdEcT/3lAV+eyGSv+uECYG43apVQN4yLJKnV6mzcNvGzOhDhb72gg==} engines: {node: '>=18'} - '@tanstack/devtools-ui@0.3.4': - resolution: {integrity: sha512-W3FnFhot91c30I/DyZUKSCd5gan5FRe35EvxUrZTxMN3qQ4kOtZSmYi8N8cAP4rmAp54ivv6pvT3LXlpjEeE0w==} + '@tanstack/devtools-ui@0.3.5': + resolution: {integrity: sha512-DU8OfLntngnph+Tb7ivQvh4F4w+rDu6r01fXlhjq/Nmgdr0gtsOox4kdmyq5rCs+C6aPgP3M7+BE+fv4dN+VvA==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/devtools@0.6.11': - resolution: {integrity: sha512-H0uxsVsZabx/iyVxSp/6JzP4TbuYpj5kbZXojHZYDzuw1wP5YmzSQvIHm+6ThrFEWKmLpmNdzX6cXY/lJlXKMw==} + '@tanstack/devtools@0.6.14': + resolution: {integrity: sha512-dOtHoeLjjcHeNscu+ZEf89EFboQsy0ggb6pf8Sha59qBUeQbjUsaAvwP8Ogwg89oJxFQbTP7DKYNBNw5CxlNEA==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/eslint-config@0.3.1': - resolution: {integrity: sha512-t9A1epZWk0iUmLQxuLfo0MaBVmvtrpg3E7Y9N6+8InVlqdYOHaGLRqjwZ/nbzXkScqobei2nNXtjBZmkioJuhQ==} + '@tanstack/eslint-config@0.3.2': + resolution: {integrity: sha512-2g+PuGR3GuvvCiR3xZs+IMqAvnYU9bvH+jRml0BFBSxHBj22xFCTNvJWhvgj7uICFF9IchDkFUto91xDPMu5cg==} engines: {node: '>=18'} '@tanstack/pacer@0.13.0': @@ -2821,18 +2827,18 @@ packages: resolution: {integrity: sha512-XUewm2+D0K84ZSuWm1oMHfqw/flmO7IzCc+316php/XChgbMe30DStp1cF2Uc4IV0cI0G4hDq2RX3+NTxTIvWg==} engines: {node: '>=18'} - '@tanstack/publish-config@0.2.0': - resolution: {integrity: sha512-RC0yRBFJvGuR58tKQUIkMXVEiATXgESIc+3/NTqoCC7D2YOF4fZGmHGYIanFEPQH7EGfQ5+Bwi+H6BOtKnymtw==} + '@tanstack/publish-config@0.2.1': + resolution: {integrity: sha512-URVXmXwlZXL75AFyvyOORef1tv2f16dEaFntwLYnBHoKLQMxyWYRzQrnXooxO1xf+GidJuDSZSC6Rc9UX1aK7g==} engines: {node: '>=18'} - '@tanstack/query-core@5.87.4': - resolution: {integrity: sha512-uNsg6zMxraEPDVO2Bn+F3/ctHi+Zsk+MMpcN8h6P7ozqD088F6mFY5TfGM7zuyIrL7HKpDyu6QHfLWiDxh3cuw==} + '@tanstack/query-core@5.90.2': + resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} - '@tanstack/query-devtools@5.87.3': - resolution: {integrity: sha512-LkzxzSr2HS1ALHTgDmJH5eGAVsSQiuwz//VhFW5OqNk0OQ+Fsqba0Tsf+NzWRtXYvpgUqwQr4b2zdFZwxHcGvg==} + '@tanstack/query-devtools@5.90.1': + resolution: {integrity: sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==} - '@tanstack/react-devtools@0.6.7': - resolution: {integrity: sha512-XgBa6USm0xx3rpHE8KOaJMwEv4Pa6WEkHx7uA8mWNknY/i6SzX6o2FlrwbyJ/xeIRTTq3KzIM+APWXQiEUy3wg==} + '@tanstack/react-devtools@0.7.0': + resolution: {integrity: sha512-HJH+oNBYQotgsKWAQqvkY8KnfQbbZptHbrkPGVaIwj393vVFGT1BuXMYy+rlmOYxczyerb90ltRFgsQyUtJTuw==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -2854,14 +2860,14 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-query-devtools@5.87.4': - resolution: {integrity: sha512-JYcnVJBBW1DCPyNGM0S2CyrLpe6KFiL2gpYd/k9tAp62Du7+Y27zkzd+dKFyxpFadYaTxsx4kUA7YvnkMLVUoQ==} + '@tanstack/react-query-devtools@5.90.2': + resolution: {integrity: sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ==} peerDependencies: - '@tanstack/react-query': ^5.87.4 + '@tanstack/react-query': ^5.90.2 react: ^18 || ^19 - '@tanstack/react-query@5.87.4': - resolution: {integrity: sha512-T5GT/1ZaNsUXf5I3RhcYuT17I4CPlbZgyLxc/ZGv7ciS6esytlbjb3DgUFO6c8JWYMDpdjSWInyGZUErgzqhcA==} + '@tanstack/react-query@5.90.2': + resolution: {integrity: sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==} peerDependencies: react: ^18 || ^19 @@ -2871,35 +2877,47 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/solid-devtools@0.6.7': - resolution: {integrity: sha512-ca03Rp/LQQlU5KP2WUWCN4Vnys9mLyMbeYrHwO4YqHMcjQ3BdrZcdetq3Y3dBhlUQAeQcU86Ewzl2tFJbZYLHQ==} + '@tanstack/react-store@0.7.7': + resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/solid-devtools@0.7.0': + resolution: {integrity: sha512-BOwIadgyg0ISx7awjbCQEDwelMExZ2vuLQ6NO2Z7H2DSPPBultIBEWPK//cZhvdVrDaTmsEK+AvMDWI4SsSQ8w==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/solid-store@0.7.5': - resolution: {integrity: sha512-w9c9xsSBJiFYhz1CaOGUEY2eJQg4vgshy0pRpULgrAKl+6TAPblYtk2wHmOJb6jcCxOiIRwO3BGRYot3oH2teg==} + '@tanstack/solid-store@0.7.7': + resolution: {integrity: sha512-DnEZbqQ+pg68BguHz17VFukfp+6JaTk8nE2MhdVliU8bhsOFlTMsmVHp/4gMoQ1AkmAOMFiBsSliROCaaeJzvg==} peerDependencies: solid-js: ^1.6.0 '@tanstack/store@0.7.5': resolution: {integrity: sha512-qd/OjkjaFRKqKU4Yjipaen/EOB9MyEg6Wr9fW103RBPACf1ZcKhbhcu2S5mj5IgdPib6xFIgCUti/mKVkl+fRw==} - '@tanstack/typedoc-config@0.2.0': - resolution: {integrity: sha512-1ak0ZirlLRxd3dNNOFnMoYORBeC83nK4C+OiXpE0dxsO8ZVrBqCtNCKr8SG+W9zICXcWGiFu9qYLsgNKTayOqw==} + '@tanstack/store@0.7.7': + resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} + + '@tanstack/typedoc-config@0.2.1': + resolution: {integrity: sha512-3miLBNiyWX54bQKBNnh7Fj6otWX8ZDiU6/ffOsNnikwBdKjFkA7ddrBtC5/JQkLCE6CBIqcJvtNIwI+DZu4y1Q==} engines: {node: '>=18'} - '@tanstack/vite-config@0.2.0': - resolution: {integrity: sha512-WpL1C9iR5/U7g3GpvHIssN5QvKnDnWhW05BQhaD6bAqoPCkQyBepxUF8ZRO4IGZRGVAZeMVqTbUA05BAQH/88g==} + '@tanstack/vite-config@0.3.0': + resolution: {integrity: sha512-p1HuuSD3OUoVMYHfjkzUJqVBUurp1BDrGwT3302GRpSjpBHiJvZex3+NzRIXdG9NdjeJ0mT7DYpNMoii7GVROQ==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.8.0': - resolution: {integrity: sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==} + '@testing-library/jest-dom@6.9.0': + resolution: {integrity: sha512-QHdxYMJ0YPGKYofMc6zYvo7LOViVhdc6nPg/OtM2cf9MQrwEcTxFCs7d/GJ5eSyPkHzOiBkc/KfLdFJBHzldtQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -2939,8 +2957,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.3.1': - resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==} + '@types/node@24.6.0': + resolution: {integrity: sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==} '@types/react-dom@19.1.7': resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} @@ -2952,8 +2970,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.12': - resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} + '@types/react@19.1.16': + resolution: {integrity: sha512-WBM/nDbEZmDUORKnh5i1bTnAz6vTohUf9b8esSMu+b24+srbaxa04UbJgWx78CVfNXA20sNu0odEIluZDFdCog==} '@types/react@19.1.9': resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} @@ -2961,67 +2979,67 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.43.0': - resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==} + '@typescript-eslint/eslint-plugin@8.45.0': + resolution: {integrity: sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.43.0 + '@typescript-eslint/parser': ^8.45.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.43.0': - resolution: {integrity: sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==} + '@typescript-eslint/parser@8.45.0': + resolution: {integrity: sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.43.0': - resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} + '@typescript-eslint/project-service@8.45.0': + resolution: {integrity: sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.43.0': - resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==} + '@typescript-eslint/scope-manager@8.45.0': + resolution: {integrity: sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.43.0': - resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} + '@typescript-eslint/tsconfig-utils@8.45.0': + resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.43.0': - resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==} + '@typescript-eslint/type-utils@8.45.0': + resolution: {integrity: sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.39.1': - resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.43.0': resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.43.0': - resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} + '@typescript-eslint/types@8.45.0': + resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.45.0': + resolution: {integrity: sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.43.0': - resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==} + '@typescript-eslint/utils@8.45.0': + resolution: {integrity: sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.43.0': - resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} + '@typescript-eslint/visitor-keys@8.45.0': + resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -3119,8 +3137,8 @@ packages: cpu: [x64] os: [win32] - '@vitejs/plugin-react@5.0.2': - resolution: {integrity: sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw==} + '@vitejs/plugin-react@5.0.4': + resolution: {integrity: sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3304,6 +3322,9 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + birecord@0.1.1: resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} @@ -3453,6 +3474,10 @@ packages: css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -3460,16 +3485,16 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssstyle@4.2.1: - resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} - engines: {node: '>=18'} + cssstyle@5.3.1: + resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==} + engines: {node: '>=20'} csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + data-urls@6.0.0: + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} + engines: {node: '>=20'} dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -3595,6 +3620,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -3668,8 +3697,8 @@ packages: eslint-import-resolver-node: optional: true - eslint-plugin-n@17.21.3: - resolution: {integrity: sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw==} + eslint-plugin-n@17.23.1: + resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -3680,35 +3709,26 @@ packages: peerDependencies: eslint: '>=7' - eslint-plugin-react-debug@1.53.1: - resolution: {integrity: sha512-WNOiQ6jhodJE88VjBU/IVDM+2Zr9gKHlBFDUSA3fQ0dMB5RiBVj5wMtxbxRuipK/GqNJbteqHcZoYEod7nfddg==} - engines: {node: '>=18.18.0'} + eslint-plugin-react-debug@2.0.4: + resolution: {integrity: sha512-0H4ELREV7fr1eA4be7QQZHiR/rzxhV3iquR/HQSQy5Ab3x7Bv7fTdA3dhWOlF9m/XTtfeNKz5iD66u9XFTGQzA==} + engines: {node: '>=20.19.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + eslint: ^9.36.0 + typescript: ^5.9.2 - eslint-plugin-react-dom@1.53.1: - resolution: {integrity: sha512-UYrWJ2cS4HpJ1A5XBuf1HfMpPoLdfGil+27g/ldXfGemb4IXqlxHt4ANLyC8l2CWcE3SXGJW7mTslL34MG0qTQ==} - engines: {node: '>=18.18.0'} + eslint-plugin-react-dom@2.0.4: + resolution: {integrity: sha512-YQ7BAaFPEvh+sjVJp7STeCk5Uz6cKTVOXFAiOKYKX1FJ34xHhma1csfkDwIgEyr37mglS6wn/VRkS5HGx2/cHw==} + engines: {node: '>=20.19.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + eslint: ^9.36.0 + typescript: ^5.9.2 - eslint-plugin-react-hooks-extra@1.53.1: - resolution: {integrity: sha512-fshTnMWNn9NjFLIuy7HzkRgGK29vKv4ZBO9UMr+kltVAfKLMeXXP6021qVKk66i/XhQjbktiS+vQsu1Rd3ZKvg==} - engines: {node: '>=18.18.0'} + eslint-plugin-react-hooks-extra@2.0.4: + resolution: {integrity: sha512-K4XEvsRD1NWj4phthkOMgBpRnexyP6f1+GLBv0i+Bo2sxS7qP/y/UgI5m8ZI6xCuh0H+MqWrUq1a8eku3hdb7g==} + engines: {node: '>=20.0.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + eslint: ^9.36.0 + typescript: ^5.9.2 eslint-plugin-react-hooks@5.2.0: resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} @@ -3716,38 +3736,26 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@1.53.1: - resolution: {integrity: sha512-rvZ/B/CSVF8d34HQ4qIt90LRuxotVx+KUf3i1OMXAyhsagEFMRe4gAlPJiRufZ+h9lnuu279bEdd+NINsXOteA==} - engines: {node: '>=18.18.0'} + eslint-plugin-react-naming-convention@2.0.4: + resolution: {integrity: sha512-/7cAWZyW/M5HH4WolPb9CwCf4HxribmQQ/tBrg28hexVx8EPDZO+PbONyESC6DvF2Y1P2N8lYo657h+y0tJhTg==} + engines: {node: '>=20.19.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + eslint: ^9.36.0 + typescript: ^5.9.2 - eslint-plugin-react-web-api@1.53.1: - resolution: {integrity: sha512-INVZ3Cbl9/b+sizyb43ChzEPXXYuDsBGU9BIg7OVTNPyDPloCXdI+dQFAcSlDocZhPrLxhPV3eT6+gXbygzYXg==} - engines: {node: '>=18.18.0'} + eslint-plugin-react-web-api@2.0.4: + resolution: {integrity: sha512-U4ql2C+AQVnZeQ+nxBb3A8NA58W4tx4Fdc+cEro5/QMJKuiXltNUnhAJ5N4ttS6K0D/Iz1nHtkyULuWXFq+p1w==} + engines: {node: '>=20.19.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + eslint: ^9.36.0 + typescript: ^5.9.2 - eslint-plugin-react-x@1.53.1: - resolution: {integrity: sha512-MwMNnVwiPem0U6SlejDF/ddA4h/lmP6imL1RDZ2m3pUBrcdcOwOx0gyiRVTA3ENnhRlWfHljHf5y7m8qDSxMEg==} - engines: {node: '>=18.18.0'} + eslint-plugin-react-x@2.0.4: + resolution: {integrity: sha512-9YqZGzu5lvevtzQjkaQZut2dMvOl9bjNgn+LUcwBdhqWkvoD7dFC6I0p6jgIZdA4ql8CGoYBlcYqve55wddOWw==} + engines: {node: '>=20.19.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - ts-api-utils: ^2.1.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - ts-api-utils: - optional: true - typescript: - optional: true + eslint: ^9.36.0 + typescript: ^5.9.2 eslint-plugin-unused-imports@4.2.0: resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} @@ -3770,8 +3778,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.35.0: - resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} + eslint@9.36.0: + resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3970,8 +3978,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} globby@11.1.0: @@ -4161,8 +4169,8 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.0: + resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} hasBin: true jju@1.4.0: @@ -4182,9 +4190,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@26.1.0: - resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} - engines: {node: '>=18'} + jsdom@27.0.0: + resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} + engines: {node: '>=20'} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -4219,8 +4227,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} @@ -4229,13 +4237,13 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - knip@5.63.1: - resolution: {integrity: sha512-wSznedUAzcU4o9e0O2WPqDnP7Jttu8cesq/R23eregRY8QYQ9NLJ3aGt9fadJfRzPBoU4tRyutwVQu6chhGDlA==} + knip@5.64.1: + resolution: {integrity: sha512-80XnLsyeXuyxj1F4+NBtQFHxaRH0xWRw8EKwfQ6EkVZZ0bSz/kqqan08k/Qg8ajWsFPhFq+0S2RbLCBGIQtuOg==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: '@types/node': '>=18' - typescript: '>=5.0.4' + typescript: '>=5.0.4 <7' kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -4289,8 +4297,9 @@ packages: loupe@3.1.4: resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4321,6 +4330,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -4429,11 +4441,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.18: - resolution: {integrity: sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==} - - nx@21.5.2: - resolution: {integrity: sha512-hvq3W6mWsNuXzO1VWXpVcbGuF3e4cx0PyPavy8RgZUinbnh3Gk+f+2DGXyjKEyAG3Ql0Nl3V4RJERZzXEVl7EA==} + nx@21.6.2: + resolution: {integrity: sha512-bFZgAsB838vn9kk1vI6a1A9sStKyOA7Q9Ifsx7fYPth3D0GafHKu7X2/YbsC4h1TpmuejkJCPWUw2WtCOQy6IQ==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -4466,8 +4475,8 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - oxc-resolver@11.7.2: - resolution: {integrity: sha512-abgiTgtJ7FLVPdg5x+rcfoSqz5kpgS/j1Rk/BFNVlLbpAI56VXCj/MM7NyfQb+aVlQDBum0omdz4uFrOYEjNIw==} + oxc-resolver@11.8.4: + resolution: {integrity: sha512-qpimS3tHHEf+kgESMAme+q+rj7aCzMya00u9YdKOKyX2o7q4lozjPo6d7ZTTi979KHEcVOPWdNTueAKdeNq72w==} p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} @@ -4500,8 +4509,8 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - package-manager-detector@1.1.0: - resolution: {integrity: sha512-Y8f9qUlBzW8qauJjd/eu6jlpJZsuPJm2ZAV0cDVd420o4EdpH5RPdoCv+60/TdJflGatr4sDfpAL6ArWZbM5tA==} + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -4516,6 +4525,9 @@ packages: parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -4599,8 +4611,8 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - publint@0.3.12: - resolution: {integrity: sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w==} + publint@0.3.13: + resolution: {integrity: sha512-NC+lph09+BRO9LJgKlIy3WQXyu6/6WDQ0dCA60KALUwdKVf3PfGuC6fY8I+oKB/5kEPh50aOSUz+6yWy1n4EfA==} engines: {node: '>=18'} hasBin: true @@ -4963,11 +4975,11 @@ packages: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} - tldts-core@6.1.83: - resolution: {integrity: sha512-I2wb9OJc6rXyh9d4aInhSNWChNI+ra6qDnFEGEwe9OoA68lE4Temw29bOkf1Uvwt8VZS079t1BFZdXVBmmB4dw==} + tldts-core@7.0.16: + resolution: {integrity: sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==} - tldts@6.1.83: - resolution: {integrity: sha512-FHxxNJJ0WNsEBPHyC1oesQb3rRoxpuho/z2g3zIIAhw1WHJeQsUzK1jYK8TI1/iClaa4fS3Z2TCA9mtxXsENSg==} + tldts@7.0.16: + resolution: {integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==} hasBin: true tmp@0.2.3: @@ -4978,16 +4990,16 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@5.1.2: - resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -5051,8 +5063,8 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.43.0: - resolution: {integrity: sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==} + typescript-eslint@8.45.0: + resolution: {integrity: sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5074,8 +5086,8 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.13.0: + resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} undici@6.21.3: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} @@ -5150,8 +5162,8 @@ packages: vite: optional: true - vite@7.1.5: - resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} + vite@7.1.7: + resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -5249,9 +5261,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + webidl-conversions@8.0.0: + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + engines: {node: '>=20'} whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} @@ -5261,9 +5273,9 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.1.1: - resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} - engines: {node: '>=18'} + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -5289,18 +5301,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -5359,11 +5359,8 @@ packages: zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} - zod@3.25.72: - resolution: {integrity: sha512-Cl+fe4dNL4XumOBNBsr0lHfA80PQiZXHI4xEMTEr8gt6aGz92t3lBA32e71j9+JeF/VAYvdfBnuwJs+BMx/BrA==} - - zod@4.1.8: - resolution: {integrity: sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==} + zod@4.1.11: + resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} snapshots: @@ -5374,13 +5371,23 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@asamuzakjp/css-color@2.8.3': + '@asamuzakjp/css-color@4.0.5': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.2 + + '@asamuzakjp/dom-selector@6.5.6': dependencies: - '@csstools/css-calc': 2.1.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-color-parser': 3.0.8(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 - lru-cache: 10.4.3 + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.2 + + '@asamuzakjp/nwsapi@2.3.9': {} '@babel/code-frame@7.26.2': dependencies: @@ -5438,18 +5445,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.28.3': + '@babel/core@7.28.4': dependencies: - '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) - '@babel/helpers': 7.28.3 - '@babel/parser': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -5484,8 +5491,8 @@ snapshots: '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 @@ -5568,12 +5575,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.3 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -5623,10 +5630,10 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.0 - '@babel/helpers@7.28.3': + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@babel/parser@7.27.0': dependencies: @@ -5640,6 +5647,10 @@ snapshots: dependencies: '@babel/types': 7.28.2 + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -5653,14 +5664,14 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/runtime@7.26.10': @@ -5721,14 +5732,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.28.3': + '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.3 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -5753,6 +5764,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@changesets/apply-release-plan@7.0.13': dependencies: '@changesets/config': 3.1.1 @@ -5782,7 +5798,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@24.3.1)': + '@changesets/cli@2.29.7(@types/node@24.6.0)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -5798,7 +5814,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.1(@types/node@24.3.1) + '@inquirer/external-editor': 1.0.1(@types/node@24.6.0) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -5915,54 +5931,42 @@ snapshots: '@types/conventional-commits-parser': 5.0.1 chalk: 5.4.1 - '@csstools/color-helpers@5.0.2': {} + '@csstools/color-helpers@5.1.0': {} - '@csstools/css-calc@2.1.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-color-parser@3.0.8(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/color-helpers': 5.0.2 - '@csstools/css-calc': 2.1.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-tokenizer@3.0.3': {} - - '@emnapi/core@1.4.3': + '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)': dependencies: - '@emnapi/wasi-threads': 1.0.2 - tslib: 2.8.1 + postcss: 8.5.6 + + '@csstools/css-tokenizer@3.0.4': {} '@emnapi/core@1.5.0': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.4.3': - dependencies: - tslib: 2.8.1 '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.0.2': - dependencies: - tslib: 2.8.1 '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 - optional: true '@esbuild/aix-ppc64@0.25.0': optional: true @@ -6039,42 +6043,35 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.35.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.6.0))': dependencies: - eslint: 9.35.0(jiti@2.5.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.5.1))': - dependencies: - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint-react/ast@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@eslint-react/ast@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint-react/eff': 1.53.1 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) string-ts: 2.2.1 - ts-pattern: 5.8.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@eslint-react/core@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) birecord: 0.1.1 ts-pattern: 5.8.0 transitivePeerDependencies: @@ -6082,61 +6079,57 @@ snapshots: - supports-color - typescript - '@eslint-react/eff@1.53.1': {} - - '@eslint-react/eslint-plugin@1.53.1(eslint@9.35.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2)': - dependencies: - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) - eslint-plugin-react-debug: 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-react-dom: 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-react-hooks-extra: 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-react-naming-convention: 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-react-web-api: 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint-plugin-react-x: 1.53.1(eslint@9.35.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) - optionalDependencies: + '@eslint-react/eff@2.0.4': {} + + '@eslint-react/eslint-plugin@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + dependencies: + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) + eslint-plugin-react-debug: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-dom: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-hooks-extra: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-naming-convention: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-web-api: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-x: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - - ts-api-utils - '@eslint-react/kit@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@eslint-react/kit@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint-react/eff': 1.53.1 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - ts-pattern: 5.8.0 - zod: 4.1.8 + '@eslint-react/eff': 2.0.4 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@eslint-react/shared@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) ts-pattern: 5.8.0 - zod: 4.1.8 + zod: 4.1.11 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@eslint-react/var@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - string-ts: 2.2.1 + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) ts-pattern: 5.8.0 transitivePeerDependencies: - eslint @@ -6171,7 +6164,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.35.0': {} + '@eslint/js@9.36.0': {} '@eslint/object-schema@2.1.6': {} @@ -6201,12 +6194,12 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} - '@inquirer/external-editor@1.0.1(@types/node@24.3.1)': + '@inquirer/external-editor@1.0.1(@types/node@24.6.0)': dependencies: chardet: 2.1.0 iconv-lite: 0.6.3 optionalDependencies: - '@types/node': 24.3.1 + '@types/node': 24.6.0 '@jest/diff-sequences@30.0.1': {} @@ -6227,6 +6220,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -6267,23 +6265,23 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@microsoft/api-extractor-model@7.29.6(@types/node@24.3.1)': + '@microsoft/api-extractor-model@7.29.6(@types/node@24.6.0)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@24.3.1) + '@rushstack/node-core-library': 5.7.0(@types/node@24.6.0) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@24.3.1)': + '@microsoft/api-extractor@7.47.7(@types/node@24.6.0)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@24.3.1) + '@microsoft/api-extractor-model': 7.29.6(@types/node@24.6.0) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@24.3.1) + '@rushstack/node-core-library': 5.7.0(@types/node@24.6.0) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@24.3.1) - '@rushstack/ts-command-line': 4.22.6(@types/node@24.3.1) + '@rushstack/terminal': 0.14.0(@types/node@24.6.0) + '@rushstack/ts-command-line': 4.22.6(@types/node@24.6.0) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -6304,22 +6302,22 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.10.0 optional: true '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.9.0 - '@napi-rs/wasm-runtime@1.0.4': + '@napi-rs/wasm-runtime@1.0.5': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.0 + '@tybys/wasm-util': 0.10.1 optional: true '@nodelib/fs.scandir@2.1.5': @@ -6364,68 +6362,68 @@ snapshots: '@nx/nx-win32-x64-msvc@21.5.2': optional: true - '@oxc-resolver/binding-android-arm-eabi@11.7.2': + '@oxc-resolver/binding-android-arm-eabi@11.8.4': optional: true - '@oxc-resolver/binding-android-arm64@11.7.2': + '@oxc-resolver/binding-android-arm64@11.8.4': optional: true - '@oxc-resolver/binding-darwin-arm64@11.7.2': + '@oxc-resolver/binding-darwin-arm64@11.8.4': optional: true - '@oxc-resolver/binding-darwin-x64@11.7.2': + '@oxc-resolver/binding-darwin-x64@11.8.4': optional: true - '@oxc-resolver/binding-freebsd-x64@11.7.2': + '@oxc-resolver/binding-freebsd-x64@11.8.4': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.7.2': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.8.4': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.7.2': + '@oxc-resolver/binding-linux-arm-musleabihf@11.8.4': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.7.2': + '@oxc-resolver/binding-linux-arm64-gnu@11.8.4': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.7.2': + '@oxc-resolver/binding-linux-arm64-musl@11.8.4': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.7.2': + '@oxc-resolver/binding-linux-ppc64-gnu@11.8.4': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.7.2': + '@oxc-resolver/binding-linux-riscv64-gnu@11.8.4': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.7.2': + '@oxc-resolver/binding-linux-riscv64-musl@11.8.4': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.7.2': + '@oxc-resolver/binding-linux-s390x-gnu@11.8.4': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.7.2': + '@oxc-resolver/binding-linux-x64-gnu@11.8.4': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.7.2': + '@oxc-resolver/binding-linux-x64-musl@11.8.4': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.7.2': + '@oxc-resolver/binding-wasm32-wasi@11.8.4': dependencies: - '@napi-rs/wasm-runtime': 1.0.4 + '@napi-rs/wasm-runtime': 1.0.5 optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.7.2': + '@oxc-resolver/binding-win32-arm64-msvc@11.8.4': optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.7.2': + '@oxc-resolver/binding-win32-ia32-msvc@11.8.4': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.7.2': + '@oxc-resolver/binding-win32-x64-msvc@11.8.4': optional: true '@publint/pack@0.1.2': {} - '@rolldown/pluginutils@1.0.0-beta.34': {} + '@rolldown/pluginutils@1.0.0-beta.38': {} '@rollup/pluginutils@5.1.4(rollup@4.44.1)': dependencies: @@ -6495,7 +6493,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true - '@rushstack/node-core-library@5.7.0(@types/node@24.3.1)': + '@rushstack/node-core-library@5.7.0(@types/node@24.6.0)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -6506,23 +6504,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 24.3.1 + '@types/node': 24.6.0 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@24.3.1)': + '@rushstack/terminal@0.14.0(@types/node@24.6.0)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@24.3.1) + '@rushstack/node-core-library': 5.7.0(@types/node@24.6.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.3.1 + '@types/node': 24.6.0 - '@rushstack/ts-command-line@4.22.6(@types/node@24.3.1)': + '@rushstack/ts-command-line@4.22.6(@types/node@24.6.0)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@24.3.1) + '@rushstack/terminal': 0.14.0(@types/node@24.6.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -6580,11 +6578,11 @@ snapshots: dependencies: solid-js: 1.9.9 - '@stylistic/eslint-plugin@5.3.1(eslint@9.35.0(jiti@2.5.1))': + '@stylistic/eslint-plugin@5.4.0(eslint@9.36.0(jiti@2.6.0))': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.35.0(jiti@2.5.1)) - '@typescript-eslint/types': 8.43.0 - eslint: 9.35.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + '@typescript-eslint/types': 8.45.0 + eslint: 9.36.0(jiti@2.6.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -6601,12 +6599,12 @@ snapshots: transitivePeerDependencies: - encoding - '@tanstack/config@0.20.1(@types/node@24.3.1)(@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/config@0.20.3(@types/node@24.6.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: - '@tanstack/eslint-config': 0.3.1(@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@tanstack/publish-config': 0.2.0 - '@tanstack/typedoc-config': 0.2.0(typescript@5.9.2) - '@tanstack/vite-config': 0.2.0(@types/node@24.3.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@tanstack/publish-config': 0.2.1 + '@tanstack/typedoc-config': 0.2.1(typescript@5.9.2) + '@tanstack/vite-config': 0.3.0(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -6624,9 +6622,9 @@ snapshots: - bufferutil - utf-8-validate - '@tanstack/devtools-event-client@0.2.5': {} + '@tanstack/devtools-event-client@0.3.2': {} - '@tanstack/devtools-ui@0.3.4(csstype@3.1.3)(solid-js@1.9.9)': + '@tanstack/devtools-ui@0.3.5(csstype@3.1.3)(solid-js@1.9.9)': dependencies: clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) @@ -6634,11 +6632,11 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools@0.6.11(csstype@3.1.3)(solid-js@1.9.9)': + '@tanstack/devtools@0.6.14(csstype@3.1.3)(solid-js@1.9.9)': dependencies: '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.9) '@tanstack/devtools-event-bus': 0.3.2 - '@tanstack/devtools-ui': 0.3.4(csstype@3.1.3)(solid-js@1.9.9) + '@tanstack/devtools-ui': 0.3.5(csstype@3.1.3)(solid-js@1.9.9) clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.9 @@ -6647,15 +6645,15 @@ snapshots: - csstype - utf-8-validate - '@tanstack/eslint-config@0.3.1(@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint/js': 9.35.0 - '@stylistic/eslint-plugin': 5.3.1(eslint@9.35.0(jiti@2.5.1)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1)) - eslint-plugin-n: 17.21.3(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - globals: 16.3.0 - typescript-eslint: 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - vue-eslint-parser: 10.2.0(eslint@9.35.0(jiti@2.5.1)) + '@eslint/js': 9.36.0 + '@stylistic/eslint-plugin': 5.4.0(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-n: 17.23.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + globals: 16.4.0 + typescript-eslint: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + vue-eslint-parser: 10.2.0(eslint@9.36.0(jiti@2.6.0)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint @@ -6665,28 +6663,28 @@ snapshots: '@tanstack/pacer@0.13.0': dependencies: - '@tanstack/store': 0.7.5 + '@tanstack/store': 0.7.7 '@tanstack/persister@0.1.1': {} - '@tanstack/publish-config@0.2.0': + '@tanstack/publish-config@0.2.1': dependencies: '@commitlint/parse': 19.8.1 - jsonfile: 6.1.0 + jsonfile: 6.2.0 semver: 7.7.2 simple-git: 3.28.0 transitivePeerDependencies: - supports-color - '@tanstack/query-core@5.87.4': {} + '@tanstack/query-core@5.90.2': {} - '@tanstack/query-devtools@5.87.3': {} + '@tanstack/query-devtools@5.90.1': {} - '@tanstack/react-devtools@0.6.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)': + '@tanstack/react-devtools@0.7.0(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)': dependencies: - '@tanstack/devtools': 0.6.11(csstype@3.1.3)(solid-js@1.9.9) - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@tanstack/devtools': 0.6.14(csstype@3.1.3)(solid-js@1.9.9) + '@types/react': 19.1.16 + '@types/react-dom': 19.1.9(@types/react@19.1.16) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -6708,48 +6706,50 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@tanstack/react-query-devtools@5.87.4(@tanstack/react-query@5.87.4(react@19.1.1))(react@19.1.1)': + '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.2(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/query-devtools': 5.87.3 - '@tanstack/react-query': 5.87.4(react@19.1.1) + '@tanstack/query-devtools': 5.90.1 + '@tanstack/react-query': 5.90.2(react@19.1.1) react: 19.1.1 - '@tanstack/react-query@5.87.4(react@19.1.1)': + '@tanstack/react-query@5.90.2(react@19.1.1)': dependencies: - '@tanstack/query-core': 5.87.4 + '@tanstack/query-core': 5.90.2 react: 19.1.1 - '@tanstack/react-store@0.7.5(react-dom@19.1.0(react@19.1.1))(react@19.1.1)': + '@tanstack/react-store@0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/store': 0.7.5 react: 19.1.1 - react-dom: 19.1.0(react@19.1.1) + react-dom: 19.1.1(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) - '@tanstack/react-store@0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-store@0.7.7(react-dom@19.1.0(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/store': 0.7.5 + '@tanstack/store': 0.7.7 react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) + react-dom: 19.1.0(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) - '@tanstack/solid-devtools@0.6.7(csstype@3.1.3)(solid-js@1.9.9)': + '@tanstack/solid-devtools@0.7.0(csstype@3.1.3)(solid-js@1.9.9)': dependencies: - '@tanstack/devtools': 0.6.11(csstype@3.1.3)(solid-js@1.9.9) + '@tanstack/devtools': 0.6.14(csstype@3.1.3)(solid-js@1.9.9) solid-js: 1.9.9 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/solid-store@0.7.5(solid-js@1.9.9)': + '@tanstack/solid-store@0.7.7(solid-js@1.9.9)': dependencies: - '@tanstack/store': 0.7.5 + '@tanstack/store': 0.7.7 solid-js: 1.9.9 '@tanstack/store@0.7.5': {} - '@tanstack/typedoc-config@0.2.0(typescript@5.9.2)': + '@tanstack/store@0.7.7': {} + + '@tanstack/typedoc-config@0.2.1(typescript@5.9.2)': dependencies: typedoc: 0.27.9(typescript@5.9.2) typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2))) @@ -6757,12 +6757,12 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.2.0(@types/node@24.3.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/vite-config@0.3.0(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.44.1) - vite-plugin-dts: 4.2.3(@types/node@24.3.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) - vite-plugin-externalize-deps: 0.9.0(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-dts: 4.2.3(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-externalize-deps: 0.9.0(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - rollup @@ -6770,7 +6770,7 @@ snapshots: - typescript - vite - '@testing-library/jest-dom@6.8.0': + '@testing-library/jest-dom@6.9.0': dependencies: '@adobe/css-tools': 4.4.2 aria-query: 5.3.2 @@ -6784,6 +6784,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 @@ -6817,7 +6822,7 @@ snapshots: '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 24.3.1 + '@types/node': 24.6.0 '@types/deep-eql@4.0.2': {} @@ -6831,19 +6836,19 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@24.3.1': + '@types/node@24.6.0': dependencies: - undici-types: 7.10.0 + undici-types: 7.13.0 '@types/react-dom@19.1.7(@types/react@19.1.9)': dependencies: '@types/react': 19.1.9 - '@types/react-dom@19.1.9(@types/react@19.1.12)': + '@types/react-dom@19.1.9(@types/react@19.1.16)': dependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.16 - '@types/react@19.1.12': + '@types/react@19.1.16': dependencies: csstype: 3.1.3 @@ -6853,15 +6858,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.43.0 - eslint: 9.35.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.45.0 + eslint: 9.36.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -6870,58 +6875,58 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.43.0 + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.1 - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.43.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.45.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.43.0': + '@typescript-eslint/scope-manager@8.45.0': dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/visitor-keys': 8.45.0 - '@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) debug: 4.4.1 - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.39.1': {} - '@typescript-eslint/types@8.43.0': {} - '@typescript-eslint/typescript-estree@8.43.0(typescript@5.9.2)': + '@typescript-eslint/types@8.45.0': {} + + '@typescript-eslint/typescript-estree@8.45.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.43.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 + '@typescript-eslint/project-service': 8.45.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -6932,20 +6937,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.35.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.43.0': + '@typescript-eslint/visitor-keys@8.45.0': dependencies: - '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/types': 8.45.0 eslint-visitor-keys: 4.2.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -7007,15 +7012,15 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0))': + '@vitejs/plugin-react@5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: - '@babel/core': 7.28.3 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3) - '@rolldown/pluginutils': 1.0.0-beta.34 + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -7027,13 +7032,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -7218,6 +7223,10 @@ snapshots: dependencies: is-windows: 1.0.2 + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + birecord@0.1.1: {} bl@4.1.0: @@ -7382,21 +7391,29 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + css-what@6.1.0: {} css.escape@1.5.1: {} - cssstyle@4.2.1: + cssstyle@5.3.1(postcss@8.5.6): dependencies: - '@asamuzakjp/css-color': 2.8.3 - rrweb-cssom: 0.8.0 + '@asamuzakjp/css-color': 4.0.5 + '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) + css-tree: 3.1.0 + transitivePeerDependencies: + - postcss csstype@3.1.3: {} - data-urls@5.0.0: + data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 - whatwg-url: 14.1.1 + whatwg-url: 15.1.0 dataloader@1.4.0: {} @@ -7502,6 +7519,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -7553,9 +7572,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.35.0(jiti@2.5.1)): + eslint-compat-utils@0.5.1(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) semver: 7.7.2 eslint-import-context@0.1.9(unrs-resolver@1.11.1): @@ -7574,19 +7593,19 @@ snapshots: - supports-color optional: true - eslint-plugin-es-x@7.8.0(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-es-x@7.8.0(eslint@9.36.0(jiti@2.6.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.35.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.35.0(jiti@2.5.1) - eslint-compat-utils: 0.5.1(eslint@9.35.0(jiti@2.5.1)) + eslint: 9.36.0(jiti@2.6.0) + eslint-compat-utils: 0.5.1(eslint@9.36.0(jiti@2.6.0)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0)): dependencies: - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/types': 8.43.0 comment-parser: 1.4.1 debug: 4.4.1 - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 9.0.5 @@ -7594,17 +7613,17 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-n@17.21.3(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-n@17.23.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.35.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) enhanced-resolve: 5.18.1 - eslint: 9.35.0(jiti@2.5.1) - eslint-plugin-es-x: 7.8.0(eslint@9.35.0(jiti@2.5.1)) + eslint: 9.36.0(jiti@2.6.0) + eslint-plugin-es-x: 7.8.0(eslint@9.36.0(jiti@2.6.0)) get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 @@ -7614,149 +7633,143 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.36.0(jiti@2.6.0)): dependencies: '@babel/core': 7.26.10 '@babel/parser': 7.27.0 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) hermes-parser: 0.25.1 zod: 3.24.2 zod-validation-error: 3.4.0(zod@3.24.2) transitivePeerDependencies: - supports-color - eslint-plugin-react-debug@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) + eslint-plugin-react-debug@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-react-dom@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) compare-versions: 6.1.1 - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) + eslint-plugin-react-hooks-extra@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.2.0(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) - eslint-plugin-react-naming-convention@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-react-naming-convention@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) + eslint-plugin-react-web-api@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.53.1(eslint@9.35.0(jiti@2.5.1))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-react-x@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) compare-versions: 6.1.1 - eslint: 9.35.0(jiti@2.5.1) - is-immutable-type: 5.0.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) + is-immutable-type: 5.0.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) string-ts: 2.2.1 - ts-pattern: 5.8.0 - optionalDependencies: ts-api-utils: 2.1.0(typescript@5.9.2) + ts-pattern: 5.8.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1)): + eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) eslint-scope@8.4.0: dependencies: @@ -7767,15 +7780,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.35.0(jiti@2.5.1): + eslint@9.36.0(jiti@2.6.0): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.35.0 + '@eslint/js': 9.36.0 '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -7805,7 +7818,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.0 transitivePeerDependencies: - supports-color @@ -7982,7 +7995,7 @@ snapshots: globals@15.15.0: {} - globals@16.3.0: {} + globals@16.4.0: {} globby@11.1.0: dependencies: @@ -8045,14 +8058,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -8095,10 +8108,10 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-immutable-type@5.0.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): + is-immutable-type@5.0.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) ts-api-utils: 2.1.0(typescript@5.9.2) ts-declaration-location: 1.0.7(typescript@5.9.2) typescript: 5.9.2 @@ -8146,7 +8159,7 @@ snapshots: jiti@2.4.2: {} - jiti@2.5.1: {} + jiti@2.6.0: {} jju@1.4.0: {} @@ -8163,30 +8176,31 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@26.1.0: + jsdom@27.0.0(postcss@8.5.6): dependencies: - cssstyle: 4.2.1 - data-urls: 5.0.0 + '@asamuzakjp/dom-selector': 6.5.6 + cssstyle: 5.3.1(postcss@8.5.6) + data-urls: 6.0.0 decimal.js: 10.5.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.18 - parse5: 7.2.1 + parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 5.1.2 + tough-cookie: 6.0.0 w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 + webidl-conversions: 8.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 - whatwg-url: 14.1.1 - ws: 8.18.1 + whatwg-url: 15.1.0 + ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil + - postcss - supports-color - utf-8-validate @@ -8208,7 +8222,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -8220,23 +8234,22 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.63.1(@types/node@24.3.1)(typescript@5.9.2): + knip@5.64.1(@types/node@24.6.0)(typescript@5.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 24.3.1 + '@types/node': 24.6.0 fast-glob: 3.3.3 formatly: 0.3.0 - jiti: 2.5.1 + jiti: 2.6.0 js-yaml: 4.1.0 minimist: 1.2.8 - oxc-resolver: 11.7.2 + oxc-resolver: 11.8.4 picocolors: 1.1.1 picomatch: 4.0.3 smol-toml: 1.4.2 strip-json-comments: 5.0.2 typescript: 5.9.2 - zod: 3.25.72 - zod-validation-error: 3.4.0(zod@3.25.72) + zod: 4.1.11 kolorist@1.8.0: {} @@ -8283,7 +8296,7 @@ snapshots: loupe@3.1.4: {} - lru-cache@10.4.3: {} + lru-cache@11.2.2: {} lru-cache@5.1.1: dependencies: @@ -8317,6 +8330,8 @@ snapshots: math-intrinsics@1.1.0: {} + mdn-data@2.12.2: {} + mdurl@2.0.0: {} meow@12.1.1: {} @@ -8401,9 +8416,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.18: {} - - nx@21.5.2: + nx@21.6.2: dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -8490,29 +8503,29 @@ snapshots: outdent@0.5.0: {} - oxc-resolver@11.7.2: + oxc-resolver@11.8.4: dependencies: napi-postinstall: 0.3.2 optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.7.2 - '@oxc-resolver/binding-android-arm64': 11.7.2 - '@oxc-resolver/binding-darwin-arm64': 11.7.2 - '@oxc-resolver/binding-darwin-x64': 11.7.2 - '@oxc-resolver/binding-freebsd-x64': 11.7.2 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.7.2 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.7.2 - '@oxc-resolver/binding-linux-arm64-gnu': 11.7.2 - '@oxc-resolver/binding-linux-arm64-musl': 11.7.2 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.7.2 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.7.2 - '@oxc-resolver/binding-linux-riscv64-musl': 11.7.2 - '@oxc-resolver/binding-linux-s390x-gnu': 11.7.2 - '@oxc-resolver/binding-linux-x64-gnu': 11.7.2 - '@oxc-resolver/binding-linux-x64-musl': 11.7.2 - '@oxc-resolver/binding-wasm32-wasi': 11.7.2 - '@oxc-resolver/binding-win32-arm64-msvc': 11.7.2 - '@oxc-resolver/binding-win32-ia32-msvc': 11.7.2 - '@oxc-resolver/binding-win32-x64-msvc': 11.7.2 + '@oxc-resolver/binding-android-arm-eabi': 11.8.4 + '@oxc-resolver/binding-android-arm64': 11.8.4 + '@oxc-resolver/binding-darwin-arm64': 11.8.4 + '@oxc-resolver/binding-darwin-x64': 11.8.4 + '@oxc-resolver/binding-freebsd-x64': 11.8.4 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.8.4 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.8.4 + '@oxc-resolver/binding-linux-arm64-gnu': 11.8.4 + '@oxc-resolver/binding-linux-arm64-musl': 11.8.4 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.8.4 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.8.4 + '@oxc-resolver/binding-linux-riscv64-musl': 11.8.4 + '@oxc-resolver/binding-linux-s390x-gnu': 11.8.4 + '@oxc-resolver/binding-linux-x64-gnu': 11.8.4 + '@oxc-resolver/binding-linux-x64-musl': 11.8.4 + '@oxc-resolver/binding-wasm32-wasi': 11.8.4 + '@oxc-resolver/binding-win32-arm64-msvc': 11.8.4 + '@oxc-resolver/binding-win32-ia32-msvc': 11.8.4 + '@oxc-resolver/binding-win32-x64-msvc': 11.8.4 p-filter@2.1.0: dependencies: @@ -8542,7 +8555,7 @@ snapshots: dependencies: quansync: 0.2.8 - package-manager-detector@1.1.0: {} + package-manager-detector@1.3.0: {} parent-module@1.0.1: dependencies: @@ -8561,6 +8574,10 @@ snapshots: dependencies: entities: 4.5.0 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -8618,10 +8635,10 @@ snapshots: proxy-from-env@1.1.0: {} - publint@0.3.12: + publint@0.3.13: dependencies: '@publint/pack': 0.1.2 - package-manager-detector: 1.1.0 + package-manager-detector: 1.3.0 picocolors: 1.1.1 sade: 1.8.1 @@ -8974,11 +8991,11 @@ snapshots: tinyspy@4.0.3: {} - tldts-core@6.1.83: {} + tldts-core@7.0.16: {} - tldts@6.1.83: + tldts@7.0.16: dependencies: - tldts-core: 6.1.83 + tldts-core: 7.0.16 tmp@0.2.3: {} @@ -8986,13 +9003,13 @@ snapshots: dependencies: is-number: 7.0.0 - tough-cookie@5.1.2: + tough-cookie@6.0.0: dependencies: - tldts: 6.1.83 + tldts: 7.0.16 tr46@0.0.3: {} - tr46@5.0.0: + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -9051,13 +9068,13 @@ snapshots: typescript: 5.9.2 yaml: 2.8.0 - typescript-eslint@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.35.0(jiti@2.5.1) + '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -9070,7 +9087,7 @@ snapshots: ufo@1.5.4: {} - undici-types@7.10.0: {} + undici-types@7.13.0: {} undici@6.21.3: {} @@ -9120,13 +9137,13 @@ snapshots: validate-html-nesting@1.2.2: {} - vite-node@3.2.4(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -9141,9 +9158,9 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@24.3.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-dts@4.2.3(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@24.3.1) + '@microsoft/api-extractor': 7.47.7(@types/node@24.6.0) '@rollup/pluginutils': 5.1.4(rollup@4.44.1) '@volar/typescript': 2.4.12 '@vue/language-core': 2.1.6(typescript@5.9.2) @@ -9154,17 +9171,17 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-externalize-deps@0.9.0(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.7)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.7)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.28.0 '@types/babel__core': 7.20.5 @@ -9172,14 +9189,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.7 solid-refresh: 0.6.3(solid-js@1.9.7) - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.0.6(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) optionalDependencies: - '@testing-library/jest-dom': 6.8.0 + '@testing-library/jest-dom': 6.9.0 transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.28.0 '@types/babel__core': 7.20.5 @@ -9187,25 +9204,25 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.0.6(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) optionalDependencies: - '@testing-library/jest-dom': 6.8.0 + '@testing-library/jest-dom': 6.9.0 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.9.2) optionalDependencies: - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0): + vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.3) @@ -9214,21 +9231,21 @@ snapshots: rollup: 4.44.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.3.1 + '@types/node': 24.6.0 fsevents: 2.3.3 - jiti: 2.5.1 + jiti: 2.6.0 tsx: 4.19.3 yaml: 2.8.0 - vitefu@1.0.6(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)): + vitefu@1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): optionalDependencies: - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vitest@3.2.4(@types/node@24.3.1)(jiti@2.5.1)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.8.0): + vitest@3.2.4(@types/node@24.6.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -9246,12 +9263,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.3.1)(jiti@2.5.1)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.3.1 - jsdom: 26.1.0 + '@types/node': 24.6.0 + jsdom: 27.0.0(postcss@8.5.6) transitivePeerDependencies: - jiti - less @@ -9268,10 +9285,10 @@ snapshots: vscode-uri@3.1.0: {} - vue-eslint-parser@10.2.0(eslint@9.35.0(jiti@2.5.1)): + vue-eslint-parser@10.2.0(eslint@9.36.0(jiti@2.6.0)): dependencies: debug: 4.4.1 - eslint: 9.35.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -9292,7 +9309,7 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@7.0.0: {} + webidl-conversions@8.0.0: {} whatwg-encoding@3.1.1: dependencies: @@ -9300,10 +9317,10 @@ snapshots: whatwg-mimetype@4.0.0: {} - whatwg-url@14.1.1: + whatwg-url@15.1.0: dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 + tr46: 6.0.0 + webidl-conversions: 8.0.0 whatwg-url@5.0.0: dependencies: @@ -9329,8 +9346,6 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.1: {} - ws@8.18.3: {} xml-name-validator@5.0.0: {} @@ -9365,12 +9380,6 @@ snapshots: dependencies: zod: 3.24.2 - zod-validation-error@3.4.0(zod@3.25.72): - dependencies: - zod: 3.25.72 - zod@3.24.2: {} - zod@3.25.72: {} - - zod@4.1.8: {} + zod@4.1.11: {} From 19ea030029b725ac78e5a8f4f25828eb22fd0619 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Tue, 30 Sep 2025 16:54:33 -0500 Subject: [PATCH 39/50] merge main --- examples/react/asyncBatch/package.json | 2 +- examples/react/asyncDebounce/package.json | 2 +- examples/react/asyncRateLimit/package.json | 2 +- examples/react/asyncThrottle/package.json | 2 +- examples/react/batch/package.json | 2 +- examples/react/debounce/package.json | 2 +- examples/react/queue/package.json | 2 +- examples/react/rateLimit/package.json | 2 +- .../package.json | 2 +- .../react-query-queued-prefetch/package.json | 2 +- .../package.json | 2 +- examples/react/throttle/package.json | 2 +- .../useAsyncBatchedCallback/package.json | 2 +- examples/react/useAsyncBatcher/package.json | 2 +- .../useAsyncDebouncedCallback/package.json | 2 +- examples/react/useAsyncDebouncer/package.json | 2 +- .../react/useAsyncQueuedState/package.json | 2 +- examples/react/useAsyncQueuer/package.json | 2 +- .../react/useAsyncRateLimiter/package.json | 2 +- .../package.json | 2 +- examples/react/useAsyncThrottler/package.json | 2 +- .../react/useBatchedCallback/package.json | 2 +- examples/react/useBatcher/package.json | 2 +- .../react/useDebouncedCallback/package.json | 2 +- examples/react/useDebouncedState/package.json | 2 +- examples/react/useDebouncedValue/package.json | 2 +- examples/react/useDebouncer/package.json | 2 +- examples/react/useQueuedState/package.json | 2 +- examples/react/useQueuedValue/package.json | 2 +- examples/react/useQueuer/package.json | 2 +- .../react/useQueuerWithPersister/package.json | 2 +- .../react/useRateLimitedCallback/package.json | 2 +- .../react/useRateLimitedState/package.json | 2 +- .../react/useRateLimitedValue/package.json | 2 +- examples/react/useRateLimiter/package.json | 2 +- .../useRateLimiterWithPersister/package.json | 2 +- .../react/useThrottledCallback/package.json | 2 +- examples/react/useThrottledState/package.json | 2 +- examples/react/useThrottledValue/package.json | 2 +- examples/react/useThrottler/package.json | 2 +- examples/react/util-comparison/package.json | 2 +- package.json | 8 +- packages/react-pacer-devtools/package.json | 2 +- packages/react-pacer/package.json | 4 +- pnpm-lock.yaml | 1923 +++++++++++------ 45 files changed, 1261 insertions(+), 758 deletions(-) diff --git a/examples/react/asyncBatch/package.json b/examples/react/asyncBatch/package.json index c2df3c42..12888820 100644 --- a/examples/react/asyncBatch/package.json +++ b/examples/react/asyncBatch/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/asyncDebounce/package.json b/examples/react/asyncDebounce/package.json index 10d86eb3..70705497 100644 --- a/examples/react/asyncDebounce/package.json +++ b/examples/react/asyncDebounce/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/asyncRateLimit/package.json b/examples/react/asyncRateLimit/package.json index f5046768..a9f397c0 100644 --- a/examples/react/asyncRateLimit/package.json +++ b/examples/react/asyncRateLimit/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/asyncThrottle/package.json b/examples/react/asyncThrottle/package.json index f9258293..6dc75eed 100644 --- a/examples/react/asyncThrottle/package.json +++ b/examples/react/asyncThrottle/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/batch/package.json b/examples/react/batch/package.json index 413d092d..c943a052 100644 --- a/examples/react/batch/package.json +++ b/examples/react/batch/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/debounce/package.json b/examples/react/debounce/package.json index e2ff68f3..c081fab9 100644 --- a/examples/react/debounce/package.json +++ b/examples/react/debounce/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/queue/package.json b/examples/react/queue/package.json index 1595a87a..94add16e 100644 --- a/examples/react/queue/package.json +++ b/examples/react/queue/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@tanstack/react-devtools": "0.7.0", "@tanstack/react-pacer-devtools": "0.3.0", - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/rateLimit/package.json b/examples/react/rateLimit/package.json index a8534be3..e3b7abbb 100644 --- a/examples/react/rateLimit/package.json +++ b/examples/react/rateLimit/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/react-query-debounced-prefetch/package.json b/examples/react/react-query-debounced-prefetch/package.json index 61bdb26a..4634b69b 100644 --- a/examples/react/react-query-debounced-prefetch/package.json +++ b/examples/react/react-query-debounced-prefetch/package.json @@ -16,7 +16,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/react-query-queued-prefetch/package.json b/examples/react/react-query-queued-prefetch/package.json index be9e132f..c34bbded 100644 --- a/examples/react/react-query-queued-prefetch/package.json +++ b/examples/react/react-query-queued-prefetch/package.json @@ -16,7 +16,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/react-query-throttled-prefetch/package.json b/examples/react/react-query-throttled-prefetch/package.json index d181a72b..3809f7d7 100644 --- a/examples/react/react-query-throttled-prefetch/package.json +++ b/examples/react/react-query-throttled-prefetch/package.json @@ -16,7 +16,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/throttle/package.json b/examples/react/throttle/package.json index ed5c7ad2..6acd7b9f 100644 --- a/examples/react/throttle/package.json +++ b/examples/react/throttle/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncBatchedCallback/package.json b/examples/react/useAsyncBatchedCallback/package.json index ea84495e..b6b1bafc 100644 --- a/examples/react/useAsyncBatchedCallback/package.json +++ b/examples/react/useAsyncBatchedCallback/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncBatcher/package.json b/examples/react/useAsyncBatcher/package.json index c59844d0..27509f8c 100644 --- a/examples/react/useAsyncBatcher/package.json +++ b/examples/react/useAsyncBatcher/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncDebouncedCallback/package.json b/examples/react/useAsyncDebouncedCallback/package.json index 12f220ec..2f619d48 100644 --- a/examples/react/useAsyncDebouncedCallback/package.json +++ b/examples/react/useAsyncDebouncedCallback/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncDebouncer/package.json b/examples/react/useAsyncDebouncer/package.json index f3315969..330363b8 100644 --- a/examples/react/useAsyncDebouncer/package.json +++ b/examples/react/useAsyncDebouncer/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncQueuedState/package.json b/examples/react/useAsyncQueuedState/package.json index e96187da..d9fe43dd 100644 --- a/examples/react/useAsyncQueuedState/package.json +++ b/examples/react/useAsyncQueuedState/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncQueuer/package.json b/examples/react/useAsyncQueuer/package.json index 0a6c8374..5b7107b1 100644 --- a/examples/react/useAsyncQueuer/package.json +++ b/examples/react/useAsyncQueuer/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncRateLimiter/package.json b/examples/react/useAsyncRateLimiter/package.json index 90c8fb84..833e70a0 100644 --- a/examples/react/useAsyncRateLimiter/package.json +++ b/examples/react/useAsyncRateLimiter/package.json @@ -15,7 +15,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncRateLimiterWithPersister/package.json b/examples/react/useAsyncRateLimiterWithPersister/package.json index a6b0e50e..9a7da838 100644 --- a/examples/react/useAsyncRateLimiterWithPersister/package.json +++ b/examples/react/useAsyncRateLimiterWithPersister/package.json @@ -15,7 +15,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useAsyncThrottler/package.json b/examples/react/useAsyncThrottler/package.json index 6ee9940f..d09d9d8c 100644 --- a/examples/react/useAsyncThrottler/package.json +++ b/examples/react/useAsyncThrottler/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useBatchedCallback/package.json b/examples/react/useBatchedCallback/package.json index 9461039b..6f4abab1 100644 --- a/examples/react/useBatchedCallback/package.json +++ b/examples/react/useBatchedCallback/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useBatcher/package.json b/examples/react/useBatcher/package.json index 17016793..a6a0c96b 100644 --- a/examples/react/useBatcher/package.json +++ b/examples/react/useBatcher/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useDebouncedCallback/package.json b/examples/react/useDebouncedCallback/package.json index c74350ba..1e90f9dc 100644 --- a/examples/react/useDebouncedCallback/package.json +++ b/examples/react/useDebouncedCallback/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useDebouncedState/package.json b/examples/react/useDebouncedState/package.json index ca6349e8..e244383a 100644 --- a/examples/react/useDebouncedState/package.json +++ b/examples/react/useDebouncedState/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useDebouncedValue/package.json b/examples/react/useDebouncedValue/package.json index ea922329..8d98516d 100644 --- a/examples/react/useDebouncedValue/package.json +++ b/examples/react/useDebouncedValue/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useDebouncer/package.json b/examples/react/useDebouncer/package.json index 6e4d2974..76452ff7 100644 --- a/examples/react/useDebouncer/package.json +++ b/examples/react/useDebouncer/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useQueuedState/package.json b/examples/react/useQueuedState/package.json index 232cd32f..2ae47279 100644 --- a/examples/react/useQueuedState/package.json +++ b/examples/react/useQueuedState/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useQueuedValue/package.json b/examples/react/useQueuedValue/package.json index 95bf5425..e035ed50 100644 --- a/examples/react/useQueuedValue/package.json +++ b/examples/react/useQueuedValue/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useQueuer/package.json b/examples/react/useQueuer/package.json index af83048c..8071e6de 100644 --- a/examples/react/useQueuer/package.json +++ b/examples/react/useQueuer/package.json @@ -17,7 +17,7 @@ "devDependencies": { "@tanstack/react-devtools": "0.7.0", "@tanstack/react-pacer-devtools": "0.3.0", - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useQueuerWithPersister/package.json b/examples/react/useQueuerWithPersister/package.json index a061d5f4..e693eb75 100644 --- a/examples/react/useQueuerWithPersister/package.json +++ b/examples/react/useQueuerWithPersister/package.json @@ -15,7 +15,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useRateLimitedCallback/package.json b/examples/react/useRateLimitedCallback/package.json index c96f000d..938b8146 100644 --- a/examples/react/useRateLimitedCallback/package.json +++ b/examples/react/useRateLimitedCallback/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useRateLimitedState/package.json b/examples/react/useRateLimitedState/package.json index c009dd23..9c7ec110 100644 --- a/examples/react/useRateLimitedState/package.json +++ b/examples/react/useRateLimitedState/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useRateLimitedValue/package.json b/examples/react/useRateLimitedValue/package.json index 970459db..0a1deb92 100644 --- a/examples/react/useRateLimitedValue/package.json +++ b/examples/react/useRateLimitedValue/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useRateLimiter/package.json b/examples/react/useRateLimiter/package.json index 9478a211..da72f164 100644 --- a/examples/react/useRateLimiter/package.json +++ b/examples/react/useRateLimiter/package.json @@ -15,7 +15,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useRateLimiterWithPersister/package.json b/examples/react/useRateLimiterWithPersister/package.json index 7e7c075c..859f08cb 100644 --- a/examples/react/useRateLimiterWithPersister/package.json +++ b/examples/react/useRateLimiterWithPersister/package.json @@ -15,7 +15,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useThrottledCallback/package.json b/examples/react/useThrottledCallback/package.json index ec3b6d07..91456de5 100644 --- a/examples/react/useThrottledCallback/package.json +++ b/examples/react/useThrottledCallback/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useThrottledState/package.json b/examples/react/useThrottledState/package.json index ce684751..82c82075 100644 --- a/examples/react/useThrottledState/package.json +++ b/examples/react/useThrottledState/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useThrottledValue/package.json b/examples/react/useThrottledValue/package.json index 65e9992f..d0aef75a 100644 --- a/examples/react/useThrottledValue/package.json +++ b/examples/react/useThrottledValue/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/useThrottler/package.json b/examples/react/useThrottler/package.json index 51b44518..18fdb153 100644 --- a/examples/react/useThrottler/package.json +++ b/examples/react/useThrottler/package.json @@ -14,7 +14,7 @@ "react-dom": "^19.1.1" }, "devDependencies": { - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/examples/react/util-comparison/package.json b/examples/react/util-comparison/package.json index 11f2e2b4..38af3c74 100644 --- a/examples/react/util-comparison/package.json +++ b/examples/react/util-comparison/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@tanstack/react-devtools": "0.7.0", "@tanstack/react-pacer-devtools": "0.3.0", - "@types/react": "^19.1.15", + "@types/react": "^19.1.16", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.4", "vite": "^7.1.7" diff --git a/package.json b/package.json index 435a568a..c83f0a74 100644 --- a/package.json +++ b/package.json @@ -58,22 +58,22 @@ "@size-limit/preset-small-lib": "^11.2.0", "@svitejs/changesets-changelog-github-compact": "^1.2.0", "@tanstack/config": "0.20.3", - "@testing-library/jest-dom": "^6.8.0", - "@types/node": "^24.3.1", + "@testing-library/jest-dom": "^6.9.0", + "@types/node": "^24.6.0", "eslint": "^9.36.0", "eslint-plugin-unused-imports": "^4.2.0", "fast-glob": "^3.3.3", "jsdom": "^27.0.0", "knip": "^5.64.1", "markdown-link-extractor": "^4.0.2", - "nx": "^21.5.3", + "nx": "^21.6.2", "premove": "^4.0.0", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", "publint": "^0.3.13", "sherif": "^1.6.1", "size-limit": "^11.2.0", - "typescript": "5.9.2", + "typescript": "5.9.3", "vite": "^7.1.7", "vitest": "^3.2.4" }, diff --git a/packages/react-pacer-devtools/package.json b/packages/react-pacer-devtools/package.json index a930c468..94a4bae1 100644 --- a/packages/react-pacer-devtools/package.json +++ b/packages/react-pacer-devtools/package.json @@ -68,7 +68,7 @@ "@tanstack/pacer-devtools": "workspace:*" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^1.53.1", + "@eslint-react/eslint-plugin": "^2.0.4", "@vitejs/plugin-react": "^5.0.4", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0" diff --git a/packages/react-pacer/package.json b/packages/react-pacer/package.json index 777c1f97..931101ed 100644 --- a/packages/react-pacer/package.json +++ b/packages/react-pacer/package.json @@ -195,8 +195,8 @@ "@tanstack/react-store": "^0.7.7" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^1.53.1", - "@types/react": "^19.1.15", + "@eslint-react/eslint-plugin": "^2.0.4", + "@types/react": "^19.1.16", "@vitejs/plugin-react": "^5.0.4", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^5.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5b14d6fa..289759a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 1.2.0 '@tanstack/config': specifier: 0.20.3 - version: 0.20.3(@types/node@24.3.1)(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 0.20.3(@types/node@24.6.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) '@testing-library/jest-dom': specifier: ^6.9.0 version: 6.9.0 @@ -34,7 +34,7 @@ importers: version: 9.36.0(jiti@2.6.0) eslint-plugin-unused-imports: specifier: ^4.2.0 - version: 4.2.0(@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0)) + version: 4.2.0(@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -43,13 +43,13 @@ importers: version: 27.0.0(postcss@8.5.6) knip: specifier: ^5.64.1 - version: 5.64.1(@types/node@24.3.1)(typescript@5.9.2) + version: 5.64.1(@types/node@24.6.0)(typescript@5.9.3) markdown-link-extractor: specifier: ^4.0.2 version: 4.0.2 nx: - specifier: ^21.5.3 - version: 21.5.3 + specifier: ^21.6.2 + version: 21.6.2 premove: specifier: ^4.0.0 version: 4.0.0 @@ -69,14 +69,14 @@ importers: specifier: ^11.2.0 version: 11.2.0 typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0) + version: 3.2.4(@types/node@24.6.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncBatch: dependencies: @@ -91,17 +91,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncDebounce: dependencies: @@ -116,17 +116,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncRateLimit: dependencies: @@ -141,17 +141,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncThrottle: dependencies: @@ -166,17 +166,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/batch: dependencies: @@ -191,17 +191,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/debounce: dependencies: @@ -216,17 +216,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/queue: dependencies: @@ -242,22 +242,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: 0.7.0 - version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.3.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/rateLimit: dependencies: @@ -272,17 +272,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-debounced-prefetch: dependencies: @@ -303,17 +303,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-queued-prefetch: dependencies: @@ -334,17 +334,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-throttled-prefetch: dependencies: @@ -365,17 +365,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/throttle: dependencies: @@ -390,17 +390,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatchedCallback: dependencies: @@ -415,17 +415,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatcher: dependencies: @@ -440,17 +440,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncedCallback: dependencies: @@ -465,17 +465,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncer: dependencies: @@ -490,17 +490,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuedState: dependencies: @@ -515,17 +515,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuer: dependencies: @@ -540,17 +540,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiter: dependencies: @@ -568,17 +568,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiterWithPersister: dependencies: @@ -596,17 +596,42 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + + examples/react/useAsyncRetryer: + dependencies: + '@tanstack/react-pacer': + specifier: ^0.14.0 + version: 0.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react: + specifier: ^19.1.1 + version: 19.1.1 + react-dom: + specifier: ^19.1.1 + version: 19.1.1(react@19.1.1) + devDependencies: + '@types/react': + specifier: ^19.1.16 + version: 19.1.16 + '@types/react-dom': + specifier: ^19.1.9 + version: 19.1.9(@types/react@19.1.16) + '@vitejs/plugin-react': + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite: + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncThrottler: dependencies: @@ -621,17 +646,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatchedCallback: dependencies: @@ -646,17 +671,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatcher: dependencies: @@ -671,17 +696,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedCallback: dependencies: @@ -696,17 +721,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedState: dependencies: @@ -721,17 +746,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedValue: dependencies: @@ -746,17 +771,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncer: dependencies: @@ -771,17 +796,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedState: dependencies: @@ -796,17 +821,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedValue: dependencies: @@ -821,17 +846,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuer: dependencies: @@ -850,22 +875,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: 0.7.0 - version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.3.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuerWithPersister: dependencies: @@ -883,17 +908,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedCallback: dependencies: @@ -908,17 +933,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedState: dependencies: @@ -933,17 +958,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedValue: dependencies: @@ -958,17 +983,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiter: dependencies: @@ -986,17 +1011,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiterWithPersister: dependencies: @@ -1014,17 +1039,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledCallback: dependencies: @@ -1039,17 +1064,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledState: dependencies: @@ -1064,17 +1089,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledValue: dependencies: @@ -1089,17 +1114,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottler: dependencies: @@ -1114,17 +1139,17 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/util-comparison: dependencies: @@ -1140,22 +1165,22 @@ importers: devDependencies: '@tanstack/react-devtools': specifier: 0.7.0 - version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) + version: 0.7.0(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) '@tanstack/react-pacer-devtools': specifier: 0.3.0 version: link:../../../packages/react-pacer-devtools '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.15) + version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/solid/asyncBatch: dependencies: @@ -1168,10 +1193,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncDebounce: dependencies: @@ -1184,10 +1209,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncRateLimit: dependencies: @@ -1200,10 +1225,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncThrottle: dependencies: @@ -1216,10 +1241,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/batch: dependencies: @@ -1232,10 +1257,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncBatcher: dependencies: @@ -1248,10 +1273,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncDebouncer: dependencies: @@ -1264,10 +1289,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncQueuer: dependencies: @@ -1280,10 +1305,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncRateLimiter: dependencies: @@ -1296,10 +1321,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncThrottler: dependencies: @@ -1312,10 +1337,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createBatcher: dependencies: @@ -1328,10 +1353,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedSignal: dependencies: @@ -1344,10 +1369,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedValue: dependencies: @@ -1360,10 +1385,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncer: dependencies: @@ -1376,10 +1401,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createQueuer: dependencies: @@ -1398,10 +1423,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedSignal: dependencies: @@ -1414,10 +1439,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedValue: dependencies: @@ -1430,10 +1455,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimiter: dependencies: @@ -1446,10 +1471,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledSignal: dependencies: @@ -1462,10 +1487,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledValue: dependencies: @@ -1478,10 +1503,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottler: dependencies: @@ -1494,10 +1519,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/debounce: dependencies: @@ -1510,10 +1535,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/queue: dependencies: @@ -1532,10 +1557,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/rateLimit: dependencies: @@ -1548,10 +1573,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/throttle: dependencies: @@ -1564,10 +1589,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/pacer: dependencies: @@ -1604,7 +1629,7 @@ importers: devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/react-pacer: dependencies: @@ -1613,20 +1638,20 @@ importers: version: link:../pacer '@tanstack/react-store': specifier: ^0.7.7 - version: 0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 0.7.7(react-dom@19.1.0(react@19.1.1))(react@19.1.1) react-dom: specifier: '>=16.8' - version: 19.1.1(react@19.1.1) + version: 19.1.0(react@19.1.1) devDependencies: '@eslint-react/eslint-plugin': - specifier: ^1.53.1 - version: 1.53.1(eslint@9.36.0(jiti@2.6.0))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + specifier: ^2.0.4 + version: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) '@types/react': - specifier: ^19.1.15 - version: 19.1.15 + specifier: ^19.1.16 + version: 19.1.16 '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.6.0)) @@ -1644,10 +1669,10 @@ importers: version: link:../pacer-devtools '@types/react': specifier: '>=16.8' - version: 19.1.15 + version: 19.1.9 '@types/react-dom': specifier: '>=16.8' - version: 19.1.9(@types/react@19.1.15) + version: 19.1.7(@types/react@19.1.9) react: specifier: '>=16.8' version: 19.1.1 @@ -1656,11 +1681,11 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@eslint-react/eslint-plugin': - specifier: ^1.53.1 - version: 1.53.1(eslint@9.36.0(jiti@2.6.0))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) + specifier: ^2.0.4 + version: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.6.0)) @@ -1682,7 +1707,7 @@ importers: version: 1.9.9 vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/solid-pacer-devtools: dependencies: @@ -1691,11 +1716,11 @@ importers: version: link:../pacer-devtools solid-js: specifier: '>=1.9.7' - version: 1.9.9 + version: 1.9.7 devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.7)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages: @@ -1706,27 +1731,55 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@asamuzakjp/css-color@4.0.4': - resolution: {integrity: sha512-cKjSKvWGmAziQWbCouOsFwb14mp1betm8Y7Fn+yglDMUUu3r9DCbJ9iJbeFDenLMqFbIMC0pQP8K+B8LAxX3OQ==} + '@asamuzakjp/css-color@4.0.5': + resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} - '@asamuzakjp/dom-selector@6.5.5': - resolution: {integrity: sha512-kI2MX9pmImjxWT8nxDZY+MuN6r1jJGe7WxizEbsAEPB/zxfW5wYLIiPG1v3UKgEOOP8EsDkp0ZL99oRFAdPM8g==} + '@asamuzakjp/dom-selector@6.5.6': + resolution: {integrity: sha512-Mj3Hu9ymlsERd7WOsUKNUZnJYL4IZ/I9wVVYgtvOsWYiEFbkQ4G7VRIh2USxTVW4BBDIsLG+gBUgqOqf2Kvqow==} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.0': resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + '@babel/core@7.28.4': resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.28.3': resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} @@ -1735,6 +1788,10 @@ packages: resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} @@ -1757,10 +1814,26 @@ packages: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.3': resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} @@ -1771,6 +1844,10 @@ packages: resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} @@ -1785,24 +1862,54 @@ packages: resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.4': resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} engines: {node: '>=6.0.0'} hasBin: true @@ -1840,16 +1947,48 @@ packages: resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.4': resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} '@babel/types@7.28.4': @@ -2235,8 +2374,9 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -2245,9 +2385,16 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} @@ -2297,53 +2444,53 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nx/nx-darwin-arm64@21.5.3': - resolution: {integrity: sha512-XKOaBpkBzPd5l9in1ax7KQrAiqm4hi46pzQ/qq4Jo20/RKTpc2ZZSFujjuI8wF75oZ6+iV+cvuxSbwbuX6AxQQ==} + '@nx/nx-darwin-arm64@21.5.2': + resolution: {integrity: sha512-PrfZbV2blRHoWLor+xDVwPY/dk46kbsmuTXCZRYlNAwko521Y9dCAJT0UOROic3zoUasQ+TwqsQextIcKCotIA==} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@21.5.3': - resolution: {integrity: sha512-auGY/gvB5B2In25gozlNV6lb4so14OIpIh/dPgXXrHL5YTuky2i6NFiTOq2D1RWtv5kkoK73rQXDbffDXUS6SA==} + '@nx/nx-darwin-x64@21.5.2': + resolution: {integrity: sha512-YaLY2Cqbjrl+pDddHV7GFtokn81GLvoqg+i9k0Eiid8B0dDLBZpJ3VQKr4RkTzxBX38UuHbJUwrZc8L9z8vqEw==} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@21.5.3': - resolution: {integrity: sha512-IsPCC8CpIRd7dzcRQ+j1zAEZObKVkSLQ3GI7rqybEf0/vWZz6T7UbxGHNtFB7AlaecCbHshZ3Mg5mPVXYSR+iA==} + '@nx/nx-freebsd-x64@21.5.2': + resolution: {integrity: sha512-2z/Wd42/KHFyT0zRVxWHlaRBQz12Fd1A0FCGJzuWI8G2meh9tYt4MN96gQ4q/rLQ0fmfFEEECq6pmOfCi8t9Mg==} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@21.5.3': - resolution: {integrity: sha512-IDW5wy2x7KNFK5u8v94KarJ0h4Fk49pVMKcAI6imeQOJnc0lh0TwID4cqVTCg73BLJXbIV3+Ok01jDKrDsTL/w==} + '@nx/nx-linux-arm-gnueabihf@21.5.2': + resolution: {integrity: sha512-lY2O1py8x+l39XAFFuplKlzouPC9K/gERYEB/b5jHGf7PGfNj0BX2MDmUztgTty6kKUnkRele39aSoQqWok0gA==} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@21.5.3': - resolution: {integrity: sha512-GQF/xjGeqt4tYWf9jT1D0GRPrcAjajTB1QpSavUaiT1jDkByuN11WvuWeTfBdPJpYWFxvH887+r+uMEg8zRE4A==} + '@nx/nx-linux-arm64-gnu@21.5.2': + resolution: {integrity: sha512-gcpkXXPpWaf8wB0FZUaKmk8Jdv+QMHLiOcQuuXYi1X0vbgotVTl/y+dccwG1EZml6V5JIRGtg2YDM61a7Olp1Q==} cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@21.5.3': - resolution: {integrity: sha512-C5j2pzfe0zoAJelHXzPdTGeU19VvvHVaoesiKPeH9EvJwLLb9FoeIn+6//x3jDUNUqIHdn4+63kMA6mdBQSpMQ==} + '@nx/nx-linux-arm64-musl@21.5.2': + resolution: {integrity: sha512-oCSUwT0hORgFJWIGjwl6x4/2mVusw+3YAcSrvDePAXadjPSEMLZlJEE+4HExzqLFFBTxc+ucvyOIk08P4BtNJg==} cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@21.5.3': - resolution: {integrity: sha512-HI+tdkvzFcnJQpU9m1FjvlxW7ZsJeF4os8OG4HSLRTQfFT8HCXXzp6b9sojTr+4Nfvp5r3T/J/UJM9tOJXW9Aw==} + '@nx/nx-linux-x64-gnu@21.5.2': + resolution: {integrity: sha512-rgJTQk0iaidxEIMOuRQJS36Sk4+qcpJP0uwymvgyoTpZyBdkX38NHH3D+E6sudPSFWsiVxJpkCzYE4ScSKF8Ew==} cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@21.5.3': - resolution: {integrity: sha512-ntlBqcO9wVajUjYwzBU5ru2iBORttO4nurKvjnpBbyCF1mOjSJ3uFcFMzktbp2cxpRE5JRAadGq9/pZisez1AQ==} + '@nx/nx-linux-x64-musl@21.5.2': + resolution: {integrity: sha512-KeS36526VruYO9HzhFGqhE5tbps7e94DV0b4j5wfPr7V51EfPzvjAiMWllsQDARv67wdbQ80c0Wg516XTlekgA==} cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@21.5.3': - resolution: {integrity: sha512-VgX1VnKDRgWcjIMJ0V3zZ6OPuYkvA7rzgn8wbZWyBh2/1GFFffypJJsGeXRPCZBFHjF3UFYcwjzCMoStZ35b5g==} + '@nx/nx-win32-arm64-msvc@21.5.2': + resolution: {integrity: sha512-jlRTycYKOiSqc0fcqvabOH/HZX9BOG0S8EGsLmqEr2OkJLZc25ByD1n22P486R2n+m8GQwL6pX+L1LPpOPmz0A==} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@21.5.3': - resolution: {integrity: sha512-bEQxvsglGInSi51HJUJ7X1lqekzn5xAOddY4tpmOzBXVadx4fuMT8X/PLDLorAAShNZ36g/7sYbtWaBuJNz3tQ==} + '@nx/nx-win32-x64-msvc@21.5.2': + resolution: {integrity: sha512-Ur8GPdz52kLS5uE9IQf0wBtGyvQm4Y3M1ZDjRkR+oGf26aVGNTK6C0+kMJPuggR4Z6lurmHYA34ViGi2hHPPpA==} cpu: [x64] os: [win32] @@ -2672,6 +2819,10 @@ packages: resolution: {integrity: sha512-2g+PuGR3GuvvCiR3xZs+IMqAvnYU9bvH+jRml0BFBSxHBj22xFCTNvJWhvgj7uICFF9IchDkFUto91xDPMu5cg==} engines: {node: '>=18'} + '@tanstack/pacer@0.13.0': + resolution: {integrity: sha512-eCV3BIn+If4YGMgRbB315CvhyggmBhV85NmBH4uAA2kop6fOJh5GAWsvgsQOqYt0EFhHcjUwQ1eIhqw9aohuOQ==} + engines: {node: '>=18'} + '@tanstack/persister@0.1.1': resolution: {integrity: sha512-XUewm2+D0K84ZSuWm1oMHfqw/flmO7IzCc+316php/XChgbMe30DStp1cF2Uc4IV0cI0G4hDq2RX3+NTxTIvWg==} engines: {node: '>=18'} @@ -2720,6 +2871,12 @@ packages: peerDependencies: react: ^18 || ^19 + '@tanstack/react-store@0.7.5': + resolution: {integrity: sha512-A+WZtEnHZpvbKXm8qR+xndNKywBLez2KKKKEQc7w0Qs45GvY1LpRI3BTZNmELwEVim8+Apf99iEDH2J+MUIzlQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/react-store@0.7.7': resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} peerDependencies: @@ -2737,6 +2894,9 @@ packages: peerDependencies: solid-js: ^1.6.0 + '@tanstack/store@0.7.5': + resolution: {integrity: sha512-qd/OjkjaFRKqKU4Yjipaen/EOB9MyEg6Wr9fW103RBPACf1ZcKhbhcu2S5mj5IgdPib6xFIgCUti/mKVkl+fRw==} + '@tanstack/store@0.7.7': resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} @@ -2752,8 +2912,8 @@ packages: resolution: {integrity: sha512-QHdxYMJ0YPGKYofMc6zYvo7LOViVhdc6nPg/OtM2cf9MQrwEcTxFCs7d/GJ5eSyPkHzOiBkc/KfLdFJBHzldtQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -2800,74 +2960,86 @@ packages: '@types/node@24.6.0': resolution: {integrity: sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==} + '@types/react-dom@19.1.7': + resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} + peerDependencies: + '@types/react': ^19.0.0 + '@types/react-dom@19.1.9': resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.15': - resolution: {integrity: sha512-+kLxJpaJzXybyDyFXYADyP1cznTO8HSuBpenGlnKOAkH4hyNINiywvXS/tGJhsrGGP/gM185RA3xpjY0Yg4erA==} + '@types/react@19.1.16': + resolution: {integrity: sha512-WBM/nDbEZmDUORKnh5i1bTnAz6vTohUf9b8esSMu+b24+srbaxa04UbJgWx78CVfNXA20sNu0odEIluZDFdCog==} + + '@types/react@19.1.9': + resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.44.1': - resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==} + '@typescript-eslint/eslint-plugin@8.45.0': + resolution: {integrity: sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.44.1 + '@typescript-eslint/parser': ^8.45.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.44.1': - resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} + '@typescript-eslint/parser@8.45.0': + resolution: {integrity: sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.44.1': - resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} + '@typescript-eslint/project-service@8.45.0': + resolution: {integrity: sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.44.1': - resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} + '@typescript-eslint/scope-manager@8.45.0': + resolution: {integrity: sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.44.1': - resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} + '@typescript-eslint/tsconfig-utils@8.45.0': + resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.44.1': - resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==} + '@typescript-eslint/type-utils@8.45.0': + resolution: {integrity: sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.44.1': - resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} + '@typescript-eslint/types@8.43.0': + resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.45.0': + resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.44.1': - resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} + '@typescript-eslint/typescript-estree@8.45.0': + resolution: {integrity: sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.44.1': - resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} + '@typescript-eslint/utils@8.45.0': + resolution: {integrity: sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.44.1': - resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} + '@typescript-eslint/visitor-keys@8.45.0': + resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -3341,6 +3513,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -3670,6 +3851,14 @@ packages: fd-package-json@2.0.0: resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3777,6 +3966,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -3972,6 +4165,10 @@ packages: resolution: {integrity: sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + jiti@2.6.0: resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} hasBin: true @@ -4094,11 +4291,14 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.1.4: resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - lru-cache@11.2.1: - resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -4241,8 +4441,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nx@21.5.3: - resolution: {integrity: sha512-+XwzK3OWZw/7zLdhNHBms9VdAA8F6w6QsX8qFQ3+3CnbqEy0IDmVxTXb8c711LDMbEtNn94EiWvSV6C00FKw9Q==} + nx@21.6.2: + resolution: {integrity: sha512-bFZgAsB838vn9kk1vI6a1A9sStKyOA7Q9Ifsx7fYPth3D0GafHKu7X2/YbsC4h1TpmuejkJCPWUw2WtCOQy6IQ==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -4322,8 +4522,8 @@ packages: parse5-parser-stream@7.1.2: resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -4360,6 +4560,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -4426,6 +4630,11 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + react-dom@19.1.1: resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: @@ -4622,6 +4831,9 @@ packages: resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} engines: {node: '>= 18'} + solid-js@1.9.7: + resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} + solid-js@1.9.9: resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} @@ -4739,6 +4951,14 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -4755,11 +4975,11 @@ packages: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} - tldts-core@7.0.15: - resolution: {integrity: sha512-YBkp2VfS9VTRMPNL2PA6PMESmxV1JEVoAr5iBlZnB5JG3KUrWzNCB3yNNkRa2FZkqClaBgfNYCp8PgpYmpjkZw==} + tldts-core@7.0.16: + resolution: {integrity: sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==} - tldts@7.0.15: - resolution: {integrity: sha512-heYRCiGLhtI+U/D0V8YM3QRwPfsLJiP+HX+YwiHZTnWzjIKC+ZCxQRYlzvOoTEc6KIP62B1VeAN63diGCng2hg==} + tldts@7.0.16: + resolution: {integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==} hasBin: true tmp@0.2.3: @@ -4843,8 +5063,8 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.44.1: - resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==} + typescript-eslint@8.45.0: + resolution: {integrity: sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4855,8 +5075,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -5136,8 +5356,8 @@ packages: peerDependencies: zod: ^3.18.0 - zod@3.25.72: - resolution: {integrity: sha512-Cl+fe4dNL4XumOBNBsr0lHfA80PQiZXHI4xEMTEr8gt6aGz92t3lBA32e71j9+JeF/VAYvdfBnuwJs+BMx/BrA==} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} zod@4.1.11: resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} @@ -5148,34 +5368,83 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@asamuzakjp/css-color@4.0.4': + '@asamuzakjp/css-color@4.0.5': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.1 + lru-cache: 11.2.2 - '@asamuzakjp/dom-selector@6.5.5': + '@asamuzakjp/dom-selector@6.5.6': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.1.0 is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.2 '@asamuzakjp/nwsapi@2.3.9': {} + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.28.0': {} + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/core@7.28.4': dependencies: '@babel/code-frame': 7.27.1 @@ -5196,6 +5465,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/generator@7.26.9': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/generator@7.27.0': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + '@babel/generator@7.28.3': dependencies: '@babel/parser': 7.28.4 @@ -5206,7 +5499,15 @@ snapshots: '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.27.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -5216,15 +5517,15 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.28.4)': + '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.28.4) + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.27.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -5233,19 +5534,44 @@ snapshots: '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.0 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color @@ -5260,52 +5586,82 @@ snapshots: '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.27.0 + + '@babel/helper-plugin-utils@7.26.5': {} '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.26.5(@babel/core@7.28.4)': + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.26.10 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helpers@7.27.0': + dependencies: + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 '@babel/types': 7.28.4 + '@babel/parser@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.0 + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + '@babel/parser@7.28.4': dependencies: '@babel/types': 7.28.4 - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.4)': + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': @@ -5322,11 +5678,59 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.28.0 + '@babel/types': 7.26.9 + + '@babel/template@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.28.0 + '@babel/types': 7.27.0 + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + + '@babel/traverse@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.28.0 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.1 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.1 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color '@babel/traverse@7.28.4': dependencies: @@ -5340,7 +5744,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.28.4': + '@babel/types@7.26.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@babel/types@7.28.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.28.2': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -5631,29 +6050,28 @@ snapshots: '@eslint-community/regexpp@4.12.1': {} - '@eslint-react/ast@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@eslint-react/ast@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 1.53.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) string-ts: 2.2.1 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/core@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) birecord: 0.1.1 ts-pattern: 5.8.0 transitivePeerDependencies: @@ -5663,43 +6081,41 @@ snapshots: '@eslint-react/eff@2.0.4': {} - '@eslint-react/eslint-plugin@1.53.1(eslint@9.36.0(jiti@2.6.0))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2)': + '@eslint-react/eslint-plugin@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.36.0(jiti@2.6.0) - eslint-plugin-react-debug: 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - eslint-plugin-react-dom: 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - eslint-plugin-react-hooks-extra: 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - eslint-plugin-react-naming-convention: 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - eslint-plugin-react-web-api: 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - eslint-plugin-react-x: 1.53.1(eslint@9.36.0(jiti@2.6.0))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 + eslint-plugin-react-debug: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + eslint-plugin-react-dom: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + eslint-plugin-react-hooks-extra: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + eslint-plugin-react-naming-convention: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + eslint-plugin-react-web-api: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + eslint-plugin-react-x: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/kit@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@eslint-react/kit@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 1.53.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - ts-pattern: 5.8.0 - zod: 4.1.11 + '@eslint-react/eff': 2.0.4 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@eslint-react/shared@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) ts-pattern: 5.8.0 zod: 4.1.11 transitivePeerDependencies: @@ -5707,14 +6123,13 @@ snapshots: - supports-color - typescript - '@eslint-react/var@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@eslint-react/var@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - string-ts: 2.2.1 + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/eff': 2.0.4 + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) ts-pattern: 5.8.0 transitivePeerDependencies: - eslint @@ -5799,10 +6214,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/remapping@2.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/remapping@2.3.5': dependencies: @@ -5811,8 +6227,15 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -5881,7 +6304,7 @@ snapshots: dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.1 + '@tybys/wasm-util': 0.10.0 optional: true '@napi-rs/wasm-runtime@0.2.4': @@ -5909,34 +6332,34 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nx/nx-darwin-arm64@21.5.3': + '@nx/nx-darwin-arm64@21.5.2': optional: true - '@nx/nx-darwin-x64@21.5.3': + '@nx/nx-darwin-x64@21.5.2': optional: true - '@nx/nx-freebsd-x64@21.5.3': + '@nx/nx-freebsd-x64@21.5.2': optional: true - '@nx/nx-linux-arm-gnueabihf@21.5.3': + '@nx/nx-linux-arm-gnueabihf@21.5.2': optional: true - '@nx/nx-linux-arm64-gnu@21.5.3': + '@nx/nx-linux-arm64-gnu@21.5.2': optional: true - '@nx/nx-linux-arm64-musl@21.5.3': + '@nx/nx-linux-arm64-musl@21.5.2': optional: true - '@nx/nx-linux-x64-gnu@21.5.3': + '@nx/nx-linux-x64-gnu@21.5.2': optional: true - '@nx/nx-linux-x64-musl@21.5.3': + '@nx/nx-linux-x64-musl@21.5.2': optional: true - '@nx/nx-win32-arm64-msvc@21.5.3': + '@nx/nx-win32-arm64-msvc@21.5.2': optional: true - '@nx/nx-win32-x64-msvc@21.5.3': + '@nx/nx-win32-x64-msvc@21.5.2': optional: true '@oxc-resolver/binding-android-arm-eabi@11.8.4': @@ -6158,7 +6581,7 @@ snapshots: '@stylistic/eslint-plugin@5.4.0(eslint@9.36.0(jiti@2.6.0))': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) - '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/types': 8.45.0 eslint: 9.36.0(jiti@2.6.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -6176,12 +6599,12 @@ snapshots: transitivePeerDependencies: - encoding - '@tanstack/config@0.20.3(@types/node@24.3.1)(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/config@0.20.3(@types/node@24.6.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: - '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) '@tanstack/publish-config': 0.2.1 - '@tanstack/typedoc-config': 0.2.1(typescript@5.9.2) - '@tanstack/vite-config': 0.3.0(@types/node@24.3.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + '@tanstack/typedoc-config': 0.2.1(typescript@5.9.3) + '@tanstack/vite-config': 0.3.0(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -6222,14 +6645,14 @@ snapshots: - csstype - utf-8-validate - '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint/js': 9.36.0 '@stylistic/eslint-plugin': 5.4.0(eslint@9.36.0(jiti@2.6.0)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0)) - eslint-plugin-n: 17.23.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-n: 17.23.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) globals: 16.4.0 - typescript-eslint: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + typescript-eslint: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) vue-eslint-parser: 10.2.0(eslint@9.36.0(jiti@2.6.0)) transitivePeerDependencies: - '@typescript-eslint/utils' @@ -6257,11 +6680,11 @@ snapshots: '@tanstack/query-devtools@5.90.1': {} - '@tanstack/react-devtools@0.7.0(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)': + '@tanstack/react-devtools@0.7.0(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)': dependencies: '@tanstack/devtools': 0.6.14(csstype@3.1.3)(solid-js@1.9.9) - '@types/react': 19.1.15 - '@types/react-dom': 19.1.9(@types/react@19.1.15) + '@types/react': 19.1.16 + '@types/react-dom': 19.1.9(@types/react@19.1.16) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -6294,13 +6717,20 @@ snapshots: '@tanstack/query-core': 5.90.2 react: 19.1.1 - '@tanstack/react-store@0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-store@0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/store': 0.7.7 + '@tanstack/store': 0.7.5 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) + '@tanstack/react-store@0.7.7(react-dom@19.1.0(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/store': 0.7.7 + react: 19.1.1 + react-dom: 19.1.0(react@19.1.1) + use-sync-external-store: 1.5.0(react@19.1.1) + '@tanstack/solid-devtools@0.7.0(csstype@3.1.3)(solid-js@1.9.9)': dependencies: '@tanstack/devtools': 0.6.14(csstype@3.1.3)(solid-js@1.9.9) @@ -6315,22 +6745,24 @@ snapshots: '@tanstack/store': 0.7.7 solid-js: 1.9.9 + '@tanstack/store@0.7.5': {} + '@tanstack/store@0.7.7': {} - '@tanstack/typedoc-config@0.2.1(typescript@5.9.2)': + '@tanstack/typedoc-config@0.2.1(typescript@5.9.3)': dependencies: - typedoc: 0.27.9(typescript@5.9.2) - typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2))) - typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.2)) + typedoc: 0.27.9(typescript@5.9.3) + typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3))) + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.3)) transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.3.0(@types/node@24.3.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/vite-config@0.3.0(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.44.1) - vite-plugin-dts: 4.2.3(@types/node@24.3.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) - vite-plugin-externalize-deps: 0.9.0(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-dts: 4.2.3(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-externalize-deps: 0.9.0(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - rollup @@ -6347,7 +6779,7 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.0': dependencies: tslib: 2.8.1 optional: true @@ -6365,24 +6797,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.27.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.0 + '@babel/types': 7.27.0 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.27.0 '@types/chai@5.2.2': dependencies: @@ -6408,107 +6840,117 @@ snapshots: dependencies: undici-types: 7.13.0 - '@types/react-dom@19.1.9(@types/react@19.1.15)': + '@types/react-dom@19.1.7(@types/react@19.1.9)': dependencies: - '@types/react': 19.1.15 + '@types/react': 19.1.9 - '@types/react@19.1.15': + '@types/react-dom@19.1.9(@types/react@19.1.16)': + dependencies: + '@types/react': 19.1.16 + + '@types/react@19.1.16': + dependencies: + csstype: 3.1.3 + + '@types/react@19.1.9': dependencies: csstype: 3.1.3 '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.45.0 eslint: 9.36.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.1 eslint: 9.36.0(jiti@2.6.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.45.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 debug: 4.4.1 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.44.1': + '@typescript-eslint/scope-manager@8.45.0': dependencies: - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/visitor-keys': 8.45.0 - '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) debug: 4.4.1 eslint: 9.36.0(jiti@2.6.0) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.44.1': {} + '@typescript-eslint/types@8.43.0': {} + + '@typescript-eslint/types@8.45.0': {} - '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.45.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.44.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/project-service': 8.45.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) eslint: 9.36.0(jiti@2.6.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.44.1': + '@typescript-eslint/visitor-keys@8.45.0': dependencies: - '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/types': 8.45.0 eslint-visitor-keys: 4.2.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -6570,7 +7012,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@5.0.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': + '@vitejs/plugin-react@5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -6578,7 +7020,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -6590,13 +7032,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -6638,7 +7080,7 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.3 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -6654,7 +7096,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.1.6(typescript@5.9.2)': + '@vue/language-core@2.1.6(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.12 '@vue/compiler-dom': 3.5.13 @@ -6665,7 +7107,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 '@vue/shared@3.5.13': {} @@ -6758,20 +7200,20 @@ snapshots: axobject-query@4.1.0: {} - babel-plugin-jsx-dom-expressions@0.39.7(@babel/core@7.28.4): + babel-plugin-jsx-dom-expressions@0.39.7(@babel/core@7.28.0): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.28.4) - '@babel/types': 7.28.4 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.28.0) + '@babel/types': 7.28.0 html-entities: 2.3.3 - parse5: 7.3.0 + parse5: 7.2.1 validate-html-nesting: 1.2.2 - babel-preset-solid@1.9.5(@babel/core@7.28.4): + babel-preset-solid@1.9.5(@babel/core@7.28.0): dependencies: - '@babel/core': 7.28.4 - babel-plugin-jsx-dom-expressions: 0.39.7(@babel/core@7.28.4) + '@babel/core': 7.28.0 + babel-plugin-jsx-dom-expressions: 0.39.7(@babel/core@7.28.0) balanced-match@1.0.2: {} @@ -6838,7 +7280,7 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.4 + loupe: 3.1.3 pathval: 2.0.0 chalk@4.1.2: @@ -6869,7 +7311,7 @@ snapshots: domutils: 3.2.2 encoding-sniffer: 0.2.0 htmlparser2: 9.1.0 - parse5: 7.3.0 + parse5: 7.2.1 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 undici: 6.21.3 @@ -6960,7 +7402,7 @@ snapshots: cssstyle@5.3.1(postcss@8.5.6): dependencies: - '@asamuzakjp/css-color': 4.0.4 + '@asamuzakjp/css-color': 4.0.5 '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) css-tree: 3.1.0 transitivePeerDependencies: @@ -6984,6 +7426,10 @@ snapshots: ms: 2.1.3 optional: true + debug@4.4.0: + dependencies: + ms: 2.1.3 + debug@4.4.1: dependencies: ms: 2.1.3 @@ -7154,9 +7600,9 @@ snapshots: eslint: 9.36.0(jiti@2.6.0) eslint-compat-utils: 0.5.1(eslint@9.36.0(jiti@2.6.0)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0)): dependencies: - '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/types': 8.43.0 comment-parser: 1.4.1 debug: 4.4.1 eslint: 9.36.0(jiti@2.6.0) @@ -7167,12 +7613,12 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-n@17.23.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): + eslint-plugin-n@17.23.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) enhanced-resolve: 5.18.1 @@ -7183,76 +7629,76 @@ snapshots: globrex: 0.1.2 ignore: 5.3.2 semver: 7.7.2 - ts-declaration-location: 1.0.7(typescript@5.9.2) + ts-declaration-location: 1.0.7(typescript@5.9.3) transitivePeerDependencies: - typescript eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.36.0(jiti@2.6.0)): dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.4) + '@babel/core': 7.26.10 + '@babel/parser': 7.27.0 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) eslint: 9.36.0(jiti@2.6.0) hermes-parser: 0.25.1 - zod: 3.25.72 - zod-validation-error: 3.4.0(zod@3.25.72) + zod: 3.24.2 + zod-validation-error: 3.4.0(zod@3.24.2) transitivePeerDependencies: - supports-color - eslint-plugin-react-debug@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-debug@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-dom@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-hooks-extra@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7260,70 +7706,70 @@ snapshots: dependencies: eslint: 9.36.0(jiti@2.6.0) - eslint-plugin-react-naming-convention@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-naming-convention@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-web-api@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.36.0(jiti@2.6.0) string-ts: 2.2.1 ts-pattern: 5.8.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.53.1(eslint@9.36.0(jiti@2.6.0))(ts-api-utils@2.1.0(typescript@5.9.2))(typescript@5.9.2): - dependencies: - '@eslint-react/ast': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/core': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/eff': 1.53.1 - '@eslint-react/kit': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/shared': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@eslint-react/var': 1.53.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-react-x@2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/core': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/eff': 2.0.4 + '@eslint-react/kit': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/shared': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@eslint-react/var': 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.45.0 + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.36.0(jiti@2.6.0) - is-immutable-type: 5.0.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + is-immutable-type: 5.0.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) string-ts: 2.2.1 - ts-api-utils: 2.1.0(typescript@5.9.2) + ts-api-utils: 2.1.0(typescript@5.9.3) ts-pattern: 5.8.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0)): + eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0)): dependencies: eslint: 9.36.0(jiti@2.6.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint-scope@8.4.0: dependencies: @@ -7434,6 +7880,10 @@ snapshots: dependencies: walk-up-path: 4.0.0 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -7539,6 +7989,8 @@ snapshots: dependencies: is-glob: 4.0.3 + globals@11.12.0: {} + globals@14.0.0: {} globals@15.15.0: {} @@ -7656,13 +8108,13 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-immutable-type@5.0.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): + is-immutable-type@5.0.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.36.0(jiti@2.6.0) - ts-api-utils: 2.1.0(typescript@5.9.2) - ts-declaration-location: 1.0.7(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + ts-declaration-location: 1.0.7(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7705,6 +8157,8 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.2 + jiti@2.4.2: {} + jiti@2.6.0: {} jju@1.4.0: {} @@ -7724,7 +8178,7 @@ snapshots: jsdom@27.0.0(postcss@8.5.6): dependencies: - '@asamuzakjp/dom-selector': 6.5.5 + '@asamuzakjp/dom-selector': 6.5.6 cssstyle: 5.3.1(postcss@8.5.6) data-urls: 6.0.0 decimal.js: 10.5.0 @@ -7780,7 +8234,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.64.1(@types/node@24.3.1)(typescript@5.9.2): + knip@5.64.1(@types/node@24.6.0)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 '@types/node': 24.6.0 @@ -7794,7 +8248,7 @@ snapshots: picomatch: 4.0.3 smol-toml: 1.4.2 strip-json-comments: 5.0.2 - typescript: 5.9.2 + typescript: 5.9.3 zod: 4.1.11 kolorist@1.8.0: {} @@ -7838,9 +8292,11 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + loupe@3.1.3: {} + loupe@3.1.4: {} - lru-cache@11.2.1: {} + lru-cache@11.2.2: {} lru-cache@5.1.1: dependencies: @@ -7960,7 +8416,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nx@21.5.3: + nx@21.6.2: dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -7998,16 +8454,16 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 21.5.3 - '@nx/nx-darwin-x64': 21.5.3 - '@nx/nx-freebsd-x64': 21.5.3 - '@nx/nx-linux-arm-gnueabihf': 21.5.3 - '@nx/nx-linux-arm64-gnu': 21.5.3 - '@nx/nx-linux-arm64-musl': 21.5.3 - '@nx/nx-linux-x64-gnu': 21.5.3 - '@nx/nx-linux-x64-musl': 21.5.3 - '@nx/nx-win32-arm64-msvc': 21.5.3 - '@nx/nx-win32-x64-msvc': 21.5.3 + '@nx/nx-darwin-arm64': 21.5.2 + '@nx/nx-darwin-x64': 21.5.2 + '@nx/nx-freebsd-x64': 21.5.2 + '@nx/nx-linux-arm-gnueabihf': 21.5.2 + '@nx/nx-linux-arm64-gnu': 21.5.2 + '@nx/nx-linux-arm64-musl': 21.5.2 + '@nx/nx-linux-x64-gnu': 21.5.2 + '@nx/nx-linux-x64-musl': 21.5.2 + '@nx/nx-win32-arm64-msvc': 21.5.2 + '@nx/nx-win32-x64-msvc': 21.5.2 transitivePeerDependencies: - debug @@ -8108,15 +8564,15 @@ snapshots: parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 - parse5: 7.3.0 + parse5: 7.2.1 parse5-parser-stream@7.1.2: dependencies: - parse5: 7.3.0 + parse5: 7.2.1 - parse5@7.3.0: + parse5@7.2.1: dependencies: - entities: 6.0.1 + entities: 4.5.0 parse5@7.3.0: dependencies: @@ -8140,6 +8596,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + picomatch@4.0.3: {} pify@4.0.1: {} @@ -8192,6 +8650,11 @@ snapshots: queue-microtask@1.2.3: {} + react-dom@19.1.0(react@19.1.1): + dependencies: + react: 19.1.1 + scheduler: 0.26.0 + react-dom@19.1.1(react@19.1.1): dependencies: react: 19.1.1 @@ -8367,27 +8830,42 @@ snapshots: dependencies: bytes-iec: 3.1.1 chokidar: 4.0.3 - jiti: 2.6.0 + jiti: 2.4.2 lilconfig: 3.1.3 nanospinner: 1.2.2 picocolors: 1.1.1 - tinyglobby: 0.2.15 + tinyglobby: 0.2.12 slash@3.0.0: {} smol-toml@1.4.2: {} + solid-js@1.9.7: + dependencies: + csstype: 3.1.3 + seroval: 1.3.2 + seroval-plugins: 1.3.2(seroval@1.3.2) + solid-js@1.9.9: dependencies: csstype: 3.1.3 seroval: 1.3.2 seroval-plugins: 1.3.2(seroval@1.3.2) + solid-refresh@0.6.3(solid-js@1.9.7): + dependencies: + '@babel/generator': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/types': 7.28.0 + solid-js: 1.9.7 + transitivePeerDependencies: + - supports-color + solid-refresh@0.6.3(solid-js@1.9.9): dependencies: - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.0 '@babel/helper-module-imports': 7.27.1 - '@babel/types': 7.28.4 + '@babel/types': 7.28.0 solid-js: 1.9.9 transitivePeerDependencies: - supports-color @@ -8492,6 +8970,16 @@ snapshots: tinyexec@0.3.2: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -8503,11 +8991,11 @@ snapshots: tinyspy@4.0.3: {} - tldts-core@7.0.15: {} + tldts-core@7.0.16: {} - tldts@7.0.15: + tldts@7.0.16: dependencies: - tldts-core: 7.0.15 + tldts-core: 7.0.16 tmp@0.2.3: {} @@ -8517,7 +9005,7 @@ snapshots: tough-cookie@6.0.0: dependencies: - tldts: 7.0.15 + tldts: 7.0.16 tr46@0.0.3: {} @@ -8527,20 +9015,20 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - ts-declaration-location@1.0.7(typescript@5.9.2): + ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: picomatch: 4.0.3 - typescript: 5.9.2 + typescript: 5.9.3 ts-pattern@5.8.0: {} - tsconfck@3.1.5(typescript@5.9.2): + tsconfck@3.1.5(typescript@5.9.3): optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 tsconfig-paths@4.2.0: dependencies: @@ -8562,38 +9050,38 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2))): + typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3))): dependencies: - typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.2)) + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.3)) yaml: 2.8.0 - typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2)): + typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3)): dependencies: - typedoc: 0.27.9(typescript@5.9.2) + typedoc: 0.27.9(typescript@5.9.3) - typedoc@0.27.9(typescript@5.9.2): + typedoc@0.27.9(typescript@5.9.3): dependencies: '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.9.2 + typescript: 5.9.3 yaml: 2.8.0 - typescript-eslint@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): + typescript-eslint@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) eslint: 9.36.0(jiti@2.6.0) - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color typescript@5.4.2: {} - typescript@5.9.2: {} + typescript@5.9.3: {} uc.micro@2.1.0: {} @@ -8649,13 +9137,13 @@ snapshots: validate-html-nesting@1.2.2: {} - vite-node@3.2.4(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -8670,56 +9158,71 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@24.3.1)(rollup@4.44.1)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-dts@4.2.3(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@24.6.0) '@rollup/pluginutils': 5.1.4(rollup@4.44.1) '@volar/typescript': 2.4.12 - '@vue/language-core': 2.1.6(typescript@5.9.2) + '@vue/language-core': 2.1.6(typescript@5.9.3) compare-versions: 6.1.1 debug: 4.4.1 kolorist: 1.8.0 local-pkg: 0.5.1 magic-string: 0.30.17 - typescript: 5.9.2 + typescript: 5.9.3 optionalDependencies: - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-externalize-deps@0.9.0(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.7)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.0 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.5(@babel/core@7.28.4) + babel-preset-solid: 1.9.5(@babel/core@7.28.0) + merge-anything: 5.1.7 + solid-js: 1.9.7 + solid-refresh: 0.6.3(solid-js@1.9.7) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + optionalDependencies: + '@testing-library/jest-dom': 6.9.0 + transitivePeerDependencies: + - supports-color + + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + dependencies: + '@babel/core': 7.28.0 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.5(@babel/core@7.28.0) merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.0.6(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) optionalDependencies: '@testing-library/jest-dom': 6.9.0 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 - tsconfck: 3.1.5(typescript@5.9.2) + tsconfck: 3.1.5(typescript@5.9.3) optionalDependencies: - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): + vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.3) @@ -8734,15 +9237,15 @@ snapshots: tsx: 4.19.3 yaml: 2.8.0 - vitefu@1.0.6(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vitefu@1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): optionalDependencies: - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vitest@3.2.4(@types/node@24.3.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0): + vitest@3.2.4(@types/node@24.6.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -8753,18 +9256,18 @@ snapshots: expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.2 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.15 + tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.7(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.3.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.3.1 + '@types/node': 24.6.0 jsdom: 27.0.0(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -8873,10 +9376,10 @@ snapshots: zimmerframe@1.1.2: {} - zod-validation-error@3.4.0(zod@3.25.72): + zod-validation-error@3.4.0(zod@3.24.2): dependencies: - zod: 3.25.72 + zod: 3.24.2 - zod@3.25.72: {} + zod@3.24.2: {} zod@4.1.11: {} From 0fe793958c67fba9f900e38b2bc7d26b4a08aa2f Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Wed, 1 Oct 2025 12:57:55 -0500 Subject: [PATCH 40/50] clean up retry error tests --- examples/react/asyncBatch/src/index.tsx | 2 +- examples/react/useAsyncBatcher/src/index.tsx | 2 +- .../react/useAsyncQueuedState/src/index.tsx | 2 +- examples/react/useAsyncQueuer/src/index.tsx | 2 +- examples/react/useAsyncRetryer/package.json | 2 +- examples/react/useAsyncRetryer/src/index.tsx | 6 +- examples/solid/asyncBatch/src/index.tsx | 2 +- .../solid/createAsyncBatcher/src/index.tsx | 2 +- package.json | 2 +- packages/pacer/src/async-batcher.ts | 15 +- packages/pacer/src/async-debouncer.ts | 6 +- packages/pacer/src/async-queuer.ts | 6 +- packages/pacer/src/async-rate-limiter.ts | 18 +- packages/pacer/src/async-retryer.ts | 12 +- packages/pacer/src/async-throttler.ts | 6 +- packages/pacer/tests/async-batcher.test.ts | 18 +- packages/pacer/tests/async-retryer.test.ts | 28 +- .../src/async-batcher/useAsyncBatcher.ts | 2 +- .../src/async-debouncer/useAsyncDebouncer.ts | 2 +- .../src/async-queuer/useAsyncQueuer.ts | 2 +- .../async-rate-limiter/useAsyncRateLimiter.ts | 2 +- .../src/async-retryer/useAsyncRetryer.ts | 2 +- .../src/async-throttler/useAsyncThrottler.ts | 2 +- .../react-pacer/src/batcher/useBatcher.ts | 2 +- .../react-pacer/src/debouncer/useDebouncer.ts | 2 +- .../src/provider/PacerProvider.tsx | 16 +- packages/react-pacer/src/queuer/useQueuer.ts | 2 +- .../src/rate-limiter/useRateLimiter.ts | 2 +- .../react-pacer/src/throttler/useThrottler.ts | 2 +- pnpm-lock.yaml | 452 ++++++++---------- 30 files changed, 289 insertions(+), 332 deletions(-) diff --git a/examples/react/asyncBatch/src/index.tsx b/examples/react/asyncBatch/src/index.tsx index be35e2b1..10e19a77 100644 --- a/examples/react/asyncBatch/src/index.tsx +++ b/examples/react/asyncBatch/src/index.tsx @@ -53,7 +53,7 @@ function App() { } catch (error: any) { setErrors((prev) => [ ...prev, - `Error: ${error.message} (${new Date().toLocaleTimeString()})`, + `Error: ${error} (${new Date().toLocaleTimeString()})`, ]) setErrorCount((prev) => prev + 1) console.error('Batch failed:', error) diff --git a/examples/react/useAsyncBatcher/src/index.tsx b/examples/react/useAsyncBatcher/src/index.tsx index 7ebff2dc..95004f53 100644 --- a/examples/react/useAsyncBatcher/src/index.tsx +++ b/examples/react/useAsyncBatcher/src/index.tsx @@ -61,7 +61,7 @@ function App() { console.error('Batch failed:', error) setErrors((prev) => [ ...prev, - `Error: ${error.message} (${new Date().toLocaleTimeString()})`, + `Error: ${error} (${new Date().toLocaleTimeString()})`, ]) }, onSettled: (batch, batcher) => { diff --git a/examples/react/useAsyncQueuedState/src/index.tsx b/examples/react/useAsyncQueuedState/src/index.tsx index 0153e792..0c2e5ead 100644 --- a/examples/react/useAsyncQueuedState/src/index.tsx +++ b/examples/react/useAsyncQueuedState/src/index.tsx @@ -31,7 +31,7 @@ function App() { asyncQueuer.store.state.rejectionCount, ) }, - onError: (error: unknown, item: Item, asyncQueuer) => { + onError: (error, item: Item, asyncQueuer) => { console.error( `Error processing item: ${item}`, error, diff --git a/examples/react/useAsyncQueuer/src/index.tsx b/examples/react/useAsyncQueuer/src/index.tsx index b59f23a0..4c611363 100644 --- a/examples/react/useAsyncQueuer/src/index.tsx +++ b/examples/react/useAsyncQueuer/src/index.tsx @@ -31,7 +31,7 @@ function App() { asyncQueuer.store.state.rejectionCount, ) }, - onError: (error: unknown, item: Item, asyncQueuer) => { + onError: (error, item: Item, asyncQueuer) => { console.error( `Error processing item: ${item}`, error, diff --git a/examples/react/useAsyncRetryer/package.json b/examples/react/useAsyncRetryer/package.json index f99314ad..52ccc5b3 100644 --- a/examples/react/useAsyncRetryer/package.json +++ b/examples/react/useAsyncRetryer/package.json @@ -9,7 +9,7 @@ "test:types": "tsc" }, "dependencies": { - "@tanstack/react-pacer": "^0.14.0", + "@tanstack/react-pacer": "^0.16.4", "react": "^19.1.1", "react-dom": "^19.1.1" }, diff --git a/examples/react/useAsyncRetryer/src/index.tsx b/examples/react/useAsyncRetryer/src/index.tsx index b295750b..be0630f1 100644 --- a/examples/react/useAsyncRetryer/src/index.tsx +++ b/examples/react/useAsyncRetryer/src/index.tsx @@ -43,13 +43,13 @@ function App() { backoff: 'exponential', // Exponential backoff (1s, 2s, 4s, 8s, 16s) baseWait: 1000, // Start with 1 second wait onRetry: (attempt, error) => { - console.log(`Retry attempt ${attempt} after error:`, error.message) + console.log(`Retry attempt ${attempt} after error:`, error) }, onError: (error) => { - console.error('Request failed:', error.message) + console.error('Request failed:', error) }, onLastError: (error) => { - console.error('All retries failed:', error.message) + console.error('All retries failed:', error) setUserData(null) }, onSuccess: (result) => { diff --git a/examples/solid/asyncBatch/src/index.tsx b/examples/solid/asyncBatch/src/index.tsx index 9d6c3435..9e4ee525 100644 --- a/examples/solid/asyncBatch/src/index.tsx +++ b/examples/solid/asyncBatch/src/index.tsx @@ -52,7 +52,7 @@ function App() { } catch (error: any) { setErrors((prev) => [ ...prev, - `Error: ${error.message} (${new Date().toLocaleTimeString()})`, + `Error: ${error} (${new Date().toLocaleTimeString()})`, ]) setErrorCount((prev) => prev + 1) console.error('Batch failed:', error) diff --git a/examples/solid/createAsyncBatcher/src/index.tsx b/examples/solid/createAsyncBatcher/src/index.tsx index 1f40d553..01c4b412 100644 --- a/examples/solid/createAsyncBatcher/src/index.tsx +++ b/examples/solid/createAsyncBatcher/src/index.tsx @@ -61,7 +61,7 @@ function App() { console.error('Batch failed:', error) setErrors((prev) => [ ...prev, - `Error: ${error.message} (${new Date().toLocaleTimeString()})`, + `Error: ${error} (${new Date().toLocaleTimeString()})`, ]) }, onSettled: (batch, batcher) => { diff --git a/package.json b/package.json index c83f0a74..d8f21a2f 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "@svitejs/changesets-changelog-github-compact": "^1.2.0", "@tanstack/config": "0.20.3", "@testing-library/jest-dom": "^6.9.0", - "@types/node": "^24.6.0", + "@types/node": "^24.6.1", "eslint": "^9.36.0", "eslint-plugin-unused-imports": "^4.2.0", "fast-glob": "^3.3.3", diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 04b5c38e..6d8207ec 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -1,8 +1,8 @@ import { Store } from '@tanstack/store' import { AsyncRetryer } from './async-retryer' -import type { AsyncRetryerOptions } from './async-retryer' import { createKey, parseFunctionOrValue } from './utils' import { emitChange, pacerEventClient } from './event-client' +import type { AsyncRetryerOptions } from './async-retryer' import type { OptionalKeys } from './types' export interface AsyncBatcherState { @@ -116,7 +116,7 @@ export interface AsyncBatcherOptions { * This can be used alongside throwOnError - the handler will be called before any error is thrown. */ onError?: ( - error: unknown, + error: Error, batch: Array, batcher: AsyncBatcher, ) => void @@ -314,8 +314,12 @@ export class AsyncBatcher { /** * Adds an item to the async batcher * If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed + * + * @returns The result from the batch function, or undefined if an error occurred and was handled by onError + * + * @throws The error from the batch function if no onError handler is configured or throwOnError is true */ - addItem = (item: TValue): void => { + addItem = async (item: TValue): Promise => { this.#setState({ items: [...this.store.state.items, item], isPending: this.options.wait !== Infinity, @@ -327,10 +331,11 @@ export class AsyncBatcher { this.options.getShouldExecute(this.store.state.items, this) if (shouldProcess) { - this.#execute() + return await this.#execute() } else if (this.options.wait !== Infinity) { this.#clearTimeout() // clear any pending timeout to replace it with a new one this.#timeoutId = setTimeout(() => this.#execute(), this.#getWait()) + await new Promise((resolve) => setTimeout(resolve, this.#getWait())) } } @@ -373,7 +378,7 @@ export class AsyncBatcher { failedItems: [...this.store.state.failedItems, ...batch], totalItemsFailed: this.store.state.totalItemsFailed + batch.length, }) - this.options.onError?.(error, batch, this) + this.options.onError?.(error as Error, batch, this) if (this.options.throwOnError) { throw error } diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index 11628673..8b26ad36 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -1,8 +1,8 @@ import { Store } from '@tanstack/store' import { AsyncRetryer } from './async-retryer' -import type { AsyncRetryerOptions } from './async-retryer' import { createKey, parseFunctionOrValue } from './utils' import { emitChange, pacerEventClient } from './event-client' +import type { AsyncRetryerOptions } from './async-retryer' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncDebouncerState { @@ -99,7 +99,7 @@ export interface AsyncDebouncerOptions { * This can be used alongside throwOnError - the handler will be called before any error is thrown. */ onError?: ( - error: unknown, + error: Error, args: Parameters, debouncer: AsyncDebouncer, ) => void @@ -356,7 +356,7 @@ export class AsyncDebouncer { this.#setState({ errorCount: this.store.state.errorCount + 1, }) - this.options.onError?.(error, args, this) + this.options.onError?.(error as Error, args, this) if (this.options.throwOnError) { throw error } diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index f86b87a6..7a2f60ce 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -1,8 +1,8 @@ import { Store } from '@tanstack/store' import { AsyncRetryer } from './async-retryer' -import type { AsyncRetryerOptions } from './async-retryer' import { createKey, parseFunctionOrValue } from './utils' import { emitChange, pacerEventClient } from './event-client' +import type { AsyncRetryerOptions } from './async-retryer' import type { OptionalKeys } from './types' import type { QueuePosition } from './queuer' @@ -158,7 +158,7 @@ export interface AsyncQueuerOptions { * If provided, the handler will be called with the error and queuer instance. * This can be used alongside throwOnError - the handler will be called before any error is thrown. */ - onError?: (error: unknown, item: TValue, queuer: AsyncQueuer) => void + onError?: (error: Error, item: TValue, queuer: AsyncQueuer) => void /** * Callback fired whenever an item expires in the queuer */ @@ -586,7 +586,7 @@ export class AsyncQueuer { this.#setState({ errorCount: this.store.state.errorCount + 1, }) - this.options.onError?.(error, item, this) + this.options.onError?.(error as Error, item, this) if (this.options.throwOnError) { throw error } diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index 4966e143..14ce4126 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -1,8 +1,8 @@ import { Store } from '@tanstack/store' import { AsyncRetryer } from './async-retryer' -import type { AsyncRetryerOptions } from './async-retryer' import { createKey, parseFunctionOrValue } from './utils' import { emitChange, pacerEventClient } from './event-client' +import type { AsyncRetryerOptions } from './async-retryer' import type { AnyAsyncFunction } from './types' export interface AsyncRateLimiterState { @@ -99,7 +99,7 @@ export interface AsyncRateLimiterOptions { * This can be used alongside throwOnError - the handler will be called before any error is thrown. */ onError?: ( - error: unknown, + error: Error, args: Parameters, rateLimiter: AsyncRateLimiter, ) => void @@ -228,7 +228,6 @@ export class AsyncRateLimiter { >(getDefaultAsyncRateLimiterState()) key: string options: AsyncRateLimiterOptions - asyncRetryer: AsyncRetryer #timeoutIds: Set = new Set() constructor( @@ -241,10 +240,6 @@ export class AsyncRateLimiter { ...initialOptions, throwOnError: initialOptions.throwOnError ?? !initialOptions.onError, } - this.asyncRetryer = new AsyncRetryer( - this.fn, - this.options.asyncRetryerOptions, - ) this.#setState(this.options.initialState ?? {}) for (const executionTime of this.#getExecutionTimesInWindow()) { this.#setCleanupTimeout(executionTime) @@ -374,7 +369,12 @@ export class AsyncRateLimiter { }) try { - const result = await this.asyncRetryer.execute(...args) // EXECUTE! + // Create a new AsyncRetryer for this execution to avoid cancelling concurrent executions + const asyncRetryer = new AsyncRetryer( + this.fn, + this.options.asyncRetryerOptions, + ) + const result = await asyncRetryer.execute(...args) // EXECUTE! this.#setCleanupTimeout(now) this.#setState({ successCount: this.store.state.successCount + 1, @@ -385,7 +385,7 @@ export class AsyncRateLimiter { this.#setState({ errorCount: this.store.state.errorCount + 1, }) - this.options.onError?.(error, args, this) + this.options.onError?.(error as Error, args, this) if (this.options.throwOnError) { throw error } diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts index f1a905f3..eeb84d25 100644 --- a/packages/pacer/src/async-retryer.ts +++ b/packages/pacer/src/async-retryer.ts @@ -88,7 +88,7 @@ export interface AsyncRetryerOptions { * Callback invoked when any error occurs during execution (including retries) */ onError?: ( - error: unknown, + error: Error, args: Parameters, retryer: AsyncRetryer, ) => void @@ -315,6 +315,8 @@ export class AsyncRetryer { } result = (await this.fn(...args)) as ReturnType + // Check if cancelled during execution + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (signal.aborted) { return undefined as any } @@ -361,9 +363,7 @@ export class AsyncRetryer { }) if (signal.aborted) { // When cancelled during retry wait, surface the last error exactly once - if (lastError) { - this.options.onError?.(lastError, args, this) - } + this.options.onError?.(lastError, args, this) return undefined as any } } @@ -375,8 +375,8 @@ export class AsyncRetryer { // Exhausted retries - finalize state this.#setState({ isExecuting: false }) - this.options.onLastError?.(lastError!, this) - this.options.onError?.(lastError!, args, this) + this.options.onLastError?.(lastError as Error, this) + this.options.onError?.(lastError as Error, args, this) this.options.onSettled?.(args, this) if ( diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index f414ddfd..502fb566 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -1,8 +1,8 @@ import { Store } from '@tanstack/store' import { AsyncRetryer } from './async-retryer' -import type { AsyncRetryerOptions } from './async-retryer' import { createKey, parseFunctionOrValue } from './utils' import { emitChange, pacerEventClient } from './event-client' +import type { AsyncRetryerOptions } from './async-retryer' import type { AnyAsyncFunction, OptionalKeys } from './types' export interface AsyncThrottlerState { @@ -104,7 +104,7 @@ export interface AsyncThrottlerOptions { * This can be used alongside throwOnError - the handler will be called before any error is thrown. */ onError?: ( - error: unknown, + error: Error, args: Parameters, asyncThrottler: AsyncThrottler, ) => void @@ -380,7 +380,7 @@ export class AsyncThrottler { this.#setState({ errorCount: this.store.state.errorCount + 1, }) - this.options.onError?.(error, args, this) + this.options.onError?.(error as Error, args, this) if (this.options.throwOnError) { throw error } diff --git a/packages/pacer/tests/async-batcher.test.ts b/packages/pacer/tests/async-batcher.test.ts index 4be62363..6ac6898c 100644 --- a/packages/pacer/tests/async-batcher.test.ts +++ b/packages/pacer/tests/async-batcher.test.ts @@ -71,20 +71,20 @@ describe('AsyncBatcher', () => { }) it('should track execution state during async processing', async () => { - let resolvePromise: (value: any) => void - const promise = new Promise((resolve) => { - resolvePromise = resolve - }) - const mockFn = vi.fn().mockReturnValue(promise) - const batcher = new AsyncBatcher(mockFn, { maxSize: 1 }) + const mockFn = vi.fn().mockResolvedValue('result') + const batcher = new AsyncBatcher(mockFn, { maxSize: 2 }) + // Add item without triggering execution (since maxSize is 2) batcher.addItem(1) + expect(batcher.store.state.isExecuting).toBe(false) + expect(batcher.store.state.status).toBe('populated') + + // Use flush to trigger execution and wait for completion + const executionPromise = batcher.flush() expect(batcher.store.state.isExecuting).toBe(true) expect(batcher.store.state.status).toBe('executing') - resolvePromise!('result') - await promise - + await executionPromise expect(batcher.store.state.isExecuting).toBe(false) expect(batcher.store.state.status).toBe('idle') }) diff --git a/packages/pacer/tests/async-retryer.test.ts b/packages/pacer/tests/async-retryer.test.ts index 8fbb81c3..77eb1e69 100644 --- a/packages/pacer/tests/async-retryer.test.ts +++ b/packages/pacer/tests/async-retryer.test.ts @@ -160,23 +160,17 @@ describe('AsyncRetryer', () => { }) it('should fail after exhausting all retries', async () => { - const error = new Error('Persistent failure') - const mockFn = vi.fn().mockRejectedValue(error) + const mockFn = vi.fn().mockRejectedValue(new Error('Persistent failure')) const retryer = new AsyncRetryer(mockFn, { maxAttempts: 2, - baseWait: 100, + baseWait: 0, // No delay to avoid timer issues throwOnError: 'last', }) - const executePromise = retryer.execute() + await expect(retryer.execute()).rejects.toThrow('Persistent failure') - // Complete first retry - await vi.runOnlyPendingTimersAsync() - vi.advanceTimersByTime(100) - - await expect(executePromise).rejects.toThrow('Persistent failure') expect(mockFn).toHaveBeenCalledTimes(2) - expect(retryer.store.state.lastError).toBe(error) + expect(retryer.store.state.lastError?.message).toBe('Persistent failure') expect(retryer.store.state.status).toBe('idle') }) }) @@ -275,23 +269,15 @@ describe('AsyncRetryer', () => { }) it('should throw after retries when throwOnError is true', async () => { - const error = new Error('Test error') - const mockFn = vi.fn().mockRejectedValue(error) + const mockFn = vi.fn().mockRejectedValue(new Error('Test error')) const retryer = new AsyncRetryer(mockFn, { maxAttempts: 3, - baseWait: 100, + baseWait: 0, // No delay to avoid timer issues throwOnError: true, }) - const executePromise = retryer.execute() - - // Advance through all retries - await vi.runOnlyPendingTimersAsync() - vi.advanceTimersByTime(100) // First retry - await vi.runOnlyPendingTimersAsync() - vi.advanceTimersByTime(200) // Second retry + await expect(retryer.execute()).rejects.toThrow('Test error') - await expect(executePromise).rejects.toThrow('Test error') expect(mockFn).toHaveBeenCalledTimes(3) // Should still retry but throw at end }) diff --git a/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts b/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts index c008aead..1d0f32c5 100644 --- a/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts +++ b/packages/react-pacer/src/async-batcher/useAsyncBatcher.ts @@ -1,12 +1,12 @@ import { useMemo, useState } from 'react' import { AsyncBatcher } from '@tanstack/pacer/async-batcher' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { AsyncBatcherOptions, AsyncBatcherState, } from '@tanstack/pacer/async-batcher' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncBatcher extends Omit, 'store'> { diff --git a/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts b/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts index 162ca21d..36b8ae99 100644 --- a/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts +++ b/packages/react-pacer/src/async-debouncer/useAsyncDebouncer.ts @@ -1,13 +1,13 @@ import { useEffect, useMemo, useState } from 'react' import { AsyncDebouncer } from '@tanstack/pacer/async-debouncer' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { AnyAsyncFunction } from '@tanstack/pacer/types' import type { AsyncDebouncerOptions, AsyncDebouncerState, } from '@tanstack/pacer/async-debouncer' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncDebouncer< TFn extends AnyAsyncFunction, diff --git a/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts b/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts index 4a3c2dc9..0d88f364 100644 --- a/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts +++ b/packages/react-pacer/src/async-queuer/useAsyncQueuer.ts @@ -1,12 +1,12 @@ import { useMemo, useState } from 'react' import { AsyncQueuer } from '@tanstack/pacer/async-queuer' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { AsyncQueuerOptions, AsyncQueuerState, } from '@tanstack/pacer/async-queuer' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncQueuer extends Omit, 'store'> { diff --git a/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts b/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts index ecb2a3ad..81bf9f6d 100644 --- a/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts +++ b/packages/react-pacer/src/async-rate-limiter/useAsyncRateLimiter.ts @@ -1,13 +1,13 @@ import { useMemo, useState } from 'react' import { AsyncRateLimiter } from '@tanstack/pacer/async-rate-limiter' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { AnyAsyncFunction } from '@tanstack/pacer/types' import type { AsyncRateLimiterOptions, AsyncRateLimiterState, } from '@tanstack/pacer/async-rate-limiter' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncRateLimiter< TFn extends AnyAsyncFunction, diff --git a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts index 77fd5743..95f5c67f 100644 --- a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts +++ b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts @@ -1,13 +1,13 @@ import { useEffect, useMemo, useState } from 'react' import { AsyncRetryer } from '@tanstack/pacer/async-retryer' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { AnyAsyncFunction } from '@tanstack/pacer/types' import type { AsyncRetryerOptions, AsyncRetryerState, } from '@tanstack/pacer/async-retryer' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncRetryer extends Omit, 'store'> { diff --git a/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts b/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts index c4590cbb..1f583c5c 100644 --- a/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts +++ b/packages/react-pacer/src/async-throttler/useAsyncThrottler.ts @@ -1,13 +1,13 @@ import { useEffect, useMemo, useState } from 'react' import { AsyncThrottler } from '@tanstack/pacer/async-throttler' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { AnyAsyncFunction } from '@tanstack/pacer/types' import type { AsyncThrottlerOptions, AsyncThrottlerState, } from '@tanstack/pacer/async-throttler' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactAsyncThrottler< TFn extends AnyAsyncFunction, diff --git a/packages/react-pacer/src/batcher/useBatcher.ts b/packages/react-pacer/src/batcher/useBatcher.ts index 13df5bae..b40d86e1 100644 --- a/packages/react-pacer/src/batcher/useBatcher.ts +++ b/packages/react-pacer/src/batcher/useBatcher.ts @@ -1,9 +1,9 @@ import { useMemo, useState } from 'react' import { Batcher } from '@tanstack/pacer/batcher' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { BatcherOptions, BatcherState } from '@tanstack/pacer/batcher' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactBatcher extends Omit, 'store'> { diff --git a/packages/react-pacer/src/debouncer/useDebouncer.ts b/packages/react-pacer/src/debouncer/useDebouncer.ts index 9c984fe3..cb9030dc 100644 --- a/packages/react-pacer/src/debouncer/useDebouncer.ts +++ b/packages/react-pacer/src/debouncer/useDebouncer.ts @@ -1,13 +1,13 @@ import { useEffect, useMemo, useState } from 'react' import { Debouncer } from '@tanstack/pacer/debouncer' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { DebouncerOptions, DebouncerState, } from '@tanstack/pacer/debouncer' import type { AnyFunction } from '@tanstack/pacer/types' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactDebouncer extends Omit, 'store'> { diff --git a/packages/react-pacer/src/provider/PacerProvider.tsx b/packages/react-pacer/src/provider/PacerProvider.tsx index 0b29a849..06df8207 100644 --- a/packages/react-pacer/src/provider/PacerProvider.tsx +++ b/packages/react-pacer/src/provider/PacerProvider.tsx @@ -1,4 +1,5 @@ -import React, { createContext, useContext, ReactNode } from 'react' +import React, { createContext, useContext, useMemo } from 'react' +import type { ReactNode } from 'react' import type { AnyAsyncFunction, AnyFunction, @@ -40,13 +41,18 @@ export interface PacerProviderProps { defaultOptions?: PacerProviderOptions } +const DEFAULT_OPTIONS: PacerProviderOptions = {} + export function PacerProvider({ children, - defaultOptions = {}, + defaultOptions = DEFAULT_OPTIONS, }: PacerProviderProps) { - const contextValue: PacerContextValue = { - defaultOptions, - } + const contextValue: PacerContextValue = useMemo( + () => ({ + defaultOptions, + }), + [defaultOptions], + ) return ( diff --git a/packages/react-pacer/src/queuer/useQueuer.ts b/packages/react-pacer/src/queuer/useQueuer.ts index 11d1cc40..6bedc088 100644 --- a/packages/react-pacer/src/queuer/useQueuer.ts +++ b/packages/react-pacer/src/queuer/useQueuer.ts @@ -1,9 +1,9 @@ import { useMemo, useState } from 'react' import { Queuer } from '@tanstack/pacer/queuer' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { QueuerOptions, QueuerState } from '@tanstack/pacer/queuer' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactQueuer extends Omit, 'store'> { diff --git a/packages/react-pacer/src/rate-limiter/useRateLimiter.ts b/packages/react-pacer/src/rate-limiter/useRateLimiter.ts index 9b0d0b5c..dfc2a4c5 100644 --- a/packages/react-pacer/src/rate-limiter/useRateLimiter.ts +++ b/packages/react-pacer/src/rate-limiter/useRateLimiter.ts @@ -1,13 +1,13 @@ import { useMemo, useState } from 'react' import { RateLimiter } from '@tanstack/pacer/rate-limiter' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { RateLimiterOptions, RateLimiterState, } from '@tanstack/pacer/rate-limiter' import type { AnyFunction } from '@tanstack/pacer/types' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactRateLimiter extends Omit, 'store'> { diff --git a/packages/react-pacer/src/throttler/useThrottler.ts b/packages/react-pacer/src/throttler/useThrottler.ts index ade211c0..327b5ba1 100644 --- a/packages/react-pacer/src/throttler/useThrottler.ts +++ b/packages/react-pacer/src/throttler/useThrottler.ts @@ -1,13 +1,13 @@ import { useEffect, useMemo, useState } from 'react' import { Throttler } from '@tanstack/pacer/throttler' import { useStore } from '@tanstack/react-store' +import { useDefaultPacerOptions } from '../provider/PacerProvider' import type { Store } from '@tanstack/react-store' import type { AnyFunction } from '@tanstack/pacer/types' import type { ThrottlerOptions, ThrottlerState, } from '@tanstack/pacer/throttler' -import { useDefaultPacerOptions } from '../provider/PacerProvider' export interface ReactThrottler extends Omit, 'store'> { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 289759a3..3ac63607 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.29.7 - version: 2.29.7(@types/node@24.6.0) + version: 2.29.7(@types/node@24.6.1) '@faker-js/faker': specifier: ^10.0.0 version: 10.0.0 @@ -22,13 +22,13 @@ importers: version: 1.2.0 '@tanstack/config': specifier: 0.20.3 - version: 0.20.3(@types/node@24.6.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 0.20.3(@types/node@24.6.1)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) '@testing-library/jest-dom': specifier: ^6.9.0 version: 6.9.0 '@types/node': - specifier: ^24.6.0 - version: 24.6.0 + specifier: ^24.6.1 + version: 24.6.1 eslint: specifier: ^9.36.0 version: 9.36.0(jiti@2.6.0) @@ -43,7 +43,7 @@ importers: version: 27.0.0(postcss@8.5.6) knip: specifier: ^5.64.1 - version: 5.64.1(@types/node@24.6.0)(typescript@5.9.3) + version: 5.64.1(@types/node@24.6.1)(typescript@5.9.3) markdown-link-extractor: specifier: ^4.0.2 version: 4.0.2 @@ -73,10 +73,10 @@ importers: version: 5.9.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.6.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0) + version: 3.2.4(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncBatch: dependencies: @@ -98,10 +98,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncDebounce: dependencies: @@ -123,10 +123,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncRateLimit: dependencies: @@ -148,10 +148,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/asyncThrottle: dependencies: @@ -173,10 +173,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/batch: dependencies: @@ -198,10 +198,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/debounce: dependencies: @@ -223,10 +223,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/queue: dependencies: @@ -254,10 +254,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/rateLimit: dependencies: @@ -279,10 +279,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-debounced-prefetch: dependencies: @@ -310,10 +310,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-queued-prefetch: dependencies: @@ -341,10 +341,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/react-query-throttled-prefetch: dependencies: @@ -372,10 +372,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/throttle: dependencies: @@ -397,10 +397,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatchedCallback: dependencies: @@ -422,10 +422,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncBatcher: dependencies: @@ -447,10 +447,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncedCallback: dependencies: @@ -472,10 +472,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncDebouncer: dependencies: @@ -497,10 +497,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuedState: dependencies: @@ -522,10 +522,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncQueuer: dependencies: @@ -547,10 +547,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiter: dependencies: @@ -575,10 +575,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRateLimiterWithPersister: dependencies: @@ -603,16 +603,16 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncRetryer: dependencies: '@tanstack/react-pacer': - specifier: ^0.14.0 - version: 0.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^0.16.4 + version: link:../../../packages/react-pacer react: specifier: ^19.1.1 version: 19.1.1 @@ -628,10 +628,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useAsyncThrottler: dependencies: @@ -653,10 +653,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatchedCallback: dependencies: @@ -678,10 +678,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useBatcher: dependencies: @@ -703,10 +703,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedCallback: dependencies: @@ -728,10 +728,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedState: dependencies: @@ -753,10 +753,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncedValue: dependencies: @@ -778,10 +778,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useDebouncer: dependencies: @@ -803,10 +803,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedState: dependencies: @@ -828,10 +828,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuedValue: dependencies: @@ -853,10 +853,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuer: dependencies: @@ -887,10 +887,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useQueuerWithPersister: dependencies: @@ -915,10 +915,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedCallback: dependencies: @@ -940,10 +940,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedState: dependencies: @@ -965,10 +965,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimitedValue: dependencies: @@ -990,10 +990,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiter: dependencies: @@ -1018,10 +1018,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useRateLimiterWithPersister: dependencies: @@ -1046,10 +1046,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledCallback: dependencies: @@ -1071,10 +1071,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledState: dependencies: @@ -1096,10 +1096,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottledValue: dependencies: @@ -1121,10 +1121,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/useThrottler: dependencies: @@ -1146,10 +1146,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/react/util-comparison: dependencies: @@ -1177,10 +1177,10 @@ importers: version: 19.1.9(@types/react@19.1.16) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) examples/solid/asyncBatch: dependencies: @@ -1193,10 +1193,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncDebounce: dependencies: @@ -1209,10 +1209,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncRateLimit: dependencies: @@ -1225,10 +1225,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/asyncThrottle: dependencies: @@ -1241,10 +1241,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/batch: dependencies: @@ -1257,10 +1257,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncBatcher: dependencies: @@ -1273,10 +1273,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncDebouncer: dependencies: @@ -1289,10 +1289,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncQueuer: dependencies: @@ -1305,10 +1305,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncRateLimiter: dependencies: @@ -1321,10 +1321,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createAsyncThrottler: dependencies: @@ -1337,10 +1337,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createBatcher: dependencies: @@ -1353,10 +1353,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedSignal: dependencies: @@ -1369,10 +1369,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncedValue: dependencies: @@ -1385,10 +1385,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createDebouncer: dependencies: @@ -1401,10 +1401,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createQueuer: dependencies: @@ -1423,10 +1423,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedSignal: dependencies: @@ -1439,10 +1439,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimitedValue: dependencies: @@ -1455,10 +1455,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createRateLimiter: dependencies: @@ -1471,10 +1471,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledSignal: dependencies: @@ -1487,10 +1487,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottledValue: dependencies: @@ -1503,10 +1503,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/createThrottler: dependencies: @@ -1519,10 +1519,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/debounce: dependencies: @@ -1535,10 +1535,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/queue: dependencies: @@ -1557,10 +1557,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/rateLimit: dependencies: @@ -1573,10 +1573,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) examples/solid/throttle: dependencies: @@ -1589,10 +1589,10 @@ importers: devDependencies: vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/pacer: dependencies: @@ -1629,7 +1629,7 @@ importers: devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/react-pacer: dependencies: @@ -1651,7 +1651,7 @@ importers: version: 19.1.16 '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.6.0)) @@ -1685,7 +1685,7 @@ importers: version: 2.0.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 version: 19.1.0-rc.2(eslint@9.36.0(jiti@2.6.0)) @@ -1707,7 +1707,7 @@ importers: version: 1.9.9 vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages/solid-pacer-devtools: dependencies: @@ -1720,7 +1720,7 @@ importers: devDependencies: vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.7)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.7)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) packages: @@ -2819,10 +2819,6 @@ packages: resolution: {integrity: sha512-2g+PuGR3GuvvCiR3xZs+IMqAvnYU9bvH+jRml0BFBSxHBj22xFCTNvJWhvgj7uICFF9IchDkFUto91xDPMu5cg==} engines: {node: '>=18'} - '@tanstack/pacer@0.13.0': - resolution: {integrity: sha512-eCV3BIn+If4YGMgRbB315CvhyggmBhV85NmBH4uAA2kop6fOJh5GAWsvgsQOqYt0EFhHcjUwQ1eIhqw9aohuOQ==} - engines: {node: '>=18'} - '@tanstack/persister@0.1.1': resolution: {integrity: sha512-XUewm2+D0K84ZSuWm1oMHfqw/flmO7IzCc+316php/XChgbMe30DStp1cF2Uc4IV0cI0G4hDq2RX3+NTxTIvWg==} engines: {node: '>=18'} @@ -2846,13 +2842,6 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-pacer@0.14.0': - resolution: {integrity: sha512-K5wR61esBjnO+o5XnagE4twOUtNmNb6WF0+ARQRs68tViq4mNGwKuDHm0OuqAN+7Vq8k41horjiVAj24d6V1vw==} - engines: {node: '>=18'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - '@tanstack/react-persister@0.1.1': resolution: {integrity: sha512-bERMba9+dDOWKJLV5dR6+pKq+xRYyuCsK1Te5Ygs2WiXdvAVLMnNjJIOkIhZ9uihbQvyBIbYPAlb9sCfSgvYWg==} engines: {node: '>=18'} @@ -2871,12 +2860,6 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-store@0.7.5': - resolution: {integrity: sha512-A+WZtEnHZpvbKXm8qR+xndNKywBLez2KKKKEQc7w0Qs45GvY1LpRI3BTZNmELwEVim8+Apf99iEDH2J+MUIzlQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/react-store@0.7.7': resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} peerDependencies: @@ -2894,9 +2877,6 @@ packages: peerDependencies: solid-js: ^1.6.0 - '@tanstack/store@0.7.5': - resolution: {integrity: sha512-qd/OjkjaFRKqKU4Yjipaen/EOB9MyEg6Wr9fW103RBPACf1ZcKhbhcu2S5mj5IgdPib6xFIgCUti/mKVkl+fRw==} - '@tanstack/store@0.7.7': resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} @@ -2957,8 +2937,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.6.0': - resolution: {integrity: sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==} + '@types/node@24.6.1': + resolution: {integrity: sha512-ljvjjs3DNXummeIaooB4cLBKg2U6SPI6Hjra/9rRIy7CpM0HpLtG9HptkMKAb4HYWy5S7HUvJEuWgr/y0U8SHw==} '@types/react-dom@19.1.7': resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} @@ -5798,7 +5778,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@24.6.0)': + '@changesets/cli@2.29.7(@types/node@24.6.1)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -5814,7 +5794,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.1(@types/node@24.6.0) + '@inquirer/external-editor': 1.0.1(@types/node@24.6.1) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -6194,12 +6174,12 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} - '@inquirer/external-editor@1.0.1(@types/node@24.6.0)': + '@inquirer/external-editor@1.0.1(@types/node@24.6.1)': dependencies: chardet: 2.1.0 iconv-lite: 0.6.3 optionalDependencies: - '@types/node': 24.6.0 + '@types/node': 24.6.1 '@jest/diff-sequences@30.0.1': {} @@ -6265,23 +6245,23 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@microsoft/api-extractor-model@7.29.6(@types/node@24.6.0)': + '@microsoft/api-extractor-model@7.29.6(@types/node@24.6.1)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@24.6.0) + '@rushstack/node-core-library': 5.7.0(@types/node@24.6.1) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@24.6.0)': + '@microsoft/api-extractor@7.47.7(@types/node@24.6.1)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@24.6.0) + '@microsoft/api-extractor-model': 7.29.6(@types/node@24.6.1) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@24.6.0) + '@rushstack/node-core-library': 5.7.0(@types/node@24.6.1) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@24.6.0) - '@rushstack/ts-command-line': 4.22.6(@types/node@24.6.0) + '@rushstack/terminal': 0.14.0(@types/node@24.6.1) + '@rushstack/ts-command-line': 4.22.6(@types/node@24.6.1) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -6493,7 +6473,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true - '@rushstack/node-core-library@5.7.0(@types/node@24.6.0)': + '@rushstack/node-core-library@5.7.0(@types/node@24.6.1)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -6504,23 +6484,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 24.6.0 + '@types/node': 24.6.1 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@24.6.0)': + '@rushstack/terminal@0.14.0(@types/node@24.6.1)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@24.6.0) + '@rushstack/node-core-library': 5.7.0(@types/node@24.6.1) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.6.0 + '@types/node': 24.6.1 - '@rushstack/ts-command-line@4.22.6(@types/node@24.6.0)': + '@rushstack/ts-command-line@4.22.6(@types/node@24.6.1)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@24.6.0) + '@rushstack/terminal': 0.14.0(@types/node@24.6.1) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -6599,12 +6579,12 @@ snapshots: transitivePeerDependencies: - encoding - '@tanstack/config@0.20.3(@types/node@24.6.0)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/config@0.20.3(@types/node@24.6.1)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) '@tanstack/publish-config': 0.2.1 '@tanstack/typedoc-config': 0.2.1(typescript@5.9.3) - '@tanstack/vite-config': 0.3.0(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + '@tanstack/vite-config': 0.3.0(@types/node@24.6.1)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -6661,10 +6641,6 @@ snapshots: - supports-color - typescript - '@tanstack/pacer@0.13.0': - dependencies: - '@tanstack/store': 0.7.7 - '@tanstack/persister@0.1.1': {} '@tanstack/publish-config@0.2.1': @@ -6693,13 +6669,6 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-pacer@0.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@tanstack/pacer': 0.13.0 - '@tanstack/react-store': 0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - '@tanstack/react-persister@0.1.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/persister': 0.1.1 @@ -6717,13 +6686,6 @@ snapshots: '@tanstack/query-core': 5.90.2 react: 19.1.1 - '@tanstack/react-store@0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@tanstack/store': 0.7.5 - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - use-sync-external-store: 1.5.0(react@19.1.1) - '@tanstack/react-store@0.7.7(react-dom@19.1.0(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/store': 0.7.7 @@ -6745,8 +6707,6 @@ snapshots: '@tanstack/store': 0.7.7 solid-js: 1.9.9 - '@tanstack/store@0.7.5': {} - '@tanstack/store@0.7.7': {} '@tanstack/typedoc-config@0.2.1(typescript@5.9.3)': @@ -6757,12 +6717,12 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.3.0(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': + '@tanstack/vite-config@0.3.0(@types/node@24.6.1)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.44.1) - vite-plugin-dts: 4.2.3(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) - vite-plugin-externalize-deps: 0.9.0(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-dts: 4.2.3(@types/node@24.6.1)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite-plugin-externalize-deps: 0.9.0(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - rollup @@ -6822,7 +6782,7 @@ snapshots: '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 24.6.0 + '@types/node': 24.6.1 '@types/deep-eql@4.0.2': {} @@ -6836,7 +6796,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@24.6.0': + '@types/node@24.6.1': dependencies: undici-types: 7.13.0 @@ -7012,7 +6972,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@5.0.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': + '@vitejs/plugin-react@5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -7020,7 +6980,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -7032,13 +6992,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -8234,10 +8194,10 @@ snapshots: dependencies: json-buffer: 3.0.1 - knip@5.64.1(@types/node@24.6.0)(typescript@5.9.3): + knip@5.64.1(@types/node@24.6.1)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 24.6.0 + '@types/node': 24.6.1 fast-glob: 3.3.3 formatly: 0.3.0 jiti: 2.6.0 @@ -9137,13 +9097,13 @@ snapshots: validate-html-nesting@1.2.2: {} - vite-node@3.2.4(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -9158,9 +9118,9 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@24.6.0)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-dts@4.2.3(@types/node@24.6.1)(rollup@4.44.1)(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@24.6.0) + '@microsoft/api-extractor': 7.47.7(@types/node@24.6.1) '@rollup/pluginutils': 5.1.4(rollup@4.44.1) '@volar/typescript': 2.4.12 '@vue/language-core': 2.1.6(typescript@5.9.3) @@ -9171,17 +9131,17 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.3 optionalDependencies: - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-externalize-deps@0.9.0(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.7)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.7)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.28.0 '@types/babel__core': 7.20.5 @@ -9189,14 +9149,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.7 solid-refresh: 0.6.3(solid-js@1.9.7) - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) optionalDependencies: '@testing-library/jest-dom': 6.9.0 transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: '@babel/core': 7.28.0 '@types/babel__core': 7.20.5 @@ -9204,25 +9164,25 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vitefu: 1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vitefu: 1.0.6(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) optionalDependencies: '@testing-library/jest-dom': 6.9.0 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.9.3) optionalDependencies: - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): + vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.3) @@ -9231,21 +9191,21 @@ snapshots: rollup: 4.44.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.6.0 + '@types/node': 24.6.1 fsevents: 2.3.3 jiti: 2.6.0 tsx: 4.19.3 yaml: 2.8.0 - vitefu@1.0.6(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): + vitefu@1.0.6(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)): optionalDependencies: - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vitest@3.2.4(@types/node@24.6.0)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0): + vitest@3.2.4(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(tsx@4.19.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -9263,11 +9223,11 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.7(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.6.0)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.6.1)(jiti@2.6.0)(tsx@4.19.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.6.0 + '@types/node': 24.6.1 jsdom: 27.0.0(postcss@8.5.6) transitivePeerDependencies: - jiti From f23f1c83d69ef7a52237c68c78f68db3012deee8 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 14:33:33 +0000 Subject: [PATCH 41/50] ci: apply automated fixes --- .../reference/functions/pacerprovider.md | 2 +- .../functions/usedefaultpaceroptions.md | 2 +- .../reference/functions/usepacercontext.md | 2 +- .../interfaces/pacerprovideroptions.md | 24 +++++++++---------- .../interfaces/pacerproviderprops.md | 6 ++--- docs/reference/classes/asyncbatcher.md | 22 ++++++++++------- docs/reference/classes/asyncratelimiter.md | 20 ++++------------ docs/reference/functions/asyncbatch.md | 12 +++++++--- .../interfaces/asyncbatcheroptions.md | 2 +- .../interfaces/asyncdebounceroptions.md | 2 +- .../interfaces/asyncqueueroptions.md | 2 +- .../interfaces/asyncratelimiteroptions.md | 2 +- .../interfaces/asyncretryeroptions.md | 2 +- .../interfaces/asyncthrottleroptions.md | 2 +- 14 files changed, 52 insertions(+), 50 deletions(-) diff --git a/docs/framework/react/reference/functions/pacerprovider.md b/docs/framework/react/reference/functions/pacerprovider.md index 06e51a87..29b75d66 100644 --- a/docs/framework/react/reference/functions/pacerprovider.md +++ b/docs/framework/react/reference/functions/pacerprovider.md @@ -11,7 +11,7 @@ title: PacerProvider function PacerProvider(__namedParameters): Element ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:43](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L43) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:46](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L46) ## Parameters diff --git a/docs/framework/react/reference/functions/usedefaultpaceroptions.md b/docs/framework/react/reference/functions/usedefaultpaceroptions.md index a5fb75f6..bacbe354 100644 --- a/docs/framework/react/reference/functions/usedefaultpaceroptions.md +++ b/docs/framework/react/reference/functions/usedefaultpaceroptions.md @@ -11,7 +11,7 @@ title: useDefaultPacerOptions function useDefaultPacerOptions(): PacerProviderOptions ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:62](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L62) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:68](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L68) ## Returns diff --git a/docs/framework/react/reference/functions/usepacercontext.md b/docs/framework/react/reference/functions/usepacercontext.md index f5b38619..970e19ce 100644 --- a/docs/framework/react/reference/functions/usepacercontext.md +++ b/docs/framework/react/reference/functions/usepacercontext.md @@ -11,7 +11,7 @@ title: usePacerContext function usePacerContext(): null | PacerContextValue ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:58](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L58) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:64](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L64) ## Returns diff --git a/docs/framework/react/reference/interfaces/pacerprovideroptions.md b/docs/framework/react/reference/interfaces/pacerprovideroptions.md index f148c0bf..92ac77e5 100644 --- a/docs/framework/react/reference/interfaces/pacerprovideroptions.md +++ b/docs/framework/react/reference/interfaces/pacerprovideroptions.md @@ -7,7 +7,7 @@ title: PacerProviderOptions # Interface: PacerProviderOptions -Defined in: [react-pacer/src/provider/PacerProvider.tsx:18](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L18) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:19](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L19) ## Properties @@ -17,7 +17,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:18](https://github.com/T optional asyncBatcher: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:19](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L19) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:20](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L20) *** @@ -27,7 +27,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:19](https://github.com/T optional asyncDebouncer: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:20](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L20) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:21](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L21) *** @@ -37,7 +37,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:20](https://github.com/T optional asyncQueuer: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:21](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L21) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:22](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L22) *** @@ -47,7 +47,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:21](https://github.com/T optional asyncRateLimiter: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:22](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L22) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:23](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L23) *** @@ -57,7 +57,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:22](https://github.com/T optional asyncRetryer: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:23](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L23) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:24](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L24) *** @@ -67,7 +67,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:23](https://github.com/T optional asyncThrottler: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:24](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L24) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:25](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L25) *** @@ -77,7 +77,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:24](https://github.com/T optional batcher: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:25](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L25) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:26](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L26) *** @@ -87,7 +87,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:25](https://github.com/T optional debouncer: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:26](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L26) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:27](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L27) *** @@ -97,7 +97,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:26](https://github.com/T optional queuer: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:27](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L27) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:28](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L28) *** @@ -107,7 +107,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:27](https://github.com/T optional rateLimiter: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:28](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L28) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:29](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L29) *** @@ -117,4 +117,4 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:28](https://github.com/T optional throttler: Partial>; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:29](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L29) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:30](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L30) diff --git a/docs/framework/react/reference/interfaces/pacerproviderprops.md b/docs/framework/react/reference/interfaces/pacerproviderprops.md index 5841e9d6..305b231b 100644 --- a/docs/framework/react/reference/interfaces/pacerproviderprops.md +++ b/docs/framework/react/reference/interfaces/pacerproviderprops.md @@ -7,7 +7,7 @@ title: PacerProviderProps # Interface: PacerProviderProps -Defined in: [react-pacer/src/provider/PacerProvider.tsx:38](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L38) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:39](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L39) ## Properties @@ -17,7 +17,7 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:38](https://github.com/T children: ReactNode; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:39](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L39) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:40](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L40) *** @@ -27,4 +27,4 @@ Defined in: [react-pacer/src/provider/PacerProvider.tsx:39](https://github.com/T optional defaultOptions: PacerProviderOptions; ``` -Defined in: [react-pacer/src/provider/PacerProvider.tsx:40](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L40) +Defined in: [react-pacer/src/provider/PacerProvider.tsx:41](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/provider/PacerProvider.tsx#L41) diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index 138e88cb..6104a7de 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -179,10 +179,10 @@ Emits a change event for the async batcher instance. Mostly useful for devtools. ### addItem() ```ts -addItem(item): void +addItem(item): Promise ``` -Defined in: [async-batcher.ts:318](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L318) +Defined in: [async-batcher.ts:322](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L322) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -195,7 +195,13 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the #### Returns -`void` +`Promise`\<`any`\> + +The result from the batch function, or undefined if an error occurred and was handled by onError + +#### Throws + +The error from the batch function if no onError handler is configured or throwOnError is true *** @@ -205,7 +211,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the clear(): void ``` -Defined in: [async-batcher.ts:419](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L419) +Defined in: [async-batcher.ts:424](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L424) Removes all items from the async batcher @@ -221,7 +227,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [async-batcher.ts:393](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L393) +Defined in: [async-batcher.ts:398](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L398) Processes the current batch of items immediately @@ -237,7 +243,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [async-batcher.ts:401](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L401) +Defined in: [async-batcher.ts:406](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L406) Returns a copy of all items in the async batcher @@ -253,7 +259,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [async-batcher.ts:405](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L405) +Defined in: [async-batcher.ts:410](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L410) #### Returns @@ -267,7 +273,7 @@ Defined in: [async-batcher.ts:405](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:426](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L426) +Defined in: [async-batcher.ts:431](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L431) Resets the async batcher state to its default values diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index df30c773..398e86d0 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -87,7 +87,7 @@ const data = await rateLimiter.maybeExecute('123'); new AsyncRateLimiter(fn, initialOptions): AsyncRateLimiter ``` -Defined in: [async-rate-limiter.ts:234](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L234) +Defined in: [async-rate-limiter.ts:233](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L233) #### Parameters @@ -105,23 +105,13 @@ Defined in: [async-rate-limiter.ts:234](https://github.com/TanStack/pacer/blob/m ## Properties -### asyncRetryer - -```ts -asyncRetryer: AsyncRetryer; -``` - -Defined in: [async-rate-limiter.ts:231](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L231) - -*** - ### fn ```ts fn: TFn; ``` -Defined in: [async-rate-limiter.ts:235](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L235) +Defined in: [async-rate-limiter.ts:234](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L234) *** @@ -161,7 +151,7 @@ Defined in: [async-rate-limiter.ts:226](https://github.com/TanStack/pacer/blob/m _emit(): void ``` -Defined in: [async-rate-limiter.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L263) +Defined in: [async-rate-limiter.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L258) Emits a change event for the async rate limiter instance. Mostly useful for devtools. @@ -211,7 +201,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [async-rate-limiter.ts:341](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L341) +Defined in: [async-rate-limiter.ts:336](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L336) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -275,7 +265,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [async-rate-limiter.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L268) +Defined in: [async-rate-limiter.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L263) Updates the async rate limiter options diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index 0982f071..ad4e23d4 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -8,10 +8,10 @@ title: asyncBatch # Function: asyncBatch() ```ts -function asyncBatch(fn, options): (item) => void +function asyncBatch(fn, options): (item) => Promise ``` -Defined in: [async-batcher.ts:481](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L481) +Defined in: [async-batcher.ts:486](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L486) Creates an async batcher that processes items in batches @@ -69,7 +69,13 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the ### Returns -`void` +`Promise`\<`any`\> + +The result from the batch function, or undefined if an error occurred and was handled by onError + +### Throws + +The error from the batch function if no onError handler is configured or throwOnError is true ## Example diff --git a/docs/reference/interfaces/asyncbatcheroptions.md b/docs/reference/interfaces/asyncbatcheroptions.md index 24fc155d..c0d0aa52 100644 --- a/docs/reference/interfaces/asyncbatcheroptions.md +++ b/docs/reference/interfaces/asyncbatcheroptions.md @@ -115,7 +115,7 @@ This can be used alongside throwOnError - the handler will be called before any ##### error -`unknown` +`Error` ##### batch diff --git a/docs/reference/interfaces/asyncdebounceroptions.md b/docs/reference/interfaces/asyncdebounceroptions.md index 17707385..cd725cc9 100644 --- a/docs/reference/interfaces/asyncdebounceroptions.md +++ b/docs/reference/interfaces/asyncdebounceroptions.md @@ -97,7 +97,7 @@ This can be used alongside throwOnError - the handler will be called before any ##### error -`unknown` +`Error` ##### args diff --git a/docs/reference/interfaces/asyncqueueroptions.md b/docs/reference/interfaces/asyncqueueroptions.md index 99847a84..c854c24e 100644 --- a/docs/reference/interfaces/asyncqueueroptions.md +++ b/docs/reference/interfaces/asyncqueueroptions.md @@ -211,7 +211,7 @@ This can be used alongside throwOnError - the handler will be called before any ##### error -`unknown` +`Error` ##### item diff --git a/docs/reference/interfaces/asyncratelimiteroptions.md b/docs/reference/interfaces/asyncratelimiteroptions.md index 54f17cdf..9e418bbc 100644 --- a/docs/reference/interfaces/asyncratelimiteroptions.md +++ b/docs/reference/interfaces/asyncratelimiteroptions.md @@ -97,7 +97,7 @@ This can be used alongside throwOnError - the handler will be called before any ##### error -`unknown` +`Error` ##### args diff --git a/docs/reference/interfaces/asyncretryeroptions.md b/docs/reference/interfaces/asyncretryeroptions.md index c039c1fb..581585c5 100644 --- a/docs/reference/interfaces/asyncretryeroptions.md +++ b/docs/reference/interfaces/asyncretryeroptions.md @@ -116,7 +116,7 @@ Callback invoked when any error occurs during execution (including retries) ##### error -`unknown` +`Error` ##### args diff --git a/docs/reference/interfaces/asyncthrottleroptions.md b/docs/reference/interfaces/asyncthrottleroptions.md index 137dcdee..2a9d28f8 100644 --- a/docs/reference/interfaces/asyncthrottleroptions.md +++ b/docs/reference/interfaces/asyncthrottleroptions.md @@ -97,7 +97,7 @@ This can be used alongside throwOnError - the handler will be called before any ##### error -`unknown` +`Error` ##### args From 4e3330f919e76255e5d86b19e505243b9e293e2f Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Sun, 5 Oct 2025 14:38:40 -0500 Subject: [PATCH 42/50] fix async-throttler stuff --- examples/react/useAsyncBatcher/src/index.tsx | 17 +-- .../react/useAsyncThrottler/src/index.tsx | 32 +---- packages/pacer/src/async-batcher.ts | 4 + packages/pacer/src/async-debouncer.ts | 2 +- packages/pacer/src/async-retryer.ts | 65 ++++++++--- packages/pacer/src/async-throttler.ts | 110 +++++++++++------- packages/pacer/tests/async-retryer.test.ts | 4 +- packages/pacer/tests/async-throttler.test.ts | 68 ++++++++++- 8 files changed, 191 insertions(+), 111 deletions(-) diff --git a/examples/react/useAsyncBatcher/src/index.tsx b/examples/react/useAsyncBatcher/src/index.tsx index 95004f53..253059a6 100644 --- a/examples/react/useAsyncBatcher/src/index.tsx +++ b/examples/react/useAsyncBatcher/src/index.tsx @@ -16,7 +16,6 @@ function App() { Array<{ items: Array; result: string; timestamp: number }> >([]) const [errors, setErrors] = useState>([]) - const [shouldFail, setShouldFail] = useState(false) // The async function that will process a batch of items async function processBatch(items: Array): Promise { @@ -26,9 +25,8 @@ function App() { await new Promise((resolve) => setTimeout(resolve, fakeProcessingTime)) // Simulate occasional failures for demo purposes - if (shouldFail && Math.random() < 0.3) { - throw new Error(`Processing failed for batch with ${items.length} items`) - } + + // throw new Error(`Processing failed for batch with ${items.length} items`) // Return a result from the batch processing const result = `Processed ${items.length} items: ${items.map((item) => item.value).join(', ')}` @@ -166,17 +164,6 @@ function App() { Clear Current Batch
- -
- -
diff --git a/examples/react/useAsyncThrottler/src/index.tsx b/examples/react/useAsyncThrottler/src/index.tsx index ba6968da..c9dedf1e 100644 --- a/examples/react/useAsyncThrottler/src/index.tsx +++ b/examples/react/useAsyncThrottler/src/index.tsx @@ -30,7 +30,7 @@ function App() { return } - throw new Error('Test error') // you don't have to catch errors here (though you still can). The onError optional handler will catch it + // throw new Error('Test error') // you don't have to catch errors here (though you still can). The onError optional handler will catch it const data = await fakeApi(term) setResults(data) @@ -55,11 +55,7 @@ function App() { // throwOnError: true, }, // Optional Selector function to pick the state you want to track and use - (state) => ({ - successCount: state.successCount, - isPending: state.isPending, - isExecuting: state.isExecuting, - }), + (state) => state, ) // get and name our throttled function @@ -115,9 +111,8 @@ function App() { const root = ReactDOM.createRoot(document.getElementById('root')!) -let mounted = true +// optionally, provide default options to an optional PacerProvider root.render( - // optionally, provide default options to an optional PacerProvider , ) - -// demo unmounting and cancellation -document.addEventListener('keydown', (e) => { - if (e.shiftKey && e.key === 'Enter') { - mounted = !mounted - root.render( - mounted ? ( - // optionally, provide default options to an optional PacerProvider - - - - ) : null, - ) - } -}) diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 6d8207ec..30f8fffe 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -363,6 +363,10 @@ export class AsyncBatcher { this.#setState({ isExecuting: true }) try { + this.asyncRetryer = new AsyncRetryer( + this.fn, + this.options.asyncRetryerOptions, + ) const result = await this.asyncRetryer.execute(batch) // EXECUTE this.#setState({ totalItemsProcessed: diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index 8b26ad36..a187b848 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -414,7 +414,7 @@ export class AsyncDebouncer { } #abortExecution = (): void => { - this.asyncRetryer.cancel() + this.asyncRetryer.abort() } /** diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts index eeb84d25..98e3fcf1 100644 --- a/packages/pacer/src/async-retryer.ts +++ b/packages/pacer/src/async-retryer.ts @@ -79,6 +79,11 @@ export interface AsyncRetryerOptions { * Initial state to merge with the default state */ initialState?: Partial> + /** + * Jitter percentage to add to retry delays (0-1). Adds randomness to prevent thundering herd. + * @default 0 + */ + jitter?: number /** * Maximum number of retry attempts, or a function that returns the max attempts * @default 3 @@ -134,6 +139,7 @@ const defaultOptions: Omit< backoff: 'exponential', baseWait: 1000, enabled: true, + jitter: 0, maxAttempts: 3, throwOnError: 'last', } @@ -152,6 +158,8 @@ const defaultOptions: Omit< * - `'exponential'`: Wait time doubles with each attempt (1s, 2s, 4s, ...) - **DEFAULT** * - `'linear'`: Wait time increases linearly (1s, 2s, 3s, ...) * - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt + * - **Jitter**: Adds randomness to retry delays to prevent thundering herd problems (default: `0`). + * Set to a value between 0-1 to apply that percentage of random variation to each delay. * - **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. If cancelled, retries are stopped. * - **State Management**: Tracks execution status, current attempt, last error, and result using TanStack Store. * - **Callbacks**: Provides hooks for handling success, error, retry, and settled events. @@ -174,16 +182,17 @@ const defaultOptions: Omit< * * ## Usage * - Use for async operations that may fail transiently and benefit from retrying. - * - Configure `maxAttempts`, `backoff`, and `baseWait` to control retry behavior. + * - Configure `maxAttempts`, `backoff`, `baseWait`, and `jitter` to control retry behavior. * - Use `onRetry`, `onSuccess`, `onError`, and `onSettled` for custom side effects. * * @example * ```typescript - * // Retry a fetch operation up to 5 times with exponential backoff + * // Retry a fetch operation up to 5 times with exponential backoff and jitter * const retryer = new AsyncRetryer(fetchData, { * maxAttempts: 5, * backoff: 'exponential', * baseWait: 1000, + * jitter: 0.1, // Add 10% random variation to prevent thundering herd * onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), * onSuccess: (result) => console.log('Success:', result), * onError: (error) => console.error('Error:', error), @@ -261,18 +270,45 @@ export class AsyncRetryer { return parseFunctionOrValue(this.options.baseWait, this) } + #calculateJitter = (waitTime: number): number => { + const jitterAmount = this.options.jitter + if (jitterAmount <= 0) return 0 + + try { + const crypto = + typeof globalThis !== 'undefined' ? globalThis.crypto : undefined + if (crypto?.getRandomValues) { + const array = new Uint32Array(1) + crypto.getRandomValues(array) + // Convert to 0-1 range and apply jitter percentage + const randomFactor = (array[0]! / 0xffffffff) * 2 - 1 // -1 to 1 + return Math.floor(waitTime * jitterAmount * randomFactor) + } + } catch { + // No crypto available + } + return 0 + } + #calculateWait = (attempt: number): number => { const baseWait = this.#getBaseWait() + let waitTime: number switch (this.options.backoff) { case 'linear': - return baseWait * attempt + waitTime = baseWait * attempt + break case 'exponential': - return baseWait * Math.pow(2, attempt - 1) + waitTime = baseWait * Math.pow(2, attempt - 1) + break case 'fixed': default: - return baseWait + waitTime = baseWait + break } + + const jitter = this.#calculateJitter(waitTime) + return Math.max(0, waitTime + jitter) } /** @@ -289,7 +325,7 @@ export class AsyncRetryer { } // Cancel any existing execution - this.cancel() + this.abort() const startTime = Date.now() let lastError: Error | undefined @@ -311,14 +347,14 @@ export class AsyncRetryer { try { if (signal.aborted) { - return undefined as any + return undefined } result = (await this.fn(...args)) as ReturnType // Check if cancelled during execution // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (signal.aborted) { - return undefined as any + return undefined } const totalTime = Date.now() - startTime @@ -336,8 +372,8 @@ export class AsyncRetryer { return result } catch (error) { // Treat abort as a non-error cancellation outcome - if ((error as any)?.name === 'AbortError') { - return undefined as any + if ((error as Error)?.name === 'AbortError') { + return undefined } lastError = error instanceof Error ? error : new Error(String(error)) this.#setState({ lastError }) @@ -364,7 +400,7 @@ export class AsyncRetryer { if (signal.aborted) { // When cancelled during retry wait, surface the last error exactly once this.options.onError?.(lastError, args, this) - return undefined as any + return undefined } } } @@ -386,19 +422,18 @@ export class AsyncRetryer { throw lastError } - return undefined as any + return undefined } /** * Cancels the current execution and any pending retries */ - cancel = (): void => { + abort = (): void => { if (this.#abortController) { this.#abortController.abort() this.#abortController = null this.#setState({ isExecuting: false, - currentAttempt: 0, }) } } @@ -407,7 +442,7 @@ export class AsyncRetryer { * Resets the retryer to its initial state and cancels any ongoing execution */ reset = (): void => { - this.cancel() + this.abort() this.#setState(getDefaultAsyncRetryerState()) } } diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index 502fb566..386c6864 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -320,56 +320,83 @@ export class AsyncThrottler { ...args: Parameters ): Promise | undefined> => { if (!this.#getEnabled()) return undefined + const now = Date.now() const timeSinceLastExecution = now - this.store.state.lastExecutionTime const wait = this.#getWait() - // Store the most recent arguments for potential trailing execution + this.#setState({ - lastArgs: args, maybeExecuteCount: this.store.state.maybeExecuteCount + 1, + lastArgs: args, // store the arguments for potential trailing execution }) + const thisMaybeExecuteNumber = this.store.state.maybeExecuteCount + this.#resolvePreviousPromiseInternal() - // Handle leading execution - if (this.options.leading && timeSinceLastExecution >= wait) { - await this.#execute(...args) - return this.store.state.lastResult - } else { + // Wait for the wait period for the previous execution to complete if it's still running + for ( + let maxNumIterations = wait / 10; + this.store.state.isExecuting && maxNumIterations > 0; + maxNumIterations-- + ) { + await new Promise((resolve) => setTimeout(resolve, 10)) + if (this.store.state.maybeExecuteCount !== thisMaybeExecuteNumber) { + // cancel the current maybeExecute loop because a new maybeExecute call was made + return this.store.state.lastResult + } + } + + if ( + this.options.leading && + !this.store.state.isPending && + timeSinceLastExecution >= wait + ) { + await this.#execute(...args) // Leading EXECUTE! + } else if (this.options.trailing) { + // replace old pending execution with a new one + this.#cancelPendingExecution() + this.#setState({ + isPending: true, + }) + + // Set up new trailing execution return new Promise((resolve, reject) => { this.#resolvePreviousPromise = resolve - // Clear any existing timeout to ensure we use the latest arguments - this.#clearTimeout() - - // Set up trailing execution if enabled - if (this.options.trailing) { - const _timeSinceLastExecution = this.store.state.lastExecutionTime - ? now - this.store.state.lastExecutionTime - : 0 - const timeoutDuration = wait - _timeSinceLastExecution - this.#setState({ isPending: true }) - this.#timeoutId = setTimeout(async () => { - if (this.store.state.lastArgs !== undefined) { - try { - await this.#execute(...this.store.state.lastArgs) // EXECUTE! - } catch (error) { - reject(error) - } + + const newTimeSinceLastExecution = this.store.state.lastExecutionTime + ? now - this.store.state.lastExecutionTime + : 0 + const timeoutDuration = Math.max(0, wait - newTimeSinceLastExecution) + + this.#timeoutId = setTimeout(async () => { + this.#clearTimeout() + if (this.store.state.lastArgs !== undefined) { + try { + await this.#execute(...this.store.state.lastArgs) // Trailing EXECUTE! + } catch (error) { + reject(error) } - this.#resolvePreviousPromise = null - resolve(this.store.state.lastResult) - }, timeoutDuration) - } + } + this.#resolvePreviousPromise = null + resolve(this.store.state.lastResult) + }, timeoutDuration) }) } + return this.store.state.lastResult } #execute = async ( ...args: Parameters ): Promise | undefined> => { - if (!this.#getEnabled() || this.store.state.isExecuting) return undefined + if (!this.#getEnabled()) return undefined + try { this.#setState({ isExecuting: true }) + this.asyncRetryer = new AsyncRetryer( + this.fn, + this.options.asyncRetryerOptions, + ) const result = await this.asyncRetryer.execute(...args) // EXECUTE! this.#setState({ lastResult: result, @@ -386,10 +413,11 @@ export class AsyncThrottler { } } finally { const lastExecutionTime = Date.now() - const nextExecutionTime = lastExecutionTime + this.#getWait() + const wait = this.#getWait() + const nextExecutionTime = lastExecutionTime + wait this.#setState({ isExecuting: false, - isPending: false, + isPending: !!this.#timeoutId, settleCount: this.store.state.settleCount + 1, lastExecutionTime, nextExecutionTime, @@ -397,9 +425,10 @@ export class AsyncThrottler { this.options.onSettled?.(args, this) setTimeout(() => { if (!this.store.state.isPending) { + // clear nextExecutionTime if there is no pending execution this.#setState({ nextExecutionTime: undefined }) } - }, this.#getWait()) + }, wait) } return this.store.state.lastResult } @@ -409,13 +438,9 @@ export class AsyncThrottler { */ flush = async (): Promise | undefined> => { if (this.store.state.isPending && this.store.state.lastArgs) { - this.#abortExecution() // abort any current execution - this.#clearTimeout() // clear any existing timeout + this.cancel() // cancel any current execution const result = await this.#execute(...this.store.state.lastArgs) - // Resolve any pending promise from maybeExecute - this.#resolvePreviousPromiseInternal() - return result } return undefined @@ -443,21 +468,18 @@ export class AsyncThrottler { } this.#setState({ isPending: false, - isExecuting: false, - lastArgs: undefined, }) } - #abortExecution = (): void => { - this.asyncRetryer.cancel() - } - /** * Cancels any pending execution or aborts any execution in progress */ cancel = (): void => { this.#cancelPendingExecution() - this.#abortExecution() + this.asyncRetryer.abort() // abort + this.#setState({ + isExecuting: false, + }) } /** diff --git a/packages/pacer/tests/async-retryer.test.ts b/packages/pacer/tests/async-retryer.test.ts index 77eb1e69..0aacb81a 100644 --- a/packages/pacer/tests/async-retryer.test.ts +++ b/packages/pacer/tests/async-retryer.test.ts @@ -467,7 +467,7 @@ describe('AsyncRetryer', () => { // Start and immediately cancel const executePromise1 = retryer.execute() - retryer.cancel() + retryer.abort() const result1 = await executePromise1 expect(result1).toBeUndefined() @@ -495,7 +495,7 @@ describe('AsyncRetryer', () => { await Promise.resolve() // Cancel during retry delay - retryer.cancel() + retryer.abort() const result = await executePromise expect(result).toBeUndefined() diff --git a/packages/pacer/tests/async-throttler.test.ts b/packages/pacer/tests/async-throttler.test.ts index 010a04cf..1d6f471b 100644 --- a/packages/pacer/tests/async-throttler.test.ts +++ b/packages/pacer/tests/async-throttler.test.ts @@ -175,12 +175,51 @@ describe('AsyncThrottler', () => { expect(throttler.store.state.nextExecutionTime).toBe(now + 200) }) + it('should maintain isPending state correctly when trailing is scheduled during long-running execution', async () => { + let resolveExecution: ((value: string) => void) | undefined + const mockFn = vi.fn().mockImplementation(() => { + return new Promise((resolve) => { + resolveExecution = resolve + }) + }) + const throttler = new AsyncThrottler(mockFn, { wait: 100 }) + + // Start long-running leading execution + const promise1 = throttler.maybeExecute('first') + expect(throttler.store.state.isExecuting).toBe(true) + expect(throttler.store.state.isPending).toBe(false) + expect(mockFn).toHaveBeenCalledTimes(1) + + // Call again during execution - the second call will wait for first to complete + const promise2 = throttler.maybeExecute('second') + + // Advance timers to allow the waiting loop to progress + await vi.advanceTimersByTimeAsync(100) + + // After waiting loop completes, second call should have returned with lastResult + expect(throttler.store.state.isExecuting).toBe(true) + expect(mockFn).toHaveBeenCalledTimes(1) // Still just the first call + + // Resolve the first execution + resolveExecution!('result1') + await promise1 + + // After first execution completes, if there's a pending execution it should trigger + expect(throttler.store.state.isExecuting).toBe(false) + + // Advance timers to trigger trailing execution if one was scheduled + await vi.advanceTimersByTimeAsync(100) + + const result2 = await promise2 + expect(result2).toBe('result1') // Second call returns first result due to waiting loop + }) + it('should cancel pending execution', async () => { const mockFn = vi.fn().mockResolvedValue(undefined) const throttler = new AsyncThrottler(mockFn, { wait: 100 }) // First call executes immediately - throttler.maybeExecute('first') + await throttler.maybeExecute('first') expect(mockFn).toHaveBeenCalledTimes(1) expect(mockFn).toHaveBeenLastCalledWith('first') @@ -189,6 +228,9 @@ describe('AsyncThrottler', () => { // Cancel it immediately throttler.cancel() + // Advance timers to allow any waiting loops to exit + await vi.advanceTimersByTimeAsync(10) + // Wait for the promise to settle await expect(promise).resolves.toBeUndefined() expect(mockFn).toHaveBeenCalledTimes(1) @@ -199,12 +241,15 @@ describe('AsyncThrottler', () => { const mockFn = vi.fn().mockResolvedValue(undefined) const throttler = new AsyncThrottler(mockFn, { wait: 100 }) - throttler.maybeExecute('first') + await throttler.maybeExecute('first') const promise = throttler.maybeExecute('second') throttler.cancel() + + // Advance timers to allow any waiting loops to exit + await vi.advanceTimersByTimeAsync(10) await promise - vi.advanceTimersByTime(100) + await vi.advanceTimersByTimeAsync(100) await throttler.maybeExecute('third') expect(mockFn).toHaveBeenCalledTimes(2) @@ -217,13 +262,16 @@ describe('AsyncThrottler', () => { const throttler = new AsyncThrottler(mockFn, { wait: 100 }) // First call should execute - throttler.maybeExecute('first') + await throttler.maybeExecute('first') expect(mockFn).toHaveBeenCalledTimes(1) expect(mockFn).toHaveBeenLastCalledWith('first') // Second call should be cancelled const promise = throttler.maybeExecute('second') throttler.cancel() + + // Advance timers to allow any waiting loops to exit + await vi.advanceTimersByTimeAsync(10) await promise // Multiple cancels should not throw @@ -245,8 +293,15 @@ describe('AsyncThrottler', () => { // Start first long-running call const promise1 = throttler.maybeExecute('first') const promise2 = throttler.maybeExecute('second') + + // Advance timers to allow waiting loop to start + await vi.advanceTimersByTimeAsync(10) + throttler.cancel() + // Advance timers to allow cancel to take effect + await vi.advanceTimersByTimeAsync(10) + resolveFirst!({}) await promise1 await promise2 @@ -368,7 +423,10 @@ describe('AsyncThrottler', () => { expect(mockFn).toHaveBeenCalledTimes(1) expect(mockFn).toHaveBeenCalledWith('first') expect(flushResult).toBe('result') - expect(await promise).toBe('result') + + // The promise gets resolved by flush with the result + const promiseResult = await promise + expect(promiseResult).toBe('result') }) it('should update state correctly after flush', async () => { From 5abfe0c81a81f8beb196b0c029b791eed2035ed2 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Mon, 6 Oct 2025 00:16:00 -0500 Subject: [PATCH 43/50] fix retryers with per instance per execution --- examples/react/useAsyncRetryer/src/index.tsx | 2 +- nx.json | 3 + packages/pacer/src/async-batcher.ts | 48 +++++++++++--- packages/pacer/src/async-debouncer.ts | 47 ++++++++------ packages/pacer/src/async-queuer.ts | 49 ++++++++++++-- packages/pacer/src/async-rate-limiter.ts | 25 ++++++-- packages/pacer/src/async-retryer.ts | 25 +++++++- packages/pacer/src/async-throttler.ts | 64 ++++++++++++------- packages/pacer/src/batcher.ts | 9 +++ packages/pacer/src/event-client.ts | 3 + packages/pacer/tests/async-throttler.test.ts | 59 +++++++---------- .../src/async-retryer/useAsyncRetryer.ts | 2 +- 12 files changed, 234 insertions(+), 102 deletions(-) diff --git a/examples/react/useAsyncRetryer/src/index.tsx b/examples/react/useAsyncRetryer/src/index.tsx index be0630f1..0cc442b8 100644 --- a/examples/react/useAsyncRetryer/src/index.tsx +++ b/examples/react/useAsyncRetryer/src/index.tsx @@ -92,7 +92,7 @@ function App() {
- + +
+

+ Click rapidly - API calls are throttled to 1 second, but UI updates + immediately. First click executes immediately, then at most once per + second. +

+
+ ) +} + +function App3() { + const [scrollPosition, setScrollPosition] = useState(0) + const [saveCount, setSaveCount] = useState(0) + const [lastSaved, setLastSaved] = useState(null) + const [isSaving, setIsSaving] = useState(false) + + // Simulate saving scroll position to server + const saveScrollPosition = async ( + position: number, + ): Promise<{ success: boolean; position: number }> => { + await new Promise((resolve) => setTimeout(resolve, 300)) + return { success: true, position } + } + + // Create throttled save function + const throttledSave = useAsyncThrottledCallback( + async (position: number) => { + setIsSaving(true) + + try { + const result = await saveScrollPosition(position) + setSaveCount((prev) => prev + 1) + setLastSaved(new Date()) + return result + } finally { + setIsSaving(false) + } + }, + { + wait: 1000, + leading: true, + trailing: true, + }, + ) + + function handleScroll(e: React.UIEvent) { + const position = e.currentTarget.scrollTop + setScrollPosition(position) + throttledSave(position) + } + + return ( +
+

TanStack Pacer useAsyncThrottledCallback Example 3

+
+
+

Scroll this area to trigger throttled saves!

+

Current scroll position: {Math.round(scrollPosition)}px

+ {isSaving &&

Saving position...

} +
+

Saves triggered: {saveCount}

+ {lastSaved && ( +

Last saved at: {lastSaved.toLocaleTimeString()}

+ )} +
+
+

Keep scrolling...

+

More content...

+

Even more content...

+

Almost there...

+

You made it to the end!

+
+
+
+ +

+ Scroll position is saved at most once per second, but updates instantly + on screen +

+
+ ) +} + +const root = ReactDOM.createRoot(document.getElementById('root')!) +root.render( +
+ +
+ +
+ +
, +) diff --git a/examples/react/useAsyncThrottledCallback/tsconfig.json b/examples/react/useAsyncThrottledCallback/tsconfig.json new file mode 100644 index 00000000..6e9088d6 --- /dev/null +++ b/examples/react/useAsyncThrottledCallback/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "vite.config.ts"] +} diff --git a/examples/react/useAsyncThrottledCallback/vite.config.ts b/examples/react/useAsyncThrottledCallback/vite.config.ts new file mode 100644 index 00000000..5a33944a --- /dev/null +++ b/examples/react/useAsyncThrottledCallback/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts index 48834a9c..6d32bc76 100644 --- a/packages/pacer/src/async-retryer.ts +++ b/packages/pacer/src/async-retryer.ts @@ -90,6 +90,16 @@ export interface AsyncRetryerOptions { * @default 0 */ jitter?: number + /** + * Maximum execution time in milliseconds for a single function call before aborting + * @default Infinity + */ + maxExecutionTime?: number + /** + * Maximum total execution time in milliseconds for the entire retry operation before aborting + * @default Infinity + */ + maxTotalExecutionTime?: number /** * Maximum number of retry attempts, or a function that returns the max attempts * @default 3 @@ -148,12 +158,14 @@ const defaultOptions: Omit< enabled: true, jitter: 0, maxAttempts: 3, + maxExecutionTime: Infinity, + maxTotalExecutionTime: Infinity, throwOnError: 'last', } /** * Provides robust retry functionality for asynchronous functions, supporting configurable backoff strategies, - * attempt limits, and detailed state management. The AsyncRetryer class is designed to help you reliably + * attempt limits, timeout controls, and detailed state management. The AsyncRetryer class is designed to help you reliably * execute async operations that may fail intermittently, such as network requests or database operations, * by automatically retrying them according to your chosen policy. * @@ -167,6 +179,9 @@ const defaultOptions: Omit< * - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt * - **Jitter**: Adds randomness to retry delays to prevent thundering herd problems (default: `0`). * Set to a value between 0-1 to apply that percentage of random variation to each delay. + * - **Timeout Controls**: Set limits on execution time to prevent hanging operations: + * - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) + * - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) * - **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. If cancelled, retries are stopped. * - **State Management**: Tracks execution status, current attempt, last error, and result using TanStack Store. * - **Callbacks**: Provides hooks for handling success, error, retry, and settled events. @@ -190,16 +205,19 @@ const defaultOptions: Omit< * ## Usage * - Use for async operations that may fail transiently and benefit from retrying. * - Configure `maxAttempts`, `backoff`, `baseWait`, and `jitter` to control retry behavior. + * - Set `maxExecutionTime` and `maxTotalExecutionTime` to prevent hanging operations. * - Use `onRetry`, `onSuccess`, `onError`, and `onSettled` for custom side effects. * * @example * ```typescript - * // Retry a fetch operation up to 5 times with exponential backoff and jitter + * // Retry a fetch operation up to 5 times with exponential backoff, jitter, and timeouts * const retryer = new AsyncRetryer(fetchData, { * maxAttempts: 5, * backoff: 'exponential', * baseWait: 1000, * jitter: 0.1, // Add 10% random variation to prevent thundering herd + * maxExecutionTime: 5000, // Abort individual calls after 5 seconds + * maxTotalExecutionTime: 30000, // Abort entire operation after 30 seconds * onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), * onSuccess: (result) => console.log('Success:', result), * onError: (error) => console.error('Error:', error), @@ -361,6 +379,14 @@ export class AsyncRetryer { lastError: undefined, }) + // Set up total execution timeout + let totalTimeoutId: NodeJS.Timeout | undefined + if (this.options.maxTotalExecutionTime !== Infinity) { + totalTimeoutId = setTimeout(() => { + this.abort() + }, this.options.maxTotalExecutionTime) + } + let isLastAttempt = false for (let attempt = 1; attempt <= this.#getMaxAttempts(); attempt++) { isLastAttempt = attempt === this.#getMaxAttempts() @@ -370,7 +396,43 @@ export class AsyncRetryer { if (signal.aborted) { return undefined } - result = (await this.fn(...args)) as ReturnType + + // Check if total execution time has been exceeded + const currentTotalTime = Date.now() - startTime + if ( + this.options.maxTotalExecutionTime !== Infinity && + currentTotalTime >= this.options.maxTotalExecutionTime + ) { + this.abort() + return undefined + } + + // Execute with individual timeout if specified + if (this.options.maxExecutionTime === Infinity) { + result = (await this.fn(...args)) as ReturnType + } else { + result = (await Promise.race([ + this.fn(...args), + new Promise((_, reject) => { + const timeout = setTimeout(() => { + reject( + new Error( + `Execution timeout: ${this.options.maxExecutionTime}ms exceeded`, + ), + ) + }, this.options.maxExecutionTime) + + signal.addEventListener( + 'abort', + () => { + clearTimeout(timeout) + reject(new Error('Aborted')) + }, + { once: true }, + ) + }), + ])) as ReturnType + } // Check if cancelled during execution // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition @@ -393,7 +455,12 @@ export class AsyncRetryer { return result } catch (error) { // Treat abort as a non-error cancellation outcome - if ((error as Error).name === 'AbortError') { + if ( + error && + typeof error === 'object' && + 'name' in error && + (error as Error).name === 'AbortError' + ) { return undefined } lastError = error instanceof Error ? error : new Error(String(error)) @@ -430,6 +497,11 @@ export class AsyncRetryer { } } + // Clean up total timeout + if (totalTimeoutId) { + clearTimeout(totalTimeoutId) + } + // Exhausted retries - finalize state this.#setState({ isExecuting: false }) this.options.onLastError?.(lastError as Error, this) @@ -479,7 +551,7 @@ export class AsyncRetryer { * ```typescript * const retryFetch = asyncRetry(fetch, { * maxAttempts: 3, - * backoff: 'exponential' + * backoff: 'exponential' // default * }) * * const response = await retryFetch('/api/data') diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index 124f2667..2ca050f7 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -317,19 +317,16 @@ export class AsyncThrottler { ): Promise | undefined> => { if (!this.#getEnabled()) return undefined - const now = Date.now() - const timeSinceLastExecution = now - this.store.state.lastExecutionTime - const wait = this.#getWait() + this.#resolvePreviousPromiseInternal() this.#setState({ maybeExecuteCount: this.store.state.maybeExecuteCount + 1, lastArgs: args, // store the arguments for potential trailing execution }) + const wait = this.#getWait() const thisMaybeExecuteNumber = this.store.state.maybeExecuteCount - this.#resolvePreviousPromiseInternal() - // Wait for the wait period for the previous execution to complete if it's still running for ( let maxNumIterations = wait / 10; @@ -343,6 +340,9 @@ export class AsyncThrottler { } } + const now = Date.now() + const timeSinceLastExecution = now - this.store.state.lastExecutionTime + if ( this.options.leading && !this.store.state.isPending && diff --git a/packages/pacer/tests/async-retryer.test.ts b/packages/pacer/tests/async-retryer.test.ts index 0aacb81a..20962ca7 100644 --- a/packages/pacer/tests/async-retryer.test.ts +++ b/packages/pacer/tests/async-retryer.test.ts @@ -15,6 +15,8 @@ describe('AsyncRetryer', () => { expect(retryer.options.baseWait).toBe(1000) expect(retryer.options.enabled).toBe(true) expect(retryer.options.maxAttempts).toBe(3) + expect(retryer.options.maxExecutionTime).toBe(Infinity) + expect(retryer.options.maxTotalExecutionTime).toBe(Infinity) expect(retryer.options.throwOnError).toBe('last') }) @@ -561,6 +563,308 @@ describe('AsyncRetryer', () => { expect(retryer.options.baseWait).toBe(1000) // Unchanged }) }) + + describe('Timeout Controls', () => { + it('should have timeout options in default options', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn) + + expect(retryer.options.maxExecutionTime).toBe(Infinity) + expect(retryer.options.maxTotalExecutionTime).toBe(Infinity) + }) + + it('should accept custom timeout options', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { + maxExecutionTime: 5000, + maxTotalExecutionTime: 10000, + }) + + expect(retryer.options.maxExecutionTime).toBe(5000) + expect(retryer.options.maxTotalExecutionTime).toBe(10000) + }) + + it('should not timeout when execution completes quickly', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { + maxExecutionTime: 1000, + maxTotalExecutionTime: 2000, + }) + + const result = await retryer.execute() + + expect(result).toBe('success') + expect(mockFn).toHaveBeenCalledTimes(1) + }) + + it('should clean up timeouts when execution succeeds', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { + maxExecutionTime: 1000, + maxTotalExecutionTime: 2000, + }) + + const result = await retryer.execute() + + expect(result).toBe('success') + // Advance time to ensure no timeout fires + vi.advanceTimersByTime(5000) + expect(retryer.store.state.status).toBe('idle') + }) + }) + + describe('Jitter', () => { + it('should apply jitter to retry delays', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 1000, + jitter: 0.1, // 10% jitter + throwOnError: false, + }) + + const executePromise = retryer.execute() + + // First retry should have jitter applied + await vi.runOnlyPendingTimersAsync() + + // The exact time will vary due to jitter, but should be within range + // Base wait is 1000ms, jitter is 10%, so range is 900-1100ms + // We'll advance by a bit more than the base to ensure it triggers + vi.advanceTimersByTime(1100) + + await executePromise + + expect(mockFn).toHaveBeenCalledTimes(2) + }) + + it('should handle jitter when crypto is not available', async () => { + // Mock crypto to be undefined by temporarily replacing it + const originalCrypto = globalThis.crypto + Object.defineProperty(globalThis, 'crypto', { + value: undefined, + writable: true, + configurable: true, + }) + + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 100, + jitter: 0.1, + throwOnError: false, + }) + + const executePromise = retryer.execute() + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) // Should use base wait without jitter + await executePromise + + expect(mockFn).toHaveBeenCalledTimes(2) + + // Restore crypto + Object.defineProperty(globalThis, 'crypto', { + value: originalCrypto, + writable: true, + configurable: true, + }) + }) + + it('should not apply jitter when jitter is 0', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 100, + jitter: 0, + throwOnError: false, + }) + + const executePromise = retryer.execute() + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) // Exact base wait time + await executePromise + + expect(mockFn).toHaveBeenCalledTimes(2) + }) + }) + + describe('Initial State', () => { + it('should merge all initial state properties', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { + initialState: { + executionCount: 5, + lastResult: 'previous result', + lastError: new Error('Previous error'), + totalExecutionTime: 1000, + }, + }) + + expect(retryer.store.state.executionCount).toBe(5) + expect(retryer.store.state.lastResult).toBe('previous result') + expect(retryer.store.state.lastError?.message).toBe('Previous error') + expect(retryer.store.state.totalExecutionTime).toBe(1000) + expect(retryer.store.state.currentAttempt).toBe(0) // Default preserved + expect(retryer.store.state.isExecuting).toBe(false) // Default preserved + }) + + it('should update status based on initial state', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { + initialState: { + isExecuting: true, + currentAttempt: 2, + }, + }) + + expect(retryer.store.state.status).toBe('retrying') + }) + + it('should show disabled status when enabled is false in initial state', () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryer = new AsyncRetryer(mockFn, { + enabled: false, + initialState: { + isExecuting: true, + }, + }) + + expect(retryer.store.state.status).toBe('disabled') + }) + }) + + describe('Edge Cases and Error Scenarios', () => { + it('should handle function that throws non-Error objects', async () => { + const mockFn = vi.fn().mockRejectedValue('String error') + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 1, + throwOnError: false, + }) + + const result = await retryer.execute() + + expect(result).toBeUndefined() + expect(retryer.store.state.lastError?.message).toBe('String error') + }) + + it('should handle function that throws null', async () => { + const mockFn = vi.fn().mockRejectedValue(null) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 1, + throwOnError: false, + }) + + const result = await retryer.execute() + + expect(result).toBeUndefined() + expect(retryer.store.state.lastError?.message).toBe('null') + }) + + it('should handle function that throws undefined', async () => { + const mockFn = vi.fn().mockRejectedValue(undefined) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 1, + throwOnError: false, + }) + + const result = await retryer.execute() + + expect(result).toBeUndefined() + expect(retryer.store.state.lastError?.message).toBe('undefined') + }) + + it('should handle very large jitter values', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 100, + jitter: 1.5, // 150% jitter + throwOnError: false, + }) + + const executePromise = retryer.execute() + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(250) // Should be enough for max jitter + await executePromise + + expect(mockFn).toHaveBeenCalledTimes(2) + }) + + it('should handle negative jitter values', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 100, + jitter: -0.5, // Negative jitter + throwOnError: false, + }) + + const executePromise = retryer.execute() + + await vi.runOnlyPendingTimersAsync() + vi.advanceTimersByTime(100) // Should use base wait + await executePromise + + expect(mockFn).toHaveBeenCalledTimes(2) + }) + + it('should handle zero maxAttempts', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 0, + throwOnError: false, + }) + + const result = await retryer.execute() + + expect(result).toBeUndefined() + expect(mockFn).toHaveBeenCalledTimes(0) + }) + + it('should handle zero baseWait', async () => { + const mockFn = vi.fn().mockRejectedValue(new Error('Failure')) + const retryer = new AsyncRetryer(mockFn, { + maxAttempts: 2, + baseWait: 0, + throwOnError: false, + }) + + const executePromise = retryer.execute() + + // No delay between retries + await vi.runOnlyPendingTimersAsync() + await executePromise + + expect(mockFn).toHaveBeenCalledTimes(2) + }) + }) + + describe('Complex Integration Scenarios', () => { + it('should handle cancellation during execution', async () => { + const mockFn = vi.fn().mockImplementation(async () => { + vi.advanceTimersByTime(2000) + return 'success' + }) + const retryer = new AsyncRetryer(mockFn, { + maxExecutionTime: 1000, + throwOnError: false, + }) + + const executePromise = retryer.execute() + + // Cancel before timeout + vi.advanceTimersByTime(500) + retryer.abort() + + const result = await executePromise + + expect(result).toBeUndefined() + expect(mockFn).toHaveBeenCalledTimes(1) + }) + }) }) describe('asyncRetry utility function', () => { @@ -611,4 +915,17 @@ describe('asyncRetry utility function', () => { expect(result).toBeUndefined() expect(mockFn).toHaveBeenCalledTimes(3) // Default maxAttempts }) + + it('should support timeout options', async () => { + const mockFn = vi.fn().mockResolvedValue('success') + const retryFn = asyncRetry(mockFn, { + maxExecutionTime: 1000, + maxTotalExecutionTime: 2000, + }) + + const result = await retryFn() + + expect(result).toBe('success') + expect(mockFn).toHaveBeenCalledTimes(1) + }) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f85f47d3..5a8ede2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -633,6 +633,31 @@ importers: specifier: ^7.1.7 version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1) + examples/react/useAsyncThrottledCallback: + dependencies: + '@tanstack/react-pacer': + specifier: ^0.16.4 + version: link:../../../packages/react-pacer + react: + specifier: ^19.1.1 + version: 19.1.1 + react-dom: + specifier: ^19.1.1 + version: 19.1.1(react@19.1.1) + devDependencies: + '@types/react': + specifier: ^19.1.17 + version: 19.2.0 + '@types/react-dom': + specifier: ^19.1.11 + version: 19.2.0(@types/react@19.2.0) + '@vitejs/plugin-react': + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1)) + vite: + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1) + examples/react/useAsyncThrottler: dependencies: '@tanstack/react-pacer': From 4228229216a27da50112b628fee13109b7eab3e5 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Sun, 12 Oct 2025 12:16:39 -0500 Subject: [PATCH 46/50] add getAbortController apis --- docs/config.json | 4 + .../reference/functions/useasyncretryer.md | 58 +- docs/guides/async-retrying.md | 806 ++++++++++++++++++ docs/reference/classes/asyncbatcher.md | 51 +- docs/reference/classes/asyncdebouncer.md | 47 +- docs/reference/classes/asyncqueuer.md | 45 +- docs/reference/classes/asyncratelimiter.md | 49 +- docs/reference/classes/asyncretryer.md | 98 ++- docs/reference/classes/asyncthrottler.md | 51 +- docs/reference/functions/asyncbatch.md | 2 +- docs/reference/functions/asyncdebounce.md | 2 +- docs/reference/functions/asyncqueue.md | 2 +- docs/reference/functions/asyncratelimit.md | 2 +- docs/reference/functions/asyncretry.md | 4 +- docs/reference/functions/asyncthrottle.md | 2 +- .../interfaces/asyncretryeroptions.md | 50 +- examples/react/asyncRetry/.eslintrc.cjs | 13 + examples/react/asyncRetry/.gitignore | 27 + examples/react/asyncRetry/README.md | 24 + examples/react/asyncRetry/index.html | 16 + examples/react/asyncRetry/package.json | 34 + .../react/asyncRetry/public/emblem-light.svg | 13 + examples/react/asyncRetry/src/index.tsx | 424 +++++++++ examples/react/asyncRetry/tsconfig.json | 23 + examples/react/asyncRetry/vite.config.ts | 13 + examples/react/useAsyncRetryer/src/index.tsx | 437 ++++++++-- packages/pacer/src/async-batcher.ts | 30 + packages/pacer/src/async-debouncer.ts | 26 + packages/pacer/src/async-queuer.ts | 26 + packages/pacer/src/async-rate-limiter.ts | 27 + packages/pacer/src/async-retryer.ts | 56 +- packages/pacer/src/async-throttler.ts | 30 + .../react-pacer/src/async-retryer/index.ts | 3 + .../src/async-retryer/useAsyncRetryer.ts | 56 +- pnpm-lock.yaml | 25 + 35 files changed, 2409 insertions(+), 167 deletions(-) create mode 100644 docs/guides/async-retrying.md create mode 100644 examples/react/asyncRetry/.eslintrc.cjs create mode 100644 examples/react/asyncRetry/.gitignore create mode 100644 examples/react/asyncRetry/README.md create mode 100644 examples/react/asyncRetry/index.html create mode 100644 examples/react/asyncRetry/package.json create mode 100644 examples/react/asyncRetry/public/emblem-light.svg create mode 100644 examples/react/asyncRetry/src/index.tsx create mode 100644 examples/react/asyncRetry/tsconfig.json create mode 100644 examples/react/asyncRetry/vite.config.ts diff --git a/docs/config.json b/docs/config.json index 36594671..972f8cec 100644 --- a/docs/config.json +++ b/docs/config.json @@ -89,6 +89,10 @@ { "label": "Async Batching Guide", "to": "guides/async-batching" + }, + { + "label": "Async Retrying Guide", + "to": "guides/async-retrying" } ] }, diff --git a/docs/framework/react/reference/functions/useasyncretryer.md b/docs/framework/react/reference/functions/useasyncretryer.md index 2b8a58be..e85c02e0 100644 --- a/docs/framework/react/reference/functions/useasyncretryer.md +++ b/docs/framework/react/reference/functions/useasyncretryer.md @@ -14,23 +14,43 @@ function useAsyncRetryer( selector): ReactAsyncRetryer ``` -Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:152](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L152) +Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:194](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L194) A low-level React hook that creates an `AsyncRetryer` instance to retry execution of an async function. This hook is designed to be flexible and state-management agnostic - it simply returns a retryer instance that you can integrate with any state management solution (useState, Redux, Zustand, Jotai, etc). +## Retrying Concepts + Async retrying automatically re-executes a failed async function up to a specified number of attempts with configurable backoff strategies. This is useful for handling transient errors like network failures, temporary server issues, or rate limiting where you want to automatically retry the operation. -Error Handling: -- If an `onError` handler is provided, it will be called for every error during execution -- If an `onLastError` handler is provided, it will be called only for the final error after all retries fail -- If `throwOnError` is 'last' (default), only the final error after all retries will be thrown -- If `throwOnError` is true, every error will be thrown immediately (disables retrying) -- If `throwOnError` is false, errors are never thrown and undefined is returned instead +- **Backoff Strategies**: Controls the delay between retry attempts (default: `'exponential'`): + - `'exponential'`: Wait time doubles with each attempt (1s, 2s, 4s, ...) - **DEFAULT** + - `'linear'`: Wait time increases linearly (1s, 2s, 3s, ...) + - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt +- **Jitter**: Adds randomness to retry delays to prevent thundering herd problems (default: `0`). + Set to a value between 0-1 to apply that percentage of random variation to each delay. +- **Timeout Controls**: Set limits on execution time to prevent hanging operations: + - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) + - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) +- **Abort & Cancellation**: Call `abort()` on the retryer to cancel ongoing execution and pending retries. + +## Error Handling + +The `throwOnError` option controls when errors are thrown (default: `'last'`): +- `'last'`: Only throws the final error after all retries are exhausted - **DEFAULT** +- `true`: Throws every error immediately (disables retrying) +- `false`: Never throws errors, returns `undefined` instead + +Callbacks for error handling: +- `onError`: Called for every error (including during retries) +- `onLastError`: Called only for the final error after all retries fail +- `onRetry`: Called before each retry attempt +- `onSuccess`: Called when execution succeeds +- `onSettled`: Called after execution completes (success or failure) ## State Management and Selector @@ -53,6 +73,10 @@ Available state properties: - `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') - `totalExecutionTime`: Total time spent executing (including retries) in milliseconds +## Cleanup + +The hook automatically calls `abort()` on unmount to cancel any ongoing execution. + ## Type Parameters • **TFn** *extends* `AnyAsyncFunction` @@ -90,6 +114,23 @@ const apiRetryer = useAsyncRetryer( { maxAttempts: 3, backoff: 'exponential' } ); +// With advanced retry configuration +const apiRetryer = useAsyncRetryer( + async (userId: string) => { + const response = await fetch(`/api/users/${userId}`); + if (!response.ok) throw new Error('Failed to fetch user'); + return response.json(); + }, + { + maxAttempts: 5, + backoff: 'exponential', + baseWait: 1000, + jitter: 0.1, // Add 10% random variation to prevent thundering herd + maxExecutionTime: 5000, // Abort individual calls after 5 seconds + maxTotalExecutionTime: 30000, // Abort entire operation after 30 seconds + } +); + // Opt-in to re-render when execution state changes (optimized for loading indicators) const apiRetryer = useAsyncRetryer( async (userId: string) => { @@ -129,7 +170,8 @@ const apiRetryer = useAsyncRetryer( maxAttempts: 3, backoff: 'exponential', onError: (error) => console.error('API call failed:', error), - onLastError: (error) => console.error('All retries failed:', error) + onLastError: (error) => console.error('All retries failed:', error), + onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), }, (state) => ({ lastError: state.lastError, diff --git a/docs/guides/async-retrying.md b/docs/guides/async-retrying.md new file mode 100644 index 00000000..ff0bbf4f --- /dev/null +++ b/docs/guides/async-retrying.md @@ -0,0 +1,806 @@ +--- +title: Async Retrying Guide +id: async-retrying +--- + +TanStack Pacer provides its own retrying utility as a standalone `AsyncRetryer` class or a wrapper function `asyncRetry` for convenience. All of the other async utilities from TanStack Pacer use the `AsyncRetryer` class internally to wrap their executions with built-in retrying functionality. The Async Retryer supports features such as different backoff strategies, jitter, max timeouts, aborting, error handling, and more. + +## When to Use Retries + +Async retrying is particularly effective when you need to: +- Handle transient failures in API calls or network requests +- Implement robust error recovery for flaky operations +- Deal with rate-limited APIs that may temporarily reject requests +- Retry database operations that may fail due to temporary connection issues +- Handle operations that depend on external services with variable reliability + +### When Not to Use Retries + +Avoid async retrying when: +- The operation is not idempotent (retrying could cause unwanted side effects) +- Errors are permanent and retrying won't help (e.g., authentication failures, invalid input) +- The operation is time-sensitive and delays are unacceptable +- You need immediate feedback on failures without any retry attempts + +For operations that need to be queued and processed sequentially, use [Queuing](../queuing.md) instead. For operations that should be delayed until inactivity, use [Debouncing](../debouncing.md) instead. + +## Understanding Retry Behavior + +Before implementing retries, understanding the underlying concepts helps you make better decisions about retry strategies and configurations. + +### The Thundering Herd Problem + +The thundering herd problem occurs when many clients simultaneously retry failed requests to a recovering service, overwhelming it and preventing recovery. This typically happens when: + +- A service experiences a brief outage affecting many clients at once +- All clients fail simultaneously and begin retrying +- Without randomization, all clients retry at exactly the same intervals +- The synchronized retry attempts overwhelm the recovering service +- The service continues to fail, triggering more synchronized retries + +**How TanStack Pacer Addresses This:** + +Jitter adds randomness to retry delays, spreading out retry attempts across time rather than having them occur simultaneously. When you configure jitter, each client's retry timing becomes slightly different: + +```ts +// Without jitter: all clients retry at exactly 1s, 2s, 4s, 8s +// This can overwhelm a recovering service + +// With jitter: clients retry at randomized intervals +const retryer = new AsyncRetryer(asyncFn, { + backoff: 'exponential', + baseWait: 1000, + jitter: 0.3 // 30% random variation +}) +// Client A might retry at: 850ms, 1.7s, 3.6s, 7.2s +// Client B might retry at: 1.15s, 2.3s, 4.4s, 8.8s +// Client C might retry at: 950ms, 1.9s, 3.8s, 7.6s +``` + +This distribution prevents synchronized retry waves and gives the service breathing room to recover. + +### Exponential Backoff and Resource Conservation + +Exponential backoff doubles the wait time between retries. This pattern serves multiple purposes: + +**Fast Recovery for Transient Issues:** +The first retry happens quickly (after `baseWait`), catching brief network hiccups or momentary service interruptions. + +**Reduced Load on Failing Services:** +As retries continue, the increasing delays reduce the request rate to a struggling service, giving it time to recover rather than keeping it under constant pressure. + +**Resource Efficiency:** +Long delays between later retries prevent your application from consuming resources (memory, connections, threads) waiting for a service that might be down for an extended period. + +```ts +// With exponential backoff and 1s base wait: +// Attempt 1: immediate +// Attempt 2: 1s later (service might recover quickly) +// Attempt 3: 2s later (giving service more time) +// Attempt 4: 4s later (backing off further) +// Attempt 5: 8s later (minimal load if service is down) +``` + +### Retry Amplification in Distributed Systems + +Retry amplification occurs when retries cascade through multiple layers of a distributed system, multiplying the actual request load. This is a critical concern in microservices architectures. + +**The Amplification Effect:** + +Consider a system where Service A calls Service B, which calls Service C: + +```text +User → Service A (retries 3x) → Service B (retries 3x) → Service C +``` + +If Service C fails, Service B retries 3 times per request. Service A retries 3 times per request to Service B. This means Service C receives up to 9 requests (3 × 3) for a single user request. + +With deeper call chains, this grows exponentially: +- 2 services with 3 retries each: 9 requests +- 3 services with 3 retries each: 27 requests +- 4 services with 3 retries each: 81 requests + +**Mitigation Strategies:** + +1. **Reduce retries at higher layers:** +```ts +// Service A (user-facing): more retries for better UX +const serviceA = new AsyncRetryer(callServiceB, { + maxAttempts: 5 +}) + +// Service B (internal): fewer retries to prevent amplification +const serviceB = new AsyncRetryer(callServiceC, { + maxAttempts: 2 +}) +``` + +2. **Use timeout budgets to limit total retry time:** +```ts +const retryer = new AsyncRetryer(asyncFn, { + maxAttempts: 3, + maxTotalExecutionTime: 5000 // Limit total time regardless of retries +}) +``` + +### Cost Considerations + +Retries have real costs that should factor into your retry strategy: + +**Network Costs:** +- Each retry consumes bandwidth +- Mobile users may have limited or metered data +- Cloud services may charge for bandwidth + +**Time Costs:** +- Users wait longer for results +- Longer waits hurt user experience +- Time spent retrying could be spent on other requests + +**Resource Costs:** +- Memory for pending operations +- CPU for processing retries +- Connection pool exhaustion +- Thread/worker saturation + +**Example: Failing Fast Based on Error Type:** + +You can use dynamic `maxAttempts` to adjust retry behavior based on error conditions: + +```ts +// Your async function that throws errors with status codes +async function fetchData(url: string) { + const response = await fetch(url) + if (!response.ok) { + const error = new Error('Request failed') + ;(error as any).status = response.status + throw error + } + return response.json() +} + +const retryer = new AsyncRetryer(fetchData, { + maxAttempts: (retryer) => { + const error = retryer.store.state.lastError as any + + // Don't retry client errors (400-499) + if (error?.status >= 400 && error?.status < 500) { + return 1 // No retries + } + + // Retry server errors (500-599) + return 3 + } +}) +``` + +## Async Retrying in TanStack Pacer + +TanStack Pacer provides async retrying through the `asyncRetry` function and the more powerful `AsyncRetryer` class. + +### Basic Usage with `asyncRetry` + +The `asyncRetry` function provides a simple way to add retry functionality to any async function: + +```ts +import { asyncRetry } from '@tanstack/pacer' + +// Create a retry-enabled version of your async function +const fetchWithRetry = asyncRetry( + async (url: string) => { + const response = await fetch(url) + if (!response.ok) throw new Error('Request failed') + return response.json() + }, + { + maxAttempts: 3, + backoff: 'exponential', + baseWait: 1000 + } +) + +// Usage +try { + const data = await fetchWithRetry('/api/data') + console.log('Success:', data) +} catch (error) { + console.error('All retries failed:', error) +} +``` + +For more control over retry behavior, use the `AsyncRetryer` class directly. + +### Advanced Usage with `AsyncRetryer` Class + +The `AsyncRetryer` class provides complete control over retry behavior: + +```ts +import { AsyncRetryer } from '@tanstack/pacer' + +const retryer = new AsyncRetryer( + async (url: string) => { + const response = await fetch(url) + if (!response.ok) throw new Error('Request failed') + return response.json() + }, + { + maxAttempts: 5, + backoff: 'exponential', + baseWait: 1000, + jitter: 0.1, // Add 10% random variation + maxExecutionTime: 5000, // Abort individual calls after 5 seconds + maxTotalExecutionTime: 30000, // Abort entire operation after 30 seconds + key: 'api-fetcher', // Identify this retryer in devtools + onRetry: (attempt, error, retryer) => { + console.log(`Retry attempt ${attempt} after error:`, error) + }, + onSuccess: (result, args, retryer) => { + console.log('Request succeeded:', result) + }, + onError: (error, args, retryer) => { + console.error('Request failed:', error) + }, + onLastError: (error, retryer) => { + console.error('All retries exhausted:', error) + } + } +) + +// Execute the function with retry logic +const data = await retryer.execute('/api/data') +``` + +> **Note:** When using React, prefer `useAsyncRetryer` hook over the `asyncRetry` function for better integration with React's lifecycle and automatic cleanup. + +## Backoff Strategies + +The `backoff` option controls how the wait time between retry attempts changes: + +### Exponential Backoff (Default) + +Wait time doubles with each attempt. This is the most common strategy and works well for most scenarios: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + backoff: 'exponential', + baseWait: 1000 +}) +// Attempt 1: immediate +// Attempt 2: wait 1 second (1000ms * 2^0) +// Attempt 3: wait 2 seconds (1000ms * 2^1) +// Attempt 4: wait 4 seconds (1000ms * 2^2) +// Attempt 5: wait 8 seconds (1000ms * 2^3) +``` + +### Linear Backoff + +Wait time increases linearly with each attempt: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + backoff: 'linear', + baseWait: 1000 +}) +// Attempt 1: immediate +// Attempt 2: wait 1 second (1000ms * 1) +// Attempt 3: wait 2 seconds (1000ms * 2) +// Attempt 4: wait 3 seconds (1000ms * 3) +// Attempt 5: wait 4 seconds (1000ms * 4) +``` + +### Fixed Backoff + +Wait time remains constant for all attempts: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + backoff: 'fixed', + baseWait: 1000 +}) +// Attempt 1: immediate +// Attempt 2: wait 1 second +// Attempt 3: wait 1 second +// Attempt 4: wait 1 second +// Attempt 5: wait 1 second +``` + +## Jitter + +Jitter adds randomness to retry delays to prevent thundering herd problems, where many clients retry at the same time and overwhelm a recovering service. The `jitter` option accepts a value between 0 and 1, representing the percentage of random variation to apply: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + backoff: 'exponential', + baseWait: 1000, + jitter: 0.1 // Add ±10% random variation +}) +// Attempt 2: wait 900-1100ms (1000ms ± 10%) +// Attempt 3: wait 1800-2200ms (2000ms ± 10%) +// Attempt 4: wait 3600-4400ms (4000ms ± 10%) +``` + +Jitter is particularly useful when: +- Multiple clients might fail at the same time (e.g., service outage) +- You're dealing with rate-limited APIs +- You want to spread out retry attempts to avoid overwhelming a recovering service + +## Timeout Controls + +TanStack Pacer provides two types of timeout controls to prevent hanging operations: + +### Individual Execution Timeout + +The `maxExecutionTime` option sets the maximum time for a single function call: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + maxExecutionTime: 5000 // Abort individual calls after 5 seconds +}) +``` + +If a single execution exceeds this time, it will be aborted and retried (if attempts remain). + +### Total Execution Timeout + +The `maxTotalExecutionTime` option sets the maximum time for the entire retry operation: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + maxAttempts: 5, + baseWait: 1000, + maxTotalExecutionTime: 30000 // Abort entire operation after 30 seconds +}) +``` + +If the total time across all attempts exceeds this limit, the retry operation will be aborted. + +### Combining Timeouts + +You can combine both timeout types for comprehensive control: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + maxAttempts: 5, + backoff: 'exponential', + baseWait: 1000, + maxExecutionTime: 5000, // Individual call timeout + maxTotalExecutionTime: 30000 // Overall operation timeout +}) +``` + +## Error Handling + +The async retryer provides comprehensive error handling through callbacks and the `throwOnError` option: + +### Error Throwing Behavior + +The `throwOnError` option controls when errors are thrown: + +```ts +// Default: throw only the last error after all retries fail +const retryer1 = new AsyncRetryer(asyncFn, { + throwOnError: 'last' // Default +}) + +// Throw every error immediately (disables retrying) +const retryer2 = new AsyncRetryer(asyncFn, { + throwOnError: true +}) + +// Never throw errors, return undefined instead +const retryer3 = new AsyncRetryer(asyncFn, { + throwOnError: false +}) +``` + +### Error Callbacks + +The async retryer supports multiple callbacks for different stages of execution: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + maxAttempts: 3, + onRetry: (attempt, error, retryer) => { + // Called before each retry attempt + console.log(`Retrying (attempt ${attempt})...`) + console.log('Error:', error.message) + console.log('Current attempt:', retryer.store.state.currentAttempt) + }, + onError: (error, args, retryer) => { + // Called for every error (including during retries) + console.error('Execution failed:', error) + console.log('Failed with arguments:', args) + }, + onLastError: (error, retryer) => { + // Called only for the final error after all retries fail + console.error('All retries exhausted:', error) + console.log('Total execution time:', retryer.store.state.totalExecutionTime) + }, + onSuccess: (result, args, retryer) => { + // Called when execution succeeds + console.log('Execution succeeded:', result) + console.log('Succeeded with arguments:', args) + console.log('Attempts used:', retryer.store.state.currentAttempt) + }, + onSettled: (args, retryer) => { + // Called after execution completes (success or failure) + console.log('Execution settled') + console.log('Total executions:', retryer.store.state.executionCount) + } +}) +``` + +### Callback Execution Order + +The callbacks are executed in the following order: + +```text +1. execute() called +2. Try attempt 1 + └─ If fails: + ├─ onRetry(1, error) called + └─ Wait for backoff +3. Try attempt 2 + └─ If fails: + ├─ onRetry(2, error) called + └─ Wait for backoff +4. Try attempt 3 (last attempt) + └─ If fails: + ├─ onLastError(error) called + ├─ onError(error) called + ├─ onSettled() called + └─ Throw error (if throwOnError is 'last' or true) + └─ If succeeds: + ├─ onSuccess(result) called + ├─ onSettled() called + └─ Return result +``` + +## Dynamic Options and Enabling/Disabling + +The async retryer supports dynamic options that can change based on the retryer's current state: + +### Dynamic Max Attempts + +```ts +const retryer = new AsyncRetryer(asyncFn, { + maxAttempts: (retryer) => { + // Retry more times for critical operations + const errorCount = retryer.store.state.executionCount + return errorCount > 5 ? 2 : 5 + } +}) +``` + +### Dynamic Base Wait + +```ts +const retryer = new AsyncRetryer(asyncFn, { + baseWait: (retryer) => { + // Increase wait time if we've had many errors + const errorCount = retryer.store.state.executionCount + return errorCount > 10 ? 2000 : 1000 + } +}) +``` + +### Enabling/Disabling + +```ts +const retryer = new AsyncRetryer(asyncFn, { + enabled: (retryer) => { + // Disable retrying after too many failures + return retryer.store.state.executionCount < 100 + } +}) +``` + +## Abort and Cancellation + +The async retryer supports manual cancellation of ongoing execution and pending retries: + +### Manual Abort + +```ts +const retryer = new AsyncRetryer(longRunningAsyncFn, { + maxAttempts: 5, + baseWait: 1000 +}) + +// Start execution +const promise = retryer.execute() + +// Cancel execution and pending retries +retryer.abort() + +// The promise will resolve to undefined +const result = await promise +console.log(result) // undefined +``` + +### Automatic Cleanup + +When using framework adapters, cleanup is handled automatically: + +```tsx +// React example +function MyComponent() { + const retryer = useAsyncRetryer(asyncFn, { maxAttempts: 3 }) + + // Automatically calls abort() on unmount + return +} +``` + +### Reset + +The `reset()` method cancels execution and resets all state to initial values: + +```ts +const retryer = new AsyncRetryer(asyncFn, { maxAttempts: 3 }) + +await retryer.execute() +console.log(retryer.store.state.executionCount) // 1 + +// Reset to initial state +retryer.reset() +console.log(retryer.store.state.executionCount) // 0 +console.log(retryer.store.state.lastError) // undefined +console.log(retryer.store.state.lastResult) // undefined +``` + +## State Management + +The `AsyncRetryer` class uses TanStack Store for reactive state management, providing real-time access to execution state, error tracking, and retry statistics. All state is stored in a TanStack Store and can be accessed via `asyncRetryer.store.state`, although, if you are using a framework adapter like React or Solid, you will not want to read the state from here. Instead, you will read the state from `asyncRetryer.state` along with providing a selector callback as the 3rd argument to the `useAsyncRetryer` hook to opt-in to state tracking as shown below. + +### State Selector (Framework Adapters) + +Framework adapters support a `selector` argument that allows you to specify which state changes will trigger re-renders. This optimizes performance by preventing unnecessary re-renders when irrelevant state changes occur. + +**By default, `retryer.state` is empty (`{}`) as the selector is empty by default.** This is where reactive state from a TanStack Store `useStore` gets stored. You must opt-in to state tracking by providing a selector function. + +```tsx +// Default behavior - no reactive state subscriptions +const retryer = useAsyncRetryer(asyncFn, { maxAttempts: 3 }) +console.log(retryer.state) // {} + +// Opt-in to re-render when execution state changes +const retryer = useAsyncRetryer( + asyncFn, + { maxAttempts: 3 }, + (state) => ({ + isExecuting: state.isExecuting, + currentAttempt: state.currentAttempt + }) +) +console.log(retryer.state.isExecuting) // Reactive value +console.log(retryer.state.currentAttempt) // Reactive value + +// Opt-in to re-render when results are available +const retryer = useAsyncRetryer( + asyncFn, + { maxAttempts: 3 }, + (state) => ({ + lastResult: state.lastResult, + lastError: state.lastError, + status: state.status + }) +) +``` + +### Initial State + +You can provide initial state values when creating an async retryer. This is commonly used to restore state from persistent storage: + +```ts +// Load initial state from localStorage +const savedState = localStorage.getItem('async-retryer-state') +const initialState = savedState ? JSON.parse(savedState) : {} + +const retryer = new AsyncRetryer(asyncFn, { + maxAttempts: 3, + initialState +}) +``` + +### Subscribing to State Changes + +The store is reactive and supports subscriptions: + +```ts +const retryer = new AsyncRetryer(asyncFn, { maxAttempts: 3 }) + +// Subscribe to state changes +const unsubscribe = retryer.store.subscribe((state) => { + // do something with the state like persist it to localStorage + localStorage.setItem('async-retryer-state', JSON.stringify(state)) +}) + +// Unsubscribe when done +unsubscribe() +``` + +> **Note:** This is unnecessary when using a framework adapter because the underlying `useStore` hook already does this. You can also import and use `useStore` from TanStack Store to turn `retryer.store.state` into reactive state with a custom selector wherever you want if necessary. + +### Available State Properties + +The `AsyncRetryerState` includes: + +- `currentAttempt`: The current retry attempt number (0 when not executing) +- `executionCount`: Total number of completed executions (successful or failed) +- `isExecuting`: Whether the retryer is currently executing the function +- `lastError`: The most recent error encountered during execution +- `lastExecutionTime`: Timestamp of the last execution completion in milliseconds +- `lastResult`: The result from the most recent successful execution +- `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') +- `totalExecutionTime`: Total time spent executing (including retries) in milliseconds + +### Status Values + +The `status` property indicates the current state of the retryer: + +- `'disabled'`: The retryer is disabled (via `enabled: false`) +- `'idle'`: Ready to execute, not currently running +- `'executing'`: Currently executing the first attempt +- `'retrying'`: Currently executing a retry attempt (attempt > 1) + +## Framework Adapters + +Each framework adapter provides hooks that build on top of the core async retrying functionality to integrate with the framework's state management system. Hooks like `createAsyncRetryer`, `useAsyncRetryer`, or similar are available for each framework. + +### React Example + +```tsx +import { useAsyncRetryer } from '@tanstack/react-pacer' + +function DataFetcher() { + const retryer = useAsyncRetryer( + async (userId: string) => { + const response = await fetch(`/api/users/${userId}`) + if (!response.ok) throw new Error('Failed to fetch user') + return response.json() + }, + { + maxAttempts: 5, + backoff: 'exponential', + baseWait: 1000, + jitter: 0.1, + maxExecutionTime: 5000, + onRetry: (attempt) => console.log(`Retry attempt ${attempt}`) + }, + (state) => ({ + isExecuting: state.isExecuting, + currentAttempt: state.currentAttempt, + lastError: state.lastError, + lastResult: state.lastResult + }) + ) + + const handleFetch = async () => { + try { + const user = await retryer.execute('user123') + console.log('User:', user) + } catch (error) { + console.error('Failed to fetch user:', error) + } + } + + return ( +
+ + {retryer.state.lastError && ( +

Error: {retryer.state.lastError.message}

+ )} + {retryer.state.lastResult && ( +
{JSON.stringify(retryer.state.lastResult, null, 2)}
+ )} +
+ ) +} +``` + +## Best Practices + +### 1. Choose the Right Backoff Strategy + +- Use **exponential** backoff for most scenarios (default) +- Use **linear** backoff when you want slower growth in wait times +- Use **fixed** backoff when you have strict timing requirements + +### 2. Add Jitter for Distributed Systems + +When multiple clients might retry at the same time, add jitter to prevent thundering herd: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + backoff: 'exponential', + jitter: 0.2 // Add 20% random variation +}) +``` + +### 3. Set Appropriate Timeouts + +Always set timeouts to prevent hanging operations: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + maxExecutionTime: 5000, // Individual call timeout + maxTotalExecutionTime: 30000 // Overall operation timeout +}) +``` + +### 4. Use Callbacks for Side Effects + +Instead of wrapping the retryer in try-catch, use callbacks for cleaner code: + +```ts +const retryer = new AsyncRetryer(asyncFn, { + onSuccess: (result) => { + // Update UI, cache result, etc. + }, + onError: (error) => { + // Log error, show notification, etc. + }, + throwOnError: false // Don't throw, handle via callbacks +}) +``` + +### 5. Make Operations Idempotent + +Ensure your operations can be safely retried without side effects: + +```ts +// Good: Idempotent operation +const retryer = new AsyncRetryer( + async (userId: string) => { + // GET request is idempotent + return await fetch(`/api/users/${userId}`) + } +) + +// Be careful: Non-idempotent operation +const retryer = new AsyncRetryer( + async (amount: number) => { + // POST request that creates a charge + // Could charge multiple times if retried! + return await fetch('/api/charge', { + method: 'POST', + body: JSON.stringify({ amount }) + }) + } +) +``` + +### 6. Adjust Retry Count Based on Error Type + +Some errors should retry more or less than others: + +```ts +const retryer = new AsyncRetryer( + async (url: string) => { + const response = await fetch(url) + if (!response.ok) { + const error = new Error('Request failed') + error.status = response.status + throw error + } + return response.json() + }, + { + maxAttempts: (retryer) => { + const lastError = retryer.store.state.lastError + // Don't retry 4xx client errors + if (lastError?.status >= 400 && lastError?.status < 500) { + return 1 + } + // Retry 5xx server errors more times + return 5 + } + } +) +``` + diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index b6c37c15..dbe92d6e 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -182,7 +182,7 @@ Emits a change event for the async batcher instance. Mostly useful for devtools. abort(): void ``` -Defined in: [async-batcher.ts:444](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L444) +Defined in: [async-batcher.ts:474](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L474) Aborts all ongoing executions with the internal abort controllers. Does NOT cancel any pending execution that have not started yet. @@ -229,7 +229,7 @@ The error from the batch function if no onError handler is configured or throwOn cancel(): void ``` -Defined in: [async-batcher.ts:457](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L457) +Defined in: [async-batcher.ts:487](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L487) Cancels any pending execution that have not started yet. Does NOT abort any execution already in progress. @@ -273,6 +273,51 @@ Processes the current batch of items immediately *** +### getAbortSignal() + +```ts +getAbortSignal(executeCount?): null | AbortSignal +``` + +Defined in: [async-batcher.ts:463](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L463) + +Returns the AbortSignal for a specific execution. +If no executeCount is provided, returns the signal for the most recent execution. +Returns null if no execution is found or not currently executing. + +#### Parameters + +##### executeCount? + +`number` + +Optional specific execution to get signal for + +#### Returns + +`null` \| `AbortSignal` + +#### Example + +```typescript +const batcher = new AsyncBatcher( + async (items: string[]) => { + const signal = batcher.getAbortSignal() + if (signal) { + const response = await fetch('/api/batch', { + method: 'POST', + body: JSON.stringify(items), + signal + }) + return response.json() + } + }, + { maxSize: 10, wait: 100 } +) +``` + +*** + ### peekAllItems() ```ts @@ -309,7 +354,7 @@ Defined in: [async-batcher.ts:421](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:467](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L467) +Defined in: [async-batcher.ts:497](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L497) Resets the async batcher state to its default values diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index f22d6732..22a211aa 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -156,7 +156,7 @@ Emits a change event for the async debouncer instance. Mostly useful for devtool abort(): void ``` -Defined in: [async-debouncer.ts:421](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L421) +Defined in: [async-debouncer.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L447) Aborts all ongoing executions with the internal abort controllers. Does NOT cancel any pending execution that have not started yet. @@ -173,7 +173,7 @@ Does NOT cancel any pending execution that have not started yet. cancel(): void ``` -Defined in: [async-debouncer.ts:433](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L433) +Defined in: [async-debouncer.ts:459](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L459) Cancels any pending execution that have not started yet. Does NOT abort any execution already in progress. @@ -200,6 +200,47 @@ Processes the current pending execution immediately *** +### getAbortSignal() + +```ts +getAbortSignal(maybeExecuteCount?): null | AbortSignal +``` + +Defined in: [async-debouncer.ts:437](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L437) + +Returns the AbortSignal for a specific execution. +If no maybeExecuteCount is provided, returns the signal for the most recent execution. +Returns null if no execution is found or not currently executing. + +#### Parameters + +##### maybeExecuteCount? + +`number` + +Optional specific execution to get signal for + +#### Returns + +`null` \| `AbortSignal` + +#### Example + +```typescript +const debouncer = new AsyncDebouncer( + async (searchTerm: string) => { + const signal = debouncer.getAbortSignal() + if (signal) { + const response = await fetch(`/api/search?q=${searchTerm}`, { signal }) + return response.json() + } + }, + { wait: 300 } +) +``` + +*** + ### maybeExecute() ```ts @@ -242,7 +283,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [async-debouncer.ts:441](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L441) +Defined in: [async-debouncer.ts:467](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L467) Resets the debouncer state to its default values diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index add1fe4d..ce2b6103 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -171,7 +171,7 @@ Emits a change event for the async queuer instance. Mostly useful for devtools. abort(): void ``` -Defined in: [async-queuer.ts:785](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L785) +Defined in: [async-queuer.ts:811](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L811) Aborts all ongoing executions with the internal abort controllers. Does NOT clear out the items. @@ -320,6 +320,47 @@ The queue is cleared after processing *** +### getAbortSignal() + +```ts +getAbortSignal(executeCount?): null | AbortSignal +``` + +Defined in: [async-queuer.ts:801](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L801) + +Returns the AbortSignal for a specific execution. +If no executeCount is provided, returns the signal for the most recent execution. +Returns null if no execution is found or not currently executing. + +#### Parameters + +##### executeCount? + +`number` + +Optional specific execution to get signal for + +#### Returns + +`null` \| `AbortSignal` + +#### Example + +```typescript +const queuer = new AsyncQueuer( + async (item: string) => { + const signal = queuer.getAbortSignal() + if (signal) { + const response = await fetch(`/api/process/${item}`, { signal }) + return response.json() + } + }, + { concurrency: 2 } +) +``` + +*** + ### getNextItem() ```ts @@ -435,7 +476,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [async-queuer.ts:796](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L796) +Defined in: [async-queuer.ts:822](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L822) Resets the queuer state to its default values diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index e11e153c..2f5dfe07 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -177,7 +177,7 @@ Emits a change event for the async rate limiter instance. Mostly useful for devt abort(): void ``` -Defined in: [async-rate-limiter.ts:491](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L491) +Defined in: [async-rate-limiter.ts:518](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L518) Aborts all ongoing executions with the internal abort controllers. Does NOT clear out the execution times or reset the rate limiter. @@ -188,13 +188,54 @@ Does NOT clear out the execution times or reset the rate limiter. *** +### getAbortSignal() + +```ts +getAbortSignal(maybeExecuteCount?): null | AbortSignal +``` + +Defined in: [async-rate-limiter.ts:508](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L508) + +Returns the AbortSignal for a specific execution. +If no maybeExecuteCount is provided, returns the signal for the most recent execution. +Returns null if no execution is found or not currently executing. + +#### Parameters + +##### maybeExecuteCount? + +`number` + +Optional specific execution to get signal for + +#### Returns + +`null` \| `AbortSignal` + +#### Example + +```typescript +const rateLimiter = new AsyncRateLimiter( + async (userId: string) => { + const signal = rateLimiter.getAbortSignal() + if (signal) { + const response = await fetch(`/api/users/${userId}`, { signal }) + return response.json() + } + }, + { limit: 5, window: 1000 } +) +``` + +*** + ### getMsUntilNextWindow() ```ts getMsUntilNextWindow(): number ``` -Defined in: [async-rate-limiter.ts:479](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L479) +Defined in: [async-rate-limiter.ts:480](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L480) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -212,7 +253,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [async-rate-limiter.ts:469](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L469) +Defined in: [async-rate-limiter.ts:470](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L470) Returns the number of remaining executions allowed in the current window @@ -276,7 +317,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [async-rate-limiter.ts:502](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L502) +Defined in: [async-rate-limiter.ts:529](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L529) Resets the rate limiter state diff --git a/docs/reference/classes/asyncretryer.md b/docs/reference/classes/asyncretryer.md index 6d097078..ffd175da 100644 --- a/docs/reference/classes/asyncretryer.md +++ b/docs/reference/classes/asyncretryer.md @@ -7,10 +7,10 @@ title: AsyncRetryer # Class: AsyncRetryer\ -Defined in: [async-retryer.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L214) +Defined in: [async-retryer.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L245) Provides robust retry functionality for asynchronous functions, supporting configurable backoff strategies, -attempt limits, and detailed state management. The AsyncRetryer class is designed to help you reliably +attempt limits, timeout controls, and detailed state management. The AsyncRetryer class is designed to help you reliably execute async operations that may fail intermittently, such as network requests or database operations, by automatically retrying them according to your chosen policy. @@ -24,40 +24,59 @@ by automatically retrying them according to your chosen policy. - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt - **Jitter**: Adds randomness to retry delays to prevent thundering herd problems (default: `0`). Set to a value between 0-1 to apply that percentage of random variation to each delay. -- **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. If cancelled, retries are stopped. -- **State Management**: Tracks execution status, current attempt, last error, and result using TanStack Store. -- **Callbacks**: Provides hooks for handling success, error, retry, and settled events. +- **Timeout Controls**: Set limits on execution time to prevent hanging operations: + - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) + - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) +- **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. Call `abort()` to stop retries. ## State Management -- Uses TanStack Store for fine-grained reactivity. -- State includes: `isExecuting`, `currentAttempt`, `lastError`, `lastResult`, and `status` (`idle`, `executing`, `retrying`, `disabled`). -- State can be accessed via the `store.state` property. + +Uses TanStack Store for fine-grained reactivity. State can be accessed via the `store.state` property. + +Available state properties: +- `currentAttempt`: The current retry attempt number (0 when not executing) +- `executionCount`: Total number of completed executions (successful or failed) +- `isExecuting`: Whether the retryer is currently executing the function +- `lastError`: The most recent error encountered during execution +- `lastExecutionTime`: Timestamp of the last execution completion in milliseconds +- `lastResult`: The result from the most recent successful execution +- `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') +- `totalExecutionTime`: Total time spent executing (including retries) in milliseconds ## Error Handling + The `throwOnError` option controls when errors are thrown (default: `'last'`): - `'last'`: Only throws the final error after all retries are exhausted - **DEFAULT** -- `true`: Throws every error immediately (no retries) +- `true`: Throws every error immediately (disables retrying) - `false`: Never throws errors, returns `undefined` instead -Additional error handling: +Callbacks for error handling: - `onError`: Called for every error (including during retries) - `onLastError`: Called only for the final error after all retries fail -- If `onError` is provided but `throwOnError` is not specified, defaults to `'last'` +- `onRetry`: Called before each retry attempt +- `onSuccess`: Called when execution succeeds +- `onSettled`: Called after execution completes (success or failure) ## Usage + - Use for async operations that may fail transiently and benefit from retrying. - Configure `maxAttempts`, `backoff`, `baseWait`, and `jitter` to control retry behavior. -- Use `onRetry`, `onSuccess`, `onError`, and `onSettled` for custom side effects. +- Set `maxExecutionTime` and `maxTotalExecutionTime` to prevent hanging operations. +- Use `onRetry`, `onSuccess`, `onError`, `onLastError`, and `onSettled` for custom side effects. +- Call `abort()` to cancel ongoing execution and pending retries. +- Call `reset()` to reset state and cancel execution. ## Example ```typescript -// Retry a fetch operation up to 5 times with exponential backoff and jitter +// Retry a fetch operation up to 5 times with exponential backoff, jitter, and timeouts const retryer = new AsyncRetryer(fetchData, { maxAttempts: 5, backoff: 'exponential', baseWait: 1000, jitter: 0.1, // Add 10% random variation to prevent thundering herd + maxExecutionTime: 5000, // Abort individual calls after 5 seconds + maxTotalExecutionTime: 30000, // Abort entire operation after 30 seconds onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), onSuccess: (result) => console.log('Success:', result), onError: (error) => console.error('Error:', error), @@ -81,7 +100,7 @@ The async function type to be retried. new AsyncRetryer(fn, initialOptions): AsyncRetryer ``` -Defined in: [async-retryer.ts:227](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L227) +Defined in: [async-retryer.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L258) Creates a new AsyncRetryer instance @@ -111,7 +130,7 @@ Configuration options for the retryer fn: TFn; ``` -Defined in: [async-retryer.ts:228](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L228) +Defined in: [async-retryer.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L259) The async function to retry @@ -123,7 +142,7 @@ The async function to retry key: string; ``` -Defined in: [async-retryer.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L218) +Defined in: [async-retryer.ts:249](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L249) *** @@ -140,7 +159,7 @@ options: AsyncRetryerOptions & Omit>, | "onRetry">; ``` -Defined in: [async-retryer.ts:219](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L219) +Defined in: [async-retryer.ts:250](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L250) *** @@ -150,7 +169,7 @@ Defined in: [async-retryer.ts:219](https://github.com/TanStack/pacer/blob/main/p readonly store: Store>>; ``` -Defined in: [async-retryer.ts:215](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L215) +Defined in: [async-retryer.ts:246](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L246) ## Methods @@ -160,7 +179,7 @@ Defined in: [async-retryer.ts:215](https://github.com/TanStack/pacer/blob/main/p _emit(): void ``` -Defined in: [async-retryer.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L251) +Defined in: [async-retryer.ts:282](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L282) Emits a change event for the async retryer instance. Mostly useful for devtools. @@ -176,7 +195,7 @@ Emits a change event for the async retryer instance. Mostly useful for devtools. abort(): void ``` -Defined in: [async-retryer.ts:452](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L452) +Defined in: [async-retryer.ts:560](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L560) Cancels the current execution and any pending retries @@ -192,7 +211,7 @@ Cancels the current execution and any pending retries execute(...args): Promise> ``` -Defined in: [async-retryer.ts:341](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L341) +Defined in: [async-retryer.ts:372](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L372) Executes the function with retry logic @@ -216,13 +235,46 @@ The last error if throwOnError is true and all retries fail *** +### getAbortSignal() + +```ts +getAbortSignal(): null | AbortSignal +``` + +Defined in: [async-retryer.ts:553](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L553) + +Returns the current AbortSignal for the executing operation. +Use this signal in your async function to make it cancellable. +Returns null when not currently executing. + +#### Returns + +`null` \| `AbortSignal` + +#### Example + +```typescript +const retryer = new AsyncRetryer(async (userId: string) => { + const signal = retryer.getAbortSignal() + if (signal) { + return fetch(`/api/users/${userId}`, { signal }) + } + return fetch(`/api/users/${userId}`) +}) + +// Abort will now actually cancel the fetch +retryer.abort() +``` + +*** + ### reset() ```ts reset(): void ``` -Defined in: [async-retryer.ts:465](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L465) +Defined in: [async-retryer.ts:573](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L573) Resets the retryer to its initial state and cancels any ongoing execution @@ -238,7 +290,7 @@ Resets the retryer to its initial state and cancels any ongoing execution setOptions(newOptions): void ``` -Defined in: [async-retryer.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L257) +Defined in: [async-retryer.ts:288](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L288) Updates the retryer options diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index 829b2c1f..3e1d6f62 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -159,7 +159,7 @@ Emits a change event for the async throttler instance. Mostly useful for devtool abort(): void ``` -Defined in: [async-throttler.ts:480](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L480) +Defined in: [async-throttler.ts:510](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L510) Aborts all ongoing executions with the internal abort controllers. Does NOT cancel any pending execution that have not started yet. @@ -176,7 +176,7 @@ Does NOT cancel any pending execution that have not started yet. cancel(): void ``` -Defined in: [async-throttler.ts:490](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L490) +Defined in: [async-throttler.ts:520](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L520) Cancels any pending execution that have not started yet. Does NOT abort any execution already in progress. @@ -203,6 +203,51 @@ Processes the current pending execution immediately *** +### getAbortSignal() + +```ts +getAbortSignal(maybeExecuteCount?): null | AbortSignal +``` + +Defined in: [async-throttler.ts:500](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L500) + +Returns the AbortSignal for a specific execution. +If no maybeExecuteCount is provided, returns the signal for the most recent execution. +Returns null if no execution is found or not currently executing. + +#### Parameters + +##### maybeExecuteCount? + +`number` + +Optional specific execution to get signal for + +#### Returns + +`null` \| `AbortSignal` + +#### Example + +```typescript +const throttler = new AsyncThrottler( + async (data: string) => { + const signal = throttler.getAbortSignal() + if (signal) { + const response = await fetch('/api/save', { + method: 'POST', + body: data, + signal + }) + return response.json() + } + }, + { wait: 1000 } +) +``` + +*** + ### maybeExecute() ```ts @@ -251,7 +296,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [async-throttler.ts:504](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L504) +Defined in: [async-throttler.ts:534](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L534) Resets the debouncer state to its default values diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index 337f8dbc..f544ec59 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,7 +11,7 @@ title: asyncBatch function asyncBatch(fn, options): (item) => Promise ``` -Defined in: [async-batcher.ts:522](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L522) +Defined in: [async-batcher.ts:552](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L552) Creates an async batcher that processes items in batches diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index 63897d7e..239466ab 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,7 +11,7 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-debouncer.ts:490](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L490) +Defined in: [async-debouncer.ts:516](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L516) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index 33a2e33f..67832666 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,7 +11,7 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [async-queuer.ts:835](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L835) +Defined in: [async-queuer.ts:861](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L861) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index 547e2669..76c7f1da 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,7 +11,7 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-rate-limiter.ts:573](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L573) +Defined in: [async-rate-limiter.ts:600](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L600) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. diff --git a/docs/reference/functions/asyncretry.md b/docs/reference/functions/asyncretry.md index 3eccab27..ce29fb55 100644 --- a/docs/reference/functions/asyncretry.md +++ b/docs/reference/functions/asyncretry.md @@ -11,7 +11,7 @@ title: asyncRetry function asyncRetry(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-retryer.ts:488](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L488) +Defined in: [async-retryer.ts:596](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L596) Creates a retry-enabled version of an async function @@ -54,7 +54,7 @@ A new function that executes the original with retry logic ```typescript const retryFetch = asyncRetry(fetch, { maxAttempts: 3, - backoff: 'exponential' + backoff: 'exponential' // default }) const response = await retryFetch('/api/data') diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index 0c393f0c..0ca8d62d 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,7 +11,7 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-throttler.ts:552](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L552) +Defined in: [async-throttler.ts:582](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L582) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. diff --git a/docs/reference/interfaces/asyncretryeroptions.md b/docs/reference/interfaces/asyncretryeroptions.md index ceed5adc..d02145e0 100644 --- a/docs/reference/interfaces/asyncretryeroptions.md +++ b/docs/reference/interfaces/asyncretryeroptions.md @@ -121,7 +121,7 @@ If provided, the async retryer will be identified by this key in the devtools an optional maxAttempts: number | (retryer) => number; ``` -Defined in: [async-retryer.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L97) +Defined in: [async-retryer.ts:107](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L107) Maximum number of retry attempts, or a function that returns the max attempts @@ -133,13 +133,49 @@ Maximum number of retry attempts, or a function that returns the max attempts *** +### maxExecutionTime? + +```ts +optional maxExecutionTime: number; +``` + +Defined in: [async-retryer.ts:97](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L97) + +Maximum execution time in milliseconds for a single function call before aborting + +#### Default + +```ts +Infinity +``` + +*** + +### maxTotalExecutionTime? + +```ts +optional maxTotalExecutionTime: number; +``` + +Defined in: [async-retryer.ts:102](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L102) + +Maximum total execution time in milliseconds for the entire retry operation before aborting + +#### Default + +```ts +Infinity +``` + +*** + ### onError()? ```ts optional onError: (error, args, retryer) => void; ``` -Defined in: [async-retryer.ts:101](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L101) +Defined in: [async-retryer.ts:111](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L111) Callback invoked when any error occurs during execution (including retries) @@ -169,7 +205,7 @@ Callback invoked when any error occurs during execution (including retries) optional onLastError: (error, retryer) => void; ``` -Defined in: [async-retryer.ts:109](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L109) +Defined in: [async-retryer.ts:119](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L119) Callback invoked when the final error occurs after all retries are exhausted @@ -195,7 +231,7 @@ Callback invoked when the final error occurs after all retries are exhausted optional onRetry: (attempt, error, retryer) => void; ``` -Defined in: [async-retryer.ts:113](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L113) +Defined in: [async-retryer.ts:123](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L123) Callback invoked before each retry attempt @@ -225,7 +261,7 @@ Callback invoked before each retry attempt optional onSettled: (args, retryer) => void; ``` -Defined in: [async-retryer.ts:117](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L117) +Defined in: [async-retryer.ts:127](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L127) Callback invoked after execution completes (success or failure) @@ -251,7 +287,7 @@ Callback invoked after execution completes (success or failure) optional onSuccess: (result, args, retryer) => void; ``` -Defined in: [async-retryer.ts:121](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L121) +Defined in: [async-retryer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L131) Callback invoked when execution succeeds @@ -281,7 +317,7 @@ Callback invoked when execution succeeds optional throwOnError: boolean | "last"; ``` -Defined in: [async-retryer.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L133) +Defined in: [async-retryer.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L143) Controls when errors are thrown: - 'last': Only throw the final error after all retries are exhausted diff --git a/examples/react/asyncRetry/.eslintrc.cjs b/examples/react/asyncRetry/.eslintrc.cjs new file mode 100644 index 00000000..9ff0b9fc --- /dev/null +++ b/examples/react/asyncRetry/.eslintrc.cjs @@ -0,0 +1,13 @@ +// @ts-check + +/** @type {import('eslint').Linter.Config} */ +const config = { + settings: { + extends: ['plugin:react/recommended', 'plugin:react-hooks/recommended'], + rules: { + 'react/no-children-prop': 'off', + }, + }, +} + +module.exports = config diff --git a/examples/react/asyncRetry/.gitignore b/examples/react/asyncRetry/.gitignore new file mode 100644 index 00000000..872082d1 --- /dev/null +++ b/examples/react/asyncRetry/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +pnpm-lock.yaml +yarn.lock +package-lock.json + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* \ No newline at end of file diff --git a/examples/react/asyncRetry/README.md b/examples/react/asyncRetry/README.md new file mode 100644 index 00000000..c953e6ee --- /dev/null +++ b/examples/react/asyncRetry/README.md @@ -0,0 +1,24 @@ +# AsyncBatch Example + +This example demonstrates how to use the `asyncBatch` function from `@tanstack/react-pacer` wrapped in a `useCallback` hook for optimal performance. + +The example combines features from both the `batch` and `useAsyncBatcher` examples: + +- Uses `asyncBatch` function (functional API) like in the sync batcher examples +- Wrapped in `useCallback` for performance optimization +- Demonstrates async processing with error handling +- Shows manual state management for batch tracking + +## Key Features + +- **Async Processing**: Processes items asynchronously with simulated delays +- **Batch Control**: Batches up to 5 items or processes after 3 seconds +- **Urgent Processing**: Items marked as "urgent" trigger immediate processing +- **Error Handling**: Graceful error handling with configurable failure simulation +- **Performance**: Uses `useCallback` to prevent unnecessary re-renders +- **Manual State Management**: Tracks processing state without reactive hooks + +## To run this example: + +- `npm install` +- `npm run dev` diff --git a/examples/react/asyncRetry/index.html b/examples/react/asyncRetry/index.html new file mode 100644 index 00000000..ef327a8e --- /dev/null +++ b/examples/react/asyncRetry/index.html @@ -0,0 +1,16 @@ + + + + + + + + + TanStack Pacer AsyncBatch Example + + + +
+ + + diff --git a/examples/react/asyncRetry/package.json b/examples/react/asyncRetry/package.json new file mode 100644 index 00000000..b065f377 --- /dev/null +++ b/examples/react/asyncRetry/package.json @@ -0,0 +1,34 @@ +{ + "name": "@tanstack/pacer-example-react-asyncretry", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3005", + "build": "vite build", + "preview": "vite preview", + "test:types": "tsc" + }, + "dependencies": { + "@tanstack/react-pacer": "^0.16.4", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@types/react": "^19.1.17", + "@types/react-dom": "^19.1.11", + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/examples/react/asyncRetry/public/emblem-light.svg b/examples/react/asyncRetry/public/emblem-light.svg new file mode 100644 index 00000000..16d57489 --- /dev/null +++ b/examples/react/asyncRetry/public/emblem-light.svg @@ -0,0 +1,13 @@ + + + + emblem-light + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/examples/react/asyncRetry/src/index.tsx b/examples/react/asyncRetry/src/index.tsx new file mode 100644 index 00000000..1d6a06a2 --- /dev/null +++ b/examples/react/asyncRetry/src/index.tsx @@ -0,0 +1,424 @@ +import { useState, useRef } from 'react' +import ReactDOM from 'react-dom/client' +import { asyncRetry } from '@tanstack/react-pacer/async-retryer' + +interface UserData { + id: number + name: string + email: string +} + +// Simulate API call with fake data that can fail or timeout +const fakeApi = async ( + userId: string, + options: { shouldFail?: boolean; shouldTimeout?: boolean } = {}, +): Promise => { + const delay = options.shouldTimeout ? 3000 : 800 // Simulate network delay + await new Promise((resolve) => setTimeout(resolve, delay)) + + if (options.shouldFail || Math.random() < 0.6) { + throw new Error(`Network error fetching user ${userId}`) + } + + return { + id: parseInt(userId), + name: `User ${userId}`, + email: `user${userId}@example.com`, + } +} + +function App() { + const [userId, setUserId] = useState('123') + const [userData, setUserData] = useState(null) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [currentAttempt, setCurrentAttempt] = useState(0) + const [scenario, setScenario] = useState< + 'default' | 'timeout' | 'jitter' | 'linear' + >('default') + const [logs, setLogs] = useState([]) + const abortControllerRef = useRef(null) + + const addLog = (message: string) => { + setLogs((prev) => [ + ...prev.slice(-9), + `${new Date().toLocaleTimeString()}: ${message}`, + ]) + } + + // Get options based on selected scenario + const getOptions = () => { + const baseOptions = { + onRetry: (attempt: number, error: Error) => { + addLog(`Retry attempt ${attempt} after error: ${error.message}`) + setCurrentAttempt(attempt + 1) + }, + onError: (error: Error) => { + addLog(`Request failed: ${error.message}`) + }, + onLastError: (error: Error) => { + addLog(`All retries exhausted: ${error.message}`) + setError(error.message) + setUserData(null) + }, + onSuccess: async (result: Promise) => { + const data = await result + addLog(`Request succeeded for user ${data.id}`) + setUserData(data) + setError(null) + }, + onSettled: () => { + addLog('Request settled') + setCurrentAttempt(0) + }, + } + + switch (scenario) { + case 'timeout': + return { + ...baseOptions, + maxAttempts: 3, + backoff: 'exponential' as const, + baseWait: 500, + maxExecutionTime: 2000, // Individual call timeout + maxTotalExecutionTime: 8000, // Total timeout for all retries + jitter: 0, + } + case 'jitter': + return { + ...baseOptions, + maxAttempts: 5, + backoff: 'exponential' as const, + baseWait: 500, + jitter: 0.3, // 30% random variation + } + case 'linear': + return { + ...baseOptions, + maxAttempts: 4, + backoff: 'linear' as const, + baseWait: 1000, + jitter: 0, + } + default: + return { + ...baseOptions, + maxAttempts: 5, + backoff: 'exponential' as const, + baseWait: 1000, + jitter: 0, + } + } + } + + // Create the retry-wrapped function + const fetchUserWithRetry = asyncRetry(async (id: string) => { + addLog(`Attempting to fetch user ${id}`) + return await fakeApi(id, { + shouldTimeout: scenario === 'timeout', + }) + }, getOptions()) + + // Handle fetch with abort support + async function onFetchUser() { + setLogs([]) + setIsLoading(true) + setError(null) + setCurrentAttempt(1) + addLog('Starting fetch operation') + + // Create abort controller + abortControllerRef.current = new AbortController() + + try { + const result = await fetchUserWithRetry(userId) + addLog(`Final result: ${result ? `User ${result.id}` : 'undefined'}`) + } catch (error) { + addLog( + `Caught error: ${error instanceof Error ? error.message : 'Unknown error'}`, + ) + setError(error instanceof Error ? error.message : 'Unknown error') + } finally { + setIsLoading(false) + abortControllerRef.current = null + } + } + + function onAbort() { + if (abortControllerRef.current) { + abortControllerRef.current.abort() + addLog('Operation aborted by user') + setIsLoading(false) + setCurrentAttempt(0) + } + } + + function onReset() { + setUserData(null) + setError(null) + setLogs([]) + setCurrentAttempt(0) + addLog('State reset') + } + + return ( +
+

TanStack Pacer asyncRetry Example

+

+ Demonstrates the asyncRetry utility function with configurable backoff + strategies, timeouts, jitter, and error handling. +

+ +
+
+

Configuration

+
+ + +
+ +
+ + setUserId(e.target.value)} + placeholder="Enter user ID..." + style={{ padding: '5px', width: '100%' }} + disabled={isLoading} + /> +
+ +
+ + + +
+ +
+

Current Options:

+
+              {(() => {
+                const opts = getOptions()
+                return JSON.stringify(
+                  {
+                    maxAttempts: opts.maxAttempts,
+                    backoff: opts.backoff,
+                    baseWait: opts.baseWait,
+                    jitter: opts.jitter,
+                    maxExecutionTime:
+                      'maxExecutionTime' in opts
+                        ? opts.maxExecutionTime
+                        : Infinity,
+                    maxTotalExecutionTime:
+                      'maxTotalExecutionTime' in opts
+                        ? opts.maxTotalExecutionTime
+                        : Infinity,
+                  },
+                  null,
+                  2,
+                )
+              })()}
+            
+
+
+ +
+

State

+
+
+ Status:{' '} + 1 + ? '#ff8c00' + : '#ffd700' + : '#90ee90', + }} + > + {isLoading + ? currentAttempt > 1 + ? 'retrying' + : 'executing' + : 'idle'} + +
+ {currentAttempt > 0 && ( +

+ Current Attempt: {currentAttempt} /{' '} + {(() => { + const opts = getOptions() + return opts.maxAttempts + })()} +

+ )} + {error && ( +
+ Error: +
+ {error} +
+ )} +
+ + {userData && ( +
+

User Data:

+

+ ID: {userData.id} +

+

+ Name: {userData.name} +

+

+ Email: {userData.email} +

+
+ )} +
+
+ +
+

Activity Log

+
+ {logs.length === 0 ? ( +
No activity yet
+ ) : ( + logs.map((log, i) => ( +
+ {log} +
+ )) + )} +
+
+ +
+ Note: This example uses the asyncRetry{' '} + utility function, which is a lightweight wrapper that creates a + retry-enabled version of your async function. For React integration with + hooks and reactive state, check out the useAsyncRetryer{' '} + example. +
+ +
+ Key Differences: +
    +
  • + asyncRetry - Functional utility that wraps an async + function with retry logic +
  • +
  • + useAsyncRetryer - React hook that provides reactive + state and lifecycle management +
  • +
  • + AsyncRetryer - Low-level class for advanced use cases + with fine-grained control +
  • +
+
+
+ ) +} + +const root = ReactDOM.createRoot(document.getElementById('root')!) +root.render() diff --git a/examples/react/asyncRetry/tsconfig.json b/examples/react/asyncRetry/tsconfig.json new file mode 100644 index 00000000..6e9088d6 --- /dev/null +++ b/examples/react/asyncRetry/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "vite.config.ts"] +} diff --git a/examples/react/asyncRetry/vite.config.ts b/examples/react/asyncRetry/vite.config.ts new file mode 100644 index 00000000..4e194366 --- /dev/null +++ b/examples/react/asyncRetry/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + react({ + // babel: { + // plugins: [['babel-plugin-react-compiler', { target: '19' }]], + // }, + }), + ], +}) diff --git a/examples/react/useAsyncRetryer/src/index.tsx b/examples/react/useAsyncRetryer/src/index.tsx index 0cc442b8..8ccc675b 100644 --- a/examples/react/useAsyncRetryer/src/index.tsx +++ b/examples/react/useAsyncRetryer/src/index.tsx @@ -8,12 +8,15 @@ interface UserData { email: string } -// Simulate API call with fake data that fails randomly -const fakeApi = async (userId: string): Promise => { - await new Promise((resolve) => setTimeout(resolve, 800)) // Simulate network delay +// Simulate API call with fake data that can fail or timeout +const fakeApi = async ( + userId: string, + options: { shouldFail?: boolean; shouldTimeout?: boolean } = {}, +): Promise => { + const delay = options.shouldTimeout ? 3000 : 800 // Simulate network delay + await new Promise((resolve) => setTimeout(resolve, delay)) - // Randomly fail 60% of the time to demonstrate retry functionality - if (Math.random() < 0.6) { + if (options.shouldFail || Math.random() < 0.6) { throw new Error(`Network error fetching user ${userId}`) } @@ -27,130 +30,384 @@ const fakeApi = async (userId: string): Promise => { function App() { const [userId, setUserId] = useState('123') const [userData, setUserData] = useState(null) + const [scenario, setScenario] = useState< + 'default' | 'timeout' | 'jitter' | 'linear' + >('default') + const [logs, setLogs] = useState([]) + + const addLog = (message: string) => { + setLogs((prev) => [ + ...prev.slice(-9), + `${new Date().toLocaleTimeString()}: ${message}`, + ]) + } // The function that will be retried const fetchUser = async (id: string) => { - const data = await fakeApi(id) + addLog(`Attempting to fetch user ${id}`) + const data = await fakeApi(id, { + shouldTimeout: scenario === 'timeout', + }) setUserData(data) return data } - // hook that gives you an async retryer instance - const asyncRetryer = useAsyncRetryer( - fetchUser, - { - maxAttempts: 5, // Retry up to 5 times - backoff: 'exponential', // Exponential backoff (1s, 2s, 4s, 8s, 16s) - baseWait: 1000, // Start with 1 second wait - onRetry: (attempt, error) => { - console.log(`Retry attempt ${attempt} after error:`, error) + // Get options based on selected scenario + const getOptions = () => { + const baseOptions = { + onRetry: (attempt: number, error: Error) => { + addLog(`Retry attempt ${attempt} after error: ${error.message}`) }, - onError: (error) => { - console.error('Request failed:', error) + onError: (error: Error) => { + addLog(`Request failed: ${error.message}`) }, - onLastError: (error) => { - console.error('All retries failed:', error) + onLastError: (error: Error) => { + addLog(`All retries exhausted: ${error.message}`) setUserData(null) }, - onSuccess: (result) => { - console.log('Request succeeded:', result) + onSuccess: async (result: Promise) => { + const data = await result + addLog(`Request succeeded for user ${data.id}`) }, - }, - // Optional Selector function to pick the state you want to track and use + onSettled: () => { + addLog('Request settled') + }, + } + + switch (scenario) { + case 'timeout': + return { + ...baseOptions, + maxAttempts: 3, + backoff: 'exponential' as const, + baseWait: 500, + maxExecutionTime: 2000, // Individual call timeout + maxTotalExecutionTime: 8000, // Total timeout for all retries + jitter: 0, + } + case 'jitter': + return { + ...baseOptions, + maxAttempts: 5, + backoff: 'exponential' as const, + baseWait: 500, + jitter: 0.3, // 30% random variation + } + case 'linear': + return { + ...baseOptions, + maxAttempts: 4, + backoff: 'linear' as const, + baseWait: 1000, + jitter: 0, + } + default: + return { + ...baseOptions, + maxAttempts: 5, + backoff: 'exponential' as const, + baseWait: 1000, + jitter: 0, + } + } + } + + // Hook that gives you an async retryer instance + const asyncRetryer = useAsyncRetryer( + fetchUser, + getOptions(), + // Selector function to pick the state you want to track (state) => ({ isExecuting: state.isExecuting, currentAttempt: state.currentAttempt, executionCount: state.executionCount, lastError: state.lastError, + lastResult: state.lastResult, status: state.status, + totalExecutionTime: state.totalExecutionTime, + lastExecutionTime: state.lastExecutionTime, }), ) - // get and name our retry function - const handleFetchUser = asyncRetryer.execute - - // event handler that calls the retry function + // Event handler that calls the retry function async function onFetchUser() { - const result = await handleFetchUser(userId) // optionally await result if you need to - console.log('Final result:', result) + setLogs([]) + addLog('Starting fetch operation') + try { + const result = await asyncRetryer.execute(userId) + addLog(`Final result: ${result ? `User ${result.id}` : 'undefined'}`) + } catch (error) { + addLog( + `Caught error: ${error instanceof Error ? error.message : 'Unknown error'}`, + ) + } } return ( -
+

TanStack Pacer useAsyncRetryer Example

-
- setUserId(e.target.value)} - placeholder="Enter user ID..." - style={{ marginRight: '10px' }} - /> - -
+

+ Demonstrates async retry functionality with configurable backoff + strategies, timeouts, jitter, and error handling. +

-
- - -
+
+
+

Configuration

+
+ + +
-
-

- Status: {asyncRetryer.state.status} -

- {asyncRetryer.state.currentAttempt > 0 && ( -

- Current Attempt:{' '} - {asyncRetryer.state.currentAttempt} -

- )} -

- Total Executions: {asyncRetryer.state.executionCount} -

- {asyncRetryer.state.lastError && ( -

- Last Error: {asyncRetryer.state.lastError.message} -

- )} +
+ + setUserId(e.target.value)} + placeholder="Enter user ID..." + style={{ padding: '5px', width: '100%' }} + /> +
+ +
+ + + +
+ +
+

Current Options:

+
+              {JSON.stringify(
+                {
+                  maxAttempts: asyncRetryer.options.maxAttempts,
+                  backoff: asyncRetryer.options.backoff,
+                  baseWait: asyncRetryer.options.baseWait,
+                  jitter: asyncRetryer.options.jitter,
+                  maxExecutionTime: asyncRetryer.options.maxExecutionTime,
+                  maxTotalExecutionTime:
+                    asyncRetryer.options.maxTotalExecutionTime,
+                  throwOnError: asyncRetryer.options.throwOnError,
+                },
+                null,
+                2,
+              )}
+            
+
+
+ +
+

State

+
+
+ Status:{' '} + + {asyncRetryer.state.status} + +
+ {asyncRetryer.state.currentAttempt > 0 && ( +

+ Current Attempt:{' '} + {asyncRetryer.state.currentAttempt} /{' '} + {typeof asyncRetryer.options.maxAttempts === 'function' + ? asyncRetryer.options.maxAttempts(asyncRetryer as any) + : asyncRetryer.options.maxAttempts} +

+ )} +

+ Total Executions:{' '} + {asyncRetryer.state.executionCount} +

+ {asyncRetryer.state.totalExecutionTime > 0 && ( +

+ Total Execution Time:{' '} + {asyncRetryer.state.totalExecutionTime}ms +

+ )} + {asyncRetryer.state.lastExecutionTime > 0 && ( +

+ Last Execution:{' '} + {new Date( + asyncRetryer.state.lastExecutionTime, + ).toLocaleTimeString()} +

+ )} + {asyncRetryer.state.lastError && ( +
+ Last Error: +
+ {asyncRetryer.state.lastError.message} +
+ )} +
+ + {userData && ( +
+

User Data:

+

+ ID: {userData.id} +

+

+ Name: {userData.name} +

+

+ Email: {userData.email} +

+
+ )} +
- {userData && ( +
+

Activity Log

-

User Data:

-

- ID: {userData.id} -

-

- Name: {userData.name} -

-

- Email: {userData.email} -

+ {logs.length === 0 ? ( +
No activity yet
+ ) : ( + logs.map((log, i) => ( +
+ {log} +
+ )) + )}
- )} +
-
+        
+ + Full State (Debug) + +
+            {JSON.stringify(asyncRetryer.store.state, null, 2)}
+          
+
+
+ +
- {JSON.stringify(asyncRetryer.store.state, null, 2)} - + Tip: Press Shift + Enter to toggle component + mounting (demonstrates cleanup) +
) } @@ -160,7 +417,7 @@ const root = ReactDOM.createRoot(document.getElementById('root')!) let mounted = true root.render() -// demo unmounting and cancellation +// Demo unmounting and cancellation document.addEventListener('keydown', (e) => { if (e.shiftKey && e.key === 'Enter') { mounted = !mounted diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 17033087..89f24714 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -436,6 +436,36 @@ export class AsyncBatcher { this.#setState({ items: [], failedItems: [], isPending: false }) } + /** + * Returns the AbortSignal for a specific execution. + * If no executeCount is provided, returns the signal for the most recent execution. + * Returns null if no execution is found or not currently executing. + * + * @param executeCount - Optional specific execution to get signal for + * @example + * ```typescript + * const batcher = new AsyncBatcher( + * async (items: string[]) => { + * const signal = batcher.getAbortSignal() + * if (signal) { + * const response = await fetch('/api/batch', { + * method: 'POST', + * body: JSON.stringify(items), + * signal + * }) + * return response.json() + * } + * }, + * { maxSize: 10, wait: 100 } + * ) + * ``` + */ + getAbortSignal(executeCount?: number): AbortSignal | null { + const count = executeCount ?? this.store.state.executeCount + const retryer = this.asyncRetryers.get(count) + return retryer?.getAbortSignal() ?? null + } + /** * Aborts all ongoing executions with the internal abort controllers. * Does NOT cancel any pending execution that have not started yet. diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index ad2c5fc5..adf4f79b 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -414,6 +414,32 @@ export class AsyncDebouncer { }) } + /** + * Returns the AbortSignal for a specific execution. + * If no maybeExecuteCount is provided, returns the signal for the most recent execution. + * Returns null if no execution is found or not currently executing. + * + * @param maybeExecuteCount - Optional specific execution to get signal for + * @example + * ```typescript + * const debouncer = new AsyncDebouncer( + * async (searchTerm: string) => { + * const signal = debouncer.getAbortSignal() + * if (signal) { + * const response = await fetch(`/api/search?q=${searchTerm}`, { signal }) + * return response.json() + * } + * }, + * { wait: 300 } + * ) + * ``` + */ + getAbortSignal(maybeExecuteCount?: number): AbortSignal | null { + const count = maybeExecuteCount ?? this.store.state.maybeExecuteCount + const retryer = this.asyncRetryers.get(count) + return retryer?.getAbortSignal() ?? null + } + /** * Aborts all ongoing executions with the internal abort controllers. * Does NOT cancel any pending execution that have not started yet. diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index b4f40d50..7fc68e12 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -778,6 +778,32 @@ export class AsyncQueuer { this.options.onItemsChange?.(this) } + /** + * Returns the AbortSignal for a specific execution. + * If no executeCount is provided, returns the signal for the most recent execution. + * Returns null if no execution is found or not currently executing. + * + * @param executeCount - Optional specific execution to get signal for + * @example + * ```typescript + * const queuer = new AsyncQueuer( + * async (item: string) => { + * const signal = queuer.getAbortSignal() + * if (signal) { + * const response = await fetch(`/api/process/${item}`, { signal }) + * return response.json() + * } + * }, + * { concurrency: 2 } + * ) + * ``` + */ + getAbortSignal(executeCount?: number): AbortSignal | null { + const count = executeCount ?? this.store.state.executeCount + const retryer = this.asyncRetryers.get(count) + return retryer?.getAbortSignal() ?? null + } + /** * Aborts all ongoing executions with the internal abort controllers. * Does NOT clear out the items. diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index ab982d51..4c68624d 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -376,6 +376,7 @@ export class AsyncRateLimiter { ...this.options.asyncRetryerOptions, key: `${this.key}-retryer-${currentMaybeExecute}`, }) + this.asyncRetryers.set(currentMaybeExecute, currentAsyncRetryer) const result = await currentAsyncRetryer.execute(...args) // EXECUTE! this.#setCleanupTimeout(now) this.#setState({ @@ -484,6 +485,32 @@ export class AsyncRateLimiter { return oldestExecution + this.#getWindow() - Date.now() } + /** + * Returns the AbortSignal for a specific execution. + * If no maybeExecuteCount is provided, returns the signal for the most recent execution. + * Returns null if no execution is found or not currently executing. + * + * @param maybeExecuteCount - Optional specific execution to get signal for + * @example + * ```typescript + * const rateLimiter = new AsyncRateLimiter( + * async (userId: string) => { + * const signal = rateLimiter.getAbortSignal() + * if (signal) { + * const response = await fetch(`/api/users/${userId}`, { signal }) + * return response.json() + * } + * }, + * { limit: 5, window: 1000 } + * ) + * ``` + */ + getAbortSignal(maybeExecuteCount?: number): AbortSignal | null { + const count = maybeExecuteCount ?? this.store.state.maybeExecuteCount + const retryer = this.asyncRetryers.get(count) + return retryer?.getAbortSignal() ?? null + } + /** * Aborts all ongoing executions with the internal abort controllers. * Does NOT clear out the execution times or reset the rate limiter. diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts index 6d32bc76..e48e4e4b 100644 --- a/packages/pacer/src/async-retryer.ts +++ b/packages/pacer/src/async-retryer.ts @@ -182,31 +182,44 @@ const defaultOptions: Omit< * - **Timeout Controls**: Set limits on execution time to prevent hanging operations: * - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) * - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) - * - **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. If cancelled, retries are stopped. - * - **State Management**: Tracks execution status, current attempt, last error, and result using TanStack Store. - * - **Callbacks**: Provides hooks for handling success, error, retry, and settled events. + * - **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. Call `abort()` to stop retries. * * ## State Management - * - Uses TanStack Store for fine-grained reactivity. - * - State includes: `isExecuting`, `currentAttempt`, `lastError`, `lastResult`, and `status` (`idle`, `executing`, `retrying`, `disabled`). - * - State can be accessed via the `store.state` property. + * + * Uses TanStack Store for fine-grained reactivity. State can be accessed via the `store.state` property. + * + * Available state properties: + * - `currentAttempt`: The current retry attempt number (0 when not executing) + * - `executionCount`: Total number of completed executions (successful or failed) + * - `isExecuting`: Whether the retryer is currently executing the function + * - `lastError`: The most recent error encountered during execution + * - `lastExecutionTime`: Timestamp of the last execution completion in milliseconds + * - `lastResult`: The result from the most recent successful execution + * - `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') + * - `totalExecutionTime`: Total time spent executing (including retries) in milliseconds * * ## Error Handling + * * The `throwOnError` option controls when errors are thrown (default: `'last'`): * - `'last'`: Only throws the final error after all retries are exhausted - **DEFAULT** - * - `true`: Throws every error immediately (no retries) + * - `true`: Throws every error immediately (disables retrying) * - `false`: Never throws errors, returns `undefined` instead * - * Additional error handling: + * Callbacks for error handling: * - `onError`: Called for every error (including during retries) * - `onLastError`: Called only for the final error after all retries fail - * - If `onError` is provided but `throwOnError` is not specified, defaults to `'last'` + * - `onRetry`: Called before each retry attempt + * - `onSuccess`: Called when execution succeeds + * - `onSettled`: Called after execution completes (success or failure) * * ## Usage + * * - Use for async operations that may fail transiently and benefit from retrying. * - Configure `maxAttempts`, `backoff`, `baseWait`, and `jitter` to control retry behavior. * - Set `maxExecutionTime` and `maxTotalExecutionTime` to prevent hanging operations. - * - Use `onRetry`, `onSuccess`, `onError`, and `onSettled` for custom side effects. + * - Use `onRetry`, `onSuccess`, `onError`, `onLastError`, and `onSettled` for custom side effects. + * - Call `abort()` to cancel ongoing execution and pending retries. + * - Call `reset()` to reset state and cancel execution. * * @example * ```typescript @@ -518,6 +531,29 @@ export class AsyncRetryer { return undefined } + /** + * Returns the current AbortSignal for the executing operation. + * Use this signal in your async function to make it cancellable. + * Returns null when not currently executing. + * + * @example + * ```typescript + * const retryer = new AsyncRetryer(async (userId: string) => { + * const signal = retryer.getAbortSignal() + * if (signal) { + * return fetch(`/api/users/${userId}`, { signal }) + * } + * return fetch(`/api/users/${userId}`) + * }) + * + * // Abort will now actually cancel the fetch + * retryer.abort() + * ``` + */ + getAbortSignal(): AbortSignal | null { + return this.#abortController?.signal ?? null + } + /** * Cancels the current execution and any pending retries */ diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index 2ca050f7..9b36cb8e 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -473,6 +473,36 @@ export class AsyncThrottler { } } + /** + * Returns the AbortSignal for a specific execution. + * If no maybeExecuteCount is provided, returns the signal for the most recent execution. + * Returns null if no execution is found or not currently executing. + * + * @param maybeExecuteCount - Optional specific execution to get signal for + * @example + * ```typescript + * const throttler = new AsyncThrottler( + * async (data: string) => { + * const signal = throttler.getAbortSignal() + * if (signal) { + * const response = await fetch('/api/save', { + * method: 'POST', + * body: data, + * signal + * }) + * return response.json() + * } + * }, + * { wait: 1000 } + * ) + * ``` + */ + getAbortSignal(maybeExecuteCount?: number): AbortSignal | null { + const count = maybeExecuteCount ?? this.store.state.maybeExecuteCount + const retryer = this.asyncRetryers.get(count) + return retryer?.getAbortSignal() ?? null + } + /** * Aborts all ongoing executions with the internal abort controllers. * Does NOT cancel any pending execution that have not started yet. diff --git a/packages/react-pacer/src/async-retryer/index.ts b/packages/react-pacer/src/async-retryer/index.ts index 6ec6da8e..dc2bb874 100644 --- a/packages/react-pacer/src/async-retryer/index.ts +++ b/packages/react-pacer/src/async-retryer/index.ts @@ -1 +1,4 @@ +// re-export everything from the core pacer package, BUT ONLY from the async-retryer module +export * from '@tanstack/pacer/async-retryer' + export * from './useAsyncRetryer' diff --git a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts index e059c95f..ac6aa1bc 100644 --- a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts +++ b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts @@ -31,16 +31,36 @@ export interface ReactAsyncRetryer * This hook is designed to be flexible and state-management agnostic - it simply returns a retryer instance that * you can integrate with any state management solution (useState, Redux, Zustand, Jotai, etc). * + * ## Retrying Concepts + * * Async retrying automatically re-executes a failed async function up to a specified number of attempts with * configurable backoff strategies. This is useful for handling transient errors like network failures, temporary * server issues, or rate limiting where you want to automatically retry the operation. * - * Error Handling: - * - If an `onError` handler is provided, it will be called for every error during execution - * - If an `onLastError` handler is provided, it will be called only for the final error after all retries fail - * - If `throwOnError` is 'last' (default), only the final error after all retries will be thrown - * - If `throwOnError` is true, every error will be thrown immediately (disables retrying) - * - If `throwOnError` is false, errors are never thrown and undefined is returned instead + * - **Backoff Strategies**: Controls the delay between retry attempts (default: `'exponential'`): + * - `'exponential'`: Wait time doubles with each attempt (1s, 2s, 4s, ...) - **DEFAULT** + * - `'linear'`: Wait time increases linearly (1s, 2s, 3s, ...) + * - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt + * - **Jitter**: Adds randomness to retry delays to prevent thundering herd problems (default: `0`). + * Set to a value between 0-1 to apply that percentage of random variation to each delay. + * - **Timeout Controls**: Set limits on execution time to prevent hanging operations: + * - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) + * - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) + * - **Abort & Cancellation**: Call `abort()` on the retryer to cancel ongoing execution and pending retries. + * + * ## Error Handling + * + * The `throwOnError` option controls when errors are thrown (default: `'last'`): + * - `'last'`: Only throws the final error after all retries are exhausted - **DEFAULT** + * - `true`: Throws every error immediately (disables retrying) + * - `false`: Never throws errors, returns `undefined` instead + * + * Callbacks for error handling: + * - `onError`: Called for every error (including during retries) + * - `onLastError`: Called only for the final error after all retries fail + * - `onRetry`: Called before each retry attempt + * - `onSuccess`: Called when execution succeeds + * - `onSettled`: Called after execution completes (success or failure) * * ## State Management and Selector * @@ -63,6 +83,10 @@ export interface ReactAsyncRetryer * - `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') * - `totalExecutionTime`: Total time spent executing (including retries) in milliseconds * + * ## Cleanup + * + * The hook automatically calls `abort()` on unmount to cancel any ongoing execution. + * * @example * ```tsx * // Default behavior - no reactive state subscriptions @@ -75,6 +99,23 @@ export interface ReactAsyncRetryer * { maxAttempts: 3, backoff: 'exponential' } * ); * + * // With advanced retry configuration + * const apiRetryer = useAsyncRetryer( + * async (userId: string) => { + * const response = await fetch(`/api/users/${userId}`); + * if (!response.ok) throw new Error('Failed to fetch user'); + * return response.json(); + * }, + * { + * maxAttempts: 5, + * backoff: 'exponential', + * baseWait: 1000, + * jitter: 0.1, // Add 10% random variation to prevent thundering herd + * maxExecutionTime: 5000, // Abort individual calls after 5 seconds + * maxTotalExecutionTime: 30000, // Abort entire operation after 30 seconds + * } + * ); + * * // Opt-in to re-render when execution state changes (optimized for loading indicators) * const apiRetryer = useAsyncRetryer( * async (userId: string) => { @@ -114,7 +155,8 @@ export interface ReactAsyncRetryer * maxAttempts: 3, * backoff: 'exponential', * onError: (error) => console.error('API call failed:', error), - * onLastError: (error) => console.error('All retries failed:', error) + * onLastError: (error) => console.error('All retries failed:', error), + * onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), * }, * (state) => ({ * lastError: state.lastError, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a8ede2a..cb8e667e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,6 +153,31 @@ importers: specifier: ^7.1.7 version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1) + examples/react/asyncRetry: + dependencies: + '@tanstack/react-pacer': + specifier: ^0.16.4 + version: link:../../../packages/react-pacer + react: + specifier: ^19.1.1 + version: 19.1.1 + react-dom: + specifier: ^19.1.1 + version: 19.1.1(react@19.1.1) + devDependencies: + '@types/react': + specifier: ^19.1.17 + version: 19.2.0 + '@types/react-dom': + specifier: ^19.1.11 + version: 19.2.0(@types/react@19.2.0) + '@vitejs/plugin-react': + specifier: ^5.0.4 + version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1)) + vite: + specifier: ^7.1.7 + version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1) + examples/react/asyncThrottle: dependencies: '@tanstack/react-pacer': From 12ecc5b26c66b4d1e07492069e8d8aea5ea76862 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Tue, 14 Oct 2025 21:24:31 -0500 Subject: [PATCH 47/50] add changeset and add retry stuff to guides --- .changeset/chubby-laws-smile.md | 10 + docs/guides/async-batching.md | 67 +++ docs/guides/async-debouncing.md | 60 +++ docs/guides/async-queuing.md | 63 +++ docs/guides/async-rate-limiting.md | 63 +++ docs/guides/async-throttling.md | 64 +++ examples/react/useAsyncRetryer/.eslintrc.cjs | 13 - examples/react/useAsyncRetryer/.gitignore | 27 -- examples/react/useAsyncRetryer/README.md | 6 - examples/react/useAsyncRetryer/index.html | 16 - examples/react/useAsyncRetryer/package.json | 34 -- .../useAsyncRetryer/public/emblem-light.svg | 13 - examples/react/useAsyncRetryer/src/index.tsx | 426 ------------------ examples/react/useAsyncRetryer/tsconfig.json | 23 - examples/react/useAsyncRetryer/vite.config.ts | 13 - packages/pacer/src/async-batcher.ts | 47 +- packages/pacer/src/async-debouncer.ts | 43 +- packages/pacer/src/async-queuer.ts | 59 ++- packages/pacer/src/async-rate-limiter.ts | 79 ++-- packages/pacer/src/async-throttler.ts | 45 +- packages/pacer/src/batcher.ts | 5 +- packages/pacer/src/debouncer.ts | 4 +- packages/pacer/src/queuer.ts | 6 +- packages/pacer/src/rate-limiter.ts | 3 + packages/pacer/src/throttler.ts | 3 + .../react-pacer/src/async-retryer/index.ts | 2 - .../src/async-retryer/useAsyncRetryer.ts | 228 ---------- packages/react-pacer/src/index.ts | 3 - pnpm-lock.yaml | 25 - 29 files changed, 555 insertions(+), 895 deletions(-) create mode 100644 .changeset/chubby-laws-smile.md delete mode 100644 examples/react/useAsyncRetryer/.eslintrc.cjs delete mode 100644 examples/react/useAsyncRetryer/.gitignore delete mode 100644 examples/react/useAsyncRetryer/README.md delete mode 100644 examples/react/useAsyncRetryer/index.html delete mode 100644 examples/react/useAsyncRetryer/package.json delete mode 100644 examples/react/useAsyncRetryer/public/emblem-light.svg delete mode 100644 examples/react/useAsyncRetryer/src/index.tsx delete mode 100644 examples/react/useAsyncRetryer/tsconfig.json delete mode 100644 examples/react/useAsyncRetryer/vite.config.ts delete mode 100644 packages/react-pacer/src/async-retryer/useAsyncRetryer.ts diff --git a/.changeset/chubby-laws-smile.md b/.changeset/chubby-laws-smile.md new file mode 100644 index 00000000..81ac4928 --- /dev/null +++ b/.changeset/chubby-laws-smile.md @@ -0,0 +1,10 @@ +--- +'@tanstack/react-pacer-devtools': minor +'@tanstack/solid-pacer-devtools': minor +'@tanstack/pacer-devtools': minor +'@tanstack/react-pacer': minor +'@tanstack/solid-pacer': minor +'@tanstack/pacer': minor +--- + +feat: added built-in retries and added better abort support to async utils \ No newline at end of file diff --git a/docs/guides/async-batching.md b/docs/guides/async-batching.md index 233b42c5..378f559f 100644 --- a/docs/guides/async-batching.md +++ b/docs/guides/async-batching.md @@ -191,6 +191,73 @@ The `AsyncBatcher` supports these async-specific callbacks: - `onExecute`: Called after each batch execution, providing the batch of items processed and batcher instance (same as synchronous batcher) - `onItemsChange`: Called when items are added or the batch is processed +## Advanced Features: Retry and Abort Support + +The async batcher includes built-in retry and abort capabilities through integration with `AsyncRetryer`. These features help handle transient failures and provide control over in-flight operations. + +### Retry Support + +Configure automatic retries for failed batch executions using the `asyncRetryerOptions`: + +```ts +const batcher = new AsyncBatcher( + async (items) => { + // This might fail due to network issues + const results = await apiCall(items) + return results + }, + { + maxSize: 5, + asyncRetryerOptions: { + maxAttempts: 3, + backoff: 'exponential', + baseWait: 1000, + maxWait: 10000, + jitter: 0.3 + } + } +) +``` + +For complete documentation on retry strategies, backoff algorithms, jitter, and advanced retry patterns, see the [Async Retrying Guide](./async-retrying.md). + +### Abort Support + +Cancel in-flight batch executions using the abort functionality: + +```ts +const batcher = new AsyncBatcher( + async (items) => { + // Access the abort signal for this execution + const signal = batcher.getAbortSignal() + if (signal) { + const response = await fetch('/api/batch', { + method: 'POST', + body: JSON.stringify(items), + signal // Pass signal to fetch for cancellation support + }) + return response.json() + } + }, + { maxSize: 10 } +) + +// Add items +batcher.addItem(1) +batcher.addItem(2) + +// Later, abort any in-flight batch executions +batcher.abort() +``` + +The abort functionality: +- Cancels all ongoing batch executions using AbortController +- Does NOT cancel pending batches that haven't started yet (use `cancel()` for that) +- Does NOT clear items from the batcher +- Can be used alongside retry support + +For more details on abort patterns and integration with fetch/axios, see the [Async Retrying Guide](./async-retrying.md). + ## Error Handling Options The async batcher provides flexible error handling through the `throwOnError` option: diff --git a/docs/guides/async-debouncing.md b/docs/guides/async-debouncing.md index a37e2998..d25aea21 100644 --- a/docs/guides/async-debouncing.md +++ b/docs/guides/async-debouncing.md @@ -103,6 +103,66 @@ Since the debouncer's `maybeExecute` method returns a Promise, you can choose to For example, if you're updating a user's profile and then immediately fetching their updated data, you can await the update operation before starting the fetch. +## Advanced Features: Retry and Abort Support + +The async debouncer includes built-in retry and abort capabilities through integration with `AsyncRetryer`. These features help handle transient failures and provide control over in-flight operations. + +### Retry Support + +Configure automatic retries for failed debounced function executions using the `asyncRetryerOptions`: + +```ts +const debouncedSave = asyncDebounce( + async (data: string) => { + // This might fail due to network issues + await api.save(data) + }, + { + wait: 500, + asyncRetryerOptions: { + maxAttempts: 3, + backoff: 'exponential', + baseWait: 1000, + maxWait: 10000, + jitter: 0.3 + } + } +) +``` + +For complete documentation on retry strategies, backoff algorithms, jitter, and advanced retry patterns, see the [Async Retrying Guide](./async-retrying.md). + +### Abort Support + +Cancel in-flight debounced executions using the abort functionality: + +```ts +const debouncer = new AsyncDebouncer( + async (searchTerm: string) => { + // Access the abort signal for this execution + const signal = debouncer.getAbortSignal() + if (signal) { + const response = await fetch(`/api/search?q=${searchTerm}`, { signal }) + return response.json() + } + }, + { wait: 300 } +) + +// Start a search +debouncer.maybeExecute('query') + +// Later, abort any in-flight execution +debouncer.abort() +``` + +The abort functionality: +- Cancels all ongoing debounced executions using AbortController +- Does NOT cancel pending executions that haven't started yet (use `cancel()` for that) +- Can be used alongside retry support + +For more details on abort patterns and integration with fetch/axios, see the [Async Retrying Guide](./async-retrying.md). + ## Dynamic Options and Enabling/Disabling Just like the synchronous debouncer, the async debouncer supports dynamic options for `wait` and `enabled`, which can be functions that receive the debouncer instance. This allows for sophisticated, runtime-adaptive debouncing behavior. diff --git a/docs/guides/async-queuing.md b/docs/guides/async-queuing.md index f22ef7ba..5396811f 100644 --- a/docs/guides/async-queuing.md +++ b/docs/guides/async-queuing.md @@ -253,6 +253,69 @@ queue.flush(1) // Process 1 more item console.log(queue.store.state.activeItems.length) // 3 (all processing concurrently) ``` +## Advanced Features: Retry and Abort Support + +The async queuer includes built-in retry and abort capabilities through integration with `AsyncRetryer`. These features help handle transient failures and provide control over in-flight task executions. + +### Retry Support + +Configure automatic retries for failed task executions using the `asyncRetryerOptions`. Each queued item's execution will be retried according to these settings: + +```ts +const queuer = new AsyncQueuer( + async (item) => { + // This might fail due to network issues + await api.processItem(item) + }, + { + concurrency: 2, + asyncRetryerOptions: { + maxAttempts: 3, + backoff: 'exponential', + baseWait: 1000, + maxWait: 10000, + jitter: 0.3 + } + } +) +``` + +For complete documentation on retry strategies, backoff algorithms, jitter, and advanced retry patterns, see the [Async Retrying Guide](./async-retrying.md). + +### Abort Support + +Cancel in-flight task executions using the abort functionality: + +```ts +const queuer = new AsyncQueuer( + async (item) => { + // Access the abort signal for this execution + const signal = queuer.getAbortSignal() + if (signal) { + const response = await fetch(`/api/process/${item}`, { signal }) + return response.json() + } + }, + { concurrency: 2 } +) + +// Add items to the queue +queuer.addItem('task1') +queuer.addItem('task2') +queuer.addItem('task3') + +// Later, abort any in-flight task executions +queuer.abort() +``` + +The abort functionality: +- Cancels all ongoing task executions using AbortController +- Does NOT clear items from the queue (pending tasks remain queued) +- Works with concurrent executions - aborts all active tasks +- Can be used alongside retry support + +For more details on abort patterns and integration with fetch/axios, see the [Async Retrying Guide](./async-retrying.md). + ## State Management The `AsyncQueuer` class uses TanStack Store for reactive state management, providing real-time access to queue state, processing statistics, and concurrent task tracking. All state is stored in a TanStack Store and can be accessed via `asyncQueuer.store.state`, although, if you are using a framework adapter like React or Solid, you will not want to read the state from here. Instead, you will read the state from `asyncQueuer.state` along with providing a selector callback as the 3rd argument to the `useAsyncQueuer` hook to opt-in to state tracking as shown below. diff --git a/docs/guides/async-rate-limiting.md b/docs/guides/async-rate-limiting.md index 76fcfd69..0819b909 100644 --- a/docs/guides/async-rate-limiting.md +++ b/docs/guides/async-rate-limiting.md @@ -107,6 +107,69 @@ Since the rate limiter's `maybeExecute` method returns a Promise, you can choose For example, if you're updating a user's profile and then immediately fetching their updated data, you can await the update operation before starting the fetch. +## Advanced Features: Retry and Abort Support + +The async rate limiter includes built-in retry and abort capabilities through integration with `AsyncRetryer`. These features help handle transient failures and provide control over in-flight operations. + +### Retry Support + +Configure automatic retries for failed rate-limited function executions using the `asyncRetryerOptions`: + +```ts +const rateLimitedApi = asyncRateLimit( + async (userId: string) => { + // This might fail due to network issues + const data = await api.fetchUser(userId) + return data + }, + { + limit: 5, + window: 1000, + asyncRetryerOptions: { + maxAttempts: 3, + backoff: 'exponential', + baseWait: 1000, + maxWait: 10000, + jitter: 0.3 + } + } +) +``` + +For complete documentation on retry strategies, backoff algorithms, jitter, and advanced retry patterns, see the [Async Retrying Guide](./async-retrying.md). + +### Abort Support + +Cancel in-flight rate-limited executions using the abort functionality: + +```ts +const rateLimiter = new AsyncRateLimiter( + async (userId: string) => { + // Access the abort signal for this execution + const signal = rateLimiter.getAbortSignal() + if (signal) { + const response = await fetch(`/api/users/${userId}`, { signal }) + return response.json() + } + }, + { limit: 5, window: 1000 } +) + +// Start some operations +rateLimiter.maybeExecute('user1') +rateLimiter.maybeExecute('user2') + +// Later, abort any in-flight executions +rateLimiter.abort() +``` + +The abort functionality: +- Cancels all ongoing rate-limited executions using AbortController +- Does NOT clear execution times or reset the rate limiter +- Can be used alongside retry support + +For more details on abort patterns and integration with fetch/axios, see the [Async Retrying Guide](./async-retrying.md). + ## Dynamic Options and Enabling/Disabling Just like the synchronous rate limiter, the async rate limiter supports dynamic options for `limit`, `window`, and `enabled`, which can be functions that receive the rate limiter instance. This allows for sophisticated, runtime-adaptive rate limiting behavior. diff --git a/docs/guides/async-throttling.md b/docs/guides/async-throttling.md index 3962e91a..4290bddf 100644 --- a/docs/guides/async-throttling.md +++ b/docs/guides/async-throttling.md @@ -104,6 +104,70 @@ Since the throttler's `maybeExecute` method returns a Promise, you can choose to For example, if you're updating a user's profile and then immediately fetching their updated data, you can await the update operation before starting the fetch. +## Advanced Features: Retry and Abort Support + +The async throttler includes built-in retry and abort capabilities through integration with `AsyncRetryer`. These features help handle transient failures and provide control over in-flight operations. + +### Retry Support + +Configure automatic retries for failed throttled function executions using the `asyncRetryerOptions`: + +```ts +const throttledSave = asyncThrottle( + async (data: string) => { + // This might fail due to network issues + await api.save(data) + }, + { + wait: 1000, + asyncRetryerOptions: { + maxAttempts: 3, + backoff: 'exponential', + baseWait: 1000, + maxWait: 10000, + jitter: 0.3 + } + } +) +``` + +For complete documentation on retry strategies, backoff algorithms, jitter, and advanced retry patterns, see the [Async Retrying Guide](./async-retrying.md). + +### Abort Support + +Cancel in-flight throttled executions using the abort functionality: + +```ts +const throttler = new AsyncThrottler( + async (data: string) => { + // Access the abort signal for this execution + const signal = throttler.getAbortSignal() + if (signal) { + const response = await fetch('/api/save', { + method: 'POST', + body: data, + signal + }) + return response.json() + } + }, + { wait: 1000 } +) + +// Start an operation +throttler.maybeExecute('data') + +// Later, abort any in-flight execution +throttler.abort() +``` + +The abort functionality: +- Cancels all ongoing throttled executions using AbortController +- Does NOT cancel pending executions that haven't started yet (use `cancel()` for that) +- Can be used alongside retry support + +For more details on abort patterns and integration with fetch/axios, see the [Async Retrying Guide](./async-retrying.md). + ## Dynamic Options and Enabling/Disabling Just like the synchronous throttler, the async throttler supports dynamic options for `wait` and `enabled`, which can be functions that receive the throttler instance. This allows for sophisticated, runtime-adaptive throttling behavior. diff --git a/examples/react/useAsyncRetryer/.eslintrc.cjs b/examples/react/useAsyncRetryer/.eslintrc.cjs deleted file mode 100644 index 9ff0b9fc..00000000 --- a/examples/react/useAsyncRetryer/.eslintrc.cjs +++ /dev/null @@ -1,13 +0,0 @@ -// @ts-check - -/** @type {import('eslint').Linter.Config} */ -const config = { - settings: { - extends: ['plugin:react/recommended', 'plugin:react-hooks/recommended'], - rules: { - 'react/no-children-prop': 'off', - }, - }, -} - -module.exports = config diff --git a/examples/react/useAsyncRetryer/.gitignore b/examples/react/useAsyncRetryer/.gitignore deleted file mode 100644 index 4673b022..00000000 --- a/examples/react/useAsyncRetryer/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -pnpm-lock.yaml -yarn.lock -package-lock.json - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/examples/react/useAsyncRetryer/README.md b/examples/react/useAsyncRetryer/README.md deleted file mode 100644 index 1cf88926..00000000 --- a/examples/react/useAsyncRetryer/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Example - -To run this example: - -- `npm install` -- `npm run dev` diff --git a/examples/react/useAsyncRetryer/index.html b/examples/react/useAsyncRetryer/index.html deleted file mode 100644 index 701aa26e..00000000 --- a/examples/react/useAsyncRetryer/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - TanStack Pacer Example - - - -
- - - diff --git a/examples/react/useAsyncRetryer/package.json b/examples/react/useAsyncRetryer/package.json deleted file mode 100644 index 07d3f48f..00000000 --- a/examples/react/useAsyncRetryer/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "@tanstack/pacer-example-react-use-async-retryer", - "private": true, - "type": "module", - "scripts": { - "dev": "vite --port=3005", - "build": "vite build", - "preview": "vite preview", - "test:types": "tsc" - }, - "dependencies": { - "@tanstack/react-pacer": "^0.16.4", - "react": "^19.1.1", - "react-dom": "^19.1.1" - }, - "devDependencies": { - "@types/react": "^19.1.17", - "@types/react-dom": "^19.1.11", - "@vitejs/plugin-react": "^5.0.4", - "vite": "^7.1.7" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/examples/react/useAsyncRetryer/public/emblem-light.svg b/examples/react/useAsyncRetryer/public/emblem-light.svg deleted file mode 100644 index a58e69ad..00000000 --- a/examples/react/useAsyncRetryer/public/emblem-light.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - emblem-light - Created with Sketch. - - - - - - - - \ No newline at end of file diff --git a/examples/react/useAsyncRetryer/src/index.tsx b/examples/react/useAsyncRetryer/src/index.tsx deleted file mode 100644 index 8ccc675b..00000000 --- a/examples/react/useAsyncRetryer/src/index.tsx +++ /dev/null @@ -1,426 +0,0 @@ -import { useState } from 'react' -import ReactDOM from 'react-dom/client' -import { useAsyncRetryer } from '@tanstack/react-pacer/async-retryer' - -interface UserData { - id: number - name: string - email: string -} - -// Simulate API call with fake data that can fail or timeout -const fakeApi = async ( - userId: string, - options: { shouldFail?: boolean; shouldTimeout?: boolean } = {}, -): Promise => { - const delay = options.shouldTimeout ? 3000 : 800 // Simulate network delay - await new Promise((resolve) => setTimeout(resolve, delay)) - - if (options.shouldFail || Math.random() < 0.6) { - throw new Error(`Network error fetching user ${userId}`) - } - - return { - id: parseInt(userId), - name: `User ${userId}`, - email: `user${userId}@example.com`, - } -} - -function App() { - const [userId, setUserId] = useState('123') - const [userData, setUserData] = useState(null) - const [scenario, setScenario] = useState< - 'default' | 'timeout' | 'jitter' | 'linear' - >('default') - const [logs, setLogs] = useState([]) - - const addLog = (message: string) => { - setLogs((prev) => [ - ...prev.slice(-9), - `${new Date().toLocaleTimeString()}: ${message}`, - ]) - } - - // The function that will be retried - const fetchUser = async (id: string) => { - addLog(`Attempting to fetch user ${id}`) - const data = await fakeApi(id, { - shouldTimeout: scenario === 'timeout', - }) - setUserData(data) - return data - } - - // Get options based on selected scenario - const getOptions = () => { - const baseOptions = { - onRetry: (attempt: number, error: Error) => { - addLog(`Retry attempt ${attempt} after error: ${error.message}`) - }, - onError: (error: Error) => { - addLog(`Request failed: ${error.message}`) - }, - onLastError: (error: Error) => { - addLog(`All retries exhausted: ${error.message}`) - setUserData(null) - }, - onSuccess: async (result: Promise) => { - const data = await result - addLog(`Request succeeded for user ${data.id}`) - }, - onSettled: () => { - addLog('Request settled') - }, - } - - switch (scenario) { - case 'timeout': - return { - ...baseOptions, - maxAttempts: 3, - backoff: 'exponential' as const, - baseWait: 500, - maxExecutionTime: 2000, // Individual call timeout - maxTotalExecutionTime: 8000, // Total timeout for all retries - jitter: 0, - } - case 'jitter': - return { - ...baseOptions, - maxAttempts: 5, - backoff: 'exponential' as const, - baseWait: 500, - jitter: 0.3, // 30% random variation - } - case 'linear': - return { - ...baseOptions, - maxAttempts: 4, - backoff: 'linear' as const, - baseWait: 1000, - jitter: 0, - } - default: - return { - ...baseOptions, - maxAttempts: 5, - backoff: 'exponential' as const, - baseWait: 1000, - jitter: 0, - } - } - } - - // Hook that gives you an async retryer instance - const asyncRetryer = useAsyncRetryer( - fetchUser, - getOptions(), - // Selector function to pick the state you want to track - (state) => ({ - isExecuting: state.isExecuting, - currentAttempt: state.currentAttempt, - executionCount: state.executionCount, - lastError: state.lastError, - lastResult: state.lastResult, - status: state.status, - totalExecutionTime: state.totalExecutionTime, - lastExecutionTime: state.lastExecutionTime, - }), - ) - - // Event handler that calls the retry function - async function onFetchUser() { - setLogs([]) - addLog('Starting fetch operation') - try { - const result = await asyncRetryer.execute(userId) - addLog(`Final result: ${result ? `User ${result.id}` : 'undefined'}`) - } catch (error) { - addLog( - `Caught error: ${error instanceof Error ? error.message : 'Unknown error'}`, - ) - } - } - - return ( -
-

TanStack Pacer useAsyncRetryer Example

-

- Demonstrates async retry functionality with configurable backoff - strategies, timeouts, jitter, and error handling. -

- -
-
-

Configuration

-
- - -
- -
- - setUserId(e.target.value)} - placeholder="Enter user ID..." - style={{ padding: '5px', width: '100%' }} - /> -
- -
- - - -
- -
-

Current Options:

-
-              {JSON.stringify(
-                {
-                  maxAttempts: asyncRetryer.options.maxAttempts,
-                  backoff: asyncRetryer.options.backoff,
-                  baseWait: asyncRetryer.options.baseWait,
-                  jitter: asyncRetryer.options.jitter,
-                  maxExecutionTime: asyncRetryer.options.maxExecutionTime,
-                  maxTotalExecutionTime:
-                    asyncRetryer.options.maxTotalExecutionTime,
-                  throwOnError: asyncRetryer.options.throwOnError,
-                },
-                null,
-                2,
-              )}
-            
-
-
- -
-

State

-
-
- Status:{' '} - - {asyncRetryer.state.status} - -
- {asyncRetryer.state.currentAttempt > 0 && ( -

- Current Attempt:{' '} - {asyncRetryer.state.currentAttempt} /{' '} - {typeof asyncRetryer.options.maxAttempts === 'function' - ? asyncRetryer.options.maxAttempts(asyncRetryer as any) - : asyncRetryer.options.maxAttempts} -

- )} -

- Total Executions:{' '} - {asyncRetryer.state.executionCount} -

- {asyncRetryer.state.totalExecutionTime > 0 && ( -

- Total Execution Time:{' '} - {asyncRetryer.state.totalExecutionTime}ms -

- )} - {asyncRetryer.state.lastExecutionTime > 0 && ( -

- Last Execution:{' '} - {new Date( - asyncRetryer.state.lastExecutionTime, - ).toLocaleTimeString()} -

- )} - {asyncRetryer.state.lastError && ( -
- Last Error: -
- {asyncRetryer.state.lastError.message} -
- )} -
- - {userData && ( -
-

User Data:

-

- ID: {userData.id} -

-

- Name: {userData.name} -

-

- Email: {userData.email} -

-
- )} -
-
- -
-

Activity Log

-
- {logs.length === 0 ? ( -
No activity yet
- ) : ( - logs.map((log, i) => ( -
- {log} -
- )) - )} -
-
- -
-
- - Full State (Debug) - -
-            {JSON.stringify(asyncRetryer.store.state, null, 2)}
-          
-
-
- -
- Tip: Press Shift + Enter to toggle component - mounting (demonstrates cleanup) -
-
- ) -} - -const root = ReactDOM.createRoot(document.getElementById('root')!) - -let mounted = true -root.render() - -// Demo unmounting and cancellation -document.addEventListener('keydown', (e) => { - if (e.shiftKey && e.key === 'Enter') { - mounted = !mounted - root.render(mounted ? : null) - } -}) diff --git a/examples/react/useAsyncRetryer/tsconfig.json b/examples/react/useAsyncRetryer/tsconfig.json deleted file mode 100644 index 6e9088d6..00000000 --- a/examples/react/useAsyncRetryer/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "Bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src", "vite.config.ts"] -} diff --git a/examples/react/useAsyncRetryer/vite.config.ts b/examples/react/useAsyncRetryer/vite.config.ts deleted file mode 100644 index 4e194366..00000000 --- a/examples/react/useAsyncRetryer/vite.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [ - react({ - // babel: { - // plugins: [['babel-plugin-react-compiler', { target: '19' }]], - // }, - }), - ], -}) diff --git a/packages/pacer/src/async-batcher.ts b/packages/pacer/src/async-batcher.ts index 89f24714..8892dffa 100644 --- a/packages/pacer/src/async-batcher.ts +++ b/packages/pacer/src/async-batcher.ts @@ -185,13 +185,19 @@ const defaultOptions: AsyncBatcherOptionsWithOptionalCallbacks = { /** * A class that collects items and processes them in batches asynchronously. * - * This is the async version of the Batcher class. Unlike the sync version, this async batcher: - * - Handles promises and returns results from batch executions - * - Provides error handling with configurable error behavior - * - Tracks success, error, and settle counts separately - * - Has state tracking for when batches are executing - * - Returns the result of the batch function execution + * Async vs Sync Versions: + * The async version provides advanced features over the sync Batcher: + * - Returns promises that can be awaited for batch results + * - Built-in retry support via AsyncRetryer integration + * - Abort support to cancel in-flight batch executions + * - Cancel support to prevent pending batches from starting + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts) * + * The sync Batcher is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Batching? * Batching is a technique for grouping multiple operations together to be processed as a single unit. * * The AsyncBatcher provides a flexible way to implement async batching with configurable: @@ -501,13 +507,29 @@ export class AsyncBatcher { } /** - * Creates an async batcher that processes items in batches + * Creates an async batcher that processes items in batches. + * + * Async vs Sync Versions: + * The async version provides advanced features over the sync batch function: + * - Returns promises that can be awaited for batch results + * - Built-in retry support via AsyncRetryer integration + * - Abort support to cancel in-flight batch executions + * - Cancel support to prevent pending batches from starting + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts) + * + * The sync batch function is lighter weight and simpler when you don't need async features, + * return values, or execution control. * - * Unlike the sync batcher, this async version: - * - Handles promises and returns results from batch executions - * - Provides error handling with configurable error behavior - * - Tracks success, error, and settle counts separately - * - Has state tracking for when batches are executing + * What is Batching? + * Batching is a technique for grouping multiple operations together to be processed as a single unit. + * + * Configuration Options: + * - `maxSize`: Maximum number of items per batch (default: Infinity) + * - `wait`: Time to wait before processing batch (default: Infinity) + * - `getShouldExecute`: Custom logic to trigger batch processing + * - `asyncRetryerOptions`: Configure retry behavior for batch executions + * - `started`: Whether to start processing immediately (default: true) * * Error Handling: * - If an `onError` handler is provided, it will be called with the error, the batch of items that failed, and batcher instance @@ -522,7 +544,6 @@ export class AsyncBatcher { * - Use `onSuccess` callback to react to successful batch execution and implement custom logic * - Use `onError` callback to react to batch execution errors and implement custom error handling * - Use `onSettled` callback to react to batch execution completion (success or error) and implement custom logic - * - Use `onExecute` callback to react to batch execution and implement custom logic * - Use `onItemsChange` callback to react to items being added or removed from the batcher * - The state includes total items processed, success/error counts, and execution status * - State can be accessed via the underlying AsyncBatcher instance's `store.state` property diff --git a/packages/pacer/src/async-debouncer.ts b/packages/pacer/src/async-debouncer.ts index adf4f79b..14130744 100644 --- a/packages/pacer/src/async-debouncer.ts +++ b/packages/pacer/src/async-debouncer.ts @@ -152,6 +152,19 @@ const defaultOptions: AsyncDebouncerOptionsWithOptionalCallbacks = { /** * A class that creates an async debounced function. * + * Async vs Sync Versions: + * The async version provides advanced features over the sync Debouncer: + * - Returns promises that can be awaited for debounced function results + * - Built-in retry support via AsyncRetryer integration + * - Abort support to cancel in-flight executions + * - Cancel support to prevent pending executions from starting + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts) + * + * The sync Debouncer is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Debouncing? * Debouncing ensures that a function is only executed after a specified delay has passed since its last invocation. * Each new invocation resets the delay timer. This is useful for handling frequent events like window resizing * or input changes where you only want to execute the handler after the events have stopped occurring. @@ -159,10 +172,6 @@ const defaultOptions: AsyncDebouncerOptionsWithOptionalCallbacks = { * Unlike throttling which allows execution at regular intervals, debouncing prevents any execution until * the function stops being called for the specified delay period. * - * Unlike the non-async Debouncer, this async version supports returning values from the debounced function, - * making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call - * instead of setting the result on a state variable from within the debounced function. - * * Error Handling: * - If an `onError` handler is provided, it will be called with the error and debouncer instance * - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown @@ -474,9 +483,29 @@ export class AsyncDebouncer { * The debounced function will only execute once the wait period has elapsed without any new calls. * If called again during the wait period, the timer resets and a new wait period begins. * - * Unlike the non-async Debouncer, this async version supports returning values from the debounced function, - * making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call - * instead of setting the result on a state variable from within the debounced function. + * Async vs Sync Versions: + * The async version provides advanced features over the sync debounce function: + * - Returns promises that can be awaited for debounced function results + * - Built-in retry support via AsyncRetryer integration + * - Abort support to cancel in-flight executions + * - Cancel support to prevent pending executions from starting + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts) + * + * The sync debounce function is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Debouncing? + * Debouncing ensures that a function is only executed after a specified delay has passed since its last invocation. + * Each new invocation resets the delay timer. This is useful for handling frequent events like window resizing + * or input changes where you only want to execute the handler after the events have stopped occurring. + * + * Configuration Options: + * - `wait`: Delay in milliseconds to wait after the last call (required) + * - `leading`: Execute on the leading edge of the timeout (default: false) + * - `trailing`: Execute on the trailing edge of the timeout (default: true) + * - `enabled`: Whether the debouncer is enabled (default: true) + * - `asyncRetryerOptions`: Configure retry behavior for executions * * Error Handling: * - If an `onError` handler is provided, it will be called with the error and debouncer instance diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index 7fc68e12..c40135f4 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -239,18 +239,31 @@ const defaultOptions: AsyncQueuerOptionsWithOptionalCallbacks = { /** * A flexible asynchronous queue for processing tasks with configurable concurrency, priority, and expiration. * - * Features: + * Async vs Sync Versions: + * The async version provides advanced features over the sync Queuer: + * - Returns promises that can be awaited for task results + * - Built-in retry support via AsyncRetryer integration for each queued task + * - Abort support to cancel in-flight task executions + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts) + * - Concurrent execution support (process multiple items simultaneously) + * + * The sync Queuer is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Queuing? + * Queuing is a technique for managing and processing items sequentially or with controlled concurrency. + * Tasks are processed up to the configured concurrency limit. When a task completes, + * the next pending task is processed if the concurrency limit allows. + * + * Key Features: * - Priority queue support via the getPriority option * - Configurable concurrency limit * - Callbacks for task success, error, completion, and queue state changes * - FIFO (First In First Out) or LIFO (Last In First Out) queue behavior * - Pause and resume processing - * - Task cancellation * - Item expiration to remove stale items from the queue * - * Tasks are processed concurrently up to the configured concurrency limit. When a task completes, - * the next pending task is processed if the concurrency limit allows. - * * Error Handling: * - If an `onError` handler is provided, it will be called with the error and queuer instance * - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown @@ -829,6 +842,34 @@ export class AsyncQueuer { * Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. * The queuer is started automatically and ready to process items. * + * Async vs Sync Versions: + * The async version provides advanced features over the sync queue function: + * - Returns promises that can be awaited for task results + * - Built-in retry support via AsyncRetryer integration for each queued task + * - Abort support to cancel in-flight task executions + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts) + * - Concurrent execution support (process multiple items simultaneously) + * + * The sync queue function is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Queuing? + * Queuing is a technique for managing and processing items sequentially or with controlled concurrency. + * Tasks are processed up to the configured concurrency limit. When a task completes, + * the next pending task is processed if the concurrency limit allows. + * + * Configuration Options: + * - `concurrency`: Maximum number of concurrent tasks (default: 1) + * - `wait`: Time to wait between processing items (default: 0) + * - `maxSize`: Maximum number of items allowed in the queue (default: Infinity) + * - `getPriority`: Function to determine item priority + * - `addItemsTo`: Default position to add items ('back' or 'front', default: 'back') + * - `getItemsFrom`: Default position to get items ('front' or 'back', default: 'front') + * - `expirationDuration`: Maximum time items can stay in queue + * - `started`: Whether to start processing immediately (default: true) + * - `asyncRetryerOptions`: Configure retry behavior for task executions + * * Error Handling: * - If an `onError` handler is provided, it will be called with the error and queuer instance * - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown @@ -849,11 +890,15 @@ export class AsyncQueuer { * - State can be accessed via the underlying AsyncQueuer instance's `store.state` property * - When using framework adapters (React/Solid), state is accessed from the hook's state property * - * Example usage: + * @example * ```ts * const enqueue = asyncQueue(async (item) => { * return item.toUpperCase(); - * }, {...options}); + * }, { + * concurrency: 2, + * wait: 100, + * onSuccess: (result) => console.log('Processed:', result) + * }); * * enqueue('hello'); * ``` diff --git a/packages/pacer/src/async-rate-limiter.ts b/packages/pacer/src/async-rate-limiter.ts index 4c68624d..e92a20a8 100644 --- a/packages/pacer/src/async-rate-limiter.ts +++ b/packages/pacer/src/async-rate-limiter.ts @@ -159,26 +159,34 @@ const defaultOptions: Omit< /** * A class that creates an async rate-limited function. * - * Rate limiting is a simple approach that allows a function to execute up to a limit within a time window, + * Async vs Sync Versions: + * The async version provides advanced features over the sync RateLimiter: + * - Returns promises that can be awaited for rate-limited function results + * - Built-in retry support via AsyncRetryer integration + * - Abort support to cancel in-flight executions + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts, rejection counts) + * - More sophisticated window management with automatic cleanup + * + * The sync RateLimiter is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Rate Limiting? + * Rate limiting allows a function to execute up to a limit within a time window, * then blocks all subsequent calls until the window passes. This can lead to "bursty" behavior where * all executions happen immediately, followed by a complete block. * - * The rate limiter supports two types of windows: + * Window Types: * - 'fixed': A strict window that resets after the window period. All executions within the window count * towards the limit, and the window resets completely after the period. * - 'sliding': A rolling window that allows executions as old ones expire. This provides a more * consistent rate of execution over time. * - * Unlike the non-async RateLimiter, this async version supports returning values from the rate-limited function, - * making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call - * instead of setting the result on a state variable from within the rate-limited function. - * - * For smoother execution patterns, consider using: - * - Throttling: Ensures consistent spacing between executions (e.g. max once per 200ms) - * - Debouncing: Waits for a pause in calls before executing (e.g. after 500ms of no calls) - * + * When to Use Rate Limiting: * Rate limiting is best used for hard API limits or resource constraints. For UI updates or * smoothing out frequent events, throttling or debouncing usually provide better user experience. + * - Throttling: Ensures consistent spacing between executions (e.g. max once per 200ms) + * - Debouncing: Waits for a pause in calls before executing (e.g. after 500ms of no calls) * * State Management: * - Uses TanStack Store for reactive state management @@ -535,21 +543,51 @@ export class AsyncRateLimiter { /** * Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. * - * Unlike the non-async rate limiter, this async version supports returning values from the rate-limited function, - * making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call - * instead of setting the result on a state variable from within the rate-limited function. + * Async vs Sync Versions: + * The async version provides advanced features over the sync rate limit function: + * - Returns promises that can be awaited for rate-limited function results + * - Built-in retry support via AsyncRetryer integration + * - Abort support to cancel in-flight executions + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts, rejection counts) + * - More sophisticated window management with automatic cleanup * - * The rate limiter supports two types of windows: + * The sync rate limit function is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Rate Limiting? + * Rate limiting allows a function to execute up to a limit within a time window, + * then blocks all subsequent calls until the window passes. This can lead to "bursty" behavior where + * all executions happen immediately, followed by a complete block. + * + * Window Types: * - 'fixed': A strict window that resets after the window period. All executions within the window count * towards the limit, and the window resets completely after the period. * - 'sliding': A rolling window that allows executions as old ones expire. This provides a more * consistent rate of execution over time. * - * Note that rate limiting is a simpler form of execution control compared to throttling or debouncing: + * Configuration Options: + * - `limit`: Maximum number of executions allowed within the window (required) + * - `window`: Time window in milliseconds (required) + * - `windowType`: 'fixed' or 'sliding' (default: 'fixed') + * - `enabled`: Whether the rate limiter is enabled (default: true) + * - `asyncRetryerOptions`: Configure retry behavior for executions + * + * When to Use Rate Limiting: + * Rate limiting is best used for hard API limits or resource constraints. For UI updates or + * smoothing out frequent events, throttling or debouncing usually provide better user experience. * - A rate limiter will allow all executions until the limit is reached, then block all subsequent calls until the window resets * - A throttler ensures even spacing between executions, which can be better for consistent performance * - A debouncer collapses multiple calls into one, which is better for handling bursts of events * + * Error Handling: + * - If an `onError` handler is provided, it will be called with the error and rate limiter instance + * - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown + * - If `throwOnError` is false (default when onError handler is provided), the error will be swallowed + * - Both onError and throwOnError can be used together - the handler will be called before any error is thrown + * - The error state can be checked using the underlying AsyncRateLimiter instance + * - Rate limit rejections (when limit is exceeded) are handled separately from execution errors via the `onReject` handler + * * State Management: * - Uses TanStack Store for reactive state management * - Use `initialState` to provide initial state values when creating the rate limiter @@ -562,17 +600,6 @@ export class AsyncRateLimiter { * - State can be accessed via the underlying AsyncRateLimiter instance's `store.state` property * - When using framework adapters (React/Solid), state is accessed from the hook's state property * - * Consider using throttle() or debounce() if you need more intelligent execution control. Use rate limiting when you specifically - * need to enforce a hard limit on the number of executions within a time period. - * - * Error Handling: - * - If an `onError` handler is provided, it will be called with the error and rate limiter instance - * - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown - * - If `throwOnError` is false (default when onError handler is provided), the error will be swallowed - * - Both onError and throwOnError can be used together - the handler will be called before any error is thrown - * - The error state can be checked using the underlying AsyncRateLimiter instance - * - Rate limit rejections (when limit is exceeded) are handled separately from execution errors via the `onReject` handler - * * @example * ```ts * // Rate limit to 5 calls per minute with a sliding window diff --git a/packages/pacer/src/async-throttler.ts b/packages/pacer/src/async-throttler.ts index 9b36cb8e..08dd6d4e 100644 --- a/packages/pacer/src/async-throttler.ts +++ b/packages/pacer/src/async-throttler.ts @@ -160,14 +160,24 @@ const defaultOptions: AsyncThrottlerOptionsWithOptionalCallbacks = { /** * A class that creates an async throttled function. * + * Async vs Sync Versions: + * The async version provides advanced features over the sync Throttler: + * - Returns promises that can be awaited for throttled function results + * - Built-in retry support via AsyncRetryer integration + * - Abort support to cancel in-flight executions + * - Cancel support to prevent pending executions from starting + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts) + * - Waits for ongoing executions to complete before scheduling the next one + * + * The sync Throttler is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Throttling? * Throttling limits how often a function can be executed, allowing only one execution within a specified time window. * Unlike debouncing which resets the delay timer on each call, throttling ensures the function executes at a * regular interval regardless of how often it's called. * - * Unlike the non-async Throttler, this async version supports returning values from the throttled function, - * making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call - * instead of setting the result on a state variable from within the throttled function. - * * This is useful for rate-limiting API calls, handling scroll/resize events, or any scenario where you want to * ensure a maximum execution frequency. * @@ -541,9 +551,30 @@ export class AsyncThrottler { * The throttled function will execute at most once per wait period, even if called multiple times. * If called while executing, it will wait until execution completes before scheduling the next call. * - * Unlike the non-async Throttler, this async version supports returning values from the throttled function, - * making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call - * instead of setting the result on a state variable from within the throttled function. + * Async vs Sync Versions: + * The async version provides advanced features over the sync throttle function: + * - Returns promises that can be awaited for throttled function results + * - Built-in retry support via AsyncRetryer integration + * - Abort support to cancel in-flight executions + * - Cancel support to prevent pending executions from starting + * - Comprehensive error handling with onError callbacks and throwOnError control + * - Detailed execution tracking (success/error/settle counts) + * - Waits for ongoing executions to complete before scheduling the next one + * + * The sync throttle function is lighter weight and simpler when you don't need async features, + * return values, or execution control. + * + * What is Throttling? + * Throttling limits how often a function can be executed, allowing only one execution within a specified time window. + * Unlike debouncing which resets the delay timer on each call, throttling ensures the function executes at a + * regular interval regardless of how often it's called. + * + * Configuration Options: + * - `wait`: Time window in milliseconds during which the function can only execute once (required) + * - `leading`: Execute immediately when called (default: true) + * - `trailing`: Execute on the trailing edge of the wait period (default: true) + * - `enabled`: Whether the throttler is enabled (default: true) + * - `asyncRetryerOptions`: Configure retry behavior for executions * * Error Handling: * - If an `onError` handler is provided, it will be called with the error and throttler instance diff --git a/packages/pacer/src/batcher.ts b/packages/pacer/src/batcher.ts index c62c7f92..681e6daf 100644 --- a/packages/pacer/src/batcher.ts +++ b/packages/pacer/src/batcher.ts @@ -107,6 +107,7 @@ const defaultOptions: BatcherOptionsWithOptionalCallbacks = { * A class that collects items and processes them in batches. * * Batching is a technique for grouping multiple operations together to be processed as a single unit. + * This synchronous version is lighter weight and often all you need - upgrade to AsyncBatcher when you need promises, retry support, abort/cancel capabilities, or advanced error handling. * * The Batcher provides a flexible way to implement batching with configurable: * - Maximum batch size (number of items per batch) @@ -299,7 +300,9 @@ export class Batcher { } /** - * Creates a batcher that processes items in batches + * Creates a batcher that processes items in batches. + * + * This synchronous version is lighter weight and often all you need - upgrade to asyncBatch when you need promises, retry support, abort/cancel capabilities, or advanced error handling. * * @example * ```ts diff --git a/packages/pacer/src/debouncer.ts b/packages/pacer/src/debouncer.ts index 0e1ff6af..b7008146 100644 --- a/packages/pacer/src/debouncer.ts +++ b/packages/pacer/src/debouncer.ts @@ -101,6 +101,7 @@ const defaultOptions: Omit< * Debouncing ensures that a function is only executed after a certain amount of time has passed * since its last invocation. This is useful for handling frequent events like window resizing, * scroll events, or input changes where you want to limit the rate of execution. + * This synchronous version is lighter weight and often all you need - upgrade to AsyncDebouncer when you need promises, retry support, abort/cancel capabilities, or advanced error handling. * * The debounced function can be configured to execute either at the start of the delay period * (leading edge) or at the end (trailing edge, default). Each new call during the wait period @@ -290,8 +291,7 @@ export class Debouncer { * Creates a debounced function that delays invoking the provided function until after a specified wait time. * Multiple calls during the wait period will cancel previous pending invocations and reset the timer. * - * This the the simple function wrapper implementation pulled from the Debouncer class. If you need - * more control over the debouncing behavior, use the Debouncer class directly. + * This synchronous version is lighter weight and often all you need - upgrade to asyncDebounce when you need promises, retry support, abort/cancel capabilities, or advanced error handling. * * If leading option is true, the function will execute immediately on the first call, then wait the delay * before allowing another execution. diff --git a/packages/pacer/src/queuer.ts b/packages/pacer/src/queuer.ts index fe3277a2..facf1c85 100644 --- a/packages/pacer/src/queuer.ts +++ b/packages/pacer/src/queuer.ts @@ -183,6 +183,8 @@ export type QueuePosition = 'front' | 'back' /** * A flexible queue that processes items with configurable wait times, expiration, and priority. * + * This synchronous version is lighter weight and often all you need - upgrade to AsyncQueuer when you need promises, retry support, abort capabilities, concurrent execution, or advanced error handling. + * * Features: * - Automatic or manual processing of items * - FIFO (First In First Out), LIFO (Last In First Out), or double-ended queue behavior @@ -687,9 +689,7 @@ export class Queuer { * Creates a queue that processes items immediately upon addition. * Items are processed sequentially in FIFO order by default. * - * This is a simplified wrapper around the Queuer class that only exposes the - * `addItem` method. The queue is always isRunning and will process items as they are added. - * For more control over queue processing, use the Queuer class directly. + * This synchronous version is lighter weight and often all you need - upgrade to asyncQueue when you need promises, retry support, abort capabilities, concurrent execution, or advanced error handling. * * State Management: * - Uses TanStack Store for reactive state management diff --git a/packages/pacer/src/rate-limiter.ts b/packages/pacer/src/rate-limiter.ts index 78aa8217..8f494f6d 100644 --- a/packages/pacer/src/rate-limiter.ts +++ b/packages/pacer/src/rate-limiter.ts @@ -102,6 +102,7 @@ const defaultOptions: Omit< * Rate limiting is a simple approach that allows a function to execute up to a limit within a time window, * then blocks all subsequent calls until the window passes. This can lead to "bursty" behavior where * all executions happen immediately, followed by a complete block. + * This synchronous version is lighter weight and often all you need - upgrade to AsyncRateLimiter when you need promises, retry support, abort capabilities, or advanced error handling. * * The rate limiter supports two types of windows: * - 'fixed': A strict window that resets after the window period. All executions within the window count @@ -363,6 +364,8 @@ export class RateLimiter { /** * Creates a rate-limited function that will execute the provided function up to a maximum number of times within a time window. * + * This synchronous version is lighter weight and often all you need - upgrade to asyncRateLimit when you need promises, retry support, abort capabilities, or advanced error handling. + * * Note that rate limiting is a simpler form of execution control compared to throttling or debouncing: * - A rate limiter will allow all executions until the limit is reached, then block all subsequent calls until the window resets * - A throttler ensures even spacing between executions, which can be better for consistent performance diff --git a/packages/pacer/src/throttler.ts b/packages/pacer/src/throttler.ts index 0137dca2..24bf89fd 100644 --- a/packages/pacer/src/throttler.ts +++ b/packages/pacer/src/throttler.ts @@ -105,6 +105,7 @@ const defaultOptions: Omit< * Throttling ensures a function is called at most once within a specified time window. * Unlike debouncing which waits for a pause in calls, throttling guarantees consistent * execution timing regardless of call frequency. + * This synchronous version is lighter weight and often all you need - upgrade to AsyncThrottler when you need promises, retry support, abort/cancel capabilities, or advanced error handling. * * Supports both leading and trailing edge execution: * - Leading: Execute immediately on first call (default: true) @@ -326,6 +327,8 @@ export class Throttler { /** * Creates a throttled function that limits how often the provided function can execute. * + * This synchronous version is lighter weight and often all you need - upgrade to asyncThrottle when you need promises, retry support, abort/cancel capabilities, or advanced error handling. + * * Throttling ensures a function executes at most once within a specified time window, * regardless of how many times it is called. This is useful for rate-limiting * expensive operations or UI updates. diff --git a/packages/react-pacer/src/async-retryer/index.ts b/packages/react-pacer/src/async-retryer/index.ts index dc2bb874..371a59aa 100644 --- a/packages/react-pacer/src/async-retryer/index.ts +++ b/packages/react-pacer/src/async-retryer/index.ts @@ -1,4 +1,2 @@ // re-export everything from the core pacer package, BUT ONLY from the async-retryer module export * from '@tanstack/pacer/async-retryer' - -export * from './useAsyncRetryer' diff --git a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts b/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts deleted file mode 100644 index ac6aa1bc..00000000 --- a/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { useEffect, useMemo, useState } from 'react' -import { AsyncRetryer } from '@tanstack/pacer/async-retryer' -import { useStore } from '@tanstack/react-store' -import { useDefaultPacerOptions } from '../provider/PacerProvider' -import type { Store } from '@tanstack/react-store' -import type { AnyAsyncFunction } from '@tanstack/pacer/types' -import type { - AsyncRetryerOptions, - AsyncRetryerState, -} from '@tanstack/pacer/async-retryer' - -export interface ReactAsyncRetryer - extends Omit, 'store'> { - /** - * Reactive state that will be updated and re-rendered when the retryer state changes - * - * Use this instead of `retryer.store.state` - */ - readonly state: Readonly - /** - * @deprecated Use `retryer.state` instead of `retryer.store.state` if you want to read reactive state. - * The state on the store object is not reactive, as it has not been wrapped in a `useStore` hook internally. - * Although, you can make the state reactive by using the `useStore` in your own usage. - */ - readonly store: Store>> -} - -/** - * A low-level React hook that creates an `AsyncRetryer` instance to retry execution of an async function. - * - * This hook is designed to be flexible and state-management agnostic - it simply returns a retryer instance that - * you can integrate with any state management solution (useState, Redux, Zustand, Jotai, etc). - * - * ## Retrying Concepts - * - * Async retrying automatically re-executes a failed async function up to a specified number of attempts with - * configurable backoff strategies. This is useful for handling transient errors like network failures, temporary - * server issues, or rate limiting where you want to automatically retry the operation. - * - * - **Backoff Strategies**: Controls the delay between retry attempts (default: `'exponential'`): - * - `'exponential'`: Wait time doubles with each attempt (1s, 2s, 4s, ...) - **DEFAULT** - * - `'linear'`: Wait time increases linearly (1s, 2s, 3s, ...) - * - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt - * - **Jitter**: Adds randomness to retry delays to prevent thundering herd problems (default: `0`). - * Set to a value between 0-1 to apply that percentage of random variation to each delay. - * - **Timeout Controls**: Set limits on execution time to prevent hanging operations: - * - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) - * - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) - * - **Abort & Cancellation**: Call `abort()` on the retryer to cancel ongoing execution and pending retries. - * - * ## Error Handling - * - * The `throwOnError` option controls when errors are thrown (default: `'last'`): - * - `'last'`: Only throws the final error after all retries are exhausted - **DEFAULT** - * - `true`: Throws every error immediately (disables retrying) - * - `false`: Never throws errors, returns `undefined` instead - * - * Callbacks for error handling: - * - `onError`: Called for every error (including during retries) - * - `onLastError`: Called only for the final error after all retries fail - * - `onRetry`: Called before each retry attempt - * - `onSuccess`: Called when execution succeeds - * - `onSettled`: Called after execution completes (success or failure) - * - * ## State Management and Selector - * - * The hook uses TanStack Store for reactive state management. The `selector` parameter allows you - * to specify which state changes will trigger a re-render, optimizing performance by preventing - * unnecessary re-renders when irrelevant state changes occur. - * - * **By default, there will be no reactive state subscriptions** and you must opt-in to state - * tracking by providing a selector function. This prevents unnecessary re-renders and gives you - * full control over when your component updates. Only when you provide a selector will the - * component re-render when the selected state values change. - * - * Available state properties: - * - `currentAttempt`: The current retry attempt number (0 when not executing) - * - `executionCount`: Total number of completed executions (successful or failed) - * - `isExecuting`: Whether the retryer is currently executing the function - * - `lastError`: The most recent error encountered during execution - * - `lastExecutionTime`: Timestamp of the last execution completion in milliseconds - * - `lastResult`: The result from the most recent successful execution - * - `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') - * - `totalExecutionTime`: Total time spent executing (including retries) in milliseconds - * - * ## Cleanup - * - * The hook automatically calls `abort()` on unmount to cancel any ongoing execution. - * - * @example - * ```tsx - * // Default behavior - no reactive state subscriptions - * const apiRetryer = useAsyncRetryer( - * async (userId: string) => { - * const response = await fetch(`/api/users/${userId}`); - * if (!response.ok) throw new Error('Failed to fetch user'); - * return response.json(); - * }, - * { maxAttempts: 3, backoff: 'exponential' } - * ); - * - * // With advanced retry configuration - * const apiRetryer = useAsyncRetryer( - * async (userId: string) => { - * const response = await fetch(`/api/users/${userId}`); - * if (!response.ok) throw new Error('Failed to fetch user'); - * return response.json(); - * }, - * { - * maxAttempts: 5, - * backoff: 'exponential', - * baseWait: 1000, - * jitter: 0.1, // Add 10% random variation to prevent thundering herd - * maxExecutionTime: 5000, // Abort individual calls after 5 seconds - * maxTotalExecutionTime: 30000, // Abort entire operation after 30 seconds - * } - * ); - * - * // Opt-in to re-render when execution state changes (optimized for loading indicators) - * const apiRetryer = useAsyncRetryer( - * async (userId: string) => { - * const response = await fetch(`/api/users/${userId}`); - * if (!response.ok) throw new Error('Failed to fetch user'); - * return response.json(); - * }, - * { maxAttempts: 3, backoff: 'exponential' }, - * (state) => ({ - * isExecuting: state.isExecuting, - * currentAttempt: state.currentAttempt - * }) - * ); - * - * // Opt-in to re-render when results are available (optimized for data display) - * const apiRetryer = useAsyncRetryer( - * async (userId: string) => { - * const response = await fetch(`/api/users/${userId}`); - * if (!response.ok) throw new Error('Failed to fetch user'); - * return response.json(); - * }, - * { maxAttempts: 3, backoff: 'exponential' }, - * (state) => ({ - * lastResult: state.lastResult, - * executionCount: state.executionCount - * }) - * ); - * - * // Opt-in to re-render when error state changes (optimized for error handling) - * const apiRetryer = useAsyncRetryer( - * async (userId: string) => { - * const response = await fetch(`/api/users/${userId}`); - * if (!response.ok) throw new Error('Failed to fetch user'); - * return response.json(); - * }, - * { - * maxAttempts: 3, - * backoff: 'exponential', - * onError: (error) => console.error('API call failed:', error), - * onLastError: (error) => console.error('All retries failed:', error), - * onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), - * }, - * (state) => ({ - * lastError: state.lastError, - * status: state.status - * }) - * ); - * - * // With state management - * const [userData, setUserData] = useState(null); - * const { execute, state } = useAsyncRetryer( - * async (userId) => { - * const response = await fetch(`/api/users/${userId}`); - * if (!response.ok) throw new Error('Failed to fetch user'); - * const data = await response.json(); - * setUserData(data); - * return data; - * }, - * { - * maxAttempts: 5, - * backoff: 'exponential', - * baseWait: 1000, - * onRetry: (attempt, error) => { - * console.log(`Retry attempt ${attempt} after error:`, error); - * }, - * onError: (error) => { - * console.error('Request failed:', error); - * } - * } - * ); - * - * // Access the selected state (will be empty object {} unless selector provided) - * const { isExecuting, currentAttempt } = state; - * ``` - */ -export function useAsyncRetryer( - fn: TFn, - options: AsyncRetryerOptions, - selector: (state: AsyncRetryerState) => TSelected = () => - ({}) as TSelected, -): ReactAsyncRetryer { - const mergedOptions = { - ...useDefaultPacerOptions().asyncRetryer, - ...options, - } as AsyncRetryerOptions - - const [asyncRetryer] = useState( - () => new AsyncRetryer(fn, mergedOptions), - ) - - asyncRetryer.fn = fn - asyncRetryer.setOptions(mergedOptions) - - const state = useStore(asyncRetryer.store, selector) - - useEffect(() => { - return () => { - asyncRetryer.abort() - } - }, [asyncRetryer]) - - return useMemo( - () => - ({ - ...asyncRetryer, - state, - }) as ReactAsyncRetryer, // omit `store` in favor of `state` - [asyncRetryer, state], - ) -} diff --git a/packages/react-pacer/src/index.ts b/packages/react-pacer/src/index.ts index 5ba57315..7ab02da1 100644 --- a/packages/react-pacer/src/index.ts +++ b/packages/react-pacer/src/index.ts @@ -24,9 +24,6 @@ export * from './async-queuer/useAsyncQueuedState' export * from './async-rate-limiter/useAsyncRateLimiter' export * from './async-rate-limiter/useAsyncRateLimitedCallback' -// async-retryer -export * from './async-retryer/useAsyncRetryer' - // async-throttler export * from './async-throttler/useAsyncThrottler' export * from './async-throttler/useAsyncThrottledCallback' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb8e667e..098072fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -633,31 +633,6 @@ importers: specifier: ^7.1.7 version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1) - examples/react/useAsyncRetryer: - dependencies: - '@tanstack/react-pacer': - specifier: ^0.16.4 - version: link:../../../packages/react-pacer - react: - specifier: ^19.1.1 - version: 19.1.1 - react-dom: - specifier: ^19.1.1 - version: 19.1.1(react@19.1.1) - devDependencies: - '@types/react': - specifier: ^19.1.17 - version: 19.2.0 - '@types/react-dom': - specifier: ^19.1.11 - version: 19.2.0(@types/react@19.2.0) - '@vitejs/plugin-react': - specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1)) - vite: - specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(yaml@2.8.1) - examples/react/useAsyncThrottledCallback: dependencies: '@tanstack/react-pacer': From d842757dfd2a0a4ef789b34697c52ca3535a63d1 Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Tue, 14 Oct 2025 21:24:49 -0500 Subject: [PATCH 48/50] generate docs --- .../reference/functions/useasyncretryer.md | 207 ------------------ docs/framework/react/reference/index.md | 2 - .../reference/interfaces/reactasyncretryer.md | 50 ----- docs/reference/classes/asyncbatcher.md | 54 +++-- docs/reference/classes/asyncdebouncer.md | 47 ++-- docs/reference/classes/asyncqueuer.md | 71 +++--- docs/reference/classes/asyncratelimiter.md | 58 ++--- docs/reference/classes/asyncthrottler.md | 48 ++-- docs/reference/classes/batcher.md | 29 +-- docs/reference/classes/debouncer.md | 25 ++- docs/reference/classes/queuer.md | 40 ++-- docs/reference/classes/ratelimiter.md | 25 ++- docs/reference/classes/throttler.md | 25 ++- docs/reference/functions/asyncbatch.md | 31 ++- docs/reference/functions/asyncdebounce.md | 28 ++- docs/reference/functions/asyncqueue.md | 53 ++++- docs/reference/functions/asyncratelimit.md | 53 +++-- docs/reference/functions/asyncthrottle.md | 29 ++- docs/reference/functions/batch.md | 6 +- docs/reference/functions/debounce.md | 3 +- docs/reference/functions/queue.md | 4 +- docs/reference/functions/ratelimit.md | 4 +- docs/reference/functions/throttle.md | 4 +- 23 files changed, 400 insertions(+), 496 deletions(-) delete mode 100644 docs/framework/react/reference/functions/useasyncretryer.md delete mode 100644 docs/framework/react/reference/interfaces/reactasyncretryer.md diff --git a/docs/framework/react/reference/functions/useasyncretryer.md b/docs/framework/react/reference/functions/useasyncretryer.md deleted file mode 100644 index e85c02e0..00000000 --- a/docs/framework/react/reference/functions/useasyncretryer.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -id: useAsyncRetryer -title: useAsyncRetryer ---- - - - -# Function: useAsyncRetryer() - -```ts -function useAsyncRetryer( - fn, - options, -selector): ReactAsyncRetryer -``` - -Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:194](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L194) - -A low-level React hook that creates an `AsyncRetryer` instance to retry execution of an async function. - -This hook is designed to be flexible and state-management agnostic - it simply returns a retryer instance that -you can integrate with any state management solution (useState, Redux, Zustand, Jotai, etc). - -## Retrying Concepts - -Async retrying automatically re-executes a failed async function up to a specified number of attempts with -configurable backoff strategies. This is useful for handling transient errors like network failures, temporary -server issues, or rate limiting where you want to automatically retry the operation. - -- **Backoff Strategies**: Controls the delay between retry attempts (default: `'exponential'`): - - `'exponential'`: Wait time doubles with each attempt (1s, 2s, 4s, ...) - **DEFAULT** - - `'linear'`: Wait time increases linearly (1s, 2s, 3s, ...) - - `'fixed'`: Waits a constant amount of time (`baseWait`) between each attempt -- **Jitter**: Adds randomness to retry delays to prevent thundering herd problems (default: `0`). - Set to a value between 0-1 to apply that percentage of random variation to each delay. -- **Timeout Controls**: Set limits on execution time to prevent hanging operations: - - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) - - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) -- **Abort & Cancellation**: Call `abort()` on the retryer to cancel ongoing execution and pending retries. - -## Error Handling - -The `throwOnError` option controls when errors are thrown (default: `'last'`): -- `'last'`: Only throws the final error after all retries are exhausted - **DEFAULT** -- `true`: Throws every error immediately (disables retrying) -- `false`: Never throws errors, returns `undefined` instead - -Callbacks for error handling: -- `onError`: Called for every error (including during retries) -- `onLastError`: Called only for the final error after all retries fail -- `onRetry`: Called before each retry attempt -- `onSuccess`: Called when execution succeeds -- `onSettled`: Called after execution completes (success or failure) - -## State Management and Selector - -The hook uses TanStack Store for reactive state management. The `selector` parameter allows you -to specify which state changes will trigger a re-render, optimizing performance by preventing -unnecessary re-renders when irrelevant state changes occur. - -**By default, there will be no reactive state subscriptions** and you must opt-in to state -tracking by providing a selector function. This prevents unnecessary re-renders and gives you -full control over when your component updates. Only when you provide a selector will the -component re-render when the selected state values change. - -Available state properties: -- `currentAttempt`: The current retry attempt number (0 when not executing) -- `executionCount`: Total number of completed executions (successful or failed) -- `isExecuting`: Whether the retryer is currently executing the function -- `lastError`: The most recent error encountered during execution -- `lastExecutionTime`: Timestamp of the last execution completion in milliseconds -- `lastResult`: The result from the most recent successful execution -- `status`: Current execution status ('disabled' | 'idle' | 'executing' | 'retrying') -- `totalExecutionTime`: Total time spent executing (including retries) in milliseconds - -## Cleanup - -The hook automatically calls `abort()` on unmount to cancel any ongoing execution. - -## Type Parameters - -• **TFn** *extends* `AnyAsyncFunction` - -• **TSelected** = \{\} - -## Parameters - -### fn - -`TFn` - -### options - -`AsyncRetryerOptions`\<`TFn`\> - -### selector - -(`state`) => `TSelected` - -## Returns - -[`ReactAsyncRetryer`](../../interfaces/reactasyncretryer.md)\<`TFn`, `TSelected`\> - -## Example - -```tsx -// Default behavior - no reactive state subscriptions -const apiRetryer = useAsyncRetryer( - async (userId: string) => { - const response = await fetch(`/api/users/${userId}`); - if (!response.ok) throw new Error('Failed to fetch user'); - return response.json(); - }, - { maxAttempts: 3, backoff: 'exponential' } -); - -// With advanced retry configuration -const apiRetryer = useAsyncRetryer( - async (userId: string) => { - const response = await fetch(`/api/users/${userId}`); - if (!response.ok) throw new Error('Failed to fetch user'); - return response.json(); - }, - { - maxAttempts: 5, - backoff: 'exponential', - baseWait: 1000, - jitter: 0.1, // Add 10% random variation to prevent thundering herd - maxExecutionTime: 5000, // Abort individual calls after 5 seconds - maxTotalExecutionTime: 30000, // Abort entire operation after 30 seconds - } -); - -// Opt-in to re-render when execution state changes (optimized for loading indicators) -const apiRetryer = useAsyncRetryer( - async (userId: string) => { - const response = await fetch(`/api/users/${userId}`); - if (!response.ok) throw new Error('Failed to fetch user'); - return response.json(); - }, - { maxAttempts: 3, backoff: 'exponential' }, - (state) => ({ - isExecuting: state.isExecuting, - currentAttempt: state.currentAttempt - }) -); - -// Opt-in to re-render when results are available (optimized for data display) -const apiRetryer = useAsyncRetryer( - async (userId: string) => { - const response = await fetch(`/api/users/${userId}`); - if (!response.ok) throw new Error('Failed to fetch user'); - return response.json(); - }, - { maxAttempts: 3, backoff: 'exponential' }, - (state) => ({ - lastResult: state.lastResult, - executionCount: state.executionCount - }) -); - -// Opt-in to re-render when error state changes (optimized for error handling) -const apiRetryer = useAsyncRetryer( - async (userId: string) => { - const response = await fetch(`/api/users/${userId}`); - if (!response.ok) throw new Error('Failed to fetch user'); - return response.json(); - }, - { - maxAttempts: 3, - backoff: 'exponential', - onError: (error) => console.error('API call failed:', error), - onLastError: (error) => console.error('All retries failed:', error), - onRetry: (attempt, error) => console.log(`Retry attempt ${attempt} after error:`, error), - }, - (state) => ({ - lastError: state.lastError, - status: state.status - }) -); - -// With state management -const [userData, setUserData] = useState(null); -const { execute, state } = useAsyncRetryer( - async (userId) => { - const response = await fetch(`/api/users/${userId}`); - if (!response.ok) throw new Error('Failed to fetch user'); - const data = await response.json(); - setUserData(data); - return data; - }, - { - maxAttempts: 5, - backoff: 'exponential', - baseWait: 1000, - onRetry: (attempt, error) => { - console.log(`Retry attempt ${attempt} after error:`, error); - }, - onError: (error) => { - console.error('Request failed:', error); - } - } -); - -// Access the selected state (will be empty object {} unless selector provided) -const { isExecuting, currentAttempt } = state; -``` diff --git a/docs/framework/react/reference/index.md b/docs/framework/react/reference/index.md index b0415dcc..1a4f016f 100644 --- a/docs/framework/react/reference/index.md +++ b/docs/framework/react/reference/index.md @@ -15,7 +15,6 @@ title: "@tanstack/react-pacer" - [ReactAsyncDebouncer](../interfaces/reactasyncdebouncer.md) - [ReactAsyncQueuer](../interfaces/reactasyncqueuer.md) - [ReactAsyncRateLimiter](../interfaces/reactasyncratelimiter.md) -- [ReactAsyncRetryer](../interfaces/reactasyncretryer.md) - [ReactAsyncThrottler](../interfaces/reactasyncthrottler.md) - [ReactBatcher](../interfaces/reactbatcher.md) - [ReactDebouncer](../interfaces/reactdebouncer.md) @@ -34,7 +33,6 @@ title: "@tanstack/react-pacer" - [useAsyncQueuer](../functions/useasyncqueuer.md) - [useAsyncRateLimitedCallback](../functions/useasyncratelimitedcallback.md) - [useAsyncRateLimiter](../functions/useasyncratelimiter.md) -- [useAsyncRetryer](../functions/useasyncretryer.md) - [useAsyncThrottledCallback](../functions/useasyncthrottledcallback.md) - [useAsyncThrottler](../functions/useasyncthrottler.md) - [useBatchedCallback](../functions/usebatchedcallback.md) diff --git a/docs/framework/react/reference/interfaces/reactasyncretryer.md b/docs/framework/react/reference/interfaces/reactasyncretryer.md deleted file mode 100644 index 586aa7e5..00000000 --- a/docs/framework/react/reference/interfaces/reactasyncretryer.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: ReactAsyncRetryer -title: ReactAsyncRetryer ---- - - - -# Interface: ReactAsyncRetryer\ - -Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:12](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L12) - -## Extends - -- `Omit`\<`AsyncRetryer`\<`TFn`\>, `"store"`\> - -## Type Parameters - -• **TFn** *extends* `AnyAsyncFunction` - -• **TSelected** = \{\} - -## Properties - -### state - -```ts -readonly state: Readonly; -``` - -Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:19](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L19) - -Reactive state that will be updated and re-rendered when the retryer state changes - -Use this instead of `retryer.store.state` - -*** - -### ~~store~~ - -```ts -readonly store: Store>>; -``` - -Defined in: [react-pacer/src/async-retryer/useAsyncRetryer.ts:25](https://github.com/TanStack/pacer/blob/main/packages/react-pacer/src/async-retryer/useAsyncRetryer.ts#L25) - -#### Deprecated - -Use `retryer.state` instead of `retryer.store.state` if you want to read reactive state. -The state on the store object is not reactive, as it has not been wrapped in a `useStore` hook internally. -Although, you can make the state reactive by using the `useStore` in your own usage. diff --git a/docs/reference/classes/asyncbatcher.md b/docs/reference/classes/asyncbatcher.md index dbe92d6e..5fb948ab 100644 --- a/docs/reference/classes/asyncbatcher.md +++ b/docs/reference/classes/asyncbatcher.md @@ -7,17 +7,23 @@ title: AsyncBatcher # Class: AsyncBatcher\ -Defined in: [async-batcher.ts:246](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L246) +Defined in: [async-batcher.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L252) A class that collects items and processes them in batches asynchronously. -This is the async version of the Batcher class. Unlike the sync version, this async batcher: -- Handles promises and returns results from batch executions -- Provides error handling with configurable error behavior -- Tracks success, error, and settle counts separately -- Has state tracking for when batches are executing -- Returns the result of the batch function execution +Async vs Sync Versions: +The async version provides advanced features over the sync Batcher: +- Returns promises that can be awaited for batch results +- Built-in retry support via AsyncRetryer integration +- Abort support to cancel in-flight batch executions +- Cancel support to prevent pending batches from starting +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts) + +The sync Batcher is lighter weight and simpler when you don't need async features, +return values, or execution control. +What is Batching? Batching is a technique for grouping multiple operations together to be processed as a single unit. The AsyncBatcher provides a flexible way to implement async batching with configurable: @@ -82,7 +88,7 @@ batcher.addItem(2); new AsyncBatcher(fn, initialOptions): AsyncBatcher ``` -Defined in: [async-batcher.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L258) +Defined in: [async-batcher.ts:264](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L264) #### Parameters @@ -106,7 +112,7 @@ Defined in: [async-batcher.ts:258](https://github.com/TanStack/pacer/blob/main/p asyncRetryers: Map Promise>>; ``` -Defined in: [async-batcher.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L252) +Defined in: [async-batcher.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L258) *** @@ -116,7 +122,7 @@ Defined in: [async-batcher.ts:252](https://github.com/TanStack/pacer/blob/main/p fn: (items) => Promise; ``` -Defined in: [async-batcher.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L259) +Defined in: [async-batcher.ts:265](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L265) #### Parameters @@ -136,7 +142,7 @@ Defined in: [async-batcher.ts:259](https://github.com/TanStack/pacer/blob/main/p key: string; ``` -Defined in: [async-batcher.ts:250](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L250) +Defined in: [async-batcher.ts:256](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L256) *** @@ -146,7 +152,7 @@ Defined in: [async-batcher.ts:250](https://github.com/TanStack/pacer/blob/main/p options: AsyncBatcherOptionsWithOptionalCallbacks; ``` -Defined in: [async-batcher.ts:251](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L251) +Defined in: [async-batcher.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L257) *** @@ -156,7 +162,7 @@ Defined in: [async-batcher.ts:251](https://github.com/TanStack/pacer/blob/main/p readonly store: Store>>; ``` -Defined in: [async-batcher.ts:247](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L247) +Defined in: [async-batcher.ts:253](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L253) ## Methods @@ -166,7 +172,7 @@ Defined in: [async-batcher.ts:247](https://github.com/TanStack/pacer/blob/main/p _emit(): void ``` -Defined in: [async-batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L280) +Defined in: [async-batcher.ts:286](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L286) Emits a change event for the async batcher instance. Mostly useful for devtools. @@ -182,7 +188,7 @@ Emits a change event for the async batcher instance. Mostly useful for devtools. abort(): void ``` -Defined in: [async-batcher.ts:474](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L474) +Defined in: [async-batcher.ts:480](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L480) Aborts all ongoing executions with the internal abort controllers. Does NOT cancel any pending execution that have not started yet. @@ -200,7 +206,7 @@ Does NOT clear out the items. addItem(item): Promise ``` -Defined in: [async-batcher.ts:326](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L326) +Defined in: [async-batcher.ts:332](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L332) Adds an item to the async batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -229,7 +235,7 @@ The error from the batch function if no onError handler is configured or throwOn cancel(): void ``` -Defined in: [async-batcher.ts:487](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L487) +Defined in: [async-batcher.ts:493](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L493) Cancels any pending execution that have not started yet. Does NOT abort any execution already in progress. @@ -247,7 +253,7 @@ Does NOT clear out the items. clear(): void ``` -Defined in: [async-batcher.ts:435](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L435) +Defined in: [async-batcher.ts:441](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L441) Removes all items from the async batcher @@ -263,7 +269,7 @@ Removes all items from the async batcher flush(): Promise ``` -Defined in: [async-batcher.ts:409](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L409) +Defined in: [async-batcher.ts:415](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L415) Processes the current batch of items immediately @@ -279,7 +285,7 @@ Processes the current batch of items immediately getAbortSignal(executeCount?): null | AbortSignal ``` -Defined in: [async-batcher.ts:463](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L463) +Defined in: [async-batcher.ts:469](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L469) Returns the AbortSignal for a specific execution. If no executeCount is provided, returns the signal for the most recent execution. @@ -324,7 +330,7 @@ const batcher = new AsyncBatcher( peekAllItems(): TValue[] ``` -Defined in: [async-batcher.ts:417](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L417) +Defined in: [async-batcher.ts:423](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L423) Returns a copy of all items in the async batcher @@ -340,7 +346,7 @@ Returns a copy of all items in the async batcher peekFailedItems(): TValue[] ``` -Defined in: [async-batcher.ts:421](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L421) +Defined in: [async-batcher.ts:427](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L427) #### Returns @@ -354,7 +360,7 @@ Defined in: [async-batcher.ts:421](https://github.com/TanStack/pacer/blob/main/p reset(): void ``` -Defined in: [async-batcher.ts:497](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L497) +Defined in: [async-batcher.ts:503](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L503) Resets the async batcher state to its default values @@ -370,7 +376,7 @@ Resets the async batcher state to its default values setOptions(newOptions): void ``` -Defined in: [async-batcher.ts:285](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L285) +Defined in: [async-batcher.ts:291](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L291) Updates the async batcher options diff --git a/docs/reference/classes/asyncdebouncer.md b/docs/reference/classes/asyncdebouncer.md index 22a211aa..bb46e0c6 100644 --- a/docs/reference/classes/asyncdebouncer.md +++ b/docs/reference/classes/asyncdebouncer.md @@ -7,10 +7,23 @@ title: AsyncDebouncer # Class: AsyncDebouncer\ -Defined in: [async-debouncer.ts:197](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L197) +Defined in: [async-debouncer.ts:206](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L206) A class that creates an async debounced function. +Async vs Sync Versions: +The async version provides advanced features over the sync Debouncer: +- Returns promises that can be awaited for debounced function results +- Built-in retry support via AsyncRetryer integration +- Abort support to cancel in-flight executions +- Cancel support to prevent pending executions from starting +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts) + +The sync Debouncer is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Debouncing? Debouncing ensures that a function is only executed after a specified delay has passed since its last invocation. Each new invocation resets the delay timer. This is useful for handling frequent events like window resizing or input changes where you only want to execute the handler after the events have stopped occurring. @@ -18,10 +31,6 @@ or input changes where you only want to execute the handler after the events hav Unlike throttling which allows execution at regular intervals, debouncing prevents any execution until the function stops being called for the specified delay period. -Unlike the non-async Debouncer, this async version supports returning values from the debounced function, -making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call -instead of setting the result on a state variable from within the debounced function. - Error Handling: - If an `onError` handler is provided, it will be called with the error and debouncer instance - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown @@ -66,7 +75,7 @@ const results = await asyncDebouncer.maybeExecute(inputElement.value); new AsyncDebouncer(fn, initialOptions): AsyncDebouncer ``` -Defined in: [async-debouncer.ts:209](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L209) +Defined in: [async-debouncer.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L218) #### Parameters @@ -90,7 +99,7 @@ Defined in: [async-debouncer.ts:209](https://github.com/TanStack/pacer/blob/main asyncRetryers: Map>; ``` -Defined in: [async-debouncer.ts:203](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L203) +Defined in: [async-debouncer.ts:212](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L212) *** @@ -100,7 +109,7 @@ Defined in: [async-debouncer.ts:203](https://github.com/TanStack/pacer/blob/main fn: TFn; ``` -Defined in: [async-debouncer.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L210) +Defined in: [async-debouncer.ts:219](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L219) *** @@ -110,7 +119,7 @@ Defined in: [async-debouncer.ts:210](https://github.com/TanStack/pacer/blob/main key: string; ``` -Defined in: [async-debouncer.ts:201](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L201) +Defined in: [async-debouncer.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L210) *** @@ -120,7 +129,7 @@ Defined in: [async-debouncer.ts:201](https://github.com/TanStack/pacer/blob/main options: AsyncDebouncerOptions; ``` -Defined in: [async-debouncer.ts:202](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L202) +Defined in: [async-debouncer.ts:211](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L211) *** @@ -130,7 +139,7 @@ Defined in: [async-debouncer.ts:202](https://github.com/TanStack/pacer/blob/main readonly store: Store>>; ``` -Defined in: [async-debouncer.ts:198](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L198) +Defined in: [async-debouncer.ts:207](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L207) ## Methods @@ -140,7 +149,7 @@ Defined in: [async-debouncer.ts:198](https://github.com/TanStack/pacer/blob/main _emit(): void ``` -Defined in: [async-debouncer.ts:231](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L231) +Defined in: [async-debouncer.ts:240](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L240) Emits a change event for the async debouncer instance. Mostly useful for devtools. @@ -156,7 +165,7 @@ Emits a change event for the async debouncer instance. Mostly useful for devtool abort(): void ``` -Defined in: [async-debouncer.ts:447](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L447) +Defined in: [async-debouncer.ts:456](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L456) Aborts all ongoing executions with the internal abort controllers. Does NOT cancel any pending execution that have not started yet. @@ -173,7 +182,7 @@ Does NOT cancel any pending execution that have not started yet. cancel(): void ``` -Defined in: [async-debouncer.ts:459](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L459) +Defined in: [async-debouncer.ts:468](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L468) Cancels any pending execution that have not started yet. Does NOT abort any execution already in progress. @@ -190,7 +199,7 @@ Does NOT abort any execution already in progress. flush(): Promise> ``` -Defined in: [async-debouncer.ts:382](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L382) +Defined in: [async-debouncer.ts:391](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L391) Processes the current pending execution immediately @@ -206,7 +215,7 @@ Processes the current pending execution immediately getAbortSignal(maybeExecuteCount?): null | AbortSignal ``` -Defined in: [async-debouncer.ts:437](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L437) +Defined in: [async-debouncer.ts:446](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L446) Returns the AbortSignal for a specific execution. If no maybeExecuteCount is provided, returns the signal for the most recent execution. @@ -247,7 +256,7 @@ const debouncer = new AsyncDebouncer( maybeExecute(...args): Promise> ``` -Defined in: [async-debouncer.ts:296](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L296) +Defined in: [async-debouncer.ts:305](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L305) Attempts to execute the debounced function. If a call is already in progress, it will be queued. @@ -283,7 +292,7 @@ The error from the debounced function if no onError handler is configured reset(): void ``` -Defined in: [async-debouncer.ts:467](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L467) +Defined in: [async-debouncer.ts:476](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L476) Resets the debouncer state to its default values @@ -299,7 +308,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-debouncer.ts:236](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L236) +Defined in: [async-debouncer.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L245) Updates the async debouncer options diff --git a/docs/reference/classes/asyncqueuer.md b/docs/reference/classes/asyncqueuer.md index ce2b6103..2ce2660e 100644 --- a/docs/reference/classes/asyncqueuer.md +++ b/docs/reference/classes/asyncqueuer.md @@ -7,22 +7,35 @@ title: AsyncQueuer # Class: AsyncQueuer\ -Defined in: [async-queuer.ts:290](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L290) +Defined in: [async-queuer.ts:303](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L303) A flexible asynchronous queue for processing tasks with configurable concurrency, priority, and expiration. -Features: +Async vs Sync Versions: +The async version provides advanced features over the sync Queuer: +- Returns promises that can be awaited for task results +- Built-in retry support via AsyncRetryer integration for each queued task +- Abort support to cancel in-flight task executions +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts) +- Concurrent execution support (process multiple items simultaneously) + +The sync Queuer is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Queuing? +Queuing is a technique for managing and processing items sequentially or with controlled concurrency. +Tasks are processed up to the configured concurrency limit. When a task completes, +the next pending task is processed if the concurrency limit allows. + +Key Features: - Priority queue support via the getPriority option - Configurable concurrency limit - Callbacks for task success, error, completion, and queue state changes - FIFO (First In First Out) or LIFO (Last In First Out) queue behavior - Pause and resume processing -- Task cancellation - Item expiration to remove stale items from the queue -Tasks are processed concurrently up to the configured concurrency limit. When a task completes, -the next pending task is processed if the concurrency limit allows. - Error Handling: - If an `onError` handler is provided, it will be called with the error and queuer instance - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown @@ -71,7 +84,7 @@ asyncQueuer.start(); new AsyncQueuer(fn, initialOptions): AsyncQueuer ``` -Defined in: [async-queuer.ts:302](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L302) +Defined in: [async-queuer.ts:315](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L315) #### Parameters @@ -95,7 +108,7 @@ Defined in: [async-queuer.ts:302](https://github.com/TanStack/pacer/blob/main/pa asyncRetryers: Map Promise>>; ``` -Defined in: [async-queuer.ts:296](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L296) +Defined in: [async-queuer.ts:309](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L309) *** @@ -105,7 +118,7 @@ Defined in: [async-queuer.ts:296](https://github.com/TanStack/pacer/blob/main/pa fn: (item) => Promise; ``` -Defined in: [async-queuer.ts:303](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L303) +Defined in: [async-queuer.ts:316](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L316) #### Parameters @@ -125,7 +138,7 @@ Defined in: [async-queuer.ts:303](https://github.com/TanStack/pacer/blob/main/pa key: string; ``` -Defined in: [async-queuer.ts:294](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L294) +Defined in: [async-queuer.ts:307](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L307) *** @@ -135,7 +148,7 @@ Defined in: [async-queuer.ts:294](https://github.com/TanStack/pacer/blob/main/pa options: AsyncQueuerOptions; ``` -Defined in: [async-queuer.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L295) +Defined in: [async-queuer.ts:308](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L308) *** @@ -145,7 +158,7 @@ Defined in: [async-queuer.ts:295](https://github.com/TanStack/pacer/blob/main/pa readonly store: Store>>; ``` -Defined in: [async-queuer.ts:291](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L291) +Defined in: [async-queuer.ts:304](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L304) ## Methods @@ -155,7 +168,7 @@ Defined in: [async-queuer.ts:291](https://github.com/TanStack/pacer/blob/main/pa _emit(): void ``` -Defined in: [async-queuer.ts:341](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L341) +Defined in: [async-queuer.ts:354](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L354) Emits a change event for the async queuer instance. Mostly useful for devtools. @@ -171,7 +184,7 @@ Emits a change event for the async queuer instance. Mostly useful for devtools. abort(): void ``` -Defined in: [async-queuer.ts:811](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L811) +Defined in: [async-queuer.ts:824](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L824) Aborts all ongoing executions with the internal abort controllers. Does NOT clear out the items. @@ -191,7 +204,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [async-queuer.ts:449](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L449) +Defined in: [async-queuer.ts:462](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L462) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -229,7 +242,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [async-queuer.ts:776](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L776) +Defined in: [async-queuer.ts:789](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L789) Removes all pending items from the queue. Does NOT affect active tasks. @@ -246,7 +259,7 @@ Does NOT affect active tasks. execute(position?): Promise ``` -Defined in: [async-queuer.ts:584](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L584) +Defined in: [async-queuer.ts:597](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L597) Removes and returns the next item from the queue and executes the task function with it. @@ -276,7 +289,7 @@ queuer.execute('back'); flush(numberOfItems, position?): Promise ``` -Defined in: [async-queuer.ts:632](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L632) +Defined in: [async-queuer.ts:645](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L645) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -303,7 +316,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): Promise ``` -Defined in: [async-queuer.ts:646](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L646) +Defined in: [async-queuer.ts:659](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L659) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -326,7 +339,7 @@ The queue is cleared after processing getAbortSignal(executeCount?): null | AbortSignal ``` -Defined in: [async-queuer.ts:801](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L801) +Defined in: [async-queuer.ts:814](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L814) Returns the AbortSignal for a specific execution. If no executeCount is provided, returns the signal for the most recent execution. @@ -367,7 +380,7 @@ const queuer = new AsyncQueuer( getNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:532](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L532) +Defined in: [async-queuer.ts:545](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L545) Removes and returns the next item from the queue without executing the task function. Use for manual queue management. Normally, use execute() to process items. @@ -399,7 +412,7 @@ queuer.getNextItem('back'); peekActiveItems(): TValue[] ``` -Defined in: [async-queuer.ts:738](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L738) +Defined in: [async-queuer.ts:751](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L751) Returns the items currently being processed (active tasks). @@ -415,7 +428,7 @@ Returns the items currently being processed (active tasks). peekAllItems(): TValue[] ``` -Defined in: [async-queuer.ts:731](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L731) +Defined in: [async-queuer.ts:744](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L744) Returns a copy of all items in the queue, including active and pending items. @@ -431,7 +444,7 @@ Returns a copy of all items in the queue, including active and pending items. peekNextItem(position): undefined | TValue ``` -Defined in: [async-queuer.ts:721](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L721) +Defined in: [async-queuer.ts:734](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L734) Returns the next item in the queue without removing it. @@ -460,7 +473,7 @@ queuer.peekNextItem('back'); // back peekPendingItems(): TValue[] ``` -Defined in: [async-queuer.ts:745](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L745) +Defined in: [async-queuer.ts:758](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L758) Returns the items waiting to be processed (pending tasks). @@ -476,7 +489,7 @@ Returns the items waiting to be processed (pending tasks). reset(): void ``` -Defined in: [async-queuer.ts:822](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L822) +Defined in: [async-queuer.ts:835](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L835) Resets the queuer state to its default values @@ -492,7 +505,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [async-queuer.ts:346](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L346) +Defined in: [async-queuer.ts:359](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L359) Updates the queuer options. New options are merged with existing options. @@ -514,7 +527,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [async-queuer.ts:752](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L752) +Defined in: [async-queuer.ts:765](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L765) Starts processing items in the queue. If already running, does nothing. @@ -530,7 +543,7 @@ Starts processing items in the queue. If already running, does nothing. stop(): void ``` -Defined in: [async-queuer.ts:762](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L762) +Defined in: [async-queuer.ts:775](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L775) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/asyncratelimiter.md b/docs/reference/classes/asyncratelimiter.md index 2f5dfe07..ec846ad0 100644 --- a/docs/reference/classes/asyncratelimiter.md +++ b/docs/reference/classes/asyncratelimiter.md @@ -7,30 +7,38 @@ title: AsyncRateLimiter # Class: AsyncRateLimiter\ -Defined in: [async-rate-limiter.ts:225](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L225) +Defined in: [async-rate-limiter.ts:233](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L233) A class that creates an async rate-limited function. -Rate limiting is a simple approach that allows a function to execute up to a limit within a time window, +Async vs Sync Versions: +The async version provides advanced features over the sync RateLimiter: +- Returns promises that can be awaited for rate-limited function results +- Built-in retry support via AsyncRetryer integration +- Abort support to cancel in-flight executions +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts, rejection counts) +- More sophisticated window management with automatic cleanup + +The sync RateLimiter is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Rate Limiting? +Rate limiting allows a function to execute up to a limit within a time window, then blocks all subsequent calls until the window passes. This can lead to "bursty" behavior where all executions happen immediately, followed by a complete block. -The rate limiter supports two types of windows: +Window Types: - 'fixed': A strict window that resets after the window period. All executions within the window count towards the limit, and the window resets completely after the period. - 'sliding': A rolling window that allows executions as old ones expire. This provides a more consistent rate of execution over time. -Unlike the non-async RateLimiter, this async version supports returning values from the rate-limited function, -making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call -instead of setting the result on a state variable from within the rate-limited function. - -For smoother execution patterns, consider using: -- Throttling: Ensures consistent spacing between executions (e.g. max once per 200ms) -- Debouncing: Waits for a pause in calls before executing (e.g. after 500ms of no calls) - +When to Use Rate Limiting: Rate limiting is best used for hard API limits or resource constraints. For UI updates or smoothing out frequent events, throttling or debouncing usually provide better user experience. +- Throttling: Ensures consistent spacing between executions (e.g. max once per 200ms) +- Debouncing: Waits for a pause in calls before executing (e.g. after 500ms of no calls) State Management: - Uses TanStack Store for reactive state management @@ -87,7 +95,7 @@ const data = await rateLimiter.maybeExecute('123'); new AsyncRateLimiter(fn, initialOptions): AsyncRateLimiter ``` -Defined in: [async-rate-limiter.ts:234](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L234) +Defined in: [async-rate-limiter.ts:242](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L242) #### Parameters @@ -111,7 +119,7 @@ Defined in: [async-rate-limiter.ts:234](https://github.com/TanStack/pacer/blob/m asyncRetryers: Map>; ``` -Defined in: [async-rate-limiter.ts:231](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L231) +Defined in: [async-rate-limiter.ts:239](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L239) *** @@ -121,7 +129,7 @@ Defined in: [async-rate-limiter.ts:231](https://github.com/TanStack/pacer/blob/m fn: TFn; ``` -Defined in: [async-rate-limiter.ts:235](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L235) +Defined in: [async-rate-limiter.ts:243](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L243) *** @@ -131,7 +139,7 @@ Defined in: [async-rate-limiter.ts:235](https://github.com/TanStack/pacer/blob/m key: string; ``` -Defined in: [async-rate-limiter.ts:229](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L229) +Defined in: [async-rate-limiter.ts:237](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L237) *** @@ -141,7 +149,7 @@ Defined in: [async-rate-limiter.ts:229](https://github.com/TanStack/pacer/blob/m options: AsyncRateLimiterOptions; ``` -Defined in: [async-rate-limiter.ts:230](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L230) +Defined in: [async-rate-limiter.ts:238](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L238) *** @@ -151,7 +159,7 @@ Defined in: [async-rate-limiter.ts:230](https://github.com/TanStack/pacer/blob/m readonly store: Store>>; ``` -Defined in: [async-rate-limiter.ts:226](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L226) +Defined in: [async-rate-limiter.ts:234](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L234) ## Methods @@ -161,7 +169,7 @@ Defined in: [async-rate-limiter.ts:226](https://github.com/TanStack/pacer/blob/m _emit(): void ``` -Defined in: [async-rate-limiter.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L259) +Defined in: [async-rate-limiter.ts:267](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L267) Emits a change event for the async rate limiter instance. Mostly useful for devtools. @@ -177,7 +185,7 @@ Emits a change event for the async rate limiter instance. Mostly useful for devt abort(): void ``` -Defined in: [async-rate-limiter.ts:518](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L518) +Defined in: [async-rate-limiter.ts:526](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L526) Aborts all ongoing executions with the internal abort controllers. Does NOT clear out the execution times or reset the rate limiter. @@ -194,7 +202,7 @@ Does NOT clear out the execution times or reset the rate limiter. getAbortSignal(maybeExecuteCount?): null | AbortSignal ``` -Defined in: [async-rate-limiter.ts:508](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L508) +Defined in: [async-rate-limiter.ts:516](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L516) Returns the AbortSignal for a specific execution. If no maybeExecuteCount is provided, returns the signal for the most recent execution. @@ -235,7 +243,7 @@ const rateLimiter = new AsyncRateLimiter( getMsUntilNextWindow(): number ``` -Defined in: [async-rate-limiter.ts:480](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L480) +Defined in: [async-rate-limiter.ts:488](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L488) Returns the number of milliseconds until the next execution will be possible For fixed windows, this is the time until the current window resets @@ -253,7 +261,7 @@ For sliding windows, this is the time until the oldest execution expires getRemainingInWindow(): number ``` -Defined in: [async-rate-limiter.ts:470](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L470) +Defined in: [async-rate-limiter.ts:478](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L478) Returns the number of remaining executions allowed in the current window @@ -269,7 +277,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): Promise> ``` -Defined in: [async-rate-limiter.ts:337](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L337) +Defined in: [async-rate-limiter.ts:345](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L345) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -317,7 +325,7 @@ const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined reset(): void ``` -Defined in: [async-rate-limiter.ts:529](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L529) +Defined in: [async-rate-limiter.ts:537](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L537) Resets the rate limiter state @@ -333,7 +341,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [async-rate-limiter.ts:264](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L264) +Defined in: [async-rate-limiter.ts:272](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L272) Updates the async rate limiter options diff --git a/docs/reference/classes/asyncthrottler.md b/docs/reference/classes/asyncthrottler.md index 3e1d6f62..ecd70779 100644 --- a/docs/reference/classes/asyncthrottler.md +++ b/docs/reference/classes/asyncthrottler.md @@ -7,18 +7,28 @@ title: AsyncThrottler # Class: AsyncThrottler\ -Defined in: [async-throttler.ts:208](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L208) +Defined in: [async-throttler.ts:218](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L218) A class that creates an async throttled function. +Async vs Sync Versions: +The async version provides advanced features over the sync Throttler: +- Returns promises that can be awaited for throttled function results +- Built-in retry support via AsyncRetryer integration +- Abort support to cancel in-flight executions +- Cancel support to prevent pending executions from starting +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts) +- Waits for ongoing executions to complete before scheduling the next one + +The sync Throttler is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Throttling? Throttling limits how often a function can be executed, allowing only one execution within a specified time window. Unlike debouncing which resets the delay timer on each call, throttling ensures the function executes at a regular interval regardless of how often it's called. -Unlike the non-async Throttler, this async version supports returning values from the throttled function, -making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call -instead of setting the result on a state variable from within the throttled function. - This is useful for rate-limiting API calls, handling scroll/resize events, or any scenario where you want to ensure a maximum execution frequency. @@ -69,7 +79,7 @@ const result = await throttler.maybeExecute(inputElement.value); new AsyncThrottler(fn, initialOptions): AsyncThrottler ``` -Defined in: [async-throttler.ts:220](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L220) +Defined in: [async-throttler.ts:230](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L230) #### Parameters @@ -93,7 +103,7 @@ Defined in: [async-throttler.ts:220](https://github.com/TanStack/pacer/blob/main asyncRetryers: Map>; ``` -Defined in: [async-throttler.ts:214](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L214) +Defined in: [async-throttler.ts:224](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L224) *** @@ -103,7 +113,7 @@ Defined in: [async-throttler.ts:214](https://github.com/TanStack/pacer/blob/main fn: TFn; ``` -Defined in: [async-throttler.ts:221](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L221) +Defined in: [async-throttler.ts:231](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L231) *** @@ -113,7 +123,7 @@ Defined in: [async-throttler.ts:221](https://github.com/TanStack/pacer/blob/main key: string; ``` -Defined in: [async-throttler.ts:212](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L212) +Defined in: [async-throttler.ts:222](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L222) *** @@ -123,7 +133,7 @@ Defined in: [async-throttler.ts:212](https://github.com/TanStack/pacer/blob/main options: AsyncThrottlerOptions; ``` -Defined in: [async-throttler.ts:213](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L213) +Defined in: [async-throttler.ts:223](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L223) *** @@ -133,7 +143,7 @@ Defined in: [async-throttler.ts:213](https://github.com/TanStack/pacer/blob/main readonly store: Store>>; ``` -Defined in: [async-throttler.ts:209](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L209) +Defined in: [async-throttler.ts:219](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L219) ## Methods @@ -143,7 +153,7 @@ Defined in: [async-throttler.ts:209](https://github.com/TanStack/pacer/blob/main _emit(): void ``` -Defined in: [async-throttler.ts:242](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L242) +Defined in: [async-throttler.ts:252](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L252) Emits a change event for the async throttler instance. Mostly useful for devtools. @@ -159,7 +169,7 @@ Emits a change event for the async throttler instance. Mostly useful for devtool abort(): void ``` -Defined in: [async-throttler.ts:510](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L510) +Defined in: [async-throttler.ts:520](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L520) Aborts all ongoing executions with the internal abort controllers. Does NOT cancel any pending execution that have not started yet. @@ -176,7 +186,7 @@ Does NOT cancel any pending execution that have not started yet. cancel(): void ``` -Defined in: [async-throttler.ts:520](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L520) +Defined in: [async-throttler.ts:530](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L530) Cancels any pending execution that have not started yet. Does NOT abort any execution already in progress. @@ -193,7 +203,7 @@ Does NOT abort any execution already in progress. flush(): Promise> ``` -Defined in: [async-throttler.ts:439](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L439) +Defined in: [async-throttler.ts:449](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L449) Processes the current pending execution immediately @@ -209,7 +219,7 @@ Processes the current pending execution immediately getAbortSignal(maybeExecuteCount?): null | AbortSignal ``` -Defined in: [async-throttler.ts:500](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L500) +Defined in: [async-throttler.ts:510](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L510) Returns the AbortSignal for a specific execution. If no maybeExecuteCount is provided, returns the signal for the most recent execution. @@ -254,7 +264,7 @@ const throttler = new AsyncThrottler( maybeExecute(...args): Promise> ``` -Defined in: [async-throttler.ts:315](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L315) +Defined in: [async-throttler.ts:325](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L325) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -296,7 +306,7 @@ await throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [async-throttler.ts:534](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L534) +Defined in: [async-throttler.ts:544](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L544) Resets the debouncer state to its default values @@ -312,7 +322,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [async-throttler.ts:247](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L247) +Defined in: [async-throttler.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L257) Updates the async throttler options diff --git a/docs/reference/classes/batcher.md b/docs/reference/classes/batcher.md index a54cb8b3..066a35f9 100644 --- a/docs/reference/classes/batcher.md +++ b/docs/reference/classes/batcher.md @@ -7,11 +7,12 @@ title: Batcher # Class: Batcher\ -Defined in: [batcher.ts:144](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L144) +Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L145) A class that collects items and processes them in batches. Batching is a technique for grouping multiple operations together to be processed as a single unit. +This synchronous version is lighter weight and often all you need - upgrade to AsyncBatcher when you need promises, retry support, abort/cancel capabilities, or advanced error handling. The Batcher provides a flexible way to implement batching with configurable: - Maximum batch size (number of items per batch) @@ -59,7 +60,7 @@ batcher.addItem(2); new Batcher(fn, initialOptions): Batcher ``` -Defined in: [batcher.ts:152](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L152) +Defined in: [batcher.ts:153](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L153) #### Parameters @@ -83,7 +84,7 @@ Defined in: [batcher.ts:152](https://github.com/TanStack/pacer/blob/main/package fn: (items) => void; ``` -Defined in: [batcher.ts:153](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L153) +Defined in: [batcher.ts:154](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L154) #### Parameters @@ -103,7 +104,7 @@ Defined in: [batcher.ts:153](https://github.com/TanStack/pacer/blob/main/package key: string; ``` -Defined in: [batcher.ts:148](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L148) +Defined in: [batcher.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L149) *** @@ -113,7 +114,7 @@ Defined in: [batcher.ts:148](https://github.com/TanStack/pacer/blob/main/package options: BatcherOptionsWithOptionalCallbacks; ``` -Defined in: [batcher.ts:149](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L149) +Defined in: [batcher.ts:150](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L150) *** @@ -123,7 +124,7 @@ Defined in: [batcher.ts:149](https://github.com/TanStack/pacer/blob/main/package readonly store: Store>>; ``` -Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L145) +Defined in: [batcher.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L146) ## Methods @@ -133,7 +134,7 @@ Defined in: [batcher.ts:145](https://github.com/TanStack/pacer/blob/main/package _emit(): void ``` -Defined in: [batcher.ts:173](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L173) +Defined in: [batcher.ts:174](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L174) Emits a change event for the batcher instance. Mostly useful for devtools. @@ -149,7 +150,7 @@ Emits a change event for the batcher instance. Mostly useful for devtools. addItem(item): void ``` -Defined in: [batcher.ts:209](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L209) +Defined in: [batcher.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L210) Adds an item to the batcher If the batch size is reached, timeout occurs, or shouldProcess returns true, the batch will be processed @@ -172,7 +173,7 @@ If the batch size is reached, timeout occurs, or shouldProcess returns true, the cancel(): void ``` -Defined in: [batcher.ts:287](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L287) +Defined in: [batcher.ts:288](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L288) Cancels any pending execution that was scheduled. Does NOT clear out the items. @@ -189,7 +190,7 @@ Does NOT clear out the items. clear(): void ``` -Defined in: [batcher.ts:279](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L279) +Defined in: [batcher.ts:280](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L280) Removes all items from the batcher @@ -205,7 +206,7 @@ Removes all items from the batcher flush(): void ``` -Defined in: [batcher.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L257) +Defined in: [batcher.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L258) Processes the current batch of items immediately @@ -221,7 +222,7 @@ Processes the current batch of items immediately peekAllItems(): TValue[] ``` -Defined in: [batcher.ts:265](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L265) +Defined in: [batcher.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L266) Returns a copy of all items in the batcher @@ -237,7 +238,7 @@ Returns a copy of all items in the batcher reset(): void ``` -Defined in: [batcher.ts:295](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L295) +Defined in: [batcher.ts:296](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L296) Resets the batcher state to its default values @@ -253,7 +254,7 @@ Resets the batcher state to its default values setOptions(newOptions): void ``` -Defined in: [batcher.ts:178](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L178) +Defined in: [batcher.ts:179](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L179) Updates the batcher options diff --git a/docs/reference/classes/debouncer.md b/docs/reference/classes/debouncer.md index d3fca780..19be306b 100644 --- a/docs/reference/classes/debouncer.md +++ b/docs/reference/classes/debouncer.md @@ -7,13 +7,14 @@ title: Debouncer # Class: Debouncer\ -Defined in: [debouncer.ts:129](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L129) +Defined in: [debouncer.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L130) A class that creates a debounced function. Debouncing ensures that a function is only executed after a certain amount of time has passed since its last invocation. This is useful for handling frequent events like window resizing, scroll events, or input changes where you want to limit the rate of execution. +This synchronous version is lighter weight and often all you need - upgrade to AsyncDebouncer when you need promises, retry support, abort/cancel capabilities, or advanced error handling. The debounced function can be configured to execute either at the start of the delay period (leading edge) or at the end (trailing edge, default). Each new call during the wait period @@ -52,7 +53,7 @@ inputElement.addEventListener('input', () => { new Debouncer(fn, initialOptions): Debouncer ``` -Defined in: [debouncer.ts:137](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L137) +Defined in: [debouncer.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L138) #### Parameters @@ -76,7 +77,7 @@ Defined in: [debouncer.ts:137](https://github.com/TanStack/pacer/blob/main/packa fn: TFn; ``` -Defined in: [debouncer.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L138) +Defined in: [debouncer.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L139) *** @@ -86,7 +87,7 @@ Defined in: [debouncer.ts:138](https://github.com/TanStack/pacer/blob/main/packa key: string; ``` -Defined in: [debouncer.ts:133](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L133) +Defined in: [debouncer.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L134) *** @@ -96,7 +97,7 @@ Defined in: [debouncer.ts:133](https://github.com/TanStack/pacer/blob/main/packa options: DebouncerOptions; ``` -Defined in: [debouncer.ts:134](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L134) +Defined in: [debouncer.ts:135](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L135) *** @@ -106,7 +107,7 @@ Defined in: [debouncer.ts:134](https://github.com/TanStack/pacer/blob/main/packa readonly store: Store>>; ``` -Defined in: [debouncer.ts:130](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L130) +Defined in: [debouncer.ts:131](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L131) ## Methods @@ -116,7 +117,7 @@ Defined in: [debouncer.ts:130](https://github.com/TanStack/pacer/blob/main/packa _emit(): void ``` -Defined in: [debouncer.ts:158](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L158) +Defined in: [debouncer.ts:159](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L159) Emits a change event for the debouncer instance. Mostly useful for devtools. @@ -132,7 +133,7 @@ Emits a change event for the debouncer instance. Mostly useful for devtools. cancel(): void ``` -Defined in: [debouncer.ts:273](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L273) +Defined in: [debouncer.ts:274](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L274) Cancels any pending execution @@ -148,7 +149,7 @@ Cancels any pending execution flush(): void ``` -Defined in: [debouncer.ts:256](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L256) +Defined in: [debouncer.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L257) Processes the current pending execution immediately @@ -164,7 +165,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [debouncer.ts:209](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L209) +Defined in: [debouncer.ts:210](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L210) Attempts to execute the debounced function If a call is already in progress, it will be queued @@ -187,7 +188,7 @@ If a call is already in progress, it will be queued reset(): void ``` -Defined in: [debouncer.ts:284](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L284) +Defined in: [debouncer.ts:285](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L285) Resets the debouncer state to its default values @@ -203,7 +204,7 @@ Resets the debouncer state to its default values setOptions(newOptions): void ``` -Defined in: [debouncer.ts:163](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L163) +Defined in: [debouncer.ts:164](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/debouncer.ts#L164) Updates the debouncer options diff --git a/docs/reference/classes/queuer.md b/docs/reference/classes/queuer.md index 460f4411..d1c6969c 100644 --- a/docs/reference/classes/queuer.md +++ b/docs/reference/classes/queuer.md @@ -7,10 +7,12 @@ title: Queuer # Class: Queuer\ -Defined in: [queuer.ts:255](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L255) +Defined in: [queuer.ts:257](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L257) A flexible queue that processes items with configurable wait times, expiration, and priority. +This synchronous version is lighter weight and often all you need - upgrade to AsyncQueuer when you need promises, retry support, abort capabilities, concurrent execution, or advanced error handling. + Features: - Automatic or manual processing of items - FIFO (First In First Out), LIFO (Last In First Out), or double-ended queue behavior @@ -92,7 +94,7 @@ manualQueue.getNextItem(); // returns 2, queue is empty new Queuer(fn, initialOptions): Queuer ``` -Defined in: [queuer.ts:263](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L263) +Defined in: [queuer.ts:265](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L265) #### Parameters @@ -116,7 +118,7 @@ Defined in: [queuer.ts:263](https://github.com/TanStack/pacer/blob/main/packages fn: (item) => void; ``` -Defined in: [queuer.ts:264](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L264) +Defined in: [queuer.ts:266](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L266) #### Parameters @@ -136,7 +138,7 @@ Defined in: [queuer.ts:264](https://github.com/TanStack/pacer/blob/main/packages key: string; ``` -Defined in: [queuer.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L259) +Defined in: [queuer.ts:261](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L261) *** @@ -146,7 +148,7 @@ Defined in: [queuer.ts:259](https://github.com/TanStack/pacer/blob/main/packages options: QueuerOptions; ``` -Defined in: [queuer.ts:260](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L260) +Defined in: [queuer.ts:262](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L262) *** @@ -156,7 +158,7 @@ Defined in: [queuer.ts:260](https://github.com/TanStack/pacer/blob/main/packages readonly store: Store>>; ``` -Defined in: [queuer.ts:256](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L256) +Defined in: [queuer.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L258) ## Methods @@ -166,7 +168,7 @@ Defined in: [queuer.ts:256](https://github.com/TanStack/pacer/blob/main/packages _emit(): void ``` -Defined in: [queuer.ts:301](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L301) +Defined in: [queuer.ts:303](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L303) Emits a change event for the queuer instance. Mostly useful for devtools. @@ -185,7 +187,7 @@ addItem( runOnItemsChange): boolean ``` -Defined in: [queuer.ts:390](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L390) +Defined in: [queuer.ts:392](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L392) Adds an item to the queue. If the queue is full, the item is rejected and onReject is called. Items can be inserted based on priority or at the front/back depending on configuration. @@ -224,7 +226,7 @@ queuer.addItem('task2', 'front'); clear(): void ``` -Defined in: [queuer.ts:672](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L672) +Defined in: [queuer.ts:674](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L674) Removes all pending items from the queue. Does not affect items being processed. @@ -240,7 +242,7 @@ Removes all pending items from the queue. Does not affect items being processed. execute(position?): undefined | TValue ``` -Defined in: [queuer.ts:526](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L526) +Defined in: [queuer.ts:528](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L528) Removes and returns the next item from the queue and processes it using the provided function. @@ -269,7 +271,7 @@ queuer.execute('back'); flush(numberOfItems, position?): void ``` -Defined in: [queuer.ts:542](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L542) +Defined in: [queuer.ts:544](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L544) Processes a specified number of items to execute immediately with no wait time If no numberOfItems is provided, all items will be processed @@ -296,7 +298,7 @@ If no numberOfItems is provided, all items will be processed flushAsBatch(batchFunction): void ``` -Defined in: [queuer.ts:557](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L557) +Defined in: [queuer.ts:559](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L559) Processes all items in the queue as a batch using the provided function as an argument The queue is cleared after processing @@ -319,7 +321,7 @@ The queue is cleared after processing getNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:474](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L474) +Defined in: [queuer.ts:476](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L476) Removes and returns the next item from the queue without executing the function. Use for manual queue management. Normally, use execute() to process items. @@ -350,7 +352,7 @@ queuer.getNextItem('back'); peekAllItems(): TValue[] ``` -Defined in: [queuer.ts:640](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L640) +Defined in: [queuer.ts:642](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L642) Returns a copy of all items in the queue. @@ -366,7 +368,7 @@ Returns a copy of all items in the queue. peekNextItem(position): undefined | TValue ``` -Defined in: [queuer.ts:630](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L630) +Defined in: [queuer.ts:632](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L632) Returns the next item in the queue without removing it. @@ -394,7 +396,7 @@ queuer.peekNextItem('back'); // back reset(): void ``` -Defined in: [queuer.ts:680](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L680) +Defined in: [queuer.ts:682](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L682) Resets the queuer state to its default values @@ -410,7 +412,7 @@ Resets the queuer state to its default values setOptions(newOptions): void ``` -Defined in: [queuer.ts:306](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L306) +Defined in: [queuer.ts:308](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L308) Updates the queuer options. New options are merged with existing options. @@ -432,7 +434,7 @@ Updates the queuer options. New options are merged with existing options. start(): void ``` -Defined in: [queuer.ts:647](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L647) +Defined in: [queuer.ts:649](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L649) Starts processing items in the queue. If already isRunning, does nothing. @@ -448,7 +450,7 @@ Starts processing items in the queue. If already isRunning, does nothing. stop(): void ``` -Defined in: [queuer.ts:657](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L657) +Defined in: [queuer.ts:659](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/queuer.ts#L659) Stops processing items in the queue. Does not clear the queue. diff --git a/docs/reference/classes/ratelimiter.md b/docs/reference/classes/ratelimiter.md index 651feb05..40f36c9d 100644 --- a/docs/reference/classes/ratelimiter.md +++ b/docs/reference/classes/ratelimiter.md @@ -7,13 +7,14 @@ title: RateLimiter # Class: RateLimiter\ -Defined in: [rate-limiter.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L143) +Defined in: [rate-limiter.ts:144](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L144) A class that creates a rate-limited function. Rate limiting is a simple approach that allows a function to execute up to a limit within a time window, then blocks all subsequent calls until the window passes. This can lead to "bursty" behavior where all executions happen immediately, followed by a complete block. +This synchronous version is lighter weight and often all you need - upgrade to AsyncRateLimiter when you need promises, retry support, abort capabilities, or advanced error handling. The rate limiter supports two types of windows: - 'fixed': A strict window that resets after the window period. All executions within the window count @@ -65,7 +66,7 @@ rateLimiter.maybeExecute('123'); new RateLimiter(fn, initialOptions): RateLimiter ``` -Defined in: [rate-limiter.ts:150](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L150) +Defined in: [rate-limiter.ts:151](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L151) #### Parameters @@ -89,7 +90,7 @@ Defined in: [rate-limiter.ts:150](https://github.com/TanStack/pacer/blob/main/pa fn: TFn; ``` -Defined in: [rate-limiter.ts:151](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L151) +Defined in: [rate-limiter.ts:152](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L152) *** @@ -99,7 +100,7 @@ Defined in: [rate-limiter.ts:151](https://github.com/TanStack/pacer/blob/main/pa key: string; ``` -Defined in: [rate-limiter.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L146) +Defined in: [rate-limiter.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L147) *** @@ -109,7 +110,7 @@ Defined in: [rate-limiter.ts:146](https://github.com/TanStack/pacer/blob/main/pa options: RateLimiterOptions; ``` -Defined in: [rate-limiter.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L147) +Defined in: [rate-limiter.ts:148](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L148) *** @@ -119,7 +120,7 @@ Defined in: [rate-limiter.ts:147](https://github.com/TanStack/pacer/blob/main/pa readonly store: Store>; ``` -Defined in: [rate-limiter.ts:144](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L144) +Defined in: [rate-limiter.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L145) ## Methods @@ -129,7 +130,7 @@ Defined in: [rate-limiter.ts:144](https://github.com/TanStack/pacer/blob/main/pa _emit(): void ``` -Defined in: [rate-limiter.ts:174](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L174) +Defined in: [rate-limiter.ts:175](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L175) Emits a change event for the rate limiter instance. Mostly useful for devtools. @@ -145,7 +146,7 @@ Emits a change event for the rate limiter instance. Mostly useful for devtools. getMsUntilNextWindow(): number ``` -Defined in: [rate-limiter.ts:346](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L346) +Defined in: [rate-limiter.ts:347](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L347) Returns the number of milliseconds until the next execution will be possible @@ -161,7 +162,7 @@ Returns the number of milliseconds until the next execution will be possible getRemainingInWindow(): number ``` -Defined in: [rate-limiter.ts:338](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L338) +Defined in: [rate-limiter.ts:339](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L339) Returns the number of remaining executions allowed in the current window @@ -177,7 +178,7 @@ Returns the number of remaining executions allowed in the current window maybeExecute(...args): boolean ``` -Defined in: [rate-limiter.ts:240](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L240) +Defined in: [rate-limiter.ts:241](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L241) Attempts to execute the rate-limited function if within the configured limits. Will reject execution if the number of calls in the current window exceeds the limit. @@ -212,7 +213,7 @@ rateLimiter.maybeExecute('arg1', 'arg2'); // false reset(): void ``` -Defined in: [rate-limiter.ts:357](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L357) +Defined in: [rate-limiter.ts:358](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L358) Resets the rate limiter state @@ -228,7 +229,7 @@ Resets the rate limiter state setOptions(newOptions): void ``` -Defined in: [rate-limiter.ts:179](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L179) +Defined in: [rate-limiter.ts:180](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L180) Updates the rate limiter options diff --git a/docs/reference/classes/throttler.md b/docs/reference/classes/throttler.md index 2d156baf..5af8a07c 100644 --- a/docs/reference/classes/throttler.md +++ b/docs/reference/classes/throttler.md @@ -7,13 +7,14 @@ title: Throttler # Class: Throttler\ -Defined in: [throttler.ts:137](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L137) +Defined in: [throttler.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L138) A class that creates a throttled function. Throttling ensures a function is called at most once within a specified time window. Unlike debouncing which waits for a pause in calls, throttling guarantees consistent execution timing regardless of call frequency. +This synchronous version is lighter weight and often all you need - upgrade to AsyncThrottler when you need promises, retry support, abort/cancel capabilities, or advanced error handling. Supports both leading and trailing edge execution: - Leading: Execute immediately on first call (default: true) @@ -56,7 +57,7 @@ throttler.maybeExecute('123'); // Throttled new Throttler(fn, initialOptions): Throttler ``` -Defined in: [throttler.ts:145](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L145) +Defined in: [throttler.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L146) #### Parameters @@ -80,7 +81,7 @@ Defined in: [throttler.ts:145](https://github.com/TanStack/pacer/blob/main/packa fn: TFn; ``` -Defined in: [throttler.ts:146](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L146) +Defined in: [throttler.ts:147](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L147) *** @@ -90,7 +91,7 @@ Defined in: [throttler.ts:146](https://github.com/TanStack/pacer/blob/main/packa key: undefined | string; ``` -Defined in: [throttler.ts:141](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L141) +Defined in: [throttler.ts:142](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L142) *** @@ -100,7 +101,7 @@ Defined in: [throttler.ts:141](https://github.com/TanStack/pacer/blob/main/packa options: ThrottlerOptions; ``` -Defined in: [throttler.ts:142](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L142) +Defined in: [throttler.ts:143](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L143) *** @@ -110,7 +111,7 @@ Defined in: [throttler.ts:142](https://github.com/TanStack/pacer/blob/main/packa readonly store: Store>>; ``` -Defined in: [throttler.ts:138](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L138) +Defined in: [throttler.ts:139](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L139) ## Methods @@ -120,7 +121,7 @@ Defined in: [throttler.ts:138](https://github.com/TanStack/pacer/blob/main/packa _emit(): void ``` -Defined in: [throttler.ts:166](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L166) +Defined in: [throttler.ts:167](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L167) Emits a change event for the throttler instance. Mostly useful for devtools. @@ -136,7 +137,7 @@ Emits a change event for the throttler instance. Mostly useful for devtools. cancel(): void ``` -Defined in: [throttler.ts:310](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L310) +Defined in: [throttler.ts:311](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L311) Cancels any pending trailing execution and clears internal state. @@ -158,7 +159,7 @@ Has no effect if there is no pending execution. flush(): void ``` -Defined in: [throttler.ts:288](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L288) +Defined in: [throttler.ts:289](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L289) Processes the current pending execution immediately @@ -174,7 +175,7 @@ Processes the current pending execution immediately maybeExecute(...args): void ``` -Defined in: [throttler.ts:229](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L229) +Defined in: [throttler.ts:230](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L230) Attempts to execute the throttled function. The execution behavior depends on the throttler options: @@ -216,7 +217,7 @@ throttled.maybeExecute('c', 'd'); reset(): void ``` -Defined in: [throttler.ts:321](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L321) +Defined in: [throttler.ts:322](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L322) Resets the throttler state to its default values @@ -232,7 +233,7 @@ Resets the throttler state to its default values setOptions(newOptions): void ``` -Defined in: [throttler.ts:171](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L171) +Defined in: [throttler.ts:172](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L172) Updates the throttler options diff --git a/docs/reference/functions/asyncbatch.md b/docs/reference/functions/asyncbatch.md index f544ec59..6ef8fda0 100644 --- a/docs/reference/functions/asyncbatch.md +++ b/docs/reference/functions/asyncbatch.md @@ -11,15 +11,31 @@ title: asyncBatch function asyncBatch(fn, options): (item) => Promise ``` -Defined in: [async-batcher.ts:552](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L552) +Defined in: [async-batcher.ts:573](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-batcher.ts#L573) -Creates an async batcher that processes items in batches +Creates an async batcher that processes items in batches. -Unlike the sync batcher, this async version: -- Handles promises and returns results from batch executions -- Provides error handling with configurable error behavior -- Tracks success, error, and settle counts separately -- Has state tracking for when batches are executing +Async vs Sync Versions: +The async version provides advanced features over the sync batch function: +- Returns promises that can be awaited for batch results +- Built-in retry support via AsyncRetryer integration +- Abort support to cancel in-flight batch executions +- Cancel support to prevent pending batches from starting +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts) + +The sync batch function is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Batching? +Batching is a technique for grouping multiple operations together to be processed as a single unit. + +Configuration Options: +- `maxSize`: Maximum number of items per batch (default: Infinity) +- `wait`: Time to wait before processing batch (default: Infinity) +- `getShouldExecute`: Custom logic to trigger batch processing +- `asyncRetryerOptions`: Configure retry behavior for batch executions +- `started`: Whether to start processing immediately (default: true) Error Handling: - If an `onError` handler is provided, it will be called with the error, the batch of items that failed, and batcher instance @@ -34,7 +50,6 @@ State Management: - Use `onSuccess` callback to react to successful batch execution and implement custom logic - Use `onError` callback to react to batch execution errors and implement custom error handling - Use `onSettled` callback to react to batch execution completion (success or error) and implement custom logic -- Use `onExecute` callback to react to batch execution and implement custom logic - Use `onItemsChange` callback to react to items being added or removed from the batcher - The state includes total items processed, success/error counts, and execution status - State can be accessed via the underlying AsyncBatcher instance's `store.state` property diff --git a/docs/reference/functions/asyncdebounce.md b/docs/reference/functions/asyncdebounce.md index 239466ab..4803e6d2 100644 --- a/docs/reference/functions/asyncdebounce.md +++ b/docs/reference/functions/asyncdebounce.md @@ -11,15 +11,35 @@ title: asyncDebounce function asyncDebounce(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-debouncer.ts:516](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L516) +Defined in: [async-debouncer.ts:545](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-debouncer.ts#L545) Creates an async debounced function that delays execution until after a specified wait time. The debounced function will only execute once the wait period has elapsed without any new calls. If called again during the wait period, the timer resets and a new wait period begins. -Unlike the non-async Debouncer, this async version supports returning values from the debounced function, -making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call -instead of setting the result on a state variable from within the debounced function. +Async vs Sync Versions: +The async version provides advanced features over the sync debounce function: +- Returns promises that can be awaited for debounced function results +- Built-in retry support via AsyncRetryer integration +- Abort support to cancel in-flight executions +- Cancel support to prevent pending executions from starting +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts) + +The sync debounce function is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Debouncing? +Debouncing ensures that a function is only executed after a specified delay has passed since its last invocation. +Each new invocation resets the delay timer. This is useful for handling frequent events like window resizing +or input changes where you only want to execute the handler after the events have stopped occurring. + +Configuration Options: +- `wait`: Delay in milliseconds to wait after the last call (required) +- `leading`: Execute on the leading edge of the timeout (default: false) +- `trailing`: Execute on the trailing edge of the timeout (default: true) +- `enabled`: Whether the debouncer is enabled (default: true) +- `asyncRetryerOptions`: Configure retry behavior for executions Error Handling: - If an `onError` handler is provided, it will be called with the error and debouncer instance diff --git a/docs/reference/functions/asyncqueue.md b/docs/reference/functions/asyncqueue.md index 67832666..7e706105 100644 --- a/docs/reference/functions/asyncqueue.md +++ b/docs/reference/functions/asyncqueue.md @@ -11,11 +11,39 @@ title: asyncQueue function asyncQueue(fn, initialOptions): (item, position, runOnItemsChange) => boolean ``` -Defined in: [async-queuer.ts:861](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L861) +Defined in: [async-queuer.ts:906](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-queuer.ts#L906) Creates a new AsyncQueuer instance and returns a bound addItem function for adding tasks. The queuer is started automatically and ready to process items. +Async vs Sync Versions: +The async version provides advanced features over the sync queue function: +- Returns promises that can be awaited for task results +- Built-in retry support via AsyncRetryer integration for each queued task +- Abort support to cancel in-flight task executions +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts) +- Concurrent execution support (process multiple items simultaneously) + +The sync queue function is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Queuing? +Queuing is a technique for managing and processing items sequentially or with controlled concurrency. +Tasks are processed up to the configured concurrency limit. When a task completes, +the next pending task is processed if the concurrency limit allows. + +Configuration Options: +- `concurrency`: Maximum number of concurrent tasks (default: 1) +- `wait`: Time to wait between processing items (default: 0) +- `maxSize`: Maximum number of items allowed in the queue (default: Infinity) +- `getPriority`: Function to determine item priority +- `addItemsTo`: Default position to add items ('back' or 'front', default: 'back') +- `getItemsFrom`: Default position to get items ('front' or 'back', default: 'front') +- `expirationDuration`: Maximum time items can stay in queue +- `started`: Whether to start processing immediately (default: true) +- `asyncRetryerOptions`: Configure retry behavior for task executions + Error Handling: - If an `onError` handler is provided, it will be called with the error and queuer instance - If `throwOnError` is true (default when no onError handler is provided), the error will be thrown @@ -36,15 +64,6 @@ State Management: - State can be accessed via the underlying AsyncQueuer instance's `store.state` property - When using framework adapters (React/Solid), state is accessed from the hook's state property -Example usage: -```ts -const enqueue = asyncQueue(async (item) => { - return item.toUpperCase(); -}, {...options}); - -enqueue('hello'); -``` - ## Type Parameters • **TValue** @@ -90,3 +109,17 @@ Items can be inserted based on priority or at the front/back depending on config queuer.addItem({ value: 'task', priority: 10 }); queuer.addItem('task2', 'front'); ``` + +## Example + +```ts +const enqueue = asyncQueue(async (item) => { + return item.toUpperCase(); +}, { + concurrency: 2, + wait: 100, + onSuccess: (result) => console.log('Processed:', result) +}); + +enqueue('hello'); +``` diff --git a/docs/reference/functions/asyncratelimit.md b/docs/reference/functions/asyncratelimit.md index 76c7f1da..306a70d1 100644 --- a/docs/reference/functions/asyncratelimit.md +++ b/docs/reference/functions/asyncratelimit.md @@ -11,25 +11,55 @@ title: asyncRateLimit function asyncRateLimit(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-rate-limiter.ts:600](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L600) +Defined in: [async-rate-limiter.ts:627](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-rate-limiter.ts#L627) Creates an async rate-limited function that will execute the provided function up to a maximum number of times within a time window. -Unlike the non-async rate limiter, this async version supports returning values from the rate-limited function, -making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call -instead of setting the result on a state variable from within the rate-limited function. +Async vs Sync Versions: +The async version provides advanced features over the sync rate limit function: +- Returns promises that can be awaited for rate-limited function results +- Built-in retry support via AsyncRetryer integration +- Abort support to cancel in-flight executions +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts, rejection counts) +- More sophisticated window management with automatic cleanup -The rate limiter supports two types of windows: +The sync rate limit function is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Rate Limiting? +Rate limiting allows a function to execute up to a limit within a time window, +then blocks all subsequent calls until the window passes. This can lead to "bursty" behavior where +all executions happen immediately, followed by a complete block. + +Window Types: - 'fixed': A strict window that resets after the window period. All executions within the window count towards the limit, and the window resets completely after the period. - 'sliding': A rolling window that allows executions as old ones expire. This provides a more consistent rate of execution over time. -Note that rate limiting is a simpler form of execution control compared to throttling or debouncing: +Configuration Options: +- `limit`: Maximum number of executions allowed within the window (required) +- `window`: Time window in milliseconds (required) +- `windowType`: 'fixed' or 'sliding' (default: 'fixed') +- `enabled`: Whether the rate limiter is enabled (default: true) +- `asyncRetryerOptions`: Configure retry behavior for executions + +When to Use Rate Limiting: +Rate limiting is best used for hard API limits or resource constraints. For UI updates or +smoothing out frequent events, throttling or debouncing usually provide better user experience. - A rate limiter will allow all executions until the limit is reached, then block all subsequent calls until the window resets - A throttler ensures even spacing between executions, which can be better for consistent performance - A debouncer collapses multiple calls into one, which is better for handling bursts of events +Error Handling: +- If an `onError` handler is provided, it will be called with the error and rate limiter instance +- If `throwOnError` is true (default when no onError handler is provided), the error will be thrown +- If `throwOnError` is false (default when onError handler is provided), the error will be swallowed +- Both onError and throwOnError can be used together - the handler will be called before any error is thrown +- The error state can be checked using the underlying AsyncRateLimiter instance +- Rate limit rejections (when limit is exceeded) are handled separately from execution errors via the `onReject` handler + State Management: - Uses TanStack Store for reactive state management - Use `initialState` to provide initial state values when creating the rate limiter @@ -42,17 +72,6 @@ State Management: - State can be accessed via the underlying AsyncRateLimiter instance's `store.state` property - When using framework adapters (React/Solid), state is accessed from the hook's state property -Consider using throttle() or debounce() if you need more intelligent execution control. Use rate limiting when you specifically -need to enforce a hard limit on the number of executions within a time period. - -Error Handling: -- If an `onError` handler is provided, it will be called with the error and rate limiter instance -- If `throwOnError` is true (default when no onError handler is provided), the error will be thrown -- If `throwOnError` is false (default when onError handler is provided), the error will be swallowed -- Both onError and throwOnError can be used together - the handler will be called before any error is thrown -- The error state can be checked using the underlying AsyncRateLimiter instance -- Rate limit rejections (when limit is exceeded) are handled separately from execution errors via the `onReject` handler - ## Type Parameters • **TFn** *extends* [`AnyAsyncFunction`](../../type-aliases/anyasyncfunction.md) diff --git a/docs/reference/functions/asyncthrottle.md b/docs/reference/functions/asyncthrottle.md index 0ca8d62d..2264fa26 100644 --- a/docs/reference/functions/asyncthrottle.md +++ b/docs/reference/functions/asyncthrottle.md @@ -11,15 +11,36 @@ title: asyncThrottle function asyncThrottle(fn, initialOptions): (...args) => Promise> ``` -Defined in: [async-throttler.ts:582](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L582) +Defined in: [async-throttler.ts:613](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-throttler.ts#L613) Creates an async throttled function that limits how often the function can execute. The throttled function will execute at most once per wait period, even if called multiple times. If called while executing, it will wait until execution completes before scheduling the next call. -Unlike the non-async Throttler, this async version supports returning values from the throttled function, -making it ideal for API calls and other async operations where you want the result of the `maybeExecute` call -instead of setting the result on a state variable from within the throttled function. +Async vs Sync Versions: +The async version provides advanced features over the sync throttle function: +- Returns promises that can be awaited for throttled function results +- Built-in retry support via AsyncRetryer integration +- Abort support to cancel in-flight executions +- Cancel support to prevent pending executions from starting +- Comprehensive error handling with onError callbacks and throwOnError control +- Detailed execution tracking (success/error/settle counts) +- Waits for ongoing executions to complete before scheduling the next one + +The sync throttle function is lighter weight and simpler when you don't need async features, +return values, or execution control. + +What is Throttling? +Throttling limits how often a function can be executed, allowing only one execution within a specified time window. +Unlike debouncing which resets the delay timer on each call, throttling ensures the function executes at a +regular interval regardless of how often it's called. + +Configuration Options: +- `wait`: Time window in milliseconds during which the function can only execute once (required) +- `leading`: Execute immediately when called (default: true) +- `trailing`: Execute on the trailing edge of the wait period (default: true) +- `enabled`: Whether the throttler is enabled (default: true) +- `asyncRetryerOptions`: Configure retry behavior for executions Error Handling: - If an `onError` handler is provided, it will be called with the error and throttler instance diff --git a/docs/reference/functions/batch.md b/docs/reference/functions/batch.md index bed79642..d96ff465 100644 --- a/docs/reference/functions/batch.md +++ b/docs/reference/functions/batch.md @@ -11,9 +11,11 @@ title: batch function batch(fn, options): (item) => void ``` -Defined in: [batcher.ts:319](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L319) +Defined in: [batcher.ts:322](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/batcher.ts#L322) -Creates a batcher that processes items in batches +Creates a batcher that processes items in batches. + +This synchronous version is lighter weight and often all you need - upgrade to asyncBatch when you need promises, retry support, abort/cancel capabilities, or advanced error handling. ## Type Parameters diff --git a/docs/reference/functions/debounce.md b/docs/reference/functions/debounce.md index c2625f7a..d646f85c 100644 --- a/docs/reference/functions/debounce.md +++ b/docs/reference/functions/debounce.md @@ -16,8 +16,7 @@ Defined in: [debouncer.ts:317](https://github.com/TanStack/pacer/blob/main/packa Creates a debounced function that delays invoking the provided function until after a specified wait time. Multiple calls during the wait period will cancel previous pending invocations and reset the timer. -This the the simple function wrapper implementation pulled from the Debouncer class. If you need -more control over the debouncing behavior, use the Debouncer class directly. +This synchronous version is lighter weight and often all you need - upgrade to asyncDebounce when you need promises, retry support, abort/cancel capabilities, or advanced error handling. If leading option is true, the function will execute immediately on the first call, then wait the delay before allowing another execution. diff --git a/docs/reference/functions/queue.md b/docs/reference/functions/queue.md index b2d4e8b1..78b2381a 100644 --- a/docs/reference/functions/queue.md +++ b/docs/reference/functions/queue.md @@ -16,9 +16,7 @@ Defined in: [queuer.ts:723](https://github.com/TanStack/pacer/blob/main/packages Creates a queue that processes items immediately upon addition. Items are processed sequentially in FIFO order by default. -This is a simplified wrapper around the Queuer class that only exposes the -`addItem` method. The queue is always isRunning and will process items as they are added. -For more control over queue processing, use the Queuer class directly. +This synchronous version is lighter weight and often all you need - upgrade to asyncQueue when you need promises, retry support, abort capabilities, concurrent execution, or advanced error handling. State Management: - Uses TanStack Store for reactive state management diff --git a/docs/reference/functions/ratelimit.md b/docs/reference/functions/ratelimit.md index 80de15e6..cd61ba57 100644 --- a/docs/reference/functions/ratelimit.md +++ b/docs/reference/functions/ratelimit.md @@ -11,10 +11,12 @@ title: rateLimit function rateLimit(fn, initialOptions): (...args) => boolean ``` -Defined in: [rate-limiter.ts:409](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L409) +Defined in: [rate-limiter.ts:412](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/rate-limiter.ts#L412) Creates a rate-limited function that will execute the provided function up to a maximum number of times within a time window. +This synchronous version is lighter weight and often all you need - upgrade to asyncRateLimit when you need promises, retry support, abort capabilities, or advanced error handling. + Note that rate limiting is a simpler form of execution control compared to throttling or debouncing: - A rate limiter will allow all executions until the limit is reached, then block all subsequent calls until the window resets - A throttler ensures even spacing between executions, which can be better for consistent performance diff --git a/docs/reference/functions/throttle.md b/docs/reference/functions/throttle.md index f779b3ff..9b3b45c4 100644 --- a/docs/reference/functions/throttle.md +++ b/docs/reference/functions/throttle.md @@ -11,10 +11,12 @@ title: throttle function throttle(fn, initialOptions): (...args) => void ``` -Defined in: [throttler.ts:360](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L360) +Defined in: [throttler.ts:363](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/throttler.ts#L363) Creates a throttled function that limits how often the provided function can execute. +This synchronous version is lighter weight and often all you need - upgrade to asyncThrottle when you need promises, retry support, abort/cancel capabilities, or advanced error handling. + Throttling ensures a function executes at most once within a specified time window, regardless of how many times it is called. This is useful for rate-limiting expensive operations or UI updates. From 6e4b9d9835d47c215a2e9c48aa37e124759bcc0a Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 02:26:05 +0000 Subject: [PATCH 49/50] ci: apply automated fixes --- .changeset/chubby-laws-smile.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/chubby-laws-smile.md b/.changeset/chubby-laws-smile.md index 81ac4928..5481d5b5 100644 --- a/.changeset/chubby-laws-smile.md +++ b/.changeset/chubby-laws-smile.md @@ -7,4 +7,4 @@ '@tanstack/pacer': minor --- -feat: added built-in retries and added better abort support to async utils \ No newline at end of file +feat: added built-in retries and added better abort support to async utils From f1787e649c229ccd21d61502ecacef7202b8713c Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Sat, 25 Oct 2025 10:37:33 -0500 Subject: [PATCH 50/50] rewrite guides around retries --- docs/guides/async-retrying.md | 394 +++--------------- docs/reference/classes/asyncretryer.md | 42 +- docs/reference/functions/asyncretry.md | 27 +- .../interfaces/asyncretryeroptions.md | 2 +- .../reference/interfaces/asyncretryerstate.md | 2 +- examples/react/asyncRetry/src/index.tsx | 78 ++-- packages/pacer/src/async-retryer.ts | 51 ++- 7 files changed, 175 insertions(+), 421 deletions(-) diff --git a/docs/guides/async-retrying.md b/docs/guides/async-retrying.md index ff0bbf4f..37247009 100644 --- a/docs/guides/async-retrying.md +++ b/docs/guides/async-retrying.md @@ -3,40 +3,21 @@ title: Async Retrying Guide id: async-retrying --- -TanStack Pacer provides its own retrying utility as a standalone `AsyncRetryer` class or a wrapper function `asyncRetry` for convenience. All of the other async utilities from TanStack Pacer use the `AsyncRetryer` class internally to wrap their executions with built-in retrying functionality. The Async Retryer supports features such as different backoff strategies, jitter, max timeouts, aborting, error handling, and more. +TanStack Pacer provides a simple `asyncRetry` utility function that wraps any async function with retry logic. This is the recommended approach for most use cases, as it creates a new retry-enabled function that can be called multiple times safely. For advanced scenarios requiring state management and reactive updates, TanStack Pacer also provides the `AsyncRetryer` class, though this requires careful usage patterns. -## When to Use Retries +> [!NOTE] The AsyncRetryer API is in alpha and may change before the 1.0.0 release. -Async retrying is particularly effective when you need to: -- Handle transient failures in API calls or network requests -- Implement robust error recovery for flaky operations -- Deal with rate-limited APIs that may temporarily reject requests -- Retry database operations that may fail due to temporary connection issues -- Handle operations that depend on external services with variable reliability +Adding retry wrappers to your async functions is a great way to add a layer of robustness to your code. However, there are some important considerations to keep in mind. TanStack Pacer includes safe default options such as exponential backoff and low amount of max attempts by default to prevent overwhelming a service. -### When Not to Use Retries +> [!NOTE] If you are already using TanStack Query, you should use the built-in retry support instead of using the AsyncRetryer from TanStack Pacer. -Avoid async retrying when: -- The operation is not idempotent (retrying could cause unwanted side effects) -- Errors are permanent and retrying won't help (e.g., authentication failures, invalid input) -- The operation is time-sensitive and delays are unacceptable -- You need immediate feedback on failures without any retry attempts - -For operations that need to be queued and processed sequentially, use [Queuing](../queuing.md) instead. For operations that should be delayed until inactivity, use [Debouncing](../debouncing.md) instead. - -## Understanding Retry Behavior +## Danger with Misconfigured Retries Before implementing retries, understanding the underlying concepts helps you make better decisions about retry strategies and configurations. ### The Thundering Herd Problem -The thundering herd problem occurs when many clients simultaneously retry failed requests to a recovering service, overwhelming it and preventing recovery. This typically happens when: - -- A service experiences a brief outage affecting many clients at once -- All clients fail simultaneously and begin retrying -- Without randomization, all clients retry at exactly the same intervals -- The synchronized retry attempts overwhelm the recovering service -- The service continues to fail, triggering more synchronized retries +The thundering herd problem occurs when many clients simultaneously retry failed requests to a recovering service, overwhelming it and preventing recovery. This usually happens when a service has a brief outage affecting many clients at once, causing all clients to fail and begin retrying. Without any randomization, these clients attempt retries at exactly the same intervals. The resulting synchronized retry attempts put heavy load on the recovering service, which reinforces the outage and leads to more simultaneous retry cycles. **How TanStack Pacer Addresses This:** @@ -81,125 +62,32 @@ Long delays between later retries prevent your application from consuming resour // Attempt 5: 8s later (minimal load if service is down) ``` -### Retry Amplification in Distributed Systems - -Retry amplification occurs when retries cascade through multiple layers of a distributed system, multiplying the actual request load. This is a critical concern in microservices architectures. - -**The Amplification Effect:** - -Consider a system where Service A calls Service B, which calls Service C: - -```text -User → Service A (retries 3x) → Service B (retries 3x) → Service C -``` - -If Service C fails, Service B retries 3 times per request. Service A retries 3 times per request to Service B. This means Service C receives up to 9 requests (3 × 3) for a single user request. +## Async Retrying in TanStack Pacer -With deeper call chains, this grows exponentially: -- 2 services with 3 retries each: 9 requests -- 3 services with 3 retries each: 27 requests -- 4 services with 3 retries each: 81 requests +TanStack Pacer provides two ways to add retry functionality to async functions: the `asyncRetry` convenience function and the `AsyncRetryer` class. -**Mitigation Strategies:** +### Using `asyncRetry` Function -1. **Reduce retries at higher layers:** -```ts -// Service A (user-facing): more retries for better UX -const serviceA = new AsyncRetryer(callServiceB, { - maxAttempts: 5 -}) +The `asyncRetry` function is a convenience wrapper that creates an `AsyncRetryer` instance and returns its execute method: -// Service B (internal): fewer retries to prevent amplification -const serviceB = new AsyncRetryer(callServiceC, { - maxAttempts: 2 -}) -``` - -2. **Use timeout budgets to limit total retry time:** ```ts -const retryer = new AsyncRetryer(asyncFn, { - maxAttempts: 3, - maxTotalExecutionTime: 5000 // Limit total time regardless of retries -}) -``` - -### Cost Considerations - -Retries have real costs that should factor into your retry strategy: - -**Network Costs:** -- Each retry consumes bandwidth -- Mobile users may have limited or metered data -- Cloud services may charge for bandwidth - -**Time Costs:** -- Users wait longer for results -- Longer waits hurt user experience -- Time spent retrying could be spent on other requests - -**Resource Costs:** -- Memory for pending operations -- CPU for processing retries -- Connection pool exhaustion -- Thread/worker saturation - -**Example: Failing Fast Based on Error Type:** - -You can use dynamic `maxAttempts` to adjust retry behavior based on error conditions: +import { asyncRetry } from '@tanstack/pacer' -```ts -// Your async function that throws errors with status codes +// Define your async function normally async function fetchData(url: string) { const response = await fetch(url) - if (!response.ok) { - const error = new Error('Request failed') - ;(error as any).status = response.status - throw error - } + if (!response.ok) throw new Error('Request failed') return response.json() } -const retryer = new AsyncRetryer(fetchData, { - maxAttempts: (retryer) => { - const error = retryer.store.state.lastError as any - - // Don't retry client errors (400-499) - if (error?.status >= 400 && error?.status < 500) { - return 1 // No retries - } - - // Retry server errors (500-599) - return 3 - } +// Create a retry-enabled version +const fetchWithRetry = asyncRetry(fetchData, { + maxAttempts: 3, + backoff: 'exponential', + baseWait: 1000 }) -``` - -## Async Retrying in TanStack Pacer - -TanStack Pacer provides async retrying through the `asyncRetry` function and the more powerful `AsyncRetryer` class. - -### Basic Usage with `asyncRetry` - -The `asyncRetry` function provides a simple way to add retry functionality to any async function: - -```ts -import { asyncRetry } from '@tanstack/pacer' - -// Create a retry-enabled version of your async function -const fetchWithRetry = asyncRetry( - async (url: string) => { - const response = await fetch(url) - if (!response.ok) throw new Error('Request failed') - return response.json() - }, - { - maxAttempts: 3, - backoff: 'exponential', - baseWait: 1000 - } -) -// Usage +// Call it try { const data = await fetchWithRetry('/api/data') console.log('Success:', data) @@ -208,11 +96,11 @@ try { } ``` -For more control over retry behavior, use the `AsyncRetryer` class directly. +### Using `AsyncRetryer` Class -### Advanced Usage with `AsyncRetryer` Class +> **⚠️ Important:** The `AsyncRetryer` class is designed for single-use execution. If you call `execute()` multiple times on the same instance, previous executions will be aborted. For multiple calls, create a new instance each time. -The `AsyncRetryer` class provides complete control over retry behavior: +The `AsyncRetryer` class provides complete control over retry behavior, state management, and manual abort control: ```ts import { AsyncRetryer } from '@tanstack/pacer' @@ -248,9 +136,18 @@ const retryer = new AsyncRetryer( // Execute the function with retry logic const data = await retryer.execute('/api/data') + +// Manual abort control - cancel ongoing execution +retryer.abort() + +// ❌ DON'T DO THIS - will abort the previous execution +// const data2 = await retryer.execute('/api/other-data') + +// ✅ DO THIS INSTEAD - create a new instance for each call +const retryer2 = new AsyncRetryer(asyncFn, options) +const data2 = await retryer2.execute('/api/other-data') ``` -> **Note:** When using React, prefer `useAsyncRetryer` hook over the `asyncRetry` function for better integration with React's lifecycle and automatic cleanup. ## Backoff Strategies @@ -518,20 +415,33 @@ const result = await promise console.log(result) // undefined ``` -### Automatic Cleanup +### Making Functions Actually Cancellable with `getAbortSignal()` -When using framework adapters, cleanup is handled automatically: +For `abort()` to actually cancel your async function (like fetch requests), you need to use the abort signal in your function: -```tsx -// React example -function MyComponent() { - const retryer = useAsyncRetryer(asyncFn, { maxAttempts: 3 }) - - // Automatically calls abort() on unmount - return -} +```ts +const retryer = new AsyncRetryer( + async (url: string) => { + const signal = retryer.getAbortSignal() + if (signal) { + // This fetch will be cancelled when abort() is called + return await fetch(url, { signal }) + } + // Fallback for when not executing + return await fetch(url) + }, + { maxAttempts: 3 } +) + +// Start execution +const promise = retryer.execute('/api/data') + +// This will now actually cancel the fetch request +retryer.abort() ``` +**Important:** Without using `getAbortSignal()`, calling `abort()` will only cancel the retry logic but not the underlying async operation (like a fetch request). The signal ensures your function can be truly cancelled. + ### Reset The `reset()` method cancels execution and resets all state to initial values: @@ -551,7 +461,7 @@ console.log(retryer.store.state.lastResult) // undefined ## State Management -The `AsyncRetryer` class uses TanStack Store for reactive state management, providing real-time access to execution state, error tracking, and retry statistics. All state is stored in a TanStack Store and can be accessed via `asyncRetryer.store.state`, although, if you are using a framework adapter like React or Solid, you will not want to read the state from here. Instead, you will read the state from `asyncRetryer.state` along with providing a selector callback as the 3rd argument to the `useAsyncRetryer` hook to opt-in to state tracking as shown below. +The `AsyncRetryer` class uses TanStack Store for reactive state management, providing real-time access to execution state, error tracking, and retry statistics. All state is stored in a TanStack Store and can be accessed via `asyncRetryer.store.state`. Framework adapters provide their own state management patterns for reactive updates. ### State Selector (Framework Adapters) @@ -560,32 +470,9 @@ Framework adapters support a `selector` argument that allows you to specify whic **By default, `retryer.state` is empty (`{}`) as the selector is empty by default.** This is where reactive state from a TanStack Store `useStore` gets stored. You must opt-in to state tracking by providing a selector function. ```tsx -// Default behavior - no reactive state subscriptions -const retryer = useAsyncRetryer(asyncFn, { maxAttempts: 3 }) -console.log(retryer.state) // {} - -// Opt-in to re-render when execution state changes -const retryer = useAsyncRetryer( - asyncFn, - { maxAttempts: 3 }, - (state) => ({ - isExecuting: state.isExecuting, - currentAttempt: state.currentAttempt - }) -) -console.log(retryer.state.isExecuting) // Reactive value -console.log(retryer.state.currentAttempt) // Reactive value - -// Opt-in to re-render when results are available -const retryer = useAsyncRetryer( - asyncFn, - { maxAttempts: 3 }, - (state) => ({ - lastResult: state.lastResult, - lastError: state.lastError, - status: state.status - }) -) +// Example with framework adapter (conceptual) +// Framework adapters provide their own hooks and state management patterns +// Check the specific framework adapter documentation for exact usage ``` ### Initial State @@ -620,7 +507,7 @@ const unsubscribe = retryer.store.subscribe((state) => { unsubscribe() ``` -> **Note:** This is unnecessary when using a framework adapter because the underlying `useStore` hook already does this. You can also import and use `useStore` from TanStack Store to turn `retryer.store.state` into reactive state with a custom selector wherever you want if necessary. +> **Note:** This is unnecessary when using a framework adapter because the underlying framework hooks already handle this. You can also import and use `useStore` from TanStack Store to turn `retryer.store.state` into reactive state with a custom selector wherever you want if necessary. ### Available State Properties @@ -643,164 +530,3 @@ The `status` property indicates the current state of the retryer: - `'idle'`: Ready to execute, not currently running - `'executing'`: Currently executing the first attempt - `'retrying'`: Currently executing a retry attempt (attempt > 1) - -## Framework Adapters - -Each framework adapter provides hooks that build on top of the core async retrying functionality to integrate with the framework's state management system. Hooks like `createAsyncRetryer`, `useAsyncRetryer`, or similar are available for each framework. - -### React Example - -```tsx -import { useAsyncRetryer } from '@tanstack/react-pacer' - -function DataFetcher() { - const retryer = useAsyncRetryer( - async (userId: string) => { - const response = await fetch(`/api/users/${userId}`) - if (!response.ok) throw new Error('Failed to fetch user') - return response.json() - }, - { - maxAttempts: 5, - backoff: 'exponential', - baseWait: 1000, - jitter: 0.1, - maxExecutionTime: 5000, - onRetry: (attempt) => console.log(`Retry attempt ${attempt}`) - }, - (state) => ({ - isExecuting: state.isExecuting, - currentAttempt: state.currentAttempt, - lastError: state.lastError, - lastResult: state.lastResult - }) - ) - - const handleFetch = async () => { - try { - const user = await retryer.execute('user123') - console.log('User:', user) - } catch (error) { - console.error('Failed to fetch user:', error) - } - } - - return ( -
- - {retryer.state.lastError && ( -

Error: {retryer.state.lastError.message}

- )} - {retryer.state.lastResult && ( -
{JSON.stringify(retryer.state.lastResult, null, 2)}
- )} -
- ) -} -``` - -## Best Practices - -### 1. Choose the Right Backoff Strategy - -- Use **exponential** backoff for most scenarios (default) -- Use **linear** backoff when you want slower growth in wait times -- Use **fixed** backoff when you have strict timing requirements - -### 2. Add Jitter for Distributed Systems - -When multiple clients might retry at the same time, add jitter to prevent thundering herd: - -```ts -const retryer = new AsyncRetryer(asyncFn, { - backoff: 'exponential', - jitter: 0.2 // Add 20% random variation -}) -``` - -### 3. Set Appropriate Timeouts - -Always set timeouts to prevent hanging operations: - -```ts -const retryer = new AsyncRetryer(asyncFn, { - maxExecutionTime: 5000, // Individual call timeout - maxTotalExecutionTime: 30000 // Overall operation timeout -}) -``` - -### 4. Use Callbacks for Side Effects - -Instead of wrapping the retryer in try-catch, use callbacks for cleaner code: - -```ts -const retryer = new AsyncRetryer(asyncFn, { - onSuccess: (result) => { - // Update UI, cache result, etc. - }, - onError: (error) => { - // Log error, show notification, etc. - }, - throwOnError: false // Don't throw, handle via callbacks -}) -``` - -### 5. Make Operations Idempotent - -Ensure your operations can be safely retried without side effects: - -```ts -// Good: Idempotent operation -const retryer = new AsyncRetryer( - async (userId: string) => { - // GET request is idempotent - return await fetch(`/api/users/${userId}`) - } -) - -// Be careful: Non-idempotent operation -const retryer = new AsyncRetryer( - async (amount: number) => { - // POST request that creates a charge - // Could charge multiple times if retried! - return await fetch('/api/charge', { - method: 'POST', - body: JSON.stringify({ amount }) - }) - } -) -``` - -### 6. Adjust Retry Count Based on Error Type - -Some errors should retry more or less than others: - -```ts -const retryer = new AsyncRetryer( - async (url: string) => { - const response = await fetch(url) - if (!response.ok) { - const error = new Error('Request failed') - error.status = response.status - throw error - } - return response.json() - }, - { - maxAttempts: (retryer) => { - const lastError = retryer.store.state.lastError - // Don't retry 4xx client errors - if (lastError?.status >= 400 && lastError?.status < 500) { - return 1 - } - // Retry 5xx server errors more times - return 5 - } - } -) -``` - diff --git a/docs/reference/classes/asyncretryer.md b/docs/reference/classes/asyncretryer.md index ffd175da..7b7238f6 100644 --- a/docs/reference/classes/asyncretryer.md +++ b/docs/reference/classes/asyncretryer.md @@ -7,7 +7,7 @@ title: AsyncRetryer # Class: AsyncRetryer\ -Defined in: [async-retryer.ts:245](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L245) +Defined in: [async-retryer.ts:255](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L255) Provides robust retry functionality for asynchronous functions, supporting configurable backoff strategies, attempt limits, timeout controls, and detailed state management. The AsyncRetryer class is designed to help you reliably @@ -28,6 +28,7 @@ by automatically retrying them according to your chosen policy. - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) - **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. Call `abort()` to stop retries. + Use `getAbortSignal()` to make your async function actually cancellable (e.g., with fetch requests). ## State Management @@ -65,12 +66,21 @@ Callbacks for error handling: - Use `onRetry`, `onSuccess`, `onError`, `onLastError`, and `onSettled` for custom side effects. - Call `abort()` to cancel ongoing execution and pending retries. - Call `reset()` to reset state and cancel execution. +- Use `getAbortSignal()` to make your async function cancellable. +- Use dynamic options (functions) for `maxAttempts`, `baseWait`, and `enabled` based on retryer state. + +**Important:** This class is designed for single-use execution. Calling `execute()` multiple times +on the same instance will abort previous executions. For multiple calls, create a new instance +each time. ## Example ```typescript // Retry a fetch operation up to 5 times with exponential backoff, jitter, and timeouts -const retryer = new AsyncRetryer(fetchData, { +const retryer = new AsyncRetryer(async (url: string) => { + const signal = retryer.getAbortSignal() + return await fetch(url, { signal }) +}, { maxAttempts: 5, backoff: 'exponential', baseWait: 1000, @@ -83,7 +93,7 @@ const retryer = new AsyncRetryer(fetchData, { onLastError: (error) => console.error('All retries failed:', error), }) -const result = await retryer.execute(userId) +const result = await retryer.execute('/api/data') ``` ## Type Parameters @@ -100,7 +110,7 @@ The async function type to be retried. new AsyncRetryer(fn, initialOptions): AsyncRetryer ``` -Defined in: [async-retryer.ts:258](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L258) +Defined in: [async-retryer.ts:268](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L268) Creates a new AsyncRetryer instance @@ -130,7 +140,7 @@ Configuration options for the retryer fn: TFn; ``` -Defined in: [async-retryer.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L259) +Defined in: [async-retryer.ts:269](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L269) The async function to retry @@ -142,7 +152,7 @@ The async function to retry key: string; ``` -Defined in: [async-retryer.ts:249](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L249) +Defined in: [async-retryer.ts:259](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L259) *** @@ -159,7 +169,7 @@ options: AsyncRetryerOptions & Omit>, | "onRetry">; ``` -Defined in: [async-retryer.ts:250](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L250) +Defined in: [async-retryer.ts:260](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L260) *** @@ -169,7 +179,7 @@ Defined in: [async-retryer.ts:250](https://github.com/TanStack/pacer/blob/main/p readonly store: Store>>; ``` -Defined in: [async-retryer.ts:246](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L246) +Defined in: [async-retryer.ts:256](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L256) ## Methods @@ -179,7 +189,7 @@ Defined in: [async-retryer.ts:246](https://github.com/TanStack/pacer/blob/main/p _emit(): void ``` -Defined in: [async-retryer.ts:282](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L282) +Defined in: [async-retryer.ts:292](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L292) Emits a change event for the async retryer instance. Mostly useful for devtools. @@ -195,7 +205,7 @@ Emits a change event for the async retryer instance. Mostly useful for devtools. abort(): void ``` -Defined in: [async-retryer.ts:560](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L560) +Defined in: [async-retryer.ts:570](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L570) Cancels the current execution and any pending retries @@ -208,10 +218,10 @@ Cancels the current execution and any pending retries ### execute() ```ts -execute(...args): Promise> +execute(...args): Promise>> ``` -Defined in: [async-retryer.ts:372](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L372) +Defined in: [async-retryer.ts:382](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L382) Executes the function with retry logic @@ -225,7 +235,7 @@ Arguments to pass to the function #### Returns -`Promise`\<`undefined` \| `ReturnType`\<`TFn`\>\> +`Promise`\<`undefined` \| `Awaited`\<`ReturnType`\<`TFn`\>\>\> The function result, or undefined if disabled or all retries failed (when throwOnError is false) @@ -241,7 +251,7 @@ The last error if throwOnError is true and all retries fail getAbortSignal(): null | AbortSignal ``` -Defined in: [async-retryer.ts:553](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L553) +Defined in: [async-retryer.ts:563](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L563) Returns the current AbortSignal for the executing operation. Use this signal in your async function to make it cancellable. @@ -274,7 +284,7 @@ retryer.abort() reset(): void ``` -Defined in: [async-retryer.ts:573](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L573) +Defined in: [async-retryer.ts:583](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L583) Resets the retryer to its initial state and cancels any ongoing execution @@ -290,7 +300,7 @@ Resets the retryer to its initial state and cancels any ongoing execution setOptions(newOptions): void ``` -Defined in: [async-retryer.ts:288](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L288) +Defined in: [async-retryer.ts:298](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L298) Updates the retryer options diff --git a/docs/reference/functions/asyncretry.md b/docs/reference/functions/asyncretry.md index ce29fb55..41357184 100644 --- a/docs/reference/functions/asyncretry.md +++ b/docs/reference/functions/asyncretry.md @@ -8,12 +8,13 @@ title: asyncRetry # Function: asyncRetry() ```ts -function asyncRetry(fn, initialOptions): (...args) => Promise> +function asyncRetry(fn, initialOptions): (...args) => Promise>> ``` -Defined in: [async-retryer.ts:596](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L596) +Defined in: [async-retryer.ts:619](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L619) -Creates a retry-enabled version of an async function +Creates a retry-enabled version of an async function. This is a convenience wrapper +around the AsyncRetryer class that returns the execute method. ## Type Parameters @@ -47,15 +48,27 @@ A new function that executes the original with retry logic ### Returns -`Promise`\<`undefined` \| `ReturnType`\<`TFn`\>\> +`Promise`\<`undefined` \| `Awaited`\<`ReturnType`\<`TFn`\>\>\> ## Example ```typescript -const retryFetch = asyncRetry(fetch, { +// Define your async function normally +async function fetchData(url: string) { + const response = await fetch(url) + if (!response.ok) throw new Error('Request failed') + return response.json() +} + +// Create retry-enabled function +const fetchWithRetry = asyncRetry(fetchData, { maxAttempts: 3, - backoff: 'exponential' // default + backoff: 'exponential', + baseWait: 1000, + jitter: 0.1 }) -const response = await retryFetch('/api/data') +// Call it multiple times +const data1 = await fetchWithRetry('/api/data1') +const data2 = await fetchWithRetry('/api/data2') ``` diff --git a/docs/reference/interfaces/asyncretryeroptions.md b/docs/reference/interfaces/asyncretryeroptions.md index d02145e0..80655c11 100644 --- a/docs/reference/interfaces/asyncretryeroptions.md +++ b/docs/reference/interfaces/asyncretryeroptions.md @@ -295,7 +295,7 @@ Callback invoked when execution succeeds ##### result -`ReturnType`\<`TFn`\> +`Awaited`\<`ReturnType`\<`TFn`\>\> ##### args diff --git a/docs/reference/interfaces/asyncretryerstate.md b/docs/reference/interfaces/asyncretryerstate.md index 3bc08be1..c78672e1 100644 --- a/docs/reference/interfaces/asyncretryerstate.md +++ b/docs/reference/interfaces/asyncretryerstate.md @@ -78,7 +78,7 @@ Timestamp of the last execution completion in milliseconds ### lastResult ```ts -lastResult: undefined | ReturnType; +lastResult: undefined | Awaited>; ``` Defined in: [async-retryer.ts:30](https://github.com/TanStack/pacer/blob/main/packages/pacer/src/async-retryer.ts#L30) diff --git a/examples/react/asyncRetry/src/index.tsx b/examples/react/asyncRetry/src/index.tsx index 1d6a06a2..81381386 100644 --- a/examples/react/asyncRetry/src/index.tsx +++ b/examples/react/asyncRetry/src/index.tsx @@ -1,6 +1,6 @@ -import { useState, useRef } from 'react' +import { useState } from 'react' import ReactDOM from 'react-dom/client' -import { asyncRetry } from '@tanstack/react-pacer/async-retryer' +import { asyncRetry } from '@tanstack/react-pacer' interface UserData { id: number @@ -37,7 +37,6 @@ function App() { 'default' | 'timeout' | 'jitter' | 'linear' >('default') const [logs, setLogs] = useState([]) - const abortControllerRef = useRef(null) const addLog = (message: string) => { setLogs((prev) => [ @@ -61,10 +60,9 @@ function App() { setError(error.message) setUserData(null) }, - onSuccess: async (result: Promise) => { - const data = await result - addLog(`Request succeeded for user ${data.id}`) - setUserData(data) + onSuccess: (result: UserData) => { + addLog(`Request succeeded for user ${result.id}`) + setUserData(result) setError(null) }, onSettled: () => { @@ -111,15 +109,7 @@ function App() { } } - // Create the retry-wrapped function - const fetchUserWithRetry = asyncRetry(async (id: string) => { - addLog(`Attempting to fetch user ${id}`) - return await fakeApi(id, { - shouldTimeout: scenario === 'timeout', - }) - }, getOptions()) - - // Handle fetch with abort support + // Handle fetch with retry - following docs pattern async function onFetchUser() { setLogs([]) setIsLoading(true) @@ -127,10 +117,16 @@ function App() { setCurrentAttempt(1) addLog('Starting fetch operation') - // Create abort controller - abortControllerRef.current = new AbortController() - try { + // Create retry-enabled function + const fetchUserWithRetry = asyncRetry(async (id: string) => { + addLog(`Attempting to fetch user ${id}`) + return await fakeApi(id, { + shouldTimeout: scenario === 'timeout', + }) + }, getOptions()) + + // Call the retry-enabled function const result = await fetchUserWithRetry(userId) addLog(`Final result: ${result ? `User ${result.id}` : 'undefined'}`) } catch (error) { @@ -140,16 +136,6 @@ function App() { setError(error instanceof Error ? error.message : 'Unknown error') } finally { setIsLoading(false) - abortControllerRef.current = null - } - } - - function onAbort() { - if (abortControllerRef.current) { - abortControllerRef.current.abort() - addLog('Operation aborted by user') - setIsLoading(false) - setCurrentAttempt(0) } } @@ -213,7 +199,7 @@ function App() {
@@ -224,13 +210,6 @@ function App() { > {isLoading ? 'Fetching...' : 'Fetch User'} - @@ -385,10 +364,9 @@ function App() { }} > Note: This example uses the asyncRetry{' '} - utility function, which is a lightweight wrapper that creates a - retry-enabled version of your async function. For React integration with - hooks and reactive state, check out the useAsyncRetryer{' '} - example. + utility function, which creates a retry-enabled version of your async + function. Each call to the retry-enabled function creates a fresh retry + context.
- Key Differences: + Key Features:
  • - asyncRetry - Functional utility that wraps an async - function with retry logic + Exponential Backoff: Wait time doubles with each + retry (1s, 2s, 4s, ...) +
  • +
  • + Linear Backoff: Wait time increases linearly (1s, + 2s, 3s, ...)
  • - useAsyncRetryer - React hook that provides reactive - state and lifecycle management + Jitter: Adds randomness to prevent thundering herd + problems
  • - AsyncRetryer - Low-level class for advanced use cases - with fine-grained control + Timeouts: Control individual and total execution + time
diff --git a/packages/pacer/src/async-retryer.ts b/packages/pacer/src/async-retryer.ts index e48e4e4b..91021072 100644 --- a/packages/pacer/src/async-retryer.ts +++ b/packages/pacer/src/async-retryer.ts @@ -27,7 +27,7 @@ export interface AsyncRetryerState { /** * The result from the most recent successful execution */ - lastResult: ReturnType | undefined + lastResult: Awaited> | undefined /** * Current execution status - 'disabled' when not enabled, 'idle' when ready, 'executing' when running */ @@ -129,7 +129,7 @@ export interface AsyncRetryerOptions { * Callback invoked when execution succeeds */ onSuccess?: ( - result: ReturnType, + result: Awaited>, args: Parameters, retryer: AsyncRetryer, ) => void @@ -183,6 +183,7 @@ const defaultOptions: Omit< * - `maxExecutionTime`: Maximum time for a single function call (default: `Infinity`) * - `maxTotalExecutionTime`: Maximum time for the entire retry operation (default: `Infinity`) * - **Abort & Cancellation**: Supports cancellation via an internal `AbortController`. Call `abort()` to stop retries. + * Use `getAbortSignal()` to make your async function actually cancellable (e.g., with fetch requests). * * ## State Management * @@ -220,11 +221,20 @@ const defaultOptions: Omit< * - Use `onRetry`, `onSuccess`, `onError`, `onLastError`, and `onSettled` for custom side effects. * - Call `abort()` to cancel ongoing execution and pending retries. * - Call `reset()` to reset state and cancel execution. + * - Use `getAbortSignal()` to make your async function cancellable. + * - Use dynamic options (functions) for `maxAttempts`, `baseWait`, and `enabled` based on retryer state. + * + * **Important:** This class is designed for single-use execution. Calling `execute()` multiple times + * on the same instance will abort previous executions. For multiple calls, create a new instance + * each time. * * @example * ```typescript * // Retry a fetch operation up to 5 times with exponential backoff, jitter, and timeouts - * const retryer = new AsyncRetryer(fetchData, { + * const retryer = new AsyncRetryer(async (url: string) => { + * const signal = retryer.getAbortSignal() + * return await fetch(url, { signal }) + * }, { * maxAttempts: 5, * backoff: 'exponential', * baseWait: 1000, @@ -237,7 +247,7 @@ const defaultOptions: Omit< * onLastError: (error) => console.error('All retries failed:', error), * }) * - * const result = await retryer.execute(userId) + * const result = await retryer.execute('/api/data') * ``` * * @template TFn The async function type to be retried. @@ -371,7 +381,7 @@ export class AsyncRetryer { */ execute = async ( ...args: Parameters - ): Promise | undefined> => { + ): Promise> | undefined> => { if (!this.#getEnabled()) { return undefined } @@ -381,7 +391,7 @@ export class AsyncRetryer { const startTime = Date.now() let lastError: Error | undefined - let result: ReturnType | undefined + let result: Awaited> | undefined this.#abortController = new AbortController() const signal = this.#abortController.signal @@ -422,7 +432,7 @@ export class AsyncRetryer { // Execute with individual timeout if specified if (this.options.maxExecutionTime === Infinity) { - result = (await this.fn(...args)) as ReturnType + result = (await this.fn(...args)) as Awaited> } else { result = (await Promise.race([ this.fn(...args), @@ -444,7 +454,7 @@ export class AsyncRetryer { { once: true }, ) }), - ])) as ReturnType + ])) as Awaited> } // Check if cancelled during execution @@ -463,7 +473,7 @@ export class AsyncRetryer { lastResult: result, }) - this.options.onSuccess?.(result, args, this) + this.options.onSuccess?.(result as Awaited>, args, this) return result } catch (error) { @@ -577,7 +587,8 @@ export class AsyncRetryer { } /** - * Creates a retry-enabled version of an async function + * Creates a retry-enabled version of an async function. This is a convenience wrapper + * around the AsyncRetryer class that returns the execute method. * * @param fn The async function to add retry functionality to * @param initialOptions Configuration options for the retry behavior @@ -585,18 +596,30 @@ export class AsyncRetryer { * * @example * ```typescript - * const retryFetch = asyncRetry(fetch, { + * // Define your async function normally + * async function fetchData(url: string) { + * const response = await fetch(url) + * if (!response.ok) throw new Error('Request failed') + * return response.json() + * } + * + * // Create retry-enabled function + * const fetchWithRetry = asyncRetry(fetchData, { * maxAttempts: 3, - * backoff: 'exponential' // default + * backoff: 'exponential', + * baseWait: 1000, + * jitter: 0.1 * }) * - * const response = await retryFetch('/api/data') + * // Call it multiple times + * const data1 = await fetchWithRetry('/api/data1') + * const data2 = await fetchWithRetry('/api/data2') * ``` */ export function asyncRetry( fn: TFn, initialOptions: AsyncRetryerOptions = {}, -): (...args: Parameters) => Promise | undefined> { +): (...args: Parameters) => Promise> | undefined> { const retryer = new AsyncRetryer(fn, initialOptions) return retryer.execute }