diff --git a/.changeset/big-jobs-call.md b/.changeset/big-jobs-call.md new file mode 100644 index 000000000..fd2613caa --- /dev/null +++ b/.changeset/big-jobs-call.md @@ -0,0 +1,5 @@ +--- +'@tanstack/angular-pacer': minor +--- + +injectQueuedValue returns queued value instead of array diff --git a/docs/framework/angular/reference/functions/injectAsyncBatchedCallback.md b/docs/framework/angular/reference/functions/injectAsyncBatchedCallback.md index 78b24980d..52b770e6b 100644 --- a/docs/framework/angular/reference/functions/injectAsyncBatchedCallback.md +++ b/docs/framework/angular/reference/functions/injectAsyncBatchedCallback.md @@ -43,7 +43,8 @@ Consider using the `injectAsyncBatcher` function instead. ### options -`AsyncBatcherOptions`\<`TValue`\> +[`AngularAsyncBatcherOptions`](../interfaces/AngularAsyncBatcherOptions.md)\<`TValue`, \{ +\}\> ## Returns diff --git a/docs/framework/angular/reference/functions/injectAsyncDebouncedCallback.md b/docs/framework/angular/reference/functions/injectAsyncDebouncedCallback.md index 1c1eaef0c..efe6e3028 100644 --- a/docs/framework/angular/reference/functions/injectAsyncDebouncedCallback.md +++ b/docs/framework/angular/reference/functions/injectAsyncDebouncedCallback.md @@ -44,7 +44,8 @@ Consider using the `injectAsyncDebouncer` function instead. ### options -`AsyncDebouncerOptions`\<`TFn`\> +[`AngularAsyncDebouncerOptions`](../interfaces/AngularAsyncDebouncerOptions.md)\<`TFn`, \{ +\}\> ## Returns diff --git a/docs/framework/angular/reference/functions/injectAsyncQueuedSignal.md b/docs/framework/angular/reference/functions/injectAsyncQueuedSignal.md index 9c34f3558..a3908a29d 100644 --- a/docs/framework/angular/reference/functions/injectAsyncQueuedSignal.md +++ b/docs/framework/angular/reference/functions/injectAsyncQueuedSignal.md @@ -43,7 +43,7 @@ The function returns a callable object: ### options -`AsyncQueuerOptions`\<`TValue`\> = `{}` +[`AngularAsyncQueuerOptions`](../interfaces/AngularAsyncQueuerOptions.md)\<`TValue`, `TSelected`\> = `{}` ### selector diff --git a/docs/framework/angular/reference/functions/injectAsyncRateLimitedCallback.md b/docs/framework/angular/reference/functions/injectAsyncRateLimitedCallback.md index a0bc18024..6ecf6ab12 100644 --- a/docs/framework/angular/reference/functions/injectAsyncRateLimitedCallback.md +++ b/docs/framework/angular/reference/functions/injectAsyncRateLimitedCallback.md @@ -40,7 +40,8 @@ Consider using the `injectAsyncRateLimiter` function instead. ### options -`AsyncRateLimiterOptions`\<`TFn`\> +[`AngularAsyncRateLimiterOptions`](../interfaces/AngularAsyncRateLimiterOptions.md)\<`TFn`, \{ +\}\> ## Returns diff --git a/docs/framework/angular/reference/functions/injectAsyncThrottledCallback.md b/docs/framework/angular/reference/functions/injectAsyncThrottledCallback.md index 79ee16812..59ccb9f9b 100644 --- a/docs/framework/angular/reference/functions/injectAsyncThrottledCallback.md +++ b/docs/framework/angular/reference/functions/injectAsyncThrottledCallback.md @@ -42,7 +42,8 @@ Consider using the `injectAsyncThrottler` function instead. ### options -`AsyncThrottlerOptions`\<`TFn`\> +[`AngularAsyncThrottlerOptions`](../interfaces/AngularAsyncThrottlerOptions.md)\<`TFn`, \{ +\}\> ## Returns diff --git a/docs/framework/angular/reference/functions/injectBatchedCallback.md b/docs/framework/angular/reference/functions/injectBatchedCallback.md index 510d62133..48fda14b1 100644 --- a/docs/framework/angular/reference/functions/injectBatchedCallback.md +++ b/docs/framework/angular/reference/functions/injectBatchedCallback.md @@ -42,7 +42,8 @@ Consider using the `injectBatcher` function instead. ### options -`BatcherOptions`\<`TValue`\> +[`AngularBatcherOptions`](../interfaces/AngularBatcherOptions.md)\<`TValue`, \{ +\}\> ## Returns diff --git a/docs/framework/angular/reference/functions/injectDebouncedCallback.md b/docs/framework/angular/reference/functions/injectDebouncedCallback.md index ccf75c755..b89d68fd6 100644 --- a/docs/framework/angular/reference/functions/injectDebouncedCallback.md +++ b/docs/framework/angular/reference/functions/injectDebouncedCallback.md @@ -43,7 +43,8 @@ Consider using the `injectDebouncer` function instead. ### options -`DebouncerOptions`\<`TFn`\> +[`AngularDebouncerOptions`](../interfaces/AngularDebouncerOptions.md)\<`TFn`, \{ +\}\> ## Returns diff --git a/docs/framework/angular/reference/functions/injectDebouncedSignal.md b/docs/framework/angular/reference/functions/injectDebouncedSignal.md index 17d305f35..103074483 100644 --- a/docs/framework/angular/reference/functions/injectDebouncedSignal.md +++ b/docs/framework/angular/reference/functions/injectDebouncedSignal.md @@ -64,7 +64,7 @@ Available debouncer state properties: ### initialOptions -`DebouncerOptions`\<`Setter`\<`TValue`\>\> +[`AngularDebouncerOptions`](../interfaces/AngularDebouncerOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> ### selector? diff --git a/docs/framework/angular/reference/functions/injectDebouncedValue.md b/docs/framework/angular/reference/functions/injectDebouncedValue.md index 73a5e291a..b064c0ab6 100644 --- a/docs/framework/angular/reference/functions/injectDebouncedValue.md +++ b/docs/framework/angular/reference/functions/injectDebouncedValue.md @@ -14,7 +14,7 @@ function injectDebouncedValue( selector?): DebouncedSignal; ``` -Defined in: [angular-pacer/src/debouncer/injectDebouncedValue.ts:77](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/debouncer/injectDebouncedValue.ts#L77) +Defined in: [angular-pacer/src/debouncer/injectDebouncedValue.ts:75](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/debouncer/injectDebouncedValue.ts#L75) An Angular function that creates a debounced value that updates only after a specified delay. Unlike injectDebouncedSignal, this function automatically tracks changes to the input signal @@ -69,7 +69,7 @@ Available debouncer state properties: #### initialOptions -`DebouncerOptions`\<`Setter`\<`TValue`\>\> +[`AngularDebouncerOptions`](../interfaces/AngularDebouncerOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> #### selector? @@ -119,7 +119,7 @@ function injectDebouncedValue( selector?): DebouncedSignal; ``` -Defined in: [angular-pacer/src/debouncer/injectDebouncedValue.ts:82](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/debouncer/injectDebouncedValue.ts#L82) +Defined in: [angular-pacer/src/debouncer/injectDebouncedValue.ts:80](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/debouncer/injectDebouncedValue.ts#L80) An Angular function that creates a debounced value that updates only after a specified delay. Unlike injectDebouncedSignal, this function automatically tracks changes to the input signal @@ -178,7 +178,7 @@ Available debouncer state properties: #### initialOptions -`DebouncerOptions`\<`Setter`\<`TValue`\>\> +[`AngularDebouncerOptions`](../interfaces/AngularDebouncerOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> #### selector? diff --git a/docs/framework/angular/reference/functions/injectQueuedSignal.md b/docs/framework/angular/reference/functions/injectQueuedSignal.md index 5304edc89..2adfae202 100644 --- a/docs/framework/angular/reference/functions/injectQueuedSignal.md +++ b/docs/framework/angular/reference/functions/injectQueuedSignal.md @@ -43,7 +43,7 @@ The function returns a callable object: ### options -`QueuerOptions`\<`TValue`\> = `{}` +[`AngularQueuerOptions`](../interfaces/AngularQueuerOptions.md)\<`TValue`, `TSelected`\> = `{}` ### selector diff --git a/docs/framework/angular/reference/functions/injectQueuedValue.md b/docs/framework/angular/reference/functions/injectQueuedValue.md index 9c3ed8576..e0a185c7c 100644 --- a/docs/framework/angular/reference/functions/injectQueuedValue.md +++ b/docs/framework/angular/reference/functions/injectQueuedValue.md @@ -11,10 +11,10 @@ title: injectQueuedValue function injectQueuedValue( value, options?, -selector?): QueuedSignal; +selector?): QueuedValueSignal; ``` -Defined in: [angular-pacer/src/queuer/injectQueuedValue.ts:31](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedValue.ts#L31) +Defined in: [angular-pacer/src/queuer/injectQueuedValue.ts:38](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedValue.ts#L38) An Angular function that creates a queued value that processes state changes in order with an optional delay. This function uses injectQueuedSignal internally to manage a queue of state changes and apply them sequentially. @@ -23,9 +23,10 @@ The queued value will process changes in the order they are received, with optio processing each change. This is useful for handling state updates that need to be processed in a specific order, like animations or sequential UI updates. -The function returns a tuple containing: -- A Signal that provides the current queued value -- The queuer instance with control methods +The function returns a callable object containing: +- `queued()`: A signal-like function that provides the current queued value +- `queued.addItem(...)`: A method to enqueue additional values +- `queued.queuer`: The queuer instance with control methods and state ### Type Parameters @@ -45,7 +46,7 @@ The function returns a tuple containing: #### options? -`QueuerOptions`\<`TValue`\> +[`AngularQueuerOptions`](../interfaces/AngularQueuerOptions.md)\<`TValue`, `TSelected`\> #### selector? @@ -53,7 +54,7 @@ The function returns a tuple containing: ### Returns -[`QueuedSignal`](../interfaces/QueuedSignal.md)\<`TValue`, `TSelected`\> +[`QueuedValueSignal`](../interfaces/QueuedValueSignal.md)\<`TValue`, `TSelected`\> ### Example @@ -75,10 +76,10 @@ function injectQueuedValue( value, initialValue, options?, -selector?): QueuedSignal; +selector?): QueuedValueSignal; ``` -Defined in: [angular-pacer/src/queuer/injectQueuedValue.ts:42](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedValue.ts#L42) +Defined in: [angular-pacer/src/queuer/injectQueuedValue.ts:49](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedValue.ts#L49) An Angular function that creates a queued value that processes state changes in order with an optional delay. This function uses injectQueuedSignal internally to manage a queue of state changes and apply them sequentially. @@ -87,9 +88,10 @@ The queued value will process changes in the order they are received, with optio processing each change. This is useful for handling state updates that need to be processed in a specific order, like animations or sequential UI updates. -The function returns a tuple containing: -- A Signal that provides the current queued value -- The queuer instance with control methods +The function returns a callable object containing: +- `queued()`: A signal-like function that provides the current queued value +- `queued.addItem(...)`: A method to enqueue additional values +- `queued.queuer`: The queuer instance with control methods and state ### Type Parameters @@ -113,7 +115,7 @@ The function returns a tuple containing: #### options? -`QueuerOptions`\<`TValue`\> +[`AngularQueuerOptions`](../interfaces/AngularQueuerOptions.md)\<`TValue`, `TSelected`\> #### selector? @@ -121,7 +123,7 @@ The function returns a tuple containing: ### Returns -[`QueuedSignal`](../interfaces/QueuedSignal.md)\<`TValue`, `TSelected`\> +[`QueuedValueSignal`](../interfaces/QueuedValueSignal.md)\<`TValue`, `TSelected`\> ### Example diff --git a/docs/framework/angular/reference/functions/injectRateLimitedCallback.md b/docs/framework/angular/reference/functions/injectRateLimitedCallback.md index ae04820fe..42402c779 100644 --- a/docs/framework/angular/reference/functions/injectRateLimitedCallback.md +++ b/docs/framework/angular/reference/functions/injectRateLimitedCallback.md @@ -43,7 +43,8 @@ Consider using the `injectRateLimiter` function instead. ### options -`RateLimiterOptions`\<`TFn`\> +[`AngularRateLimiterOptions`](../interfaces/AngularRateLimiterOptions.md)\<`TFn`, \{ +\}\> ## Returns diff --git a/docs/framework/angular/reference/functions/injectRateLimitedSignal.md b/docs/framework/angular/reference/functions/injectRateLimitedSignal.md index 1410dd49d..3debcfb2c 100644 --- a/docs/framework/angular/reference/functions/injectRateLimitedSignal.md +++ b/docs/framework/angular/reference/functions/injectRateLimitedSignal.md @@ -55,7 +55,7 @@ full control over when your component tracks state changes. ### initialOptions -`RateLimiterOptions`\<`Setter`\<`TValue`\>\> +[`AngularRateLimiterOptions`](../interfaces/AngularRateLimiterOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> ### selector? diff --git a/docs/framework/angular/reference/functions/injectRateLimitedValue.md b/docs/framework/angular/reference/functions/injectRateLimitedValue.md index 58742cf01..d572403ad 100644 --- a/docs/framework/angular/reference/functions/injectRateLimitedValue.md +++ b/docs/framework/angular/reference/functions/injectRateLimitedValue.md @@ -14,7 +14,7 @@ function injectRateLimitedValue( selector?): RateLimitedSignal; ``` -Defined in: [angular-pacer/src/rate-limiter/injectRateLimitedValue.ts:50](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/rate-limiter/injectRateLimitedValue.ts#L50) +Defined in: [angular-pacer/src/rate-limiter/injectRateLimitedValue.ts:48](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/rate-limiter/injectRateLimitedValue.ts#L48) An Angular function that creates a rate-limited value that updates at most a certain number of times within a time window. Unlike injectRateLimitedSignal, this function automatically tracks changes to the input signal @@ -56,7 +56,7 @@ full control over when your component tracks state changes. #### initialOptions -`RateLimiterOptions`\<`Setter`\<`TValue`\>\> +[`AngularRateLimiterOptions`](../interfaces/AngularRateLimiterOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> #### selector? @@ -93,7 +93,7 @@ function injectRateLimitedValue( selector?): RateLimitedSignal; ``` -Defined in: [angular-pacer/src/rate-limiter/injectRateLimitedValue.ts:55](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/rate-limiter/injectRateLimitedValue.ts#L55) +Defined in: [angular-pacer/src/rate-limiter/injectRateLimitedValue.ts:53](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/rate-limiter/injectRateLimitedValue.ts#L53) An Angular function that creates a rate-limited value that updates at most a certain number of times within a time window. Unlike injectRateLimitedSignal, this function automatically tracks changes to the input signal @@ -139,7 +139,7 @@ full control over when your component tracks state changes. #### initialOptions -`RateLimiterOptions`\<`Setter`\<`TValue`\>\> +[`AngularRateLimiterOptions`](../interfaces/AngularRateLimiterOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> #### selector? diff --git a/docs/framework/angular/reference/functions/injectThrottledCallback.md b/docs/framework/angular/reference/functions/injectThrottledCallback.md index e11c559d7..aba9cbafe 100644 --- a/docs/framework/angular/reference/functions/injectThrottledCallback.md +++ b/docs/framework/angular/reference/functions/injectThrottledCallback.md @@ -43,7 +43,8 @@ Consider using the `injectThrottler` function instead. ### options -`ThrottlerOptions`\<`TFn`\> +[`AngularThrottlerOptions`](../interfaces/AngularThrottlerOptions.md)\<`TFn`, \{ +\}\> ## Returns diff --git a/docs/framework/angular/reference/functions/injectThrottledSignal.md b/docs/framework/angular/reference/functions/injectThrottledSignal.md index bdf7d3e53..65bc319cb 100644 --- a/docs/framework/angular/reference/functions/injectThrottledSignal.md +++ b/docs/framework/angular/reference/functions/injectThrottledSignal.md @@ -65,7 +65,7 @@ Available throttler state properties: ### initialOptions -`ThrottlerOptions`\<`Setter`\<`TValue`\>\> +[`AngularThrottlerOptions`](../interfaces/AngularThrottlerOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> ### selector? diff --git a/docs/framework/angular/reference/functions/injectThrottledValue.md b/docs/framework/angular/reference/functions/injectThrottledValue.md index 1dc50fa3d..1ec06b87c 100644 --- a/docs/framework/angular/reference/functions/injectThrottledValue.md +++ b/docs/framework/angular/reference/functions/injectThrottledValue.md @@ -14,7 +14,7 @@ function injectThrottledValue( selector?): ThrottledSignal; ``` -Defined in: [angular-pacer/src/throttler/injectThrottledValue.ts:75](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/throttler/injectThrottledValue.ts#L75) +Defined in: [angular-pacer/src/throttler/injectThrottledValue.ts:73](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/throttler/injectThrottledValue.ts#L73) An Angular function that creates a throttled value that updates at most once within a specified time window. Unlike injectThrottledSignal, this function automatically tracks changes to the input signal @@ -70,7 +70,7 @@ Available throttler state properties: #### initialOptions -`ThrottlerOptions`\<`Setter`\<`TValue`\>\> +[`AngularThrottlerOptions`](../interfaces/AngularThrottlerOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> #### selector? @@ -118,7 +118,7 @@ function injectThrottledValue( selector?): ThrottledSignal; ``` -Defined in: [angular-pacer/src/throttler/injectThrottledValue.ts:80](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/throttler/injectThrottledValue.ts#L80) +Defined in: [angular-pacer/src/throttler/injectThrottledValue.ts:78](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/throttler/injectThrottledValue.ts#L78) An Angular function that creates a throttled value that updates at most once within a specified time window. Unlike injectThrottledSignal, this function automatically tracks changes to the input signal @@ -178,7 +178,7 @@ Available throttler state properties: #### initialOptions -`ThrottlerOptions`\<`Setter`\<`TValue`\>\> +[`AngularThrottlerOptions`](../interfaces/AngularThrottlerOptions.md)\<`Setter`\<`TValue`\>, `TSelected`\> #### selector? diff --git a/docs/framework/angular/reference/index.md b/docs/framework/angular/reference/index.md index 7dd3a08be..88d69e1c6 100644 --- a/docs/framework/angular/reference/index.md +++ b/docs/framework/angular/reference/index.md @@ -30,6 +30,7 @@ title: "@tanstack/angular-pacer" - [AsyncQueuedSignal](interfaces/AsyncQueuedSignal.md) - [DebouncedSignal](interfaces/DebouncedSignal.md) - [QueuedSignal](interfaces/QueuedSignal.md) +- [QueuedValueSignal](interfaces/QueuedValueSignal.md) - [RateLimitedSignal](interfaces/RateLimitedSignal.md) - [ThrottledSignal](interfaces/ThrottledSignal.md) diff --git a/docs/framework/angular/reference/interfaces/AsyncQueuedSignal.md b/docs/framework/angular/reference/interfaces/AsyncQueuedSignal.md index 889c95eab..e6235557c 100644 --- a/docs/framework/angular/reference/interfaces/AsyncQueuedSignal.md +++ b/docs/framework/angular/reference/interfaces/AsyncQueuedSignal.md @@ -33,7 +33,7 @@ Defined in: [angular-pacer/src/async-queuer/injectAsyncQueuedSignal.ts:10](https ### addItem() ```ts -addItem: (item, position?, runOnItemsChange?) => boolean; +addItem: (item, position, runOnItemsChange) => boolean; ``` Defined in: [angular-pacer/src/async-queuer/injectAsyncQueuedSignal.ts:11](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/async-queuer/injectAsyncQueuedSignal.ts#L11) @@ -47,13 +47,13 @@ Items can be inserted based on priority or at the front/back depending on config `TValue` -##### position? +##### position -`QueuePosition` +`QueuePosition` = `...` -##### runOnItemsChange? +##### runOnItemsChange -`boolean` +`boolean` = `true` #### Returns diff --git a/docs/framework/angular/reference/interfaces/QueuedSignal.md b/docs/framework/angular/reference/interfaces/QueuedSignal.md index 3e2842f51..52962fbf2 100644 --- a/docs/framework/angular/reference/interfaces/QueuedSignal.md +++ b/docs/framework/angular/reference/interfaces/QueuedSignal.md @@ -33,7 +33,7 @@ Defined in: [angular-pacer/src/queuer/injectQueuedSignal.ts:7](https://github.co ### addItem() ```ts -addItem: (item, position?, runOnItemsChange?) => boolean; +addItem: (item, position, runOnItemsChange) => boolean; ``` Defined in: [angular-pacer/src/queuer/injectQueuedSignal.ts:8](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedSignal.ts#L8) @@ -55,13 +55,13 @@ queuer.addItem('task2', 'front'); `TValue` -##### position? +##### position -`QueuePosition` +`QueuePosition` = `...` -##### runOnItemsChange? +##### runOnItemsChange -`boolean` +`boolean` = `true` #### Returns diff --git a/docs/framework/angular/reference/interfaces/QueuedValueSignal.md b/docs/framework/angular/reference/interfaces/QueuedValueSignal.md new file mode 100644 index 000000000..177d0b938 --- /dev/null +++ b/docs/framework/angular/reference/interfaces/QueuedValueSignal.md @@ -0,0 +1,78 @@ +--- +id: QueuedValueSignal +title: QueuedValueSignal +--- + +# Interface: QueuedValueSignal()\ + +Defined in: [angular-pacer/src/queuer/injectQueuedValue.ts:7](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedValue.ts#L7) + +## Type Parameters + +### TValue + +`TValue` + +### TSelected + +`TSelected` = \{ +\} + +```ts +QueuedValueSignal(): TValue; +``` + +Defined in: [angular-pacer/src/queuer/injectQueuedValue.ts:8](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedValue.ts#L8) + +## Returns + +`TValue` + +## Properties + +### addItem() + +```ts +addItem: (item, position, runOnItemsChange) => boolean; +``` + +Defined in: [angular-pacer/src/queuer/injectQueuedValue.ts:9](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedValue.ts#L9) + +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. + +Returns true if the item was added, false if the queue is full. + +Example usage: +```ts +queuer.addItem('task'); +queuer.addItem('task2', 'front'); +``` + +#### Parameters + +##### item + +`TValue` + +##### position + +`QueuePosition` = `...` + +##### runOnItemsChange + +`boolean` = `true` + +#### Returns + +`boolean` + +*** + +### queuer + +```ts +queuer: AngularQueuer; +``` + +Defined in: [angular-pacer/src/queuer/injectQueuedValue.ts:10](https://github.com/TanStack/pacer/blob/main/packages/angular-pacer/src/queuer/injectQueuedValue.ts#L10) diff --git a/examples/angular/injectQueuedValue/src/app/app.html b/examples/angular/injectQueuedValue/src/app/app.html index ad483d978..b445f9c8f 100644 --- a/examples/angular/injectQueuedValue/src/app/app.html +++ b/examples/angular/injectQueuedValue/src/app/app.html @@ -4,7 +4,7 @@

injectQueuedValue

Source (instant): {{ source() }}

Value (queued): {{ queued() }}

-

Queue length: {{ queued().length }}

+

Queue length: {{ queued.queuer.state().items.length }}

diff --git a/examples/angular/injectQueuedValue/src/app/app.ts b/examples/angular/injectQueuedValue/src/app/app.ts index c1e04c46d..7c48b6979 100644 --- a/examples/angular/injectQueuedValue/src/app/app.ts +++ b/examples/angular/injectQueuedValue/src/app/app.ts @@ -12,7 +12,7 @@ export class App { protected readonly source = signal('') // A queued value: changes are applied in-order, with an optional delay between items. - // `value()` is the current processed value, and `items()` exposes the pending queue. + // `queued()` is the current processed value, and `queued.queuer.state().items` exposes the pending queue. protected readonly queued = injectQueuedValue(this.source, { wait: 500 }, (state) => ({ items: state.items, })) diff --git a/examples/angular/injectQueuedValue/src/app/inputapp.ts b/examples/angular/injectQueuedValue/src/app/inputapp.ts index 978d1cb7f..96341b6c7 100644 --- a/examples/angular/injectQueuedValue/src/app/inputapp.ts +++ b/examples/angular/injectQueuedValue/src/app/inputapp.ts @@ -8,7 +8,7 @@ import { injectQueuedValue } from '@tanstack/angular-pacer'

NG0950

value: {{ value() }}

Value (queued): {{ queued() }}

-

Queue length: {{ queued().length }}

+

Queue length: {{ queued.queuer.state().items.length }}

`, }) diff --git a/packages/angular-pacer/eslint.config.js b/packages/angular-pacer/eslint.config.js index 50a11bbd5..c5af2db87 100644 --- a/packages/angular-pacer/eslint.config.js +++ b/packages/angular-pacer/eslint.config.js @@ -1,6 +1,21 @@ // @ts-check import rootConfig from '../../eslint.config.js' +import { fileURLToPath } from 'node:url' + +const tsconfigRootDir = fileURLToPath(new URL('.', import.meta.url)) /** @type {import('eslint').Linter.Config[]} */ -export default [...rootConfig] +export default [ + ...rootConfig, + { + name: 'angular-pacer/typescript-projects', + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + project: ['./tsconfig.lib.json', './tsconfig.spec.json'], + tsconfigRootDir, + }, + }, + }, +] diff --git a/packages/angular-pacer/package.json b/packages/angular-pacer/package.json index 3c8a443d9..5d3e0a61e 100644 --- a/packages/angular-pacer/package.json +++ b/packages/angular-pacer/package.json @@ -112,8 +112,12 @@ "@tanstack/pacer": "workspace:*" }, "devDependencies": { + "@analogjs/vite-plugin-angular": "^2.6.0", + "@analogjs/vitest-angular": "^2.6.0", + "@angular/compiler": "^21.2.12", "@angular/core": "^21.2.12", - "@types/node": "^25.7.0" + "@types/node": "^25.7.0", + "jsdom": "^29.1.1" }, "peerDependencies": { "@angular/core": ">=17.0.0" diff --git a/packages/angular-pacer/src/async-batcher/injectAsyncBatchedCallback.ts b/packages/angular-pacer/src/async-batcher/injectAsyncBatchedCallback.ts index 83b597d70..038c636b2 100644 --- a/packages/angular-pacer/src/async-batcher/injectAsyncBatchedCallback.ts +++ b/packages/angular-pacer/src/async-batcher/injectAsyncBatchedCallback.ts @@ -1,5 +1,5 @@ import { injectAsyncBatcher } from './injectAsyncBatcher' -import type { AsyncBatcherOptions } from '@tanstack/pacer/async-batcher' +import type { AngularAsyncBatcherOptions } from './injectAsyncBatcher' /** * An Angular function that creates an async batched version of a callback function. @@ -41,7 +41,7 @@ import type { AsyncBatcherOptions } from '@tanstack/pacer/async-batcher' */ export function injectAsyncBatchedCallback( fn: (items: Array) => Promise, - options: AsyncBatcherOptions, + options: AngularAsyncBatcherOptions, ): (item: TValue) => Promise { const batcher = injectAsyncBatcher(fn, options) return (item: TValue) => batcher.addItem(item) diff --git a/packages/angular-pacer/src/async-debouncer/injectAsyncDebouncedCallback.ts b/packages/angular-pacer/src/async-debouncer/injectAsyncDebouncedCallback.ts index 221765aa8..043b5f1c7 100644 --- a/packages/angular-pacer/src/async-debouncer/injectAsyncDebouncedCallback.ts +++ b/packages/angular-pacer/src/async-debouncer/injectAsyncDebouncedCallback.ts @@ -1,5 +1,5 @@ import { injectAsyncDebouncer } from './injectAsyncDebouncer' -import type { AsyncDebouncerOptions } from '@tanstack/pacer/async-debouncer' +import type { AngularAsyncDebouncerOptions } from './injectAsyncDebouncer' import type { AnyAsyncFunction } from '@tanstack/pacer/types' /** @@ -39,7 +39,7 @@ import type { AnyAsyncFunction } from '@tanstack/pacer/types' */ export function injectAsyncDebouncedCallback( fn: TFn, - options: AsyncDebouncerOptions, + options: AngularAsyncDebouncerOptions, ): (...args: Parameters) => Promise> | undefined> { const debouncer = injectAsyncDebouncer(fn, options) return async (...args: Parameters) => { diff --git a/packages/angular-pacer/src/async-queuer/injectAsyncQueuedSignal.ts b/packages/angular-pacer/src/async-queuer/injectAsyncQueuedSignal.ts index 7271c20de..19c635a01 100644 --- a/packages/angular-pacer/src/async-queuer/injectAsyncQueuedSignal.ts +++ b/packages/angular-pacer/src/async-queuer/injectAsyncQueuedSignal.ts @@ -1,10 +1,10 @@ import { computed } from '@angular/core' import { injectAsyncQueuer } from './injectAsyncQueuer' -import type { AngularAsyncQueuer } from './injectAsyncQueuer' import type { - AsyncQueuerOptions, - AsyncQueuerState, -} from '@tanstack/pacer/async-queuer' + AngularAsyncQueuer, + AngularAsyncQueuerOptions, +} from './injectAsyncQueuer' +import type { AsyncQueuerState } from '@tanstack/pacer/async-queuer' export interface AsyncQueuedSignal { (): Array @@ -57,7 +57,7 @@ export function injectAsyncQueuedSignal< >, >( fn: (value: TValue) => Promise, - options: AsyncQueuerOptions = {}, + options: AngularAsyncQueuerOptions = {}, selector: (state: AsyncQueuerState) => TSelected = (state) => ({ items: state.items }) as TSelected, ): AsyncQueuedSignal { diff --git a/packages/angular-pacer/src/async-rate-limiter/injectAsyncRateLimitedCallback.ts b/packages/angular-pacer/src/async-rate-limiter/injectAsyncRateLimitedCallback.ts index 5894a912b..03a5b72aa 100644 --- a/packages/angular-pacer/src/async-rate-limiter/injectAsyncRateLimitedCallback.ts +++ b/packages/angular-pacer/src/async-rate-limiter/injectAsyncRateLimitedCallback.ts @@ -1,5 +1,5 @@ import { injectAsyncRateLimiter } from './injectAsyncRateLimiter' -import type { AsyncRateLimiterOptions } from '@tanstack/pacer/async-rate-limiter' +import type { AngularAsyncRateLimiterOptions } from './injectAsyncRateLimiter' import type { AnyAsyncFunction } from '@tanstack/pacer/types' /** @@ -42,7 +42,7 @@ import type { AnyAsyncFunction } from '@tanstack/pacer/types' */ export function injectAsyncRateLimitedCallback( fn: TFn, - options: AsyncRateLimiterOptions, + options: AngularAsyncRateLimiterOptions, ): (...args: Parameters) => Promise> | undefined> { const rateLimiter = injectAsyncRateLimiter(fn, options) return async (...args: Parameters) => { diff --git a/packages/angular-pacer/src/async-throttler/injectAsyncThrottledCallback.ts b/packages/angular-pacer/src/async-throttler/injectAsyncThrottledCallback.ts index 85257c097..f97006f95 100644 --- a/packages/angular-pacer/src/async-throttler/injectAsyncThrottledCallback.ts +++ b/packages/angular-pacer/src/async-throttler/injectAsyncThrottledCallback.ts @@ -1,5 +1,5 @@ import { injectAsyncThrottler } from './injectAsyncThrottler' -import type { AsyncThrottlerOptions } from '@tanstack/pacer/async-throttler' +import type { AngularAsyncThrottlerOptions } from './injectAsyncThrottler' import type { AnyAsyncFunction } from '@tanstack/pacer/types' /** @@ -40,7 +40,7 @@ import type { AnyAsyncFunction } from '@tanstack/pacer/types' */ export function injectAsyncThrottledCallback( fn: TFn, - options: AsyncThrottlerOptions, + options: AngularAsyncThrottlerOptions, ): (...args: Parameters) => Promise> | undefined> { const throttler = injectAsyncThrottler(fn, options) return async (...args: Parameters) => { diff --git a/packages/angular-pacer/src/batcher/injectBatchedCallback.ts b/packages/angular-pacer/src/batcher/injectBatchedCallback.ts index 73d7f5791..11e23b281 100644 --- a/packages/angular-pacer/src/batcher/injectBatchedCallback.ts +++ b/packages/angular-pacer/src/batcher/injectBatchedCallback.ts @@ -1,5 +1,5 @@ import { injectBatcher } from './injectBatcher' -import type { BatcherOptions } from '@tanstack/pacer/batcher' +import type { AngularBatcherOptions } from './injectBatcher' /** * An Angular function that creates a batched version of a callback function. @@ -39,7 +39,7 @@ import type { BatcherOptions } from '@tanstack/pacer/batcher' */ export function injectBatchedCallback( fn: (items: Array) => void, - options: BatcherOptions, + options: AngularBatcherOptions, ): (item: TValue) => void { const batcher = injectBatcher(fn, options) return (item: TValue) => batcher.addItem(item) diff --git a/packages/angular-pacer/src/debouncer/injectDebouncedCallback.ts b/packages/angular-pacer/src/debouncer/injectDebouncedCallback.ts index a76e4c4fe..9a04f49b4 100644 --- a/packages/angular-pacer/src/debouncer/injectDebouncedCallback.ts +++ b/packages/angular-pacer/src/debouncer/injectDebouncedCallback.ts @@ -1,5 +1,5 @@ import { injectDebouncer } from './injectDebouncer' -import type { DebouncerOptions } from '@tanstack/pacer/debouncer' +import type { AngularDebouncerOptions } from './injectDebouncer' import type { AnyFunction } from '@tanstack/pacer/types' /** @@ -39,7 +39,7 @@ import type { AnyFunction } from '@tanstack/pacer/types' */ export function injectDebouncedCallback( fn: TFn, - options: DebouncerOptions, + options: AngularDebouncerOptions, ): (...args: Parameters) => void { const debouncer = injectDebouncer(fn, options) return (...args: Parameters) => debouncer.maybeExecute(...args) diff --git a/packages/angular-pacer/src/debouncer/injectDebouncedSignal.ts b/packages/angular-pacer/src/debouncer/injectDebouncedSignal.ts index bce0cdf00..fc63af481 100644 --- a/packages/angular-pacer/src/debouncer/injectDebouncedSignal.ts +++ b/packages/angular-pacer/src/debouncer/injectDebouncedSignal.ts @@ -1,10 +1,10 @@ import { signal } from '@angular/core' import { injectDebouncer } from './injectDebouncer' -import type { AngularDebouncer } from './injectDebouncer' import type { - DebouncerOptions, - DebouncerState, -} from '@tanstack/pacer/debouncer' + AngularDebouncer, + AngularDebouncerOptions, +} from './injectDebouncer' +import type { DebouncerState } from '@tanstack/pacer/debouncer' type Setter = (value: T | ((prev: T) => T)) => void @@ -62,7 +62,7 @@ export interface DebouncedSignal { */ export function injectDebouncedSignal( value: TValue, - initialOptions: DebouncerOptions>, + initialOptions: AngularDebouncerOptions, TSelected>, selector?: (state: DebouncerState>) => TSelected, ): DebouncedSignal { const debouncedValue = signal(value) diff --git a/packages/angular-pacer/src/debouncer/injectDebouncedValue.ts b/packages/angular-pacer/src/debouncer/injectDebouncedValue.ts index 5c20e5660..4c96417fc 100644 --- a/packages/angular-pacer/src/debouncer/injectDebouncedValue.ts +++ b/packages/angular-pacer/src/debouncer/injectDebouncedValue.ts @@ -2,10 +2,8 @@ import { effect } from '@angular/core' import { injectDebouncedSignal } from './injectDebouncedSignal' import type { DebouncedSignal } from './injectDebouncedSignal' import type { Signal } from '@angular/core' -import type { - DebouncerOptions, - DebouncerState, -} from '@tanstack/pacer/debouncer' +import type { AngularDebouncerOptions } from './injectDebouncer' +import type { DebouncerState } from '@tanstack/pacer/debouncer' type Setter = (value: T | ((prev: T) => T)) => void @@ -76,20 +74,22 @@ type Setter = (value: T | ((prev: T) => T)) => void */ export function injectDebouncedValue( value: Signal, - initialOptions: DebouncerOptions>, + initialOptions: AngularDebouncerOptions, TSelected>, selector?: (state: DebouncerState>) => TSelected, ): DebouncedSignal export function injectDebouncedValue( value: Signal, initialValue: TValue, - initialOptions: DebouncerOptions>, + initialOptions: AngularDebouncerOptions, TSelected>, selector?: (state: DebouncerState>) => TSelected, ): DebouncedSignal export function injectDebouncedValue( value: Signal, - initialValueOrOptions: TValue | DebouncerOptions>, + initialValueOrOptions: + | TValue + | AngularDebouncerOptions, TSelected>, initialOptionsOrSelector?: - | DebouncerOptions> + | AngularDebouncerOptions, TSelected> | ((state: DebouncerState>) => TSelected), maybeSelector?: (state: DebouncerState>) => TSelected, ): DebouncedSignal { @@ -103,8 +103,14 @@ export function injectDebouncedValue( ? (initialValueOrOptions as TValue) : (undefined as unknown as TValue) const initialOptions = hasInitialValue - ? (initialOptionsOrSelector as DebouncerOptions>) - : (initialValueOrOptions as DebouncerOptions>) + ? (initialOptionsOrSelector as AngularDebouncerOptions< + Setter, + TSelected + >) + : (initialValueOrOptions as AngularDebouncerOptions< + Setter, + TSelected + >) const selector = hasInitialValue ? maybeSelector : (initialOptionsOrSelector as diff --git a/packages/angular-pacer/src/queuer/injectQueuedSignal.ts b/packages/angular-pacer/src/queuer/injectQueuedSignal.ts index a34372e57..96e128127 100644 --- a/packages/angular-pacer/src/queuer/injectQueuedSignal.ts +++ b/packages/angular-pacer/src/queuer/injectQueuedSignal.ts @@ -1,7 +1,7 @@ import { computed } from '@angular/core' import { injectQueuer } from './injectQueuer' -import type { AngularQueuer } from './injectQueuer' -import type { QueuerOptions, QueuerState } from '@tanstack/pacer/queuer' +import type { AngularQueuer, AngularQueuerOptions } from './injectQueuer' +import type { QueuerState } from '@tanstack/pacer/queuer' export interface QueuedSignal { (): Array @@ -48,7 +48,7 @@ export function injectQueuedSignal< >, >( fn: (item: TValue) => void, - options: QueuerOptions = {}, + options: AngularQueuerOptions = {}, selector: (state: QueuerState) => TSelected = (state) => ({ items: state.items }) as TSelected, ): QueuedSignal { diff --git a/packages/angular-pacer/src/queuer/injectQueuedValue.ts b/packages/angular-pacer/src/queuer/injectQueuedValue.ts index 9eff79c03..f96a678ca 100644 --- a/packages/angular-pacer/src/queuer/injectQueuedValue.ts +++ b/packages/angular-pacer/src/queuer/injectQueuedValue.ts @@ -1,8 +1,14 @@ -import { effect, linkedSignal, signal } from '@angular/core' +import { effect, linkedSignal, untracked } from '@angular/core' import { injectQueuedSignal } from './injectQueuedSignal' -import type { QueuedSignal } from './injectQueuedSignal' import type { Signal } from '@angular/core' -import type { QueuerOptions, QueuerState } from '@tanstack/pacer/queuer' +import type { QueuerState } from '@tanstack/pacer/queuer' +import type { AngularQueuer, AngularQueuerOptions } from './injectQueuer' + +export interface QueuedValueSignal { + (): TValue + addItem: AngularQueuer['addItem'] + queuer: AngularQueuer +} /** * An Angular function that creates a queued value that processes state changes in order with an optional delay. @@ -12,9 +18,10 @@ import type { QueuerOptions, QueuerState } from '@tanstack/pacer/queuer' * processing each change. This is useful for handling state updates that need to be processed * in a specific order, like animations or sequential UI updates. * - * The function returns a tuple containing: - * - A Signal that provides the current queued value - * - The queuer instance with control methods + * The function returns a callable object containing: + * - `queued()`: A signal-like function that provides the current queued value + * - `queued.addItem(...)`: A method to enqueue additional values + * - `queued.queuer`: The queuer instance with control methods and state * * @example * ```ts @@ -36,9 +43,9 @@ export function injectQueuedValue< >, >( value: Signal, - options?: QueuerOptions, + options?: AngularQueuerOptions, selector?: (state: QueuerState) => TSelected, -): QueuedSignal +): QueuedValueSignal export function injectQueuedValue< TValue, TSelected extends Pick, 'items'> = Pick< @@ -48,9 +55,9 @@ export function injectQueuedValue< >( value: Signal, initialValue: TValue, - options?: QueuerOptions, + options?: AngularQueuerOptions, selector?: (state: QueuerState) => TSelected, -): QueuedSignal +): QueuedValueSignal export function injectQueuedValue< TValue, TSelected extends Pick, 'items'> = Pick< @@ -59,31 +66,30 @@ export function injectQueuedValue< >, >( value: Signal, - initialValueOrOptions?: TValue | QueuerOptions, + initialValueOrOptions?: TValue | AngularQueuerOptions, initialOptionsOrSelector?: - | QueuerOptions + | AngularQueuerOptions | ((state: QueuerState) => TSelected), maybeSelector?: (state: QueuerState) => TSelected, -): QueuedSignal { +): QueuedValueSignal { const hasSelector = typeof initialOptionsOrSelector === 'function' const hasInitialValue = (initialOptionsOrSelector !== undefined && !hasSelector) || maybeSelector !== undefined - - const initialValue = hasInitialValue - ? (initialValueOrOptions as TValue) - : value() const initialOptions = hasInitialValue - ? (initialOptionsOrSelector as QueuerOptions) - : (initialValueOrOptions as QueuerOptions) + ? (initialOptionsOrSelector as AngularQueuerOptions) + : (initialValueOrOptions as AngularQueuerOptions) const selector = hasInitialValue ? maybeSelector : (initialOptionsOrSelector as | ((state: QueuerState) => TSelected) | undefined) - const linkedValue = linkedSignal(() => value()) - const queuedValue = signal(initialValue) + const queuedValue = linkedSignal(() => { + return hasInitialValue + ? (initialValueOrOptions as TValue) + : untracked(value) + }) const queued = injectQueuedSignal( (item) => { @@ -94,8 +100,11 @@ export function injectQueuedValue< ) effect(() => { - queued.addItem(linkedValue()) + queued.addItem(value()) }) - return queued + return Object.assign(queuedValue, { + addItem: queued.addItem.bind(queued), + queuer: queued.queuer, + }) as QueuedValueSignal } diff --git a/packages/angular-pacer/src/rate-limiter/injectRateLimitedCallback.ts b/packages/angular-pacer/src/rate-limiter/injectRateLimitedCallback.ts index 9babbf8b8..3405e3df0 100644 --- a/packages/angular-pacer/src/rate-limiter/injectRateLimitedCallback.ts +++ b/packages/angular-pacer/src/rate-limiter/injectRateLimitedCallback.ts @@ -1,5 +1,5 @@ import { injectRateLimiter } from './injectRateLimiter' -import type { RateLimiterOptions } from '@tanstack/pacer/rate-limiter' +import type { AngularRateLimiterOptions } from './injectRateLimiter' import type { AnyFunction } from '@tanstack/pacer/types' /** @@ -38,7 +38,7 @@ import type { AnyFunction } from '@tanstack/pacer/types' */ export function injectRateLimitedCallback( fn: TFn, - options: RateLimiterOptions, + options: AngularRateLimiterOptions, ): (...args: Parameters) => boolean { const rateLimiter = injectRateLimiter(fn, options) return (...args: Parameters) => rateLimiter.maybeExecute(...args) diff --git a/packages/angular-pacer/src/rate-limiter/injectRateLimitedSignal.ts b/packages/angular-pacer/src/rate-limiter/injectRateLimitedSignal.ts index 992e4c309..0fa2df836 100644 --- a/packages/angular-pacer/src/rate-limiter/injectRateLimitedSignal.ts +++ b/packages/angular-pacer/src/rate-limiter/injectRateLimitedSignal.ts @@ -1,10 +1,10 @@ import { signal } from '@angular/core' import { injectRateLimiter } from './injectRateLimiter' -import type { AngularRateLimiter } from './injectRateLimiter' import type { - RateLimiterOptions, - RateLimiterState, -} from '@tanstack/pacer/rate-limiter' + AngularRateLimiter, + AngularRateLimiterOptions, +} from './injectRateLimiter' +import type { RateLimiterState } from '@tanstack/pacer/rate-limiter' type Setter = (value: T | ((prev: T) => T)) => void @@ -56,7 +56,7 @@ export interface RateLimitedSignal { */ export function injectRateLimitedSignal( value: TValue, - initialOptions: RateLimiterOptions>, + initialOptions: AngularRateLimiterOptions, TSelected>, selector?: (state: RateLimiterState) => TSelected, ): RateLimitedSignal { const rateLimitedValue = signal(value) diff --git a/packages/angular-pacer/src/rate-limiter/injectRateLimitedValue.ts b/packages/angular-pacer/src/rate-limiter/injectRateLimitedValue.ts index 23bab1040..14c114d58 100644 --- a/packages/angular-pacer/src/rate-limiter/injectRateLimitedValue.ts +++ b/packages/angular-pacer/src/rate-limiter/injectRateLimitedValue.ts @@ -2,10 +2,8 @@ import { effect } from '@angular/core' import { injectRateLimitedSignal } from './injectRateLimitedSignal' import type { RateLimitedSignal } from './injectRateLimitedSignal' import type { Signal } from '@angular/core' -import type { - RateLimiterOptions, - RateLimiterState, -} from '@tanstack/pacer/rate-limiter' +import type { AngularRateLimiterOptions } from './injectRateLimiter' +import type { RateLimiterState } from '@tanstack/pacer/rate-limiter' type Setter = (value: T | ((prev: T) => T)) => void @@ -49,20 +47,22 @@ type Setter = (value: T | ((prev: T) => T)) => void */ export function injectRateLimitedValue( value: Signal, - initialOptions: RateLimiterOptions>, + initialOptions: AngularRateLimiterOptions, TSelected>, selector?: (state: RateLimiterState) => TSelected, ): RateLimitedSignal export function injectRateLimitedValue( value: Signal, initialValue: TValue, - initialOptions: RateLimiterOptions>, + initialOptions: AngularRateLimiterOptions, TSelected>, selector?: (state: RateLimiterState) => TSelected, ): RateLimitedSignal export function injectRateLimitedValue( value: Signal, - initialValueOrOptions: TValue | RateLimiterOptions>, + initialValueOrOptions: + | TValue + | AngularRateLimiterOptions, TSelected>, initialOptionsOrSelector?: - | RateLimiterOptions> + | AngularRateLimiterOptions, TSelected> | ((state: RateLimiterState) => TSelected), maybeSelector?: (state: RateLimiterState) => TSelected, ): RateLimitedSignal { @@ -76,8 +76,14 @@ export function injectRateLimitedValue( ? (initialValueOrOptions as TValue) : (undefined as unknown as TValue) const initialOptions = hasInitialValue - ? (initialOptionsOrSelector as RateLimiterOptions>) - : (initialValueOrOptions as RateLimiterOptions>) + ? (initialOptionsOrSelector as AngularRateLimiterOptions< + Setter, + TSelected + >) + : (initialValueOrOptions as AngularRateLimiterOptions< + Setter, + TSelected + >) const selector = hasInitialValue ? maybeSelector : (initialOptionsOrSelector as diff --git a/packages/angular-pacer/src/throttler/injectThrottledCallback.ts b/packages/angular-pacer/src/throttler/injectThrottledCallback.ts index f92e8285b..98f900fb5 100644 --- a/packages/angular-pacer/src/throttler/injectThrottledCallback.ts +++ b/packages/angular-pacer/src/throttler/injectThrottledCallback.ts @@ -1,5 +1,5 @@ import { injectThrottler } from './injectThrottler' -import type { ThrottlerOptions } from '@tanstack/pacer/throttler' +import type { AngularThrottlerOptions } from './injectThrottler' import type { AnyFunction } from '@tanstack/pacer/types' /** @@ -38,7 +38,7 @@ import type { AnyFunction } from '@tanstack/pacer/types' */ export function injectThrottledCallback( fn: TFn, - options: ThrottlerOptions, + options: AngularThrottlerOptions, ): (...args: Parameters) => void { const throttler = injectThrottler(fn, options) return (...args: Parameters) => throttler.maybeExecute(...args) diff --git a/packages/angular-pacer/src/throttler/injectThrottledSignal.ts b/packages/angular-pacer/src/throttler/injectThrottledSignal.ts index 37cd1aace..14d191d05 100644 --- a/packages/angular-pacer/src/throttler/injectThrottledSignal.ts +++ b/packages/angular-pacer/src/throttler/injectThrottledSignal.ts @@ -1,10 +1,10 @@ import { signal } from '@angular/core' import { injectThrottler } from './injectThrottler' -import type { AngularThrottler } from './injectThrottler' import type { - ThrottlerOptions, - ThrottlerState, -} from '@tanstack/pacer/throttler' + AngularThrottler, + AngularThrottlerOptions, +} from './injectThrottler' +import type { ThrottlerState } from '@tanstack/pacer/throttler' type Setter = (value: T | ((prev: T) => T)) => void @@ -63,7 +63,7 @@ export interface ThrottledSignal { */ export function injectThrottledSignal( value: TValue, - initialOptions: ThrottlerOptions>, + initialOptions: AngularThrottlerOptions, TSelected>, selector?: (state: ThrottlerState>) => TSelected, ): ThrottledSignal { const throttledValue = signal(value) diff --git a/packages/angular-pacer/src/throttler/injectThrottledValue.ts b/packages/angular-pacer/src/throttler/injectThrottledValue.ts index 8a91cc10f..ba08edeca 100644 --- a/packages/angular-pacer/src/throttler/injectThrottledValue.ts +++ b/packages/angular-pacer/src/throttler/injectThrottledValue.ts @@ -2,10 +2,8 @@ import { effect } from '@angular/core' import { injectThrottledSignal } from './injectThrottledSignal' import type { ThrottledSignal } from './injectThrottledSignal' import type { Signal } from '@angular/core' -import type { - ThrottlerOptions, - ThrottlerState, -} from '@tanstack/pacer/throttler' +import type { AngularThrottlerOptions } from './injectThrottler' +import type { ThrottlerState } from '@tanstack/pacer/throttler' type Setter = (value: T | ((prev: T) => T)) => void @@ -74,20 +72,22 @@ type Setter = (value: T | ((prev: T) => T)) => void */ export function injectThrottledValue( value: Signal, - initialOptions: ThrottlerOptions>, + initialOptions: AngularThrottlerOptions, TSelected>, selector?: (state: ThrottlerState>) => TSelected, ): ThrottledSignal export function injectThrottledValue( value: Signal, initialValue: TValue, - initialOptions: ThrottlerOptions>, + initialOptions: AngularThrottlerOptions, TSelected>, selector?: (state: ThrottlerState>) => TSelected, ): ThrottledSignal export function injectThrottledValue( value: Signal, - initialValueOrOptions: TValue | ThrottlerOptions>, + initialValueOrOptions: + | TValue + | AngularThrottlerOptions, TSelected>, initialOptionsOrSelector?: - | ThrottlerOptions> + | AngularThrottlerOptions, TSelected> | ((state: ThrottlerState>) => TSelected), maybeSelector?: (state: ThrottlerState>) => TSelected, ): ThrottledSignal { @@ -101,8 +101,14 @@ export function injectThrottledValue( ? (initialValueOrOptions as TValue) : (undefined as unknown as TValue) const initialOptions = hasInitialValue - ? (initialOptionsOrSelector as ThrottlerOptions>) - : (initialValueOrOptions as ThrottlerOptions>) + ? (initialOptionsOrSelector as AngularThrottlerOptions< + Setter, + TSelected + >) + : (initialValueOrOptions as AngularThrottlerOptions< + Setter, + TSelected + >) const selector = hasInitialValue ? maybeSelector : (initialOptionsOrSelector as diff --git a/packages/angular-pacer/tests/queuer/injectQueuedValue.spec.ts b/packages/angular-pacer/tests/queuer/injectQueuedValue.spec.ts new file mode 100644 index 000000000..13e5c607c --- /dev/null +++ b/packages/angular-pacer/tests/queuer/injectQueuedValue.spec.ts @@ -0,0 +1,94 @@ +import { Component, input, signal } from '@angular/core' +import { TestBed } from '@angular/core/testing' +import { vi } from 'vitest' +import { injectQueuedValue } from '../../src/queuer/injectQueuedValue' + +beforeEach(() => { + vi.useFakeTimers() +}) + +afterEach(() => { + vi.useRealTimers() +}) + +describe('injectQueuedValue', () => { + describe('behaviour', () => { + it('returns a queued signal with addItem and queuer', () => { + const value = signal('initial') + const queued = TestBed.runInInjectionContext(() => + injectQueuedValue(value, { + wait: 0, + }), + ) + expect(typeof queued).toBe('function') + expect(queued.addItem).toBeDefined() + expect(queued.queuer).toBeDefined() + }) + + it('pushes source signal value into the queue when it changes', () => { + const value = signal('initial') + const queued = TestBed.runInInjectionContext(() => + injectQueuedValue(value, { + wait: 0, + }), + ) + TestBed.tick() + expect(queued()).toBe('initial') + value.set('second') + TestBed.tick() + expect(queued()).toBe('second') + }) + + it('waits for the wait time before processing the next item', () => { + const value = signal('initial') + const queued = TestBed.runInInjectionContext(() => + injectQueuedValue(value, { + wait: 1000, + }), + ) + TestBed.tick() + value.set('second') + TestBed.tick() + value.set('third') + TestBed.tick() + expect(queued()).toBe('initial') + vi.advanceTimersByTime(1000) + expect(queued()).toBe('second') + vi.advanceTimersByTime(1000) + expect(queued()).toBe('third') + }) + }) + + describe('with input signals', () => { + @Component({ + selector: 'pacer-test-child', + standalone: true, + template: '', + }) + class ChildComponent { + readonly value = input.required() + readonly queued = injectQueuedValue(this.value, { wait: 0 }) + } + + @Component({ + selector: 'pacer-test-host', + standalone: true, + imports: [ChildComponent], + template: '', + }) + class HostComponent {} + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HostComponent], + }).compileComponents() + }) + + it('does not throw when used with input.required() during component initialization', () => { + expect(() => { + const fixture = TestBed.createComponent(HostComponent) + fixture.detectChanges() + }).not.toThrow() + }) + }) +}) diff --git a/packages/angular-pacer/tests/test-setup.ts b/packages/angular-pacer/tests/test-setup.ts new file mode 100644 index 000000000..046722c7f --- /dev/null +++ b/packages/angular-pacer/tests/test-setup.ts @@ -0,0 +1,5 @@ +import '@angular/compiler' +import '@analogjs/vitest-angular/setup-snapshots' +import { setupTestBed } from '@analogjs/vitest-angular/setup-testbed' + +setupTestBed() diff --git a/packages/angular-pacer/tsconfig.base.json b/packages/angular-pacer/tsconfig.base.json new file mode 100644 index 000000000..4082f16a5 --- /dev/null +++ b/packages/angular-pacer/tsconfig.base.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.json" +} diff --git a/packages/angular-pacer/tsconfig.docs.json b/packages/angular-pacer/tsconfig.docs.json index 20ccb038c..a12189d95 100644 --- a/packages/angular-pacer/tsconfig.docs.json +++ b/packages/angular-pacer/tsconfig.docs.json @@ -1,8 +1,9 @@ { - "extends": "./tsconfig.json", + "extends": "./tsconfig.lib.json", "compilerOptions": { "paths": { - "@tanstack/pacer": ["../pacer/src"] + "@tanstack/pacer": ["../pacer/src"], + "@tanstack/pacer/*": ["../pacer/src/*"] } }, "include": ["src"] diff --git a/packages/angular-pacer/tsconfig.json b/packages/angular-pacer/tsconfig.json index 66baec5ea..b64539f8d 100644 --- a/packages/angular-pacer/tsconfig.json +++ b/packages/angular-pacer/tsconfig.json @@ -1,8 +1,7 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "preserve" - }, - "include": ["src", "vitest.config.ts", "tests"], - "exclude": ["eslint.config.js"] + "files": [], + "references": [ + { "path": "./tsconfig.lib.json" }, + { "path": "./tsconfig.spec.json" } + ] } diff --git a/packages/angular-pacer/tsconfig.lib.json b/packages/angular-pacer/tsconfig.lib.json new file mode 100644 index 000000000..19aa5520e --- /dev/null +++ b/packages/angular-pacer/tsconfig.lib.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.base.json", + "include": ["src", "vitest.config.ts"], + "exclude": ["eslint.config.js", "tests"] +} diff --git a/packages/angular-pacer/tsconfig.spec.json b/packages/angular-pacer/tsconfig.spec.json new file mode 100644 index 000000000..07715c859 --- /dev/null +++ b/packages/angular-pacer/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "noEmit": false, + "target": "ES2022", + "types": ["vitest/globals", "node"] + }, + "files": ["tests/test-setup.ts"], + "include": ["tests/**/*.spec.ts", "tests/**/*.d.ts"], + "references": [{ "path": "./tsconfig.lib.json" }] +} diff --git a/packages/angular-pacer/tsdown.config.ts b/packages/angular-pacer/tsdown.config.ts index 24dd8a5c6..bbd20035a 100644 --- a/packages/angular-pacer/tsdown.config.ts +++ b/packages/angular-pacer/tsdown.config.ts @@ -1,6 +1,7 @@ import { defineConfig } from 'tsdown' export default defineConfig({ + tsconfig: './tsconfig.lib.json', entry: [ './src/index.ts', './src/async-batcher/index.ts', diff --git a/packages/angular-pacer/vitest.config.ts b/packages/angular-pacer/vitest.config.ts index 514aa720b..3d33b308a 100644 --- a/packages/angular-pacer/vitest.config.ts +++ b/packages/angular-pacer/vitest.config.ts @@ -1,12 +1,15 @@ import { defineConfig } from 'vitest/config' +import angular from '@analogjs/vite-plugin-angular' import packageJson from './package.json' with { type: 'json' } export default defineConfig({ + plugins: [angular()], test: { name: packageJson.name, dir: './tests', watch: false, - environment: 'happy-dom', + environment: 'jsdom', globals: true, + setupFiles: ['./tests/test-setup.ts'], }, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97cef0aae..b3812ee94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4328,12 +4328,24 @@ importers: specifier: workspace:* version: link:../pacer devDependencies: + '@analogjs/vite-plugin-angular': + specifier: ^2.6.0 + version: 2.6.0(@angular/build@21.2.13(@angular/compiler-cli@21.2.15(@angular/compiler@21.2.15)(typescript@6.0.3))(@angular/compiler@21.2.15)(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2))(@angular/platform-browser@21.2.15(@angular/common@21.2.15(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(chokidar@5.0.0)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.15)(tslib@2.8.1)(typescript@6.0.3)(vitest@4.1.7(@types/node@25.7.0)(happy-dom@20.9.0)(jsdom@29.1.1)(vite@8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0)))(yaml@2.9.0))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0)) + '@analogjs/vitest-angular': + specifier: ^2.6.0 + version: 2.6.0(688197b90c183dc7305df80ff2aff7c1) + '@angular/compiler': + specifier: ^21.2.12 + version: 21.2.15 '@angular/core': specifier: ^21.2.12 version: 21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2) '@types/node': specifier: ^25.7.0 version: 25.7.0 + jsdom: + specifier: ^29.1.1 + version: 29.1.1 packages/pacer: dependencies: @@ -4599,6 +4611,32 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@analogjs/vite-plugin-angular@2.6.0': + resolution: {integrity: sha512-fPo2RgkJxLijIe9o+VSrUmfzZDEXVqXX5a86vpj/cAuuY62Of02g6G6QrqHtIkDFSUdEK8cbY/8zAiZlXW0/Hw==} + peerDependencies: + '@angular-devkit/build-angular': ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 + '@angular/build': ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@angular-devkit/build-angular': + optional: true + '@angular/build': + optional: true + vite: + optional: true + + '@analogjs/vitest-angular@2.6.0': + resolution: {integrity: sha512-vf3ZhUU3fzdCm+IXLj+ySFzCw+p7T4pXGegC6puow406fpnSpTt7L5AIrNUsSAsMWJRZh7bCzIxTNPdfQykSJw==} + peerDependencies: + '@analogjs/vite-plugin-angular': '*' + '@angular-devkit/architect': '>=0.1700.0 < 0.2300.0 || >=0.2200.0 < 0.2300.0' + '@angular-devkit/schematics': '>=17.0.0' + vitest: ^1.3.1 || ^2.0.0 || ^3.0.0 || ^4.0.0 + zone.js: '>=0.14.0' + peerDependenciesMeta: + zone.js: + optional: true + '@angular-devkit/architect@0.2102.13': resolution: {integrity: sha512-fheyi0gPx6b7tT+WQ+ePlzdGqKjPLUK72wg5Z9pkVtQ5+VN/8yB9mlRlmoivngd2FeNG9wMeNynWZGYycnOWVw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -6123,48 +6161,97 @@ packages: cpu: [x64] os: [win32] + '@oxc-parser/binding-android-arm-eabi@0.121.0': + resolution: {integrity: sha512-n07FQcySwOlzap424/PLMtOkbS7xOu8nsJduKL8P3COGHKgKoDYXwoAHCbChfgFpHnviehrLWIPX0lKGtbEk/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@oxc-parser/binding-android-arm-eabi@0.133.0': resolution: {integrity: sha512-l/44caGse+VpnY9gx0yvvc5QnnG3yG1FO3KZgYvNL1GZrfK86zIwAOgGEVlxDyRymzrU/KHiblPFpevKOmJmUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] + '@oxc-parser/binding-android-arm64@0.121.0': + resolution: {integrity: sha512-/Dd1xIXboYAicw+twT2utxPD7bL8qh7d3ej0qvaYIMj3/EgIrGR+tSnjCUkiCT6g6uTC0neSS4JY8LxhdSU/sA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@oxc-parser/binding-android-arm64@0.133.0': resolution: {integrity: sha512-KUHmPMziLBp4u+zbrLdB7iWS7KshuZe+RAp7ELnY9SI9nNXBZ+dp8fiBqWOxhXqn+FQg3a4UcQhwmsJOKV8Jjg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@oxc-parser/binding-darwin-arm64@0.121.0': + resolution: {integrity: sha512-A0jNEvv7QMtCO1yk205t3DWU9sWUjQ2KNF0hSVO5W9R9r/R1BIvzG01UQAfmtC0dQm7sCrs5puixurKSfr2bRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@oxc-parser/binding-darwin-arm64@0.133.0': resolution: {integrity: sha512-q8dWmnU/8ea2tga9w2f1PinQ5rcMPDUGkF64T189b65YMjUomET4oy5oRldOr4AwOQkneOG/Zttnz1Dvrc62wg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@oxc-parser/binding-darwin-x64@0.121.0': + resolution: {integrity: sha512-SsHzipdxTKUs3I9EOAPmnIimEeJOemqRlRDOp9LIj+96wtxZejF51gNibmoGq8KoqbT1ssAI5po/E3J+vEtXGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@oxc-parser/binding-darwin-x64@0.133.0': resolution: {integrity: sha512-cOKeIELIB2bJnCKwqx4Rdj+1Lss/U6uCbLxRySZrhyOOQa1flKhwZFjEHRHxk8fU1NKmhK5OnTdPQ4CpjuFuVw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@oxc-parser/binding-freebsd-x64@0.121.0': + resolution: {integrity: sha512-v1APOTkCp+RWOIDAHRoaeW/UoaHF15a60E8eUL6kUQXh+i4K7PBwq2Wi7jm8p0ymID5/m/oC1w3W31Z/+r7HQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@oxc-parser/binding-freebsd-x64@0.133.0': resolution: {integrity: sha512-OpaSv4pW3KgFrMYQxTaS0aOE4T1DQF3qZE/4B6uqqv1KgPWWd4UQhJALi8PJPX1RRV5K7ThKXRfF7qGg2+3l1A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': + resolution: {integrity: sha512-PmqPQuqHZyFVWA4ycr0eu4VnTMmq9laOHZd+8R359w6kzuNZPvmmunmNJ8ybkm769A0nCoVp3TJ6dUz7B3FYIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm-gnueabihf@0.133.0': resolution: {integrity: sha512-JGK1wlGrGwxBIlVSF7KWTX1/ru6BEtf28fRROztDRkLfiW+Kxa4onnriezMIiogfn9hVw2KzYcKiLjkLR2ns8A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': + resolution: {integrity: sha512-vF24htj+MOH+Q7y9A8NuC6pUZu8t/C2Fr/kDOi2OcNf28oogr2xadBPXAbml802E8wRAVfbta6YLDQTearz+jw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.133.0': resolution: {integrity: sha512-yuZO533Ftonxn/iyoqQzURzLQHMspvsIyfiCSNi1t/ER4eIQaR0SsmUOUm5b/lmSig7IWIUa5/BrbEkAPwcilQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm64-gnu@0.121.0': + resolution: {integrity: sha512-wjH8cIG2Lu/3d64iZpbYr73hREMgKAfu7fqpXjgM2S16y2zhTfDIp8EQjxO8vlDtKP5Rc7waZW72lh8nZtWrpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-arm64-gnu@0.133.0': resolution: {integrity: sha512-hvpbqT5pN2rR+3+xtWeizwfR/aZ0vGceg6TqYMl+ToxMpk9/tmnX7kSvQnfEUkoua8mhogzvIKsAkn0wxgblBA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6172,6 +6259,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-arm64-musl@0.121.0': + resolution: {integrity: sha512-qT663J/W8yQFw3dtscbEi9LKJevr20V7uWs2MPGTnvNZ3rm8anhhE16gXGpxDOHeg9raySaSHKhd4IGa3YZvuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-arm64-musl@0.133.0': resolution: {integrity: sha512-wJQGamIosQBoJHW9+S5XxrtKRo3eyJxsnS1XCPrqN0LHi8uw1pTqqTfn3t/NVuvbBg7Pumn4ez9Eidgcn0xbEg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6179,6 +6273,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': + resolution: {integrity: sha512-mYNe4NhVvDBbPkAP8JaVS8lC1dsoJZWH5WCjpw5E+sjhk1R08wt3NnXYUzum7tIiWPfgQxbCMcoxgeemFASbRw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-ppc64-gnu@0.133.0': resolution: {integrity: sha512-Koaz32/O5+abIfrNGdyndgRvdOZ9jEf5/z3Ep9h3h2QWpdDiUQpVwgH0OcMXCs+l9aXxPLtkupqyVig9W6FDKw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6186,6 +6287,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': + resolution: {integrity: sha512-+QiFoGxhAbaI/amqX567784cDyyuZIpinBrJNxUzb+/L2aBRX67mN6Jv40pqduHf15yYByI+K5gUEygCuv0z9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.133.0': resolution: {integrity: sha512-R4vOjWzxhnNWHnVLeiB6jNuIifdy9vcMXZGPc7StXcxBovI+U2zg1QhZ9o8OjV80oGivs1lX5NfPLzk4IPqlRA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6193,6 +6301,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-musl@0.121.0': + resolution: {integrity: sha512-9ykEgyTa5JD/Uhv2sttbKnCfl2PieUfOjyxJC/oDL2UO0qtXOtjPLl7H8Kaj5G7p3hIvFgu3YWvAxvE0sqY+hQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-riscv64-musl@0.133.0': resolution: {integrity: sha512-iwgBNUTHiMdxARLYuM0SBlnYeb19iw1Ea5M+4ERZupCsBMLArti6FyZ6UfFjJxIiTDr2oW2DGQFxlQVQ/dW9rA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6200,6 +6315,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-s390x-gnu@0.121.0': + resolution: {integrity: sha512-DB1EW5VHZdc1lIRjOI3bW/wV6R6y0xlfvdVrqj6kKi7Ayu2U3UqUBdq9KviVkcUGd5Oq+dROqvUEEFRXGAM7EQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-s390x-gnu@0.133.0': resolution: {integrity: sha512-ZwZNo8FZmB/gVfboQl+wXilBigGl+6nQQs+nITOeAP/HcAOjiHl6XZJL9F/KXNEspODQcbjAiyjUbeCJd9a0fA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6207,6 +6329,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.121.0': + resolution: {integrity: sha512-s4lfobX9p4kPTclvMiH3gcQUd88VlnkMTF6n2MTMDAyX5FPNRhhRSFZK05Ykhf8Zy5NibV4PbGR6DnK7FGNN6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.133.0': resolution: {integrity: sha512-govCvWx1dBlED3uu4qXctxpRcouu9I8Kn+DBktGCl760JtlGJzc9l/OmPJKlYWSbrRqKkMZehNeZ/4Wfma7uSA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6214,6 +6343,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-x64-musl@0.121.0': + resolution: {integrity: sha512-P9KlyTpuBuMi3NRGpJO8MicuGZfOoqZVRP1WjOecwx8yk4L/+mrCRNc5egSi0byhuReblBF2oVoDSMgV9Bj4Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-x64-musl@0.133.0': resolution: {integrity: sha512-ssTlpXD5Mq9uCssDJPzlRWqBt4Y7Zzd9i+XZhWmK/9Y6KUIuAxVYTYiI8lxcGWi0+3/Cz4A8q9UrD4NK9Y2j7g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6221,29 +6357,58 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-openharmony-arm64@0.121.0': + resolution: {integrity: sha512-R+4jrWOfF2OAPPhj3Eb3U5CaKNAH9/btMveMULIrcNW/hjfysFQlF8wE0GaVBr81dWz8JLgQlsxwctoL78JwXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@oxc-parser/binding-openharmony-arm64@0.133.0': resolution: {integrity: sha512-51aByfXhPtLEdWG4a2Ihdw6cPWV1ei1AarALpFdDP8MLWDLE2NuUMgbo3DERR2Kt8fT/ok1GUvBiLxVGke9uUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@oxc-parser/binding-wasm32-wasi@0.121.0': + resolution: {integrity: sha512-5TFISkPTymKvsmIlKasPVTPuWxzCcrT8pM+p77+mtQbIZDd1UC8zww4CJcRI46kolmgrEX6QpKO8AvWMVZ+ifw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@oxc-parser/binding-wasm32-wasi@0.133.0': resolution: {integrity: sha512-2e16tkKp+wDO2GTAmXfxbBcCmGEaFPIJEIRBBmVKNVXSc8/fJsSIaBGyFTPHM9ST5GNWgJcYIt94rDTks+PLwA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@oxc-parser/binding-win32-arm64-msvc@0.121.0': + resolution: {integrity: sha512-V0pxh4mql4XTt3aiEtRNUeBAUFOw5jzZNxPABLaOKAWrVzSr9+XUaB095lY7jqMf5t8vkfh8NManGB28zanYKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@oxc-parser/binding-win32-arm64-msvc@0.133.0': resolution: {integrity: sha512-KPTNDKbxH1cglrqTyVeXHb4Pk4oksz8EcE1/v8zqU7N4UXbiHfA/IwtXZ2U77fnRAWBbgVkl/lZbL7o3hRdejg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.121.0': + resolution: {integrity: sha512-4Ob1qvYMPnlF2N9rdmKdkQFdrq16QVcQwBsO8yiPZXof0fHKFF+LmQV501XFbi7lHyrKm8rlJRfQ/M8bZZPVLw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.133.0': resolution: {integrity: sha512-Una1bNYv9zCavQrfnDR9wuZVB3itLjCEH4Oz7i6CwAJN/Xq9b+zbbcxmvdkKvvJt4Ngc/MBmIYlbLo3zS4TQ0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.121.0': + resolution: {integrity: sha512-BOp1KCzdboB1tPqoCPXgntgFs0jjeSyOXHzgxVFR7B/qfr3F8r4YDacHkTOUNXtDgM8YwKnkf3rE5gwALYX7NA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.133.0': resolution: {integrity: sha512-kjBhCiOGSYTwDJQuuZa7a94JbP8htWu7J0X1KwH74kV2K5eYf6eyJRYmkpCDvr0XEL8tMxYI4WU1VekblFCLgg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6253,6 +6418,9 @@ packages: '@oxc-project/types@0.113.0': resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} + '@oxc-project/types@0.121.0': + resolution: {integrity: sha512-CGtOARQb9tyv7ECgdAlFxi0Fv7lmzvmlm2rpD/RdijOO9rfk/JvB1CjT8EnoD+tjna/IYgKKw3IV7objRb+aYw==} + '@oxc-project/types@0.132.0': resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} @@ -7169,6 +7337,9 @@ packages: peerDependencies: preact: '>=10 || ^10.0.0-alpha.0 || ^10.0.0-beta.0' + '@ts-morph/common@0.22.0': + resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} + '@tufjs/canonical-json@2.0.0': resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -7817,6 +7988,9 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -9142,6 +9316,11 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -9331,6 +9510,10 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + oxc-parser@0.121.0: + resolution: {integrity: sha512-ek9o58+SCv6AV7nchiAcUJy1DNE2CC5WRdBcO0mF+W4oRjNQfPO7b3pLjTHSFECpHkKGOZSQxx3hk8viIL5YCg==} + engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.133.0: resolution: {integrity: sha512-661RSx+ZcjBmjBYid+Fpp/2F5EbtildpeoZh5HdgnGs+jZ03nqQEQW8yGkt4BGyOC3OMPDQQRl8M5kqD2/g6jw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -9403,6 +9586,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -10069,6 +10255,9 @@ packages: peerDependencies: typescript: '>=4.0.0' + ts-morph@21.0.1: + resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} + ts-pattern@5.9.0: resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} @@ -10691,6 +10880,27 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + '@analogjs/vite-plugin-angular@2.6.0(@angular/build@21.2.13(@angular/compiler-cli@21.2.15(@angular/compiler@21.2.15)(typescript@6.0.3))(@angular/compiler@21.2.15)(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2))(@angular/platform-browser@21.2.15(@angular/common@21.2.15(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(chokidar@5.0.0)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.15)(tslib@2.8.1)(typescript@6.0.3)(vitest@4.1.7(@types/node@25.7.0)(happy-dom@20.9.0)(jsdom@29.1.1)(vite@8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0)))(yaml@2.9.0))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0))': + dependencies: + magic-string: 0.30.21 + obug: 2.1.1 + oxc-parser: 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + tinyglobby: 0.2.17 + ts-morph: 21.0.1 + optionalDependencies: + '@angular/build': 21.2.13(@angular/compiler-cli@21.2.15(@angular/compiler@21.2.15)(typescript@6.0.3))(@angular/compiler@21.2.15)(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2))(@angular/platform-browser@21.2.15(@angular/common@21.2.15(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(chokidar@5.0.0)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.15)(tslib@2.8.1)(typescript@6.0.3)(vitest@4.1.7(@types/node@25.7.0)(happy-dom@20.9.0)(jsdom@29.1.1)(vite@8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0)))(yaml@2.9.0) + vite: 8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + '@analogjs/vitest-angular@2.6.0(688197b90c183dc7305df80ff2aff7c1)': + dependencies: + '@analogjs/vite-plugin-angular': 2.6.0(@angular/build@21.2.13(@angular/compiler-cli@21.2.15(@angular/compiler@21.2.15)(typescript@6.0.3))(@angular/compiler@21.2.15)(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2))(@angular/platform-browser@21.2.15(@angular/common@21.2.15(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.15(@angular/compiler@21.2.15)(rxjs@7.8.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(chokidar@5.0.0)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.15)(tslib@2.8.1)(typescript@6.0.3)(vitest@4.1.7(@types/node@25.7.0)(happy-dom@20.9.0)(jsdom@29.1.1)(vite@8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0)))(yaml@2.9.0))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0)) + '@angular-devkit/architect': 0.2102.13(chokidar@5.0.0) + '@angular-devkit/schematics': 21.2.13(chokidar@5.0.0) + vitest: 4.1.7(@types/node@25.7.0)(happy-dom@20.9.0)(jsdom@29.1.1)(vite@8.0.16(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.97.3)(yaml@2.9.0)) + '@angular-devkit/architect@0.2102.13(chokidar@5.0.0)': dependencies: '@angular-devkit/core': 21.2.13(chokidar@5.0.0) @@ -12139,54 +12349,110 @@ snapshots: '@nx/nx-win32-x64-msvc@22.7.5': optional: true + '@oxc-parser/binding-android-arm-eabi@0.121.0': + optional: true + '@oxc-parser/binding-android-arm-eabi@0.133.0': optional: true + '@oxc-parser/binding-android-arm64@0.121.0': + optional: true + '@oxc-parser/binding-android-arm64@0.133.0': optional: true + '@oxc-parser/binding-darwin-arm64@0.121.0': + optional: true + '@oxc-parser/binding-darwin-arm64@0.133.0': optional: true + '@oxc-parser/binding-darwin-x64@0.121.0': + optional: true + '@oxc-parser/binding-darwin-x64@0.133.0': optional: true + '@oxc-parser/binding-freebsd-x64@0.121.0': + optional: true + '@oxc-parser/binding-freebsd-x64@0.133.0': optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': + optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.133.0': optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': + optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.133.0': optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.121.0': + optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-arm64-musl@0.121.0': + optional: true + '@oxc-parser/binding-linux-arm64-musl@0.133.0': optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': + optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': + optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.121.0': + optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.133.0': optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.121.0': + optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-x64-gnu@0.121.0': + optional: true + '@oxc-parser/binding-linux-x64-gnu@0.133.0': optional: true + '@oxc-parser/binding-linux-x64-musl@0.121.0': + optional: true + '@oxc-parser/binding-linux-x64-musl@0.133.0': optional: true + '@oxc-parser/binding-openharmony-arm64@0.121.0': + optional: true + '@oxc-parser/binding-openharmony-arm64@0.133.0': optional: true + '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + '@oxc-parser/binding-wasm32-wasi@0.133.0': dependencies: '@emnapi/core': 1.10.0 @@ -12194,17 +12460,28 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.121.0': + optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.133.0': optional: true + '@oxc-parser/binding-win32-ia32-msvc@0.121.0': + optional: true + '@oxc-parser/binding-win32-ia32-msvc@0.133.0': optional: true + '@oxc-parser/binding-win32-x64-msvc@0.121.0': + optional: true + '@oxc-parser/binding-win32-x64-msvc@0.133.0': optional: true '@oxc-project/types@0.113.0': {} + '@oxc-project/types@0.121.0': {} + '@oxc-project/types@0.132.0': {} '@oxc-project/types@0.133.0': {} @@ -12951,6 +13228,13 @@ snapshots: '@testing-library/dom': 8.20.1 preact: 10.29.2 + '@ts-morph/common@0.22.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 9.0.9 + mkdirp: 3.0.1 + path-browserify: 1.0.1 + '@tufjs/canonical-json@2.0.0': {} '@tufjs/models@4.1.0': @@ -13642,6 +13926,8 @@ snapshots: clsx@2.1.1: {} + code-block-writer@12.0.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -15102,6 +15388,8 @@ snapshots: dependencies: minipass: 7.1.3 + mkdirp@3.0.1: {} + mri@1.2.0: {} mrmime@2.0.1: {} @@ -15438,6 +15726,34 @@ snapshots: outdent@0.5.0: {} + oxc-parser@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + dependencies: + '@oxc-project/types': 0.121.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.121.0 + '@oxc-parser/binding-android-arm64': 0.121.0 + '@oxc-parser/binding-darwin-arm64': 0.121.0 + '@oxc-parser/binding-darwin-x64': 0.121.0 + '@oxc-parser/binding-freebsd-x64': 0.121.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.121.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.121.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.121.0 + '@oxc-parser/binding-linux-arm64-musl': 0.121.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.121.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.121.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.121.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.121.0 + '@oxc-parser/binding-linux-x64-gnu': 0.121.0 + '@oxc-parser/binding-linux-x64-musl': 0.121.0 + '@oxc-parser/binding-openharmony-arm64': 0.121.0 + '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 + '@oxc-parser/binding-win32-x64-msvc': 0.121.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + oxc-parser@0.133.0: dependencies: '@oxc-project/types': 0.133.0 @@ -15568,6 +15884,8 @@ snapshots: parseurl@1.3.3: {} + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -16293,6 +16611,11 @@ snapshots: picomatch: 4.0.4 typescript: 6.0.3 + ts-morph@21.0.1: + dependencies: + '@ts-morph/common': 0.22.0 + code-block-writer: 12.0.0 + ts-pattern@5.9.0: {} tsconfig-paths@4.2.0: