diff --git a/.eslintrc.json b/.eslintrc.json index bb7b62d65a..d8d1c9e864 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -68,7 +68,14 @@ "@typescript-eslint/no-explicit-any": "warn", "prefer-rest-params": "warn", "no-prototype-builtins": "warn", - "no-empty": "warn" + "no-empty": "warn", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "typeParameter", + "format": ["PascalCase"] + } + ] } }, { diff --git a/.husky/pre-commit b/.husky/pre-commit index 36af219892..3723623171 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged +yarn lint-staged diff --git a/apps/demos/src/app/app-component/app-component.module.ts b/apps/demos/src/app/app-component/app-component.module.ts deleted file mode 100644 index 2c70e22fb5..0000000000 --- a/apps/demos/src/app/app-component/app-component.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; - -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; -import { AppShellModule } from '../app-shell'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatLegacyListModule as MatListModule } from '@angular/material/legacy-list'; -import { MatIconModule } from '@angular/material/icon'; -import { RouterModule } from '@angular/router'; -import { ROUTES } from './app.routes'; -import { DirtyChecksModule } from '../shared/debug-helper/dirty-checks'; -import { AppControlPanelModule } from './app-control-panel/'; - -@NgModule({ - imports: [ - BrowserModule, - BrowserAnimationsModule, - RouterModule, - MatSidenavModule, - MatToolbarModule, - MatListModule, - MatIconModule, - AppShellModule, - RouterModule.forRoot(ROUTES, {}), - DirtyChecksModule, - AppControlPanelModule, - ], - declarations: [AppComponent], - exports: [], - bootstrap: [AppComponent], -}) -export class AppComponentModule {} diff --git a/apps/demos/src/app/app-component/app.component.ts b/apps/demos/src/app/app-component/app.component.ts index 569c0c148d..e5fffe18e4 100644 --- a/apps/demos/src/app/app-component/app.component.ts +++ b/apps/demos/src/app/app-component/app.component.ts @@ -1,7 +1,8 @@ import { AfterViewInit, Component } from '@angular/core'; +import { AppShellModule } from '../app-shell/index'; import { AppPresenter } from './app-presenter.service'; import { MENU_ITEMS } from './app.menu'; -import { NavigationEnd, Router } from '@angular/router'; +import { NavigationEnd, Router, RouterOutlet } from '@angular/router'; import { filter, take, tap } from 'rxjs/operators'; @Component({ @@ -9,18 +10,23 @@ import { filter, take, tap } from 'rxjs/operators'; templateUrl: './app.component.html', styleUrls: ['./app.component.scss'], providers: [AppPresenter], + standalone: true, + imports: [AppShellModule, RouterOutlet], }) export class AppComponent implements AfterViewInit { menuItems = MENU_ITEMS; - constructor(public vm: AppPresenter, router: Router) { + constructor( + public vm: AppPresenter, + router: Router, + ) { performance.mark('startRouting'); router.events .pipe( filter((e) => e instanceof NavigationEnd), tap(() => console.log('endRouting')), tap(() => performance.mark('endRouting')), - take(1) + take(1), ) .subscribe(); } @@ -43,21 +49,21 @@ export class AppComponent implements AfterViewInit { `${ Math.round(performance.timing.domContentLoadedEventEnd) - Math.round(performance.timeOrigin) - }ms` + }ms`, ); console.log( 'domComplete :' + `${ Math.round(performance.timing.domComplete) - Math.round(performance.timeOrigin) - }ms` + }ms`, ); console.log( 'loadEventEnd :' + `${ Math.round(performance.timing.loadEventEnd) - Math.round(performance.timeOrigin) - }ms` + }ms`, ); } else { console.log("Performance timing isn't supported."); diff --git a/apps/demos/src/app/app-component/index.ts b/apps/demos/src/app/app-component/index.ts index 1fbeca3a2d..11dd5936d1 100644 --- a/apps/demos/src/app/app-component/index.ts +++ b/apps/demos/src/app/app-component/index.ts @@ -1,2 +1 @@ -export {AppComponent} from './app.component'; -export {AppComponentModule} from './app-component.module'; +export { AppComponent } from './app.component'; diff --git a/apps/demos/src/app/app.module.ts b/apps/demos/src/app/app.module.ts deleted file mode 100644 index f495117459..0000000000 --- a/apps/demos/src/app/app.module.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { NgModule } from '@angular/core'; - -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { AppComponent, AppComponentModule } from './app-component'; -import { ENVIRONMENT_SETTINGS } from './shared/environment.token'; -import { environment } from '../environments/environment'; -import { HttpClientModule } from '@angular/common/http'; -import { HomeComponent } from './features/home/home.component'; -import { RX_RENDER_STRATEGIES_CONFIG } from '../../../../libs/cdk/render-strategies/src/lib/config'; - -@NgModule({ - imports: [ - BrowserModule, - BrowserAnimationsModule, - HttpClientModule, - AppComponentModule - ], - providers: [ - { - provide: ENVIRONMENT_SETTINGS, - useValue: environment, - }, - { - provide: RX_RENDER_STRATEGIES_CONFIG, - useValue: { - primaryStrategy: 'normal', - patchZone: true - } - } - ], - declarations: [HomeComponent], - exports: [], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/apps/demos/src/app/features/concepts/projected-views/projected-views.component.ts b/apps/demos/src/app/features/concepts/projected-views/projected-views.component.ts index 9e1aeda535..efd44c661f 100644 --- a/apps/demos/src/app/features/concepts/projected-views/projected-views.component.ts +++ b/apps/demos/src/app/features/concepts/projected-views/projected-views.component.ts @@ -1,13 +1,16 @@ import { ChangeDetectionStrategy, Component, + effect, + viewChild, ViewChild, + viewChildren, ViewChildren, } from '@angular/core'; import { combineLatest, Subject } from 'rxjs'; import { ContentChildComponent } from './content-child.component'; import { ViewChildComponent } from './view-child.component'; -import { RxActionFactory } from '@rx-angular/state/actions'; +import { RxActionFactory, rxActions } from '@rx-angular/state/actions'; @Component({ selector: 'rxa-projected-views', @@ -27,14 +30,7 @@ import { RxActionFactory } from '@rx-angular/state/actions'; test1
-
+
renderCallback: {{ renderCbVal }}
@@ -62,32 +57,39 @@ import { RxActionFactory } from '@rx-angular/state/actions'; `, changeDetection: ChangeDetectionStrategy.OnPush, - providers: [RxActionFactory], }) export class ProjectedViewsComponent { - @ViewChildren('test') set test(t) { + @ViewChildren('test') set testDif(t) { console.log('ViewChild in ProjectedViewsComponent of type div', t); + // this thing will never fire } - @ViewChild(ViewChildComponent) - set vcVc(v) { - console.log( - 'ViewChild in ProjectedViewsComponent of type ViewChildComponent: ', - v - ); - } + test = viewChildren('test'); + viewChildComponent = viewChild(ViewChildComponent); + contentChildComponent = viewChild(ContentChildComponent); - @ViewChild(ContentChildComponent) - set vcCc(v) { - console.log( - 'ViewChild in ProjectedViewsComponent of type ContentChildComponent: ', - v - ); + constructor() { + effect(() => { + console.log( + 'ViewChild in ProjectedViewsComponent of type ContentChildComponent: ', + this.contentChildComponent(), + ); + }); + effect(() => { + console.log( + 'ViewChild in ProjectedViewsComponent of type ViewChildComponent: ', + this.viewChildComponent(), + ); + }); + effect(() => { + console.log( + 'ViewChild in ProjectedViewsComponent of type div: ', + this.test(), + ); + }); } - constructor(private actions: RxActionFactory<{ trigger: number }>) {} - - ui = this.actions.create(); + ui = rxActions<{ trigger: number }>(); renderCallback$ = new Subject(); triggerArr$ = combineLatest([this.ui.trigger$]); diff --git a/apps/demos/src/app/features/template/rx-let/let-template-binding/examples/let-template-binding-signal-example.component.ts b/apps/demos/src/app/features/template/rx-let/let-template-binding/examples/let-template-binding-signal-example.component.ts new file mode 100644 index 0000000000..e252efee1c --- /dev/null +++ b/apps/demos/src/app/features/template/rx-let/let-template-binding/examples/let-template-binding-signal-example.component.ts @@ -0,0 +1,144 @@ +import { + Component, + computed, + effect, + inject, + Injector, + signal, + untracked, +} from '@angular/core'; +import { Subject } from 'rxjs'; +import { toSignal } from '@angular/core/rxjs-interop'; + +@Component({ + selector: 'rxa-let-template-binding-signal-example', + template: ` + + +

Signal

+ +
+ + +
+ value emitted +

{{ count | json }}

+
+
+ + + + + +
+ + +
+ thumb_up +

Completed!

+ Last valid value: {{ value }} +
+
+ +
+ thumb_down +

{{ error }}

+ Last valid value: {{ value }} +
+
+ + + + `, + styles: [ + ` + h1 { + margin: 0; + } + + mat-card-content { + min-height: 10rem; + display: flex; + justify-content: center; + align-items: center; + } + + .notification-icon { + font-size: 5rem; + height: initial; + width: initial; + } + + .btn-reset { + margin-left: 2rem; + } + + .card { + margin: 2rem; + text-align: center; + width: 20rem; + } + + .complete-icon { + color: forestgreen; + } + + .error-icon { + color: darkred; + } + `, + ], +}) +export class LetTemplateBindingSignalExampleComponent { + errorStub = new Error('Template observable error!'); + visibleStrategy = 'local'; + + private injector = inject(Injector); + + value = signal(undefined); + + valueCount = signal(0); + + constructor() { + // this.reset(); + // effect(() => { + // this.value(); + // untracked(() => { + // this.valueCount.update((v) => v + 1); + // }) + // }); + } + + random() { + return Math.random(); + } + + reset() { + this.value = signal(undefined); + } + + setError() { + const sub = new Subject(); + const lastValue = this.value(); + // @ts-ignore + this.value = toSignal(sub, { injector: this.injector }); + + setTimeout(() => sub.next(lastValue), 1); + setTimeout(() => sub.error('Best Error!'), 2); + } +} diff --git a/apps/demos/src/app/features/template/rx-let/let-template-binding/let-template-binding.component.ts b/apps/demos/src/app/features/template/rx-let/let-template-binding/let-template-binding.component.ts index 92b7462464..44ae1663d4 100644 --- a/apps/demos/src/app/features/template/rx-let/let-template-binding/let-template-binding.component.ts +++ b/apps/demos/src/app/features/template/rx-let/let-template-binding/let-template-binding.component.ts @@ -3,8 +3,9 @@ import { Component } from '@angular/core'; @Component({ selector: 'rxa-let-template-binding', template: ` - - + + + `, }) export class LetTemplateBindingComponent {} diff --git a/apps/demos/src/app/features/template/rx-let/let-template-binding/let-template-binding.module.ts b/apps/demos/src/app/features/template/rx-let/let-template-binding/let-template-binding.module.ts index 7fa001907f..8773a13ab6 100644 --- a/apps/demos/src/app/features/template/rx-let/let-template-binding/let-template-binding.module.ts +++ b/apps/demos/src/app/features/template/rx-let/let-template-binding/let-template-binding.module.ts @@ -14,12 +14,14 @@ import { RxLet } from '@rx-angular/template/let'; import { RxUnpatch } from '@rx-angular/template/unpatch'; import { MatBadgeModule } from '@angular/material/badge'; import { ToStringPipe } from './to-string.pipe'; +import { LetTemplateBindingSignalExampleComponent } from './examples/let-template-binding-signal-example.component'; const DECLARATIONS = [ ToStringPipe, LetTemplateBindingComponent, LetTemplateBindingHttpExampleComponent, LetTemplateBindingSubjectExampleComponent, + LetTemplateBindingSignalExampleComponent, ]; @NgModule({ diff --git a/apps/demos/src/app/features/template/rx-let/rx-let.routes.ts b/apps/demos/src/app/features/template/rx-let/rx-let.routes.ts index 1a64a9ae57..8560b2d2b2 100644 --- a/apps/demos/src/app/features/template/rx-let/rx-let.routes.ts +++ b/apps/demos/src/app/features/template/rx-let/rx-let.routes.ts @@ -4,6 +4,7 @@ export const ROUTES: Routes = [ { path: '', redirectTo: 'basic', + pathMatch: 'full', }, { path: 'basic', @@ -14,21 +15,21 @@ export const ROUTES: Routes = [ path: 'scoping', loadChildren: () => import('./scoping/rx-let-scoping.module').then( - (m) => m.RxLetScopingModule + (m) => m.RxLetScopingModule, ), }, { path: 'error-handling', loadChildren: () => import('./error-handling/error-handing.module').then( - (m) => m.ErrorHandingModule + (m) => m.ErrorHandingModule, ), }, { path: 'exception-handling', loadChildren: () => import('./exception-handling/rx-let-exception-handling.module').then( - (m) => m.RxLetExceptionHandlingModule + (m) => m.RxLetExceptionHandlingModule, ), }, { @@ -40,14 +41,14 @@ export const ROUTES: Routes = [ path: 'template-bindings', loadChildren: () => import('./let-template-binding/let-template-binding.module').then( - (m) => m.LetTemplateBindingModule + (m) => m.LetTemplateBindingModule, ), }, { path: 'template-triggers', loadChildren: () => import('./template-triggers/template-triggers.module').then( - (m) => m.TemplateTriggersModule + (m) => m.TemplateTriggersModule, ), }, { @@ -59,14 +60,14 @@ export const ROUTES: Routes = [ path: 'preloading-images', loadChildren: () => import('./preloading-images/preloading-images.module').then( - (m) => m.PreloadingImagesModule + (m) => m.PreloadingImagesModule, ), }, { path: 'lazy-components', loadChildren: () => import('./lazy-loading-components/lazy-loading-components.module').then( - (m) => m.LazyLoadingComponentsModule + (m) => m.LazyLoadingComponentsModule, ), }, ]; diff --git a/apps/demos/src/main.ts b/apps/demos/src/main.ts index ac690fed7c..b14dfc5609 100644 --- a/apps/demos/src/main.ts +++ b/apps/demos/src/main.ts @@ -1,18 +1,27 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { provideHttpClient } from '@angular/common/http'; +import { ɵprovideZonelessChangeDetection } from '@angular/core'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { provideRouter } from '@angular/router'; +import { ROUTES } from './app/app-component/app.routes'; +import { AppComponent } from './app/app-component/index'; -import { AppModule } from './app/app.module'; +import { ENVIRONMENT_SETTINGS } from './app/shared/environment.token'; import { environment } from './environments/environment'; import { promiseMarkerFactory } from './app/shared/utils/measure'; -// if (environment.production) { - enableProdMode(); -// } - -const compilerOptions = environment.zoneless - ? ({ ngZone: 'noop' } as any) - : undefined; const mP = promiseMarkerFactory('Bootstrap'); mP.wrap( - platformBrowserDynamic().bootstrapModule(AppModule) + bootstrapApplication(AppComponent, { + providers: [ + provideHttpClient(), + provideAnimations(), + { + provide: ENVIRONMENT_SETTINGS, + useValue: environment, + }, + ɵprovideZonelessChangeDetection(), + provideRouter(ROUTES), + ], + }), ).catch((err) => console.error(err)); diff --git a/apps/demos/src/polyfills.ts b/apps/demos/src/polyfills.ts index 647d3ffa1c..85663655b3 100644 --- a/apps/demos/src/polyfills.ts +++ b/apps/demos/src/polyfills.ts @@ -42,12 +42,11 @@ * */ - -import './zone-flags'; +// import './zone-flags'; /*************************************************************************************************** * Zone JS is required by default for Angular itself. */ -import 'zone.js'; +// import 'zone.js'; /*************************************************************************************************** * APPLICATION IMPORTS diff --git a/apps/docs/docs/cdk/notifications/notifications.mdx b/apps/docs/docs/cdk/notifications/notifications.mdx index 3701409083..86ec84d695 100644 --- a/apps/docs/docs/cdk/notifications/notifications.mdx +++ b/apps/docs/docs/cdk/notifications/notifications.mdx @@ -61,12 +61,8 @@ The following states can apply to this UI: @Component({ selector: 'any-component', template: ` - -

- Count: {{ count }} -

+ +

Count: {{ count }}

Negative Count
@@ -100,24 +96,13 @@ For those states we use the term **reactive context** which includes the state a With this concept we can create helpers that support to implement the handling of reactive context in a more elegant way. -A good example is the [`rxLet`](../../template/api/rx-let-directive.md) directive: +A good example is the [`rxLet`](../../template/api/rx-let-directive.mdx) directive: ```typescript @Component({ selector: 'any-component', template: ` -

- Count: {{ count }} -

+

Count: {{ count }}

Negative Count @@ -164,38 +149,27 @@ For wrapping a value into a RxNotification we provide 3 helpers: ```typescript const errorNotification: RxErrorNotification = toRxErrorNotification(); -const errorNotification: RxErrorNotification = toRxErrorNotification( - new Error() -); -const errorNotification: RxErrorNotification = toRxErrorNotification( - new Error(), - 'lastValue' -); +const errorNotification: RxErrorNotification = toRxErrorNotification(new Error()); +const errorNotification: RxErrorNotification = toRxErrorNotification(new Error(), 'lastValue'); ``` **toRxSuspenseNotification** ```typescript -const toRxSuspenseNotification: RxSuspenseNotification = - toRxSuspenseNotification(); -const toRxSuspenseNotification: RxSuspenseNotification = - toRxSuspenseNotification('lastValue'); +const toRxSuspenseNotification: RxSuspenseNotification = toRxSuspenseNotification(); +const toRxSuspenseNotification: RxSuspenseNotification = toRxSuspenseNotification('lastValue'); ``` **toRxCompleteNotification** ```typescript -const toRxCompleteNotification: RxCompleteNotification = - toRxCompleteNotification(); -const toRxCompleteNotification: RxCompleteNotification = - toRxCompleteNotification('lastValue'); +const toRxCompleteNotification: RxCompleteNotification = toRxCompleteNotification(); +const toRxCompleteNotification: RxCompleteNotification = toRxCompleteNotification('lastValue'); ``` **rxMaterialize** ```typescript const websocketUpdates$: Observable = interval(3000); -const materialized$: Observable> = websocketUpdates.pipe( - rxMaterialize() -); +const materialized$: Observable> = websocketUpdates.pipe(rxMaterialize()); ``` diff --git a/apps/docs/docs/isr/introduction.md b/apps/docs/docs/isr/introduction.md index fc00caa330..fe4c78a9eb 100644 --- a/apps/docs/docs/isr/introduction.md +++ b/apps/docs/docs/isr/introduction.md @@ -23,7 +23,7 @@ function, the IsrService will start to listen to route changes on the server-sid The moment the route is set and won't change anymore, we grab the route data and attach them in the HTML as JSON. -Then, the moment the server-side rendering is about to finish, we read the rendered html and grab the route data from it using regex. We parse the JSON, and now we now if we need to cache the page or not. +Then, the moment the server-side rendering is about to finish, we read the rendered html and grab the route data from it using regex. We parse the JSON, and now we know if we need to cache the page or not. If we need to cache the page, we save it in the cache and serve it to the user. If we don’t need to cache the page, we just serve it to the user. diff --git a/apps/docs/docs/state/api/rx-state.md b/apps/docs/docs/state/api/rx-state.md index 6a0b8468c0..6e6fd5b7e7 100644 --- a/apps/docs/docs/state/api/rx-state.md +++ b/apps/docs/docs/state/api/rx-state.md @@ -65,6 +65,33 @@ Use the `$` property if you want to read the state without having applied [state --- +## asReadOnly + +##### typeof: Pick<RxState<State>, 'get' | 'select' | 'computed' | 'signal'> + +Return RxState in ReadOnly mode that is exposing +get(), select(), computed() and signal() methods. +This can be helpful when you don't want others to write in your state. + +```typescript +const readOnlyState = state.asReadOnly(); +const getNum = readOnlyState.get('num'); +const selectNum$ = readOnlyState.select('num'); +``` + +Trying to call any method that is not exposed in readOnlyState will throw an appropriate error + +```typescript +const readOnlyState = state.asReadOnly(); +readOnlyState['set']('num', (state) => state.num + 1); +``` + +```language: none +throwing -> readOnlyState.set is not a function +``` + +--- + ## connect ### Signature @@ -132,11 +159,7 @@ _Example_ ```typescript const myTimer$ = interval(250); -state.connect( - 'timer', - myTimer$, - (state, timerChange) => (state.timer += timerChange) -); +state.connect('timer', myTimer$, (state, timerChange) => (state.timer += timerChange)); // every 250ms the property timer will get updated ``` @@ -221,7 +244,7 @@ _Example_ ```typescript const profilePicture$ = state.select( map((state) => state.profilePicture), - switchMap((profilePicture) => mapImageAsync(profilePicture)) + switchMap((profilePicture) => mapImageAsync(profilePicture)), ); ``` @@ -275,10 +298,7 @@ _Example_ ```typescript // Project state slice -const text$ = state.select( - ['query', 'results'], - ({ query, results }) => `${results.length} results found for "${query}"` -); +const text$ = state.select(['query', 'results'], ({ query, results }) => `${results.length} results found for "${query}"`); ``` --- @@ -346,9 +366,7 @@ _Example_ ```typescript // Directly pass an observable side-effect -const localStorageEffect$ = changes$.pipe( - tap((changes) => storeChanges(changes)) -); +const localStorageEffect$ = changes$.pipe(tap((changes) => storeChanges(changes))); state.hold(localStorageEffect$); // Pass an additional `sideEffectFunction` diff --git a/apps/docs/docs/template/api/push-pipe.md b/apps/docs/docs/template/api/push-pipe.md index 6d5f841fd3..ebb6333641 100644 --- a/apps/docs/docs/template/api/push-pipe.md +++ b/apps/docs/docs/template/api/push-pipe.md @@ -29,8 +29,7 @@ components and does not work in zone-less mode. _Example_ ```html - - + ``` The rendering behavior can be configured per RxPush instance using the strategy parameter. @@ -38,8 +37,7 @@ The rendering behavior can be configured per RxPush instance using the strategy _Example_ ```html - - + ``` ## Included features @@ -48,7 +46,7 @@ _Example_ - Handling null and undefined values in a clean unified/structured way - Distinct same values in a row to increase performance - Coalescing of change detection calls to boost performance -- Lazy rendering (see [RxLet](rx-let-directive.md)) +- Lazy rendering (see [RxLet](./rx-let-directive.mdx)) - Chunked rendering ## Signature diff --git a/apps/docs/docs/template/api/rx-for-directive.md b/apps/docs/docs/template/api/rx-for-directive.mdx similarity index 69% rename from apps/docs/docs/template/api/rx-for-directive.md rename to apps/docs/docs/template/api/rx-for-directive.mdx index ff4fb67521..98655aec77 100644 --- a/apps/docs/docs/template/api/rx-for-directive.md +++ b/apps/docs/docs/template/api/rx-for-directive.mdx @@ -4,6 +4,9 @@ sidebar_position: 2 title: 'RxFor' --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + ## Motivation The most common way to render lists in angular is by using the `*ngFor` structural directive. `*ngFor` is able @@ -31,165 +34,184 @@ Each instance of `RxFor` can be configured to render with different settings. - Nested structures are very slow, especially with updates - Destruction is more computation heavy than adding bootstrapping -## Concepts - -- [Local variables](../concepts/local-variables.md) -- [Handling view and content queries](../performance-issues/handling-view-and-content-queries.md) -- [NgZone optimizations](../performance-issues/ngzone-optimizations.md) -- [Render strategies](../../cdk/render-strategies/render-strategies.mdx) especially the section [usage-in-the-template](../../cdk/render-strategies#usage-in-the-template) - -## Features +## Basic Usage -**DX Features** +:::tip -- reduces boilerplate (multiple `async` pipe's) -- a unified/structured way of handling `null` and `undefined` -- works also with static variables `*rxFor="let i of []"` -- Immutable as well as mutable data structures (`trackBy`) -- Provide a comprehensive set of context variables +`rxFor` accepts `ObservableInput`, `Signal` as well as static values -**Performance Features** +::: -- lazy template creation (done by render strategies) -- non-blocking rendering of lists -- configurable frame budget (defaults to 60 FPS) -- triggers change-detection on `EmbeddedView` level -- distinct same values in a row (over-rendering) -- `ListManager`: special logic for differ mechanism to avoid over-rendering; abstracts away low level logic -- cancel any scheduled work if a remove was triggered for a `trackById` -- cancel any update if a new update was triggered for the same `trackById` -- nested lists will items fine grained and re-render only what is needed + -### Inputs + -**Rendering** +```html title="src/list.component.html" +
+ +
+``` -| Input | Type | description | -| ---------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `trackBy` | `keyof T` or `(index: number, item: T) => any` | Identifier function for items. `rxFor` provides a shorthand where you can name the property directly. | -| `patchZone` | `boolean` | _default: `true`_ if set to `false`, the `RxFor` will operate out of `NgZone`. See [NgZone optimizations](../performance-issues/ngzone-optimizations.md) | -| `parent` | `boolean` | _default: `true`_ if set to `false`, the `RxFor` won't inform its host component about changes being made to the template. More performant, `@ViewChild` and `@ContentChild` queries won't work. [Handling view and content queries](../performance-issues/handling-view-and-content-queries.md) | -| `strategy` | `Observable \ RxStrategyNames \ string>` | _default: `normal`_ configure the `RxStrategyRenderStrategy` used to detect changes. | -| `renderCallback` | `Subject` | giving the developer the exact timing when the `RxFor` created, updated, removed its template. Useful for situations where you need to know when rendering is done. | +```typescript title="src/list.component.html" +import { RxFor } from '@rx-angular/template/for'; +import { Component } from '@angular/core'; -### Outputs +@Component({ + templateUrl: './list.component.html', + standalone: true, + imports: [RxFor], +}) +export class ListComponent { + movies: Signal = this.movieService.fetchMovies(); +} +``` -- n/a +
-### Context Variables + -The following context variables are available for each template: +```html title="src/list.component.html" +
+ +
+``` -**Static Context Variables (mirrored from `ngFor`)** +```typescript title="src/list.component.html" +import { RxFor } from '@rx-angular/template/for'; +import { Component } from '@angular/core'; -| Variable Name | Type | description | -| ------------- | --------- | ---------------------------------------------------- | -| `$implicit` | `T` | the default variable accessed by `let val` | -| `index` | `number` | current index of the item | -| `count` | `number` | count of all items in the list | -| `first` | `boolean` | true if the item is the first in the list | -| `last` | `boolean` | true if the item is the last in the list | -| `even` | `boolean` | true if the item has on even index (index % 2 === 0) | -| `odd` | `boolean` | the opposite of even | - -**Reactive Context Variables** +@Component({ + templateUrl: './list.component.html', + standalone: true, + imports: [RxFor], +}) +export class ListComponent { + movies$: Observable = this.movieService.fetchMovies(); +} +``` -| Variable Name | Type | description | -| ------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `item$` | `Observable` | the same value as $implicit, but as `Observable` | -| `index$` | `Observable` | index as `Observable` | -| `count$` | `Observable` | count as `Observable` | -| `first$` | `Observable` | first as `Observable` | -| `last$` | `Observable` | last as `Observable` | -| `even$` | `Observable` | even as `Observable` | -| `odd$` | `Observable` | odd as `Observable` | -| `select` | `(keys: (keyof T)[], distinctByMap) => Observable>` | returns a selection function which accepts an array of properties to pluck out of every list item. The function returns the selected properties of the current list item as distinct `Observable` key-value-pair. | +
-## Setup + -The `RxFor` can be imported as following: +```html title="src/list.component.html" + + +
+ +
``` -import { RxFor } from "@rx-angular/template/for"; + +```typescript title="src/list.component.html" +import { RxFor } from '@rx-angular/template/for'; +import { Component } from '@angular/core'; @Component({ - standalone: true, - imports: [RxFor], - template: `...` + templateUrl: './list.component.html', + standalone: true, + imports: [RxFor], }) -export class AnyComponent {} +export class ListComponent { + menuItems: MenuItem[] = [ + { + id: 1, + title: 'edit', + }, + { + id: 2, + title: 'delete', + }, + ]; + + moviesSignal: Signal = this.movieService.fetchMovies(); +} ``` -## Basic Usage +
-> **⚠ Notice:** -> By default `*rxFor` is optimized for performance out of the box. -> -> This includes: -> -> - The default render strategy is [`normal`](../../cdk/render-strategies/strategies/concurrent-strategies.md). -> This ensures non-blocking rendering but can cause other side-effects. See [strategy configuration](../../cdk/render-strategies#Default-configuration) if you want to change it. -> - Creates templates lazy and manages multiple template instances -> -> As a list can take larger to render items can appear in batches if concurrent strategies are used. -> This brings several benefits. e.g. stop rendering in between and navigate away. +
-### Simple example using `*rxFor` with `Observable` values +:::note **⚠ Notice:** + +By default `*rxFor` is optimized for performance out of the box. + +This includes: + +- The default render strategy is [`normal`](../../cdk/render-strategies/strategies/concurrent-strategies.md). +- This ensures non-blocking rendering but can cause other side-effects. See [strategy configuration](../../cdk/render-strategies#Default-configuration) if you want to change it. +- Creates templates lazy and manages multiple template instances + +As a list can take larger to render items can appear in batches if concurrent strategies are used. +This brings several benefits. e.g. stop rendering in between and navigate away. + +::: + +### Save code with the `trackBy` shortcut + + + + + +:::tip DX Tip + +You can pass any valid property from the given input type as a shortcut instead of providing a `TrackByFunction` + +::: + +```html title="src/list.component.html" +
+ +
+``` + +```typescript title="src/list.component.html" +import { RxFor } from '@rx-angular/template/for'; +import { Component } from '@angular/core'; -```ts @Component({ - template: ` -
    -
  • {{ item }}
  • -
- ` + templateUrl: './list.component.html', + standalone: true, + imports: [RxFor], }) -export class AnyComponent { - items$: Observable = getItems(); - - trackItem(, item) { - return item.id - } +export class ListComponent { + movies$: Observable = this.movieService.fetchMovies(); } ``` -### Simple example using `*rxFor` with simple static values +
-> **🔥 Perf Tip:** -> As `rxFor` accepts also static values it can serve as a drop in replacement with an easy find and replace refactoring. + + +```html title="src/list.component.html" +
+ +
+``` + +```typescript title="src/list.component.html" +import { RxFor } from '@rx-angular/template/for'; +import { Component } from '@angular/core'; -```typescript @Component({ - template: ` -
    -
  • {{ item }}
  • -
- ` + templateUrl: './list.component.html', + standalone: true, + imports: [RxFor], }) -export class AnyComponent { - items: Items[] = getItems(); +export class ListComponent { + movies$: Observable = this.movieService.fetchMovies(); - trackItem(, item) { - return item.id + trackMovie(i: number, movie: Movie) { + return movie.id; } } ``` -### Save code with the `trackBy` shortcut +
-> **💡 DX Tip:** -> As `rxFor` accepts also static values it can serve as a drop in replacement with an easy find and replace refactoring. - -```typescript -@Component({ - template: ` -
    -
  • {{ item }}
  • -
- `, -}) -export class AnyComponent {} -``` +
### Using the static context variables @@ -238,6 +260,76 @@ export class AnyComponent {} ``` +## Concepts + +- [Local variables](../concepts/local-variables.md) +- [Handling view and content queries](../performance-issues/handling-view-and-content-queries.md) +- [NgZone optimizations](../performance-issues/ngzone-optimizations.md) +- [Render strategies](../../cdk/render-strategies/render-strategies.mdx) especially the section [usage-in-the-template](../../cdk/render-strategies#usage-in-the-template) + +## Features + +**DX Features** + +- reduces boilerplate (multiple `async` pipe's) +- a unified/structured way of handling `null` and `undefined` +- works also with static variables `*rxFor="let i of []"` +- Immutable as well as mutable data structures (`trackBy`) +- Provide a comprehensive set of context variables + +**Performance Features** + +- lazy template creation (done by render strategies) +- non-blocking rendering of lists +- configurable frame budget (defaults to 60 FPS) +- triggers change-detection on `EmbeddedView` level +- distinct same values in a row (over-rendering) +- `ListManager`: special logic for differ mechanism to avoid over-rendering; abstracts away low level logic +- cancel any scheduled work if a remove was triggered for a `trackById` +- cancel any update if a new update was triggered for the same `trackById` +- nested lists will items fine grained and re-render only what is needed + +## Inputs + +**Rendering** + +| Input | Type | description | +| --------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `trackBy` | `keyof T` or `(index: number, item: T) => any` | Identifier function for items. `rxFor` provides a shorthand where you can name the property directly. | +| `patchZone` | `boolean` | _default: `true`_ if set to `false`, the `RxFor` will operate out of `NgZone`. See [NgZone optimizations](../performance-issues/ngzone-optimizations.md) | +| `parent` (deprecated) | `boolean` | _default: `true`_ if set to `false`, the `RxFor` won't inform its host component about changes being made to the template. More performant, `@ViewChild` and `@ContentChild` queries won't work. [Handling view and content queries](../performance-issues/handling-view-and-content-queries.md) | +| `strategy` | `Observable \ RxStrategyNames \ string>` | _default: `normal`_ configure the `RxStrategyRenderStrategy` used to detect changes. | +| `renderCallback` | `Subject` | giving the developer the exact timing when the `RxFor` created, updated, removed its template. Useful for situations where you need to know when rendering is done. | + +## Context Variables + +The following context variables are available for each template: + +**Static Context Variables (mirrored from `ngFor`)** + +| Variable Name | Type | description | +| ------------- | --------- | ---------------------------------------------------- | +| `$implicit` | `T` | the default variable accessed by `let val` | +| `index` | `number` | current index of the item | +| `count` | `number` | count of all items in the list | +| `first` | `boolean` | true if the item is the first in the list | +| `last` | `boolean` | true if the item is the last in the list | +| `even` | `boolean` | true if the item has on even index (index % 2 === 0) | +| `odd` | `boolean` | the opposite of even | + +**Reactive Context Variables** + +| Variable Name | Type | description | +| ------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `item$` | `Observable` | the same value as $implicit, but as `Observable` | +| `index$` | `Observable` | index as `Observable` | +| `count$` | `Observable` | count as `Observable` | +| `first$` | `Observable` | first as `Observable` | +| `last$` | `Observable` | last as `Observable` | +| `even$` | `Observable` | even as `Observable` | +| `odd$` | `Observable` | odd as `Observable` | +| `select` | `(keys: (keyof T)[], distinctByMap) => Observable>` | returns a selection function which accepts an array of properties to pluck out of every list item. The function returns the selected properties of the current list item as distinct `Observable` key-value-pair. | + ## Advanced Usage ### Use render strategies (`strategy`) @@ -248,13 +340,9 @@ an `Observable` or [`RxStrategyNames`](https://github.com/rx-an The default value for strategy is [`normal`](../../cdk/render-strategies/strategies/concurrent-strategies.md). ```html - - {{ item }} - + {{ item }} - - {{ item }} - + {{ item }} ``` ```ts @@ -271,6 +359,41 @@ Learn more about the general concept of [`RenderStrategies`](../../cdk/render-st #### Local strategies and view/content queries (`parent`) +:::warning + +**Deprecation warning** + +The `parent` flag being true is not needed anymore with the new [signal based view queries](https://angular.io/guide/signal-queries). + +The flag itself is deprecated now and will be removed in future versions. + +However, for the time being: if you are already using the signal queries, you definitely want to set the `parent` flag to be false. We highly recommend doing so, as it reduces the amount of +change detection cycles significantly, thus improving the runtime performance of your apps. + +You can do so by providing a custom `RxRenderStrategiesConfig`, see the following example: + +```typescript +// import +import { RxRenderStrategiesConfig, RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; + +// create configuration with parent flag to be false +const rxaConfig: RxRenderStrategiesConfig = { + parent: false, +}; + +// provide it, in best case on root level +{ + providers: [ + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: rxaConfig, + }, + ]; +} +``` + +::: + When local rendering strategies are used, we need to treat view and content queries in a special way. To make `*rxFor` in such situations, a certain mechanism is implemented to @@ -364,13 +487,7 @@ The result of the `renderCallback` will contain the currently rendered set of it selector: 'app-root', template: ` - +
{{ item.name }}
@@ -425,13 +542,7 @@ For more details read about [NgZone optimizations](../performance-issues/ngzone- ```ts @Component({ selector: 'app-root', - template: ` -
- `, + template: `
`, }) export class AppComponent { // As the part of the template where this function is used as event listener callback diff --git a/apps/docs/docs/template/api/rx-if-directive.md b/apps/docs/docs/template/api/rx-if-directive.mdx similarity index 74% rename from apps/docs/docs/template/api/rx-if-directive.md rename to apps/docs/docs/template/api/rx-if-directive.mdx index 9a431d95d6..45b731224e 100644 --- a/apps/docs/docs/template/api/rx-if-directive.md +++ b/apps/docs/docs/template/api/rx-if-directive.mdx @@ -4,6 +4,9 @@ sidebar_position: 3 title: 'RxIf' --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + ## Motivation In order to switch a template based on an observable condition, developers are forced to use @@ -24,23 +27,87 @@ pipe in addition. This enables `rxIf` to completely operate on its own without having to interact with `NgZone` or triggering global change detection. -**Example usage** + -```html - - + + +```html title="src/some.component.html" + + + ``` -```ts -// some.component.ts +```typescript title="src/some.component.ts" +import { RxIf } from '@rx-angular/template/if'; +import { signal } from '@angular/core'; + +@Component({ + imports: [RxIf], + templateUrl: './some.component.html', + standalone: true, +}) +export class SomeComponent { + show = signal(true); +} +``` + + + + + +```html title="src/some.component.html" + + + +``` + +```typescript title="src/some.component.ts" +import { RxIf } from '@rx-angular/template/if'; +import { BehaviorSubject } from 'rxjs'; + @Component({ - /**/ + imports: [RxIf], + templateUrl: './some.component.html', + standalone: true, }) export class SomeComponent { - show$ = new BehaviorSubject(true); + show$ = new BehaviorSubject(true); } ``` + + + + +```html title="src/some.component.html" + + + + + + + + +``` + +```typescript title="src/some.component.ts" +import { RxIf } from '@rx-angular/template/if'; + +@Component({ + imports: [RxIf], + templateUrl: './some.component.html', + standalone: true, +}) +export class SomeComponent { + show = true; + showSignal = signal(true); +} +``` + + + + + ## Concepts - [Local variables](../concepts/local-variables.md) @@ -69,9 +136,9 @@ export class SomeComponent { **Value** -| Input | Type | description | -| ------ | --------------------------------------- | ----------------------------------------------------------------- | -| `rxIf` | `boolean` or `ObservableInput` | The Observable or value to be bound to the context of a template. | +| Input | Type | description | +| ------ | ------------------------------------------------------------ | ----------------------------------------------------------------------------- | +| `rxIf` | `boolean` or `ObservableInput` or `Signal` | The observable, or signal, or value to be bound to the context of a template. | **Contextual state** @@ -88,18 +155,14 @@ export class SomeComponent { **Rendering** -| Input | Type | description | -| ---------------- | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `then` | `TemplateRef` | defines the template for when the bound condition is true | -| `else` | `TemplateRef` | defines the template for when the bound condition is false | -| `patchZone` | `boolean` | _default: `true`_ if set to `false`, the `RxIf` will operate out of `NgZone`. See [NgZone optimizations](../performance-issues/ngzone-optimizations.md) | -| `parent` | `boolean` | _default: `true`_ if set to `false`, the `RxIf` won't inform its host component about changes being made to the template. More performant, `@ViewChild` and `@ContentChild` queries won't work. [Handling view and content queries](../performance-issues/handling-view-and-content-queries.md) | -| `strategy` | `Observable` or `RxStrategyNames` | _default: `normal`_ configure the `RxStrategyRenderStrategy` used to detect changes. | -| `renderCallback` | `Subject` | giving the developer the exact timing when the `RxIf` created, or removed its template. Useful for situations where you need to know when rendering is done. | - -### Outputs - -n/a +| Input | Type | description | +| --------------------- | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `then` | `TemplateRef` | defines the template for when the bound condition is true | +| `else` | `TemplateRef` | defines the template for when the bound condition is false | +| `patchZone` | `boolean` | _default: `true`_ if set to `false`, the `RxIf` will operate out of `NgZone`. See [NgZone optimizations](../performance-issues/ngzone-optimizations.md) | +| `parent` (deprecated) | `boolean` | _default: `true`_ if set to `false`, the `RxIf` won't inform its host component about changes being made to the template. More performant, `@ViewChild` and `@ContentChild` queries won't work. [Handling view and content queries](../performance-issues/handling-view-and-content-queries.md) | +| `strategy` | `Observable` or `RxStrategyNames` | _default: `normal`_ configure the `RxStrategyRenderStrategy` used to detect changes. | +| `renderCallback` | `Subject` | giving the developer the exact timing when the `RxIf` created, or removed its template. Useful for situations where you need to know when rendering is done. | ## Setup @@ -127,25 +190,91 @@ export class AnyComponent {} > This ensures non-blocking rendering but can cause other side-effects. See [strategy configuration](../../cdk/render-strategies#Default-configuration) if you want to change it. > - Creates templates lazy and manages multiple template instances -### Binding an Observable +### Bind Values + + + + + +```html title="src/some.component.html" + + + +``` + +```typescript title="src/some.component.ts" +import { RxIf } from '@rx-angular/template/if'; +import { signal } from '@angular/core'; + +@Component({ + imports: [RxIf], + templateUrl: './some.component.html', + standalone: true, +}) +export class SomeComponent { + show = signal(true); +} +``` + + + + The `*rxIf` directive makes it easy to work with reactive data streams in the template. -```html - - +```html title="src/some.component.html" + + + ``` -```ts -// some.component.ts +```typescript title="src/some.component.ts" +import { RxIf } from '@rx-angular/template/if'; +import { BehaviorSubject } from 'rxjs'; + @Component({ - /**/ + imports: [RxIf], + templateUrl: './some.component.html', + standalone: true, }) export class SomeComponent { - show$ = new BehaviorSubject(true); + show$ = new BehaviorSubject(true); } ``` + + + + +```html title="src/some.component.html" + + + + + + + + +``` + +```typescript title="src/some.component.ts" +import { RxIf } from '@rx-angular/template/if'; + +@Component({ + imports: [RxIf], + templateUrl: './some.component.html', + standalone: true, +}) +export class SomeComponent { + show = true; + showSignal = signal(true); +} +``` + + + + + ### Using the reactive context ![Contextual-State--template-vs-variable](https://user-images.githubusercontent.com/10064416/192660150-643c4d37-5326-4ba2-ad84-e079890b3f2f.png) @@ -155,6 +284,16 @@ A nice feature of the `*rxIf` directive is, it provides 2 ways to access the [re - context variables - context templates +:::note + +The full reactive context (suspense, error, complete) can only be derived from `Observable` sources. + +If you provide a `Signal`, only suspense & error can be derived. + +Static values do not have any reactive context at all. + +::: + ### Context Variables > (!) Context variables are accessible on both, the `then` and `else` template, based on the last valid value @@ -171,9 +310,7 @@ You can use them like this: **Context Variables on then template** ```html - + @@ -185,9 +322,7 @@ You can use them like this: **Context Variables on else template** ```html - + @@ -321,9 +456,7 @@ e.g. from the complete template back to the value display @Component({ selector: 'app-root', template: ` - + @@ -345,9 +478,7 @@ e.g. from the complete template back to the value display selector: 'app-root', template: ` - + loading... @@ -423,6 +554,41 @@ Learn more about the general concept of [`RenderStrategies`](../../cdk/render-st #### Local strategies and view/content queries (`parent`) +:::warning + +**Deprecation warning** + +The `parent` flag being true is not needed anymore with the new [signal based view queries](https://angular.io/guide/signal-queries). + +The flag itself is deprecated now and will be removed in future versions. + +However, for the time being: if you are already using the signal queries, you definitely want to set the `parent` flag to be false. We highly recommend doing so, as it reduces the amount of +change detection cycles significantly, thus improving the runtime performance of your apps. + +You can do so by providing a custom `RxRenderStrategiesConfig`, see the following example: + +```typescript +// import +import { RxRenderStrategiesConfig, RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; + +// create configuration with parent flag to be false +const rxaConfig: RxRenderStrategiesConfig = { + parent: false, +}; + +// provide it, in best case on root level +{ + providers: [ + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: rxaConfig, + }, + ]; +} +``` + +::: + Structural directives maintain `EmbeddedViews` within a components' template. Depending on the bound value as well as the configured `RxRenderStrategy`, updates processed by the `@rx-angular/template` directives can be asynchronous. @@ -494,9 +660,7 @@ For more details read about [NgZone optimizations](../performance-issues/ngzone- ```ts @Component({ selector: 'app-root', - template: ` -
- `, + template: `
`, }) export class AppComponent { enabled$ = state.select('enabled'); @@ -514,12 +678,7 @@ This helps to exclude all side effects from special render strategies. ### Basic Setup ```typescript -import { - ChangeDetectorRef, - Component, - TemplateRef, - ViewContainerRef, -} from '@angular/core'; +import { ChangeDetectorRef, Component, TemplateRef, ViewContainerRef } from '@angular/core'; import { TestBed } from '@angular/core/testing'; import { RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; import { RxIf } from '@rx-angular/template/if'; diff --git a/apps/docs/docs/template/api/rx-let-directive.md b/apps/docs/docs/template/api/rx-let-directive.mdx similarity index 71% rename from apps/docs/docs/template/api/rx-let-directive.md rename to apps/docs/docs/template/api/rx-let-directive.mdx index bba2f25fef..b61791dc11 100644 --- a/apps/docs/docs/template/api/rx-let-directive.md +++ b/apps/docs/docs/template/api/rx-let-directive.mdx @@ -4,6 +4,9 @@ sidebar_position: 1 title: 'RxLet' --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + ## Motivation In Angular there is one way to handle asynchronous values or streams in the template, the `async` pipe. @@ -15,17 +18,71 @@ To name a few: - it leads to too many subscriptions in the template - it is cumbersome to work with values in the template -**Access async values in the template: `*ngIf hack`** + -The ngIf hack looks like this: + ```html - +@if (number$ | async; as n) { + + +} +``` + + + + + +```html title="src/counter.component.html" + + + + +``` + +```typescript title="src/counter.component.ts" +import { RxLet } from '@rx-angular/template/let'; +import { signal } from '@angular/core'; + +@Component({ + imports: [RxLet], + templateUrl: './counter.component.html', + standalone: true, +}) +export class CounterComponent { + number = signal(0); +} +``` + + + + + +```html title="src/counter.component.html" + ``` +```typescript title="src/counter.component.ts" +import { RxLet } from '@rx-angular/template/let'; +import { BehaviorSubject } from 'rxjs'; + +@Component({ + imports: [RxLet], + templateUrl: './counter.component.html', + standalone: true, +}) +export class CounterComponent { + number$ = new BehaviorSubject(0); +} +``` + + + + + The problem is that `*ngIf` interferes with rendering and in case of falsy values (`0`, `''`, `false`, `null`, `undefined`) the component would be hidden. This issue is a big problem and leads to many production bugs as its edge cases are often overlooked. @@ -51,105 +108,81 @@ This package helps to reduce code used to create composable action streams. It mostly is used in combination with state management libs to handle user interaction and backend communication. ```html - ... + ... ``` -## Concepts +## Basic Usage -- [Local variables](../concepts/local-variables.md) -- [Local template](../concepts/local-templates.md) -- [Reactive context](../concepts/reactive-context.md) -- [Render strategies](../../cdk/render-strategies/render-strategies.mdx) +:::tip -## Features +By default `*rxLet` is optimized for performance out of the box. +This includes: -**DX Features** +- The default render strategy is [`normal`](../../cdk/render-strategies/strategies/concurrent-strategies.md). + - This ensures non-blocking rendering but can cause other side-effects. See [strategy configuration](../../cdk/render-strategies/strategies/basic-strategies.md) if you want to change it. +- Creates templates lazy and manages multiple template instances -- context variables (error, complete, suspense) -- context templates (error, complete, suspense) -- context trigger -- reduces boilerplate (multiple `async` pipe's) -- a unified/structured way of handling `null` and `undefined` -- works also with static variables `*rxLet="42; let n"` - -**Performance Features** +::: -- value binding is always present. ('`*ngIf` hack' bugs and edge cases) -- lazy template creation (done by render strategies) -- triggers change-detection on `EmbeddedView` level -- distinct same values in a row (over-rendering) +### Binding a value in the template -### Inputs +The `*rxLet` directive makes it easy to work with reactive data streams in the template. -**Value** +This can be achieved by using Angulars native 'let' syntax `*rxLet="number$; let n"` -| Input | Type | description | -| ------- | --------------- | ----------------------------------------------------------------- | -| `rxLet` | `Observable` | The Observable or value to be bound to the context of a template. | + -**Contextual state** - -| Input | Type | description | -| ----------------- | -------------------------------- | ---------------------------------------------------------------------- | -| `error` | `TemplateRef` | defines the template for the error state | -| `complete` | `TemplateRef` | defines the template for the complete state | -| `suspense` | `TemplateRef` | defines the template for the suspense state | -| `nextTrigger` | `Observable` | trigger to show `next` template | -| `errorTrigger` | `Observable` | trigger to show `error` template | -| `completeTrigger` | `Observable` | trigger to show `complete` template | -| `suspenseTrigger` | `Observable` | trigger to show `suspense` template | -| `contextTrigger` | `Observable` | trigger to show any templates, based on the given `RxNotificationKind` | + -**Rendering** +```html title="src/counter.component.html" + + + + +``` -| Input | Type | description | -| ---------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `patchZone` | `boolean` | _default: `true`_ if set to `false`, the `RxLet` will operate out of `NgZone`. See [NgZone optimizations](../performance-issues/ngzone-optimizations.md) | -| `parent` | `boolean` | _default: `true`_ if set to `false`, the `RxLet` won't inform its host component about changes being made to the template. More performant, `@ViewChild` and `@ContentChild` queries won't work. [Handling view and content queries](../performance-issues/handling-view-and-content-queries.md) | -| `strategy` | `Observable \ RxStrategyNames \ string>` | _default: `normal`_ configure the `RxStrategyRenderStrategy` used to detect changes. | -| `renderCallback` | `Subject` | giving the developer the exact timing when the `RxLet` created, updated, removed its template. Useful for situations where you need to know when rendering is done. | +```typescript title="src/counter.component.ts" +import { RxLet } from '@rx-angular/template/let'; +import { signal } from '@angular/core'; -### Outputs +@Component({ + imports: [RxLet], + templateUrl: './counter.component.html', + standalone: true, +}) +export class CounterComponent { + number = signal(0); +} +``` -n/a + -## Setup + -The `RxLet` can be imported as following: +```html title="src/counter.component.html" + + + + +``` -```ts +```typescript title="src/counter.component.ts" import { RxLet } from '@rx-angular/template/let'; +import { BehaviorSubject } from 'rxjs'; @Component({ - standalone: true, imports: [RxLet], - template: `...`, + templateUrl: './counter.component.html', + standalone: true, }) -export class AnyComponent {} +export class CounterComponent { + number$ = new BehaviorSubject(0); +} ``` -## Basic Usage - -> **⚠ Notice:** -> By default `*rxLet` is optimized for performance out of the box. -> -> This includes: -> -> - The default render strategy is [`normal`](../../cdk/render-strategies/strategies/concurrent-strategies.md). -> This ensures non-blocking rendering but can cause other side-effects. See [strategy configuration](../../cdk/render-strategies/strategies/basic-strategies.md) if you want to change it. -> - Creates templates lazy and manages multiple template instances - -### Binding an Observable to a local variable in the template - -The `*rxLet` directive makes it easy to work with reactive data streams in the template. -This can be achieved by using Angular's native 'let' syntax `*rxLet="observableNumber$; let n"`. + -```html - - - - -``` + ### Using the reactive context @@ -160,6 +193,14 @@ A nice feature of the `*rxLet` directive is, it provides 2 ways to access the [r - context variables - context templates +:::note + +The full reactive context (suspense, error, complete) can only be derived from `Observable` sources. + +If you provide a `Signal`, only suspense & error can be derived. + +::: + ### Context Variables The following context variables are available for each template: @@ -172,15 +213,12 @@ The following context variables are available for each template: You can use the as like this: ```html - + {{ s && 'No value arrived so far' }} - There is an error: {{ e ? e.message : 'No Error' }} Observable is completed: - {{c ? 'Yes' : 'No'}} + There is an error: {{ e ? e.message : 'No Error' }} Observable is completed: {{c ? 'Yes' : 'No'}} ``` @@ -191,7 +229,7 @@ You can also use template anchors to display the [contextual state](../concepts/ ```html show value - + {{ n }} @@ -274,9 +310,7 @@ e.g. from the complete template back to the value display @Component({ selector: 'app-root', template: ` - + {{ n }} @@ -300,15 +334,7 @@ e.g. from the complete template back to the value display selector: 'app-root', template: ` - + {{ n }} loading... @@ -337,9 +363,7 @@ in a convenient way. selector: 'app-root', template: ` - + {{ n }} loading... @@ -358,6 +382,62 @@ export class AppComponent { } ``` +## Concepts + +- [Local variables](../concepts/local-variables.md) +- [Local template](../concepts/local-templates.md) +- [Reactive context](../concepts/reactive-context.md) +- [Render strategies](../../cdk/render-strategies/render-strategies.mdx) + +## Features + +### DX + +- context variables (error, complete, suspense) +- context templates (error, complete, suspense) +- context trigger +- reduces boilerplate (multiple `async` pipe's) +- a unified/structured way of handling `null` and `undefined` +- works also with static variables `*rxLet="42; let n"` + +### Performance Features + +- value binding is always present. ('`*ngIf` hack' bugs and edge cases) +- lazy template creation (done by render strategies) +- triggers change-detection on `EmbeddedView` level +- distinct same values in a row (over-rendering) +- concurrent mode (read more about this [here](../../cdk/render-strategies/strategies/concurrent-strategies)) + +## Inputs + +**Value** + +| Input | Type | description | +| ------- | --------------- | ----------------------------------------------------------------- | +| `rxLet` | `Observable` | The Observable or value to be bound to the context of a template. | + +**Contextual state** + +| Input | Type | description | +| ----------------- | -------------------------------- | ---------------------------------------------------------------------- | +| `error` | `TemplateRef` | defines the template for the error state | +| `complete` | `TemplateRef` | defines the template for the complete state | +| `suspense` | `TemplateRef` | defines the template for the suspense state | +| `nextTrigger` | `Observable` | trigger to show `next` template | +| `errorTrigger` | `Observable` | trigger to show `error` template | +| `completeTrigger` | `Observable` | trigger to show `complete` template | +| `suspenseTrigger` | `Observable` | trigger to show `suspense` template | +| `contextTrigger` | `Observable` | trigger to show any templates, based on the given `RxNotificationKind` | + +**Rendering** + +| Input | Type | description | +| --------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `patchZone` | `boolean` | _default: `true`_ if set to `false`, the `RxLet` will operate out of `NgZone`. See [NgZone optimizations](../performance-issues/ngzone-optimizations.md) | +| `parent` (deprecated) | `boolean` | _default: `true`_ if set to `false`, the `RxLet` won't inform its host component about changes being made to the template. More performant, `@ViewChild` and `@ContentChild` queries won't work. [Handling view and content queries](../performance-issues/handling-view-and-content-queries.md) | +| `strategy` | `Observable \ RxStrategyNames \ string>` | _default: `normal`_ configure the `RxStrategyRenderStrategy` used to detect changes. | +| `renderCallback` | `Subject` | giving the developer the exact timing when the `RxLet` created, updated, removed its template. Useful for situations where you need to know when rendering is done. | + ## Advanced Usage ### Use render strategies (`strategy`) @@ -368,13 +448,9 @@ an `Observable` or [`RxStrategyNames`](https://github.com/rx-an The default value for strategy is [`normal`](../../cdk/render-strategies/strategies/concurrent-strategies.md#normal). ```html - - {{ item }} - + {{ item }} - - {{ item }} - + {{ item }} ``` ```ts @@ -391,6 +467,41 @@ Learn more about the general concept of [`RenderStrategies`](../../cdk/render-st #### Local strategies and view/content queries (`parent`) +:::warning + +**Deprecation warning** + +The `parent` flag being true is not needed anymore with the new [signal based view queries](https://angular.io/guide/signal-queries). + +The flag itself is deprecated now and will be removed in future versions. + +However, for the time being: if you are already using the signal queries, you definitely want to set the `parent` flag to be false. We highly recommend doing so, as it reduces the amount of +change detection cycles significantly, thus improving the runtime performance of your apps. + +You can do so by providing a custom `RxRenderStrategiesConfig`, see the following example: + +```typescript +// import +import { RxRenderStrategiesConfig, RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; + +// create configuration with parent flag to be false +const rxaConfig: RxRenderStrategiesConfig = { + parent: false, +}; + +// provide it, in best case on root level +{ + providers: [ + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: rxaConfig, + }, + ]; +} +``` + +::: + Structural directives maintain `EmbeddedViews` within a components' template. Depending on the bound value as well as the configured `RxRenderStrategy`, updates processed by the `@rx-angular/template` directives can be asynchronous. @@ -466,13 +577,7 @@ For more details read about [NgZone optimizations](../performance-issues/ngzone- ```ts @Component({ selector: 'app-root', - template: ` -
- `, + template: `
`, }) export class AppComponent { // As the part of the template where this function is used as event listener callback @@ -491,12 +596,7 @@ This helps to exclude all side effects from special render strategies. ### Basic Setup ```typescript -import { - ChangeDetectorRef, - Component, - TemplateRef, - ViewContainerRef, -} from '@angular/core'; +import { ChangeDetectorRef, Component, TemplateRef, ViewContainerRef } from '@angular/core'; import { TestBed } from '@angular/core/testing'; import { RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; import { RxLet } from '@rx-angular/template/let'; diff --git a/apps/docs/docs/template/api/virtual-scrolling.mdx b/apps/docs/docs/template/api/virtual-scrolling.mdx index e46e6649eb..8a279c759d 100644 --- a/apps/docs/docs/template/api/virtual-scrolling.mdx +++ b/apps/docs/docs/template/api/virtual-scrolling.mdx @@ -5,6 +5,8 @@ title: '🧪 Virtual Scrolling' --- import ReactPlayer from 'react-player'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; A high performance virtual scrolling implementation for Angular. @@ -19,8 +21,11 @@ explained in great detail by @DasSurma in his blog post about the of 60 frames per second. To avoid this, we are taking the burden of layout onto ourselves and use absolutely positioned elements with transforms." [(@DasSurma)](https://twitter.com/dassurma) -> **⚠ Notice:** -> This package is currently experimental, the public API can potentially change +:::note + +This package is currently experimental, the public API can potentially change + +::: The `@rx-angular/template/experimental/virtual-scrolling` package is a performance focused alternative to the official `@angular/cdk/scrolling`. @@ -34,6 +39,114 @@ See the [comparison section](#comparison-with-angular-cdk) for an in-depth compa ## Usage + + + + +```html title="list.component.html" + +
+
{{ movie.name }}
+
{{ movie.id }}
+
{{ movie.description }}
+
+
+``` + +```typescript title="src/list.component.ts" +import { + FixedSizeVirtualScrollStrategy, // choose any strategy you like + RxVirtualScrollViewportComponent, + RxVirtualFor, +} from '@rx-angular/template/experimental/virtual-scrolling'; + +@Component({ + standalone: true, + imports: [RxVirtualFor, RxVirtualScrollViewportComponent, FixedSizeVirtualScrollStrategy], +}) +export class ListComponent { + movies: Signal = this.movieService.fetchMovies(); +} +``` + +
+ + + +```html title="list.component.html" + +
+
{{ movie.name }}
+
{{ movie.id }}
+
{{ movie.description }}
+
+
+``` + +```typescript title="src/list.component.ts" +import { + FixedSizeVirtualScrollStrategy, // choose any strategy you like + RxVirtualScrollViewportComponent, + RxVirtualFor, +} from '@rx-angular/template/experimental/virtual-scrolling'; + +@Component({ + standalone: true, + imports: [RxVirtualFor, RxVirtualScrollViewportComponent, FixedSizeVirtualScrollStrategy], +}) +export class ListComponent { + movies$: Observable = this.movieService.fetchMovies(); +} +``` + +
+ + + +```html title="list.component.html" + +
+
{{ movie.name }}
+
{{ movie.id }}
+
{{ movie.description }}
+
+
+ + + +
+
{{ movie.name }}
+
{{ movie.id }}
+
{{ movie.description }}
+
+
+``` + +```typescript title="src/list.component.ts" +import { + FixedSizeVirtualScrollStrategy, // choose any strategy you like + RxVirtualScrollViewportComponent, + RxVirtualFor, +} from '@rx-angular/template/experimental/virtual-scrolling'; + +@Component({ + standalone: true, + imports: [RxVirtualFor, RxVirtualScrollViewportComponent, FixedSizeVirtualScrollStrategy], +}) +export class ListComponent { + moviesSignal: Signal = this.movieService.fetchMovies(); + movies: Movie[]; + + constructor() { + this.movieService.fetchMovies$().subscribe((result) => (this.movies = result.data)); + } +} +``` + +
+ +
+ ```ts import { FixedSizeVirtualScrollStrategy, // choose any strategy you like @@ -43,11 +156,7 @@ import { @Component({ standalone: true, - imports: [ - RxVirtualFor, - RxVirtualScrollViewportComponent, - FixedSizeVirtualScrollStrategy, - ], + imports: [RxVirtualFor, RxVirtualScrollViewportComponent, FixedSizeVirtualScrollStrategy], }) export class MyComponent {} ``` @@ -537,11 +646,7 @@ They also share two inputs to define the amount of views to actually render on t See the layouting technique in action in the following video. It compares `@rx-angular/template` vs. `@angular/cdk/scrolling` - + #### FixedSizeVirtualScrollStrategy @@ -769,7 +874,7 @@ this section covers a brief feature comparison between both implementations and | layout technique | absolutely position each view | transform a container within the viewport | | scheduling technique | [`RenderStrategies`](../../cdk/render-strategies/strategies/concurrent-strategies.md) | `requestAnimationFrame` | | renderCallback | ✅ | ❌ | -| SSR | ⚠ - to be tested | ✅ | +| SSR | ⚠ - to be tested | ✅ | | Define visible view buffer | configurable amount of views displayed in scroll direction,
and opposite scroll direction | configurable buffer in px | | trackBy | ✅ | ✅ | | View recycling | ✅ | ✅ | @@ -908,18 +1013,14 @@ puts the most pressure on the virtual scrollers. | --------- | ---------------------------------------------------------- | | OS | `Pop!_OS 22.04 LTS` | | Browser | `Chromium Version 112.0.5615.49 (Official Build) (64-bit)` | -| Processor | `Intel® Core™ i7-9750H CPU @ 2.60GHz × 12` | +| Processor | `Intel® Core™ i7-9750H CPU @ 2.60GHz × 12` | ### Different Layout techniques The RxVirtualScrolling approach to layout items is to absolutely position every view inside the viewport. Therefore, it sets the `transform` property for each managed item. The CDK approach instead transforms the viewport. The following video showcases the difference. - + ### Fixed Size Strategy diff --git a/apps/docs/docs/template/concepts/local-variables.md b/apps/docs/docs/template/concepts/local-variables.md index 5daedbe63e..5d279eddc6 100644 --- a/apps/docs/docs/template/concepts/local-variables.md +++ b/apps/docs/docs/template/concepts/local-variables.md @@ -15,7 +15,9 @@ Both ways can reduce the usage of pipes the `async` pipe (or any other pipe). **With `async` pipe** ```html - {{ n | async }} {{ n | async}} {{ n | async}} + + {{ n | async }} {{ n | async}} {{ n | async}} + ``` **With `*rxLet` directive** diff --git a/apps/docs/docs/template/performance-issues/handling-view-and-content-queries.md b/apps/docs/docs/template/performance-issues/handling-view-and-content-queries.md index 8c936fe60b..4f39f82711 100644 --- a/apps/docs/docs/template/performance-issues/handling-view-and-content-queries.md +++ b/apps/docs/docs/template/performance-issues/handling-view-and-content-queries.md @@ -1,5 +1,40 @@ # Handling view and content queries (`parent`) +## Deprecation Note + +:::warning + +The `parent` flag being true is not needed anymore with the new [signal based view queries](https://angular.io/guide/signal-queries). + +The flag itself is deprecated now and will be removed in future versions. + +However, for the time being: if you are already using the signal queries, you definitely want to set the `parent` flag to be false. We highly recommend doing so, as it reduces the amount of +change detection cycles significantly, thus improving the runtime performance of your apps. + +You can do so by providing a custom `RxRenderStrategiesConfig`, see the following example: + +```typescript +// import +import { RxRenderStrategiesConfig, RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; + +// create configuration with parent flag to be false +const rxaConfig: RxRenderStrategiesConfig = { + parent: false, +}; + +// provide it, in best case on root level +{ + providers: [ + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: rxaConfig, + }, + ]; +} +``` + +::: + ## ViewChild example (rxLet) Structural directives maintain `EmbeddedViews` within a components' template. diff --git a/libs/cdk/CHANGELOG.md b/libs/cdk/CHANGELOG.md index 8582b87701..e11b11443f 100644 --- a/libs/cdk/CHANGELOG.md +++ b/libs/cdk/CHANGELOG.md @@ -2,6 +2,25 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +# [17.1.0](https://github.com/rx-angular/rx-angular/compare/cdk@17.0.1...cdk@17.1.0) (2024-05-17) + + +### Features + +* accept subscribable on rx-let input ([#1721](https://github.com/rx-angular/rx-angular/issues/1721)) ([897a5b0](https://github.com/rx-angular/rx-angular/commit/897a5b00e4101f1ab6463f4386aa7dff876dc840)) +* **template:** deprecate parent flag ([a4592e3](https://github.com/rx-angular/rx-angular/commit/a4592e3d26df6567ff4214bc907b245068ac9436)) + + + +## [17.0.1](https://github.com/rx-angular/rx-angular/compare/cdk@17.0.0...cdk@17.0.1) (2024-03-03) + + +### Bug Fixes + +* **cdk:** use `globalThis` instead of `ɵglobal` in zone-config ([384c423](https://github.com/rx-angular/rx-angular/commit/384c423f999bf770a46d1d015506234abaad03a6)), closes [#1670](https://github.com/rx-angular/rx-angular/issues/1670) + + + # [17.0.0](https://github.com/rx-angular/rx-angular/compare/cdk@16.0.0...cdk@17.0.0) (2023-11-17) diff --git a/libs/cdk/notifications/src/lib/create-template-notifier.ts b/libs/cdk/notifications/src/lib/create-template-notifier.ts index 5e0ffc3918..a9ac49d23f 100644 --- a/libs/cdk/notifications/src/lib/create-template-notifier.ts +++ b/libs/cdk/notifications/src/lib/create-template-notifier.ts @@ -5,6 +5,7 @@ import { Observable, ObservableInput, ReplaySubject, + Subscribable, } from 'rxjs'; import { distinctUntilChanged, @@ -90,11 +91,13 @@ const handleSuspenseAndLastValueInNotifications = () => { */ export function createTemplateNotifier(): { values$: Observable>; - next(observable: ObservableInput | U): void; + next(observable: ObservableInput | U | Subscribable): void; withInitialSuspense(withInitialSuspense: boolean): void; } { // A Subject driven from the outside, it can contain Observables, static values null and undefined on purpose of from unassigned properties - const observablesSubject = new ReplaySubject | U>(1); + const observablesSubject = new ReplaySubject< + ObservableInput | U | Subscribable + >(1); let emittedValueOnce = false; @@ -104,6 +107,8 @@ export function createTemplateNotifier(): { map((observable$): ObservableInput | U => { if (isObservableInput(observable$)) { return skipSuspenseIfHasValue(observable$); + } else if (isSubscribableInput(observable$)) { + return skipSuspenseIfHasValue(mapSubscribableToObservable(observable$)); } else if (!emittedValueOnce && observable$ === undefined) { return NEVER; } @@ -114,13 +119,13 @@ export function createTemplateNotifier(): { tap(() => (emittedValueOnce = true)), distinctUntilChanged(), rxMaterialize(), - map(handleSuspenseAndLastValueInNotifications()) + map(handleSuspenseAndLastValueInNotifications()), ); - }) + }), ); return { - next(observable: ObservableInput | U) { + next(observable: ObservableInput | U | Subscribable) { observablesSubject.next(observable); }, withInitialSuspense(withInitialSuspense: boolean) { @@ -138,7 +143,7 @@ export function createTemplateNotifier(): { * @param observable$ */ function skipSuspenseIfHasValue( - observable$: ObservableInput + observable$: ObservableInput, ): Observable { return new Observable((subscriber) => { let startWithUndefined = true; @@ -168,3 +173,16 @@ function isObservableInput(input: unknown): input is ObservableInput { typeof (input as Promise)?.then === 'function' || isObservable(input) ); } + +function isSubscribableInput(input: unknown): input is Subscribable { + return typeof (input as Subscribable)?.subscribe === 'function'; +} + +function mapSubscribableToObservable(input: Subscribable): Observable { + return new Observable((subscriber) => { + const sub = input.subscribe({ next: (value) => subscriber.next(value) }); + return () => { + sub.unsubscribe(); + }; + }); +} diff --git a/libs/cdk/package.json b/libs/cdk/package.json index 2f644fde4f..5f05e5ce2f 100644 --- a/libs/cdk/package.json +++ b/libs/cdk/package.json @@ -1,6 +1,6 @@ { "name": "@rx-angular/cdk", - "version": "17.0.0", + "version": "17.1.0", "description": "@rx-angular/cdk is a Component Development Kit for ergonomic and highly performant angular applications. It helps to to build Large scale applications, UI libs, state management, rendering systems and much more. Furthermore the unique way of mixing reactive as well as imperative code leads to best DX and speed.", "publishConfig": { "access": "public" diff --git a/libs/cdk/render-strategies/src/lib/config.ts b/libs/cdk/render-strategies/src/lib/config.ts index 45cdc278cc..64956cba54 100644 --- a/libs/cdk/render-strategies/src/lib/config.ts +++ b/libs/cdk/render-strategies/src/lib/config.ts @@ -11,6 +11,9 @@ export interface RxRenderStrategiesConfig { primaryStrategy?: RxStrategyNames; customStrategies?: RxCustomStrategyCredentials; patchZone?: boolean; + /** + * @deprecated This flag will be dropped soon, as it is no longer required when using signal based view & content queries + */ parent?: boolean; } @@ -31,7 +34,7 @@ export const RX_RENDER_STRATEGIES_DEFAULTS: Required< } as const; export function mergeDefaultConfig( - cfg?: RxRenderStrategiesConfig + cfg?: RxRenderStrategiesConfig, ): Required> { const custom: RxRenderStrategiesConfig = cfg ? cfg diff --git a/libs/cdk/schematics/src/migrations/update-1.0.0-beta.1/__snapshots__/index.spec.ts.snap b/libs/cdk/schematics/src/migrations/update-1.0.0-beta.1/__snapshots__/index.spec.ts.snap index 3c9edc8cd2..f29531b262 100644 --- a/libs/cdk/schematics/src/migrations/update-1.0.0-beta.1/__snapshots__/index.spec.ts.snap +++ b/libs/cdk/schematics/src/migrations/update-1.0.0-beta.1/__snapshots__/index.spec.ts.snap @@ -1,332 +1,236 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`cdk migration 1.0.0-beta.1 should replace coalescing 1`] = ` -"import { - RxCoalescingOptions, - coalescingObj, - coalesceWith, - coalescingManager, - CoalescingManager, -} from '@rx-angular/cdk/coalescing'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { RxCoalescingOptions, coalescingObj, coalesceWith, coalescingManager, CoalescingManager } from "@rx-angular/cdk/coalescing"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace coercing 1`] = ` -"import { - coerceObservable, - coerceObservableWith, - coerceDistinctObservable, - coerceDistinctWith, - coerceAllFactory, -} from '@rx-angular/cdk/coercing'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { coerceObservable, coerceObservableWith, coerceDistinctObservable, coerceDistinctWith, coerceAllFactory } from "@rx-angular/cdk/coercing"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace internals-scheduler 1`] = ` -"import { - cancelCallback, - scheduleCallback, - forceFrameRate, - PriorityLevel, -} from '@rx-angular/cdk/internals/scheduler'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { cancelCallback, scheduleCallback, forceFrameRate, PriorityLevel } from "@rx-angular/cdk/internals/scheduler"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace notifications 1`] = ` -"import { - RxNotificationKind, - RxNotification, - RxCompleteNotification, - RxErrorNotification, - RxNextNotification, - RxNotificationValue, - RxSuspenseNotification, - toRxErrorNotification, - toRxSuspenseNotification, - toRxCompleteNotification, - templateTriggerHandling, - rxMaterialize, - createTemplateNotifier, -} from '@rx-angular/cdk/notifications'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { RxNotificationKind, RxNotification, RxCompleteNotification, RxErrorNotification, RxNextNotification, RxNotificationValue, RxSuspenseNotification, toRxErrorNotification, toRxSuspenseNotification, toRxCompleteNotification, templateTriggerHandling, rxMaterialize, createTemplateNotifier } from "@rx-angular/cdk/notifications"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace render-strategies 1`] = ` -"import { - ScheduleOnStrategyOptions, - RX_CONCURRENT_STRATEGIES, - RxConcurrentStrategies, - RX_NATIVE_STRATEGIES, - RxNativeStrategies, - onStrategy, - strategyHandling, - RxStrategies, - RxStrategyNames, - RxDefaultStrategyNames, - RxConcurrentStrategyNames, - RxNativeStrategyNames, - RxCustomStrategyCredentials, - RxStrategyCredentials, - RxRenderBehavior, - RxRenderWork, - RX_RENDER_STRATEGIES_CONFIG, - RX_RENDER_STRATEGIES_DEFAULTS, - RxRenderStrategiesConfig, -} from '@rx-angular/cdk/render-strategies'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [ - { - provide: RX_RENDER_STRATEGIES_CONFIG, - useValue: RX_RENDER_STRATEGIES_DEFAULTS, - }, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { ScheduleOnStrategyOptions, RX_CONCURRENT_STRATEGIES, RxConcurrentStrategies, RX_NATIVE_STRATEGIES, RxNativeStrategies, onStrategy, strategyHandling, RxStrategies, RxStrategyNames, RxDefaultStrategyNames, RxConcurrentStrategyNames, RxNativeStrategyNames, RxCustomStrategyCredentials, RxStrategyCredentials, RxRenderBehavior, RxRenderWork, RX_RENDER_STRATEGIES_CONFIG, RX_RENDER_STRATEGIES_DEFAULTS, RxRenderStrategiesConfig } from "@rx-angular/cdk/render-strategies"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [ + { provide: RX_RENDER_STRATEGIES_CONFIG, useValue: RX_RENDER_STRATEGIES_DEFAULTS } + ], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace state 1`] = ` -"import { - ObservableAccumulation, - ObservableMap, - accumulateObservables, -} from '@rx-angular/cdk/internals/core'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { ObservableAccumulation, ObservableMap, accumulateObservables } from "@rx-angular/cdk/internals/core"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace template 1`] = ` -"import { - templateHandling, - RxBaseTemplateNames, - RxRenderAware, - RxViewContext, - rxBaseTemplateNames, - RxTemplateManager, - createTemplateManager, - RxNotificationTemplateNameMap, - RxListManager, - createListTemplateManager, - RxListViewComputedContext, - RxDefaultListViewContext, - RxListViewContext, -} from '@rx-angular/cdk/template'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { templateHandling, RxBaseTemplateNames, RxRenderAware, RxViewContext, rxBaseTemplateNames, RxTemplateManager, createTemplateManager, RxNotificationTemplateNameMap, RxListManager, createListTemplateManager, RxListViewComputedContext, RxDefaultListViewContext, RxListViewContext } from "@rx-angular/cdk/template"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace zone-configurations 1`] = ` -"import { - focusEvents, - mouseEvents, - wheelEvents, - inputEvents, - formControlsEvents, - keyboardEvents, - vrEvents, - mSGestureEvents, - printEvents, - networkEvents, - audioEvents, - compositionEvents, - touchEvents, - globalEvents, - websocketEvents, - xhrEvents, - windowEvents, - allEvents, - EventTarget, - RxZoneFlagsHelperFunctions, - RxZoneGlobalConfigurations, - RxZoneTestConfigurations, - RxZoneRuntimeConfigurations, - zoneConfig, -} from '@rx-angular/cdk/zone-configurations'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { focusEvents, mouseEvents, wheelEvents, inputEvents, formControlsEvents, keyboardEvents, vrEvents, mSGestureEvents, printEvents, networkEvents, audioEvents, compositionEvents, touchEvents, globalEvents, websocketEvents, xhrEvents, windowEvents, allEvents, EventTarget, RxZoneFlagsHelperFunctions, RxZoneGlobalConfigurations, RxZoneTestConfigurations, RxZoneRuntimeConfigurations, zoneConfig } from "@rx-angular/cdk/zone-configurations"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace zone-less 1`] = ` -"import { - asyncScheduler, - asapScheduler, - queueScheduler, - animationFrameScheduler, - interval, - timer, - fromEvent, -} from '@rx-angular/cdk/zone-less/rxjs'; -import { - Promise as unpatchedPromise, - requestAnimationFrame, - cancelAnimationFrame, - setInterval, - clearInterval, - setTimeout, - clearTimeout, - unpatchAddEventListener, -} from '@rx-angular/cdk/zone-less/browser'; -import { getZoneUnPatchedApi } from '@rx-angular/cdk/internals/core'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { coerceObservableWith } from '@rx-angular/cdk/coercing'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { asyncScheduler, asapScheduler, queueScheduler, animationFrameScheduler, interval, timer, fromEvent } from "@rx-angular/cdk/zone-less/rxjs"; +import { Promise as unpatchedPromise, requestAnimationFrame, cancelAnimationFrame, setInterval, clearInterval, setTimeout, clearTimeout, unpatchAddEventListener } from "@rx-angular/cdk/zone-less/browser"; +import { getZoneUnPatchedApi } from "@rx-angular/cdk/internals/core"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { coerceObservableWith } from '@rx-angular/cdk/coercing'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace zone-less in edge case 1`] = ` -"import { setTimeout } from '@rx-angular/cdk/zone-less/browser'; - -import { - ChangeDetectionStrategy, - Component, - TrackByFunction, - ViewChild, -} from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; -import { RxState } from '@rx-angular/state'; -import { filter, map } from 'rxjs'; - -@Component({ - selector: 'app-shell', - templateUrl: './app-shell.component.html', - styleUrls: ['./app-shell.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [RxState], -}) -export class AppShellComponent {} -" +"import { setTimeout } from "@rx-angular/cdk/zone-less/browser"; + + import { ChangeDetectionStrategy, Component, TrackByFunction, ViewChild } from '@angular/core'; + import { NavigationEnd, Router } from '@angular/router'; + import { RxState } from '@rx-angular/state'; + import { filter, map } from 'rxjs'; + + @Component({ + selector: 'app-shell', + templateUrl: './app-shell.component.html', + styleUrls: ['./app-shell.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [RxState] + }) + export class AppShellComponent { } + " `; exports[`cdk migration 1.0.0-beta.1 should replace zone-less sub-entrypoint 1`] = ` -"import { - interval, - timer, - fromEvent, - asyncScheduler, - asapScheduler, - queueScheduler, - animationFrameScheduler, -} from '@rx-angular/cdk/zone-less/rxjs'; -import { - Promise, - requestAnimationFrame, - cancelAnimationFrame, - setInterval, - clearInterval, - setTimeout, - clearTimeout, - unpatchAddEventListener, -} from '@rx-angular/cdk/zone-less/browser'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { interval, timer, fromEvent, asyncScheduler, asapScheduler, queueScheduler, animationFrameScheduler } from "@rx-angular/cdk/zone-less/rxjs"; +import { Promise, requestAnimationFrame, cancelAnimationFrame, setInterval, clearInterval, setTimeout, clearTimeout, unpatchAddEventListener } from "@rx-angular/cdk/zone-less/browser"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; diff --git a/libs/cdk/schematics/src/utils/format-files.ts b/libs/cdk/schematics/src/utils/format-files.ts deleted file mode 100644 index 6787de1f81..0000000000 --- a/libs/cdk/schematics/src/utils/format-files.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CreateFileAction, noop, OverwriteFileAction, Rule, SchematicContext, Tree } from '@angular-devkit/schematics'; -import * as path from 'path'; -import { from } from 'rxjs'; -import { filter, map, mergeMap } from 'rxjs/operators'; - -export function formatFiles( - options: { skipFormat: boolean } = { skipFormat: false } -): Rule { - let prettier: any; - try { - prettier = require('prettier'); - } catch (e) {} - - if (options.skipFormat) { - return noop(); - } - - return (host: Tree, context: SchematicContext): any => { - if (!prettier) { - return host; - } - - const files = new Set( - host.actions - .filter((action) => action.kind !== 'd' && action.kind !== 'r') - .map((action) => ({ - path: action.path, - content: ( - action as OverwriteFileAction | CreateFileAction - ).content.toString(), - })) - ); - if (files.size === 0) { - return host; - } - return from(files).pipe( - filter((file) => host.exists(file.path)), - mergeMap(async (file) => { - const systemPath = path.join(process.cwd(), file.path); - let options: any = { - filepath: systemPath, - }; - const resolvedOptions = await prettier.resolveConfig(systemPath); - if (resolvedOptions) { - options = { - ...options, - ...resolvedOptions, - }; - } - const support = await prettier.getFileInfo(systemPath, options); - if (support.ignored || !support.inferredParser) { - return; - } - - try { - host.overwrite(file.path, prettier.format(file.content, options)); - } catch (e) { - context.logger.warn( - `Could not format ${file.path} because ${e.message}` - ); - } - }), - map(() => host) - ); - }; -} diff --git a/libs/cdk/schematics/src/utils/renaming-rule.ts b/libs/cdk/schematics/src/utils/renaming-rule.ts index 8bbc6ff7b4..6951192003 100644 --- a/libs/cdk/schematics/src/utils/renaming-rule.ts +++ b/libs/cdk/schematics/src/utils/renaming-rule.ts @@ -9,7 +9,6 @@ import { saveActiveProject, setActiveProject, } from 'ng-morph'; -import { formatFiles } from './format-files'; type ImportConfig = Pick; type RenameConfig = Record; @@ -20,6 +19,9 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { return (): Rule => { return chain([ (tree: Tree) => { + console.log( + 'Migration schematics might cause your code to be formatted incorrectly. Make sure to run your formatter of choice after the migration.', + ); setActiveProject(createProject(tree, '/', ['**/*.ts'])); const imports = getImports('**/*.ts', { @@ -79,7 +81,6 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { saveActiveProject(); }, - formatFiles(), ]); }; } @@ -87,7 +88,7 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { function renameReferences( importSpecifier: ImportSpecifier, oldName: string, - newName: string + newName: string, ) { importSpecifier .getNameNode() diff --git a/libs/eslint-plugin/package.json b/libs/eslint-plugin/package.json index efbc7302af..7e0d0d2fc7 100644 --- a/libs/eslint-plugin/package.json +++ b/libs/eslint-plugin/package.json @@ -4,9 +4,9 @@ "peerDependencies": { "eslint": ">=8.0.0", "typescript": ">=4.3.5", - "@typescript-eslint/parser": "^6.10.0" + "@typescript-eslint/parser": "^6.13.2 || ^7.0.0" }, "dependencies": { - "@typescript-eslint/utils": "^6.10.0" + "@typescript-eslint/utils": "^6.13.2 || ^7.0.0" } } diff --git a/libs/isr/models/src/isr-handler-config.ts b/libs/isr/models/src/isr-handler-config.ts index 4b738fcbe6..023d8198d8 100644 --- a/libs/isr/models/src/isr-handler-config.ts +++ b/libs/isr/models/src/isr-handler-config.ts @@ -50,6 +50,12 @@ export interface ISRHandlerConfig { */ browserDistFolder?: string; + /** + * Reduce render blocking requests by inlining critical CSS. + * If not provided, defaults to true. + */ + inlineCriticalCss?: boolean; + /** * The build ID of the application. This value is used to generate unique cache keys. * If not provided, defaults to null. diff --git a/libs/isr/server/src/isr-handler.ts b/libs/isr/server/src/isr-handler.ts index 2b5f7f3bfb..6caaec8c37 100644 --- a/libs/isr/server/src/isr-handler.ts +++ b/libs/isr/server/src/isr-handler.ts @@ -45,14 +45,14 @@ export class ISRHandler { config.indexHtml, config.commonEngine, config.bootstrap, - config.browserDistFolder + config.browserDistFolder, ); } async invalidate( req: Request, res: Response, - config?: InvalidateConfig + config?: InvalidateConfig, ): Promise { const { token, urlsToInvalidate } = extractDataFromBody(req); const { indexHtml } = this.config; @@ -125,20 +125,21 @@ export class ISRHandler { const invalidatedUrls = variantUrlsToInvalidate .map((val) => val.cacheKey) .filter( - (cacheKey) => !notInCache.includes(cacheKey) && !urlWithErrors[cacheKey] + (cacheKey) => + !notInCache.includes(cacheKey) && !urlWithErrors[cacheKey], ); if (notInCache.length) { this.logger.log( - `Urls: ${notInCache.join(', ')} does not exist in cache.` + `Urls: ${notInCache.join(', ')} does not exist in cache.`, ); } if (Object.keys(urlWithErrors).length) { this.logger.log( `Urls: ${Object.keys(urlWithErrors).join( - ', ' - )} had errors while regenerating!` + ', ', + )} had errors while regenerating!`, ); } @@ -181,7 +182,7 @@ export class ISRHandler { req: Request, res: Response, next: NextFunction, - config?: ServeFromCacheConfig + config?: ServeFromCacheConfig, ): Promise { try { const variant = this.getVariant(req); @@ -208,7 +209,7 @@ export class ISRHandler { res, cacheData, this.logger, - config?.providers + config?.providers, ); } } @@ -226,7 +227,7 @@ export class ISRHandler { // Cache exists. Send it. this.logger.log( `Page was retrieved from cache: `, - getCacheKey(req.url, variant) + getCacheKey(req.url, variant), ); return res.send(finalHtml); } catch (error) { @@ -239,7 +240,7 @@ export class ISRHandler { req: Request, res: Response, next: NextFunction, - config?: RenderConfig + config?: RenderConfig, ): Promise { const renderUrlConfig: RenderUrlConfig = { req, @@ -250,6 +251,7 @@ export class ISRHandler { bootstrap: this.config.bootstrap, commonEngine: this.config.commonEngine, browserDistFolder: this.config.browserDistFolder, + inlineCriticalCss: this.config.inlineCriticalCss, }; renderUrl(renderUrlConfig).then(async (html) => { @@ -298,7 +300,7 @@ export class ISRHandler { } const extractDataFromBody = ( - req: Request + req: Request, ): { token: string | null; urlsToInvalidate: string[] } => { const { urlsToInvalidate, token } = req.body; return { urlsToInvalidate, token }; diff --git a/libs/isr/server/src/utils/render-url.ts b/libs/isr/server/src/utils/render-url.ts index 486e1e292a..a7a07ec97b 100644 --- a/libs/isr/server/src/utils/render-url.ts +++ b/libs/isr/server/src/utils/render-url.ts @@ -14,6 +14,7 @@ export interface RenderUrlConfig { commonEngine?: CommonEngine; bootstrap?: CommonEngineRenderOptions['bootstrap']; browserDistFolder?: string; + inlineCriticalCss?: boolean; } const EXTRA_PROVIDERS: Provider[] = [ @@ -31,6 +32,7 @@ export const renderUrl = async (options: RenderUrlConfig): Promise => { commonEngine, bootstrap, browserDistFolder, + inlineCriticalCss, } = options; const { protocol, originalUrl, baseUrl, headers } = req; @@ -56,6 +58,7 @@ export const renderUrl = async (options: RenderUrlConfig): Promise => { documentFilePath: indexHtml, url: `${protocol}://${headers.host}${originalUrl}`, publicPath: browserDistFolder, + inlineCriticalCss: inlineCriticalCss ?? true, providers: [...allProviders] as StaticProvider[], // we need to cast to StaticProvider[] because of a bug in the types }) .then((html) => { @@ -73,7 +76,7 @@ export const renderUrl = async (options: RenderUrlConfig): Promise => { reject(err); } resolve(html); - } + }, ); } }); diff --git a/libs/state/schematics/src/migrations/update-1.4.7/__snapshots__/index.spec.ts.snap b/libs/state/schematics/src/migrations/update-1.4.7/__snapshots__/index.spec.ts.snap index ccb017f094..4097c482ed 100644 --- a/libs/state/schematics/src/migrations/update-1.4.7/__snapshots__/index.spec.ts.snap +++ b/libs/state/schematics/src/migrations/update-1.4.7/__snapshots__/index.spec.ts.snap @@ -1,73 +1,58 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`state migration update-1.4.7 should keep rx-angular/state 1`] = ` -"import { RxState } from '@rx-angular/state'; +"import { RxState } from "@rx-angular/state"; -import { Injectable } from '@angular/core'; -import { map } from 'rxjs'; + import { Injectable } from '@angular/core'; + import { map } from 'rxjs'; -@Injectable({ - providedIn: 'root', -}) -export class AuthStateService extends RxState {} -" + @Injectable({ + providedIn: 'root', + }) + export class AuthStateService extends RxState{ } + " `; exports[`state migration update-1.4.7 should replace cdk/state 1`] = ` -"import { - createSideEffectObservable, - createAccumulationObservable, - select, - stateful, - distinctUntilSomeChanged, - selectSlice, - KeyCompareMap, - CompareFn, - PickSlice, -} from '@rx-angular/state/selections'; -import { RxState } from '@rx-angular/state'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [RxState], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { createSideEffectObservable, createAccumulationObservable, select, stateful, distinctUntilSomeChanged, selectSlice, KeyCompareMap, CompareFn, PickSlice } from "@rx-angular/state/selections"; +import { RxState } from "@rx-angular/state"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [RxState], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`state migration update-1.4.7 should replace cdk/transformations 1`] = ` -"import { RxState } from '@rx-angular/state'; -import { - insert, - remove, - toDictionary, - update, - extract, - upsert, - setProp, - patch, - deleteProp, - dictionaryToArray, - toggle, - slice, -} from '@rx-angular/cdk/transformations'; - -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule], - providers: [RxState], - bootstrap: [AppComponent], -}) -export class AppModule {} -" +"import { RxState } from "@rx-angular/state"; +import { insert, remove, toDictionary, update, extract, upsert, setProp, patch, deleteProp, dictionaryToArray, toggle, slice } from "@rx-angular/cdk/transformations"; + + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; + + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule + ], + providers: [RxState], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; diff --git a/libs/state/schematics/src/utils/format-files.ts b/libs/state/schematics/src/utils/format-files.ts deleted file mode 100644 index 6787de1f81..0000000000 --- a/libs/state/schematics/src/utils/format-files.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CreateFileAction, noop, OverwriteFileAction, Rule, SchematicContext, Tree } from '@angular-devkit/schematics'; -import * as path from 'path'; -import { from } from 'rxjs'; -import { filter, map, mergeMap } from 'rxjs/operators'; - -export function formatFiles( - options: { skipFormat: boolean } = { skipFormat: false } -): Rule { - let prettier: any; - try { - prettier = require('prettier'); - } catch (e) {} - - if (options.skipFormat) { - return noop(); - } - - return (host: Tree, context: SchematicContext): any => { - if (!prettier) { - return host; - } - - const files = new Set( - host.actions - .filter((action) => action.kind !== 'd' && action.kind !== 'r') - .map((action) => ({ - path: action.path, - content: ( - action as OverwriteFileAction | CreateFileAction - ).content.toString(), - })) - ); - if (files.size === 0) { - return host; - } - return from(files).pipe( - filter((file) => host.exists(file.path)), - mergeMap(async (file) => { - const systemPath = path.join(process.cwd(), file.path); - let options: any = { - filepath: systemPath, - }; - const resolvedOptions = await prettier.resolveConfig(systemPath); - if (resolvedOptions) { - options = { - ...options, - ...resolvedOptions, - }; - } - const support = await prettier.getFileInfo(systemPath, options); - if (support.ignored || !support.inferredParser) { - return; - } - - try { - host.overwrite(file.path, prettier.format(file.content, options)); - } catch (e) { - context.logger.warn( - `Could not format ${file.path} because ${e.message}` - ); - } - }), - map(() => host) - ); - }; -} diff --git a/libs/state/schematics/src/utils/renaming-rule.ts b/libs/state/schematics/src/utils/renaming-rule.ts index 8bbc6ff7b4..6951192003 100644 --- a/libs/state/schematics/src/utils/renaming-rule.ts +++ b/libs/state/schematics/src/utils/renaming-rule.ts @@ -9,7 +9,6 @@ import { saveActiveProject, setActiveProject, } from 'ng-morph'; -import { formatFiles } from './format-files'; type ImportConfig = Pick; type RenameConfig = Record; @@ -20,6 +19,9 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { return (): Rule => { return chain([ (tree: Tree) => { + console.log( + 'Migration schematics might cause your code to be formatted incorrectly. Make sure to run your formatter of choice after the migration.', + ); setActiveProject(createProject(tree, '/', ['**/*.ts'])); const imports = getImports('**/*.ts', { @@ -79,7 +81,6 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { saveActiveProject(); }, - formatFiles(), ]); }; } @@ -87,7 +88,7 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { function renameReferences( importSpecifier: ImportSpecifier, oldName: string, - newName: string + newName: string, ) { importSpecifier .getNameNode() diff --git a/libs/state/selections/src/lib/operators/select.ts b/libs/state/selections/src/lib/operators/select.ts index 6fbd884dfa..cfbabbc58a 100644 --- a/libs/state/selections/src/lib/operators/select.ts +++ b/libs/state/selections/src/lib/operators/select.ts @@ -44,14 +44,14 @@ export function select(): MonoTypeOperatorFunction; * @docsCategory operators */ export function select( - op: OperatorFunction + op: OperatorFunction, ): OperatorFunction; /** * @internal */ export function select( op1: OperatorFunction, - op2: OperatorFunction + op2: OperatorFunction, ): OperatorFunction; /** * @internal @@ -59,7 +59,7 @@ export function select( export function select( op1: OperatorFunction, op2: OperatorFunction, - op3: OperatorFunction + op3: OperatorFunction, ): OperatorFunction; /** * @internal @@ -68,7 +68,7 @@ export function select( op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, - op4: OperatorFunction + op4: OperatorFunction, ): OperatorFunction; /** * @internal @@ -78,7 +78,7 @@ export function select( op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, - op5: OperatorFunction + op5: OperatorFunction, ): OperatorFunction; /** @@ -99,8 +99,8 @@ export function select( */ export function select( keys: K[], - fn: (slice: PickSlice) => R, - keyCompareMap?: KeyCompareMap> + fn?: (slice: PickSlice) => R, + keyCompareMap?: KeyCompareMap>, ): OperatorFunction; /** @@ -116,7 +116,7 @@ export function select( */ export function select( k: K, - fn: (val: T[K]) => R + fn: (val: T[K]) => R, ): OperatorFunction; /** @@ -134,14 +134,14 @@ export function select( * @return Observable */ export function select( - k1: K1 + k1: K1, ): OperatorFunction; /** * @internal */ export function select( k1: K1, - k2: K2 + k2: K2, ): OperatorFunction; /** * @internal @@ -150,7 +150,7 @@ export function select< T, K1 extends keyof T, K2 extends keyof T[K1], - K3 extends keyof T[K1][K2] + K3 extends keyof T[K1][K2], >(k1: K1, k2: K2, k3: K3): OperatorFunction; /** * @internal @@ -160,7 +160,7 @@ export function select< K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], - K4 extends keyof T[K1][K2][K3] + K4 extends keyof T[K1][K2][K3], >(k1: K1, k2: K2, k3: K3, k4: K4): OperatorFunction; /** * @internal @@ -171,13 +171,13 @@ export function select< K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], - K5 extends keyof T[K1][K2][K3][K4] + K5 extends keyof T[K1][K2][K3][K4], >( k1: K1, k2: K2, k3: K3, k4: K4, - k5: K5 + k5: K5, ): OperatorFunction; /** * @internal @@ -189,14 +189,14 @@ export function select< K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], - K6 extends keyof T[K1][K2][K3][K4][K5] + K6 extends keyof T[K1][K2][K3][K4][K5], >( k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, - k6: K6 + k6: K6, ): OperatorFunction; /** @@ -209,8 +209,8 @@ export function select>( | [k: string, fn: (val: unknown) => unknown] | [ keys: string[], - fn: (slice: unknown) => unknown, - keyCompareMap?: KeyCompareMap + fn?: (slice: unknown) => unknown, + keyCompareMap?: KeyCompareMap, ] ): OperatorFunction { return (state$: Observable) => { @@ -219,18 +219,21 @@ export function select>( } else if (isStringAndFunctionTupleGuard(opOrMapFn)) { return state$.pipe(stateful(map((s) => opOrMapFn[1](s[opOrMapFn[0]])))); } else if (isStringArrayFunctionAndOptionalObjectTupleGuard(opOrMapFn)) { - return state$.pipe( - selectSlice( - opOrMapFn[0] as (keyof T)[], - opOrMapFn[2] - ), - stateful(map(opOrMapFn[1])) - ); + const selectedState$: Observable> = + state$.pipe( + selectSlice( + opOrMapFn[0] as (keyof T)[], + opOrMapFn[2] as KeyCompareMap<{ [P in keyof T]: (T & object)[P] }>, + ), + ); + return typeof opOrMapFn[1] === 'undefined' + ? selectedState$ + : selectedState$.pipe(stateful(map(opOrMapFn[1]))); } else if (isStringArrayGuard(opOrMapFn)) { return state$.pipe( stateful( - map((state) => opOrMapFn.reduce((acc, key) => acc?.[key], state)) - ) + map((state) => opOrMapFn.reduce((acc, key) => acc?.[key], state)), + ), ); } else if (isOperateFnArrayGuard(opOrMapFn)) { return state$.pipe(stateful(pipeFromArray(opOrMapFn))); diff --git a/libs/state/selections/src/lib/utils/guards.ts b/libs/state/selections/src/lib/utils/guards.ts index fad3abc472..141938366d 100644 --- a/libs/state/selections/src/lib/utils/guards.ts +++ b/libs/state/selections/src/lib/utils/guards.ts @@ -10,7 +10,7 @@ export function isPromiseGuard(value: unknown): value is Promise { } export function isOperateFnArrayGuard( - op: any[] + op: any[], ): op is OperatorFunction[] { if (!Array.isArray(op)) { return false; @@ -55,17 +55,17 @@ export function isDefined(val: unknown): val is NonNullable { } export function isStringAndFunctionTupleGuard( - op: unknown[] + op: unknown[], ): op is [string, (val: any) => R] { return typeof op[0] === 'string' && typeof op[1] === 'function'; } export function isStringArrayFunctionAndOptionalObjectTupleGuard( - op: unknown[] + op: unknown[], ): op is [strs: string[], fn: (val: any) => R, obj?: object] { return ( isStringArrayGuard(op[0] as any) && - typeof op[1] === 'function' && + (typeof op[1] === 'function' || typeof op[1] === 'undefined') && (op[2] === undefined || typeof op[2] === 'object') ); } diff --git a/libs/state/spec/rx-state.service.spec.ts b/libs/state/spec/rx-state.service.spec.ts index b677d70ccc..2a5768b288 100644 --- a/libs/state/spec/rx-state.service.spec.ts +++ b/libs/state/spec/rx-state.service.spec.ts @@ -8,11 +8,15 @@ import { PrimitiveState, } from '@test-helpers/rx-angular'; import { of, scheduled, Subject } from 'rxjs'; +import { ColdObservable } from 'rxjs/internal/testing/ColdObservable'; import { map, switchMap, take, takeUntil } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { RxState } from '../src/lib/rx-state.service'; +import { ReadOnly } from '../src/lib/rx-state.service'; import { createStateChecker } from './fixtures'; +type ReadOnlyPrimitiveState = Pick, ReadOnly>; + function setupState(cfg: { initialState?: T } = {}) { const { initialState } = { ...cfg }; const state = TestBed.inject(RxState); @@ -139,25 +143,33 @@ describe('RxStateService', () => { it('should return undefined as initial value', () => { const state = setupState({ initialState: undefined }); const val = state.get(); + const readOnlyVal = state.asReadOnly().get(); expect(val).toEqual(undefined); + expect(readOnlyVal).toEqual(undefined); }); it('should return undefined for an undefined property', () => { const state = setupState<{ num: number }>({ initialState: undefined }); const val = state.get('num'); + const readOnlyVal = state.asReadOnly().get('num'); expect(val).toEqual(undefined); + expect(readOnlyVal).toEqual(undefined); }); it('should return value when keys are provided as params', () => { const state = setupState({ initialState: initialPrimitiveState }); const val = state.get('num'); + const readOnlyVal = state.asReadOnly().get('num'); expect(val).toEqual(initialPrimitiveState.num); + expect(readOnlyVal).toEqual(initialPrimitiveState.num); }); it('should return whole state object when no keys provided', () => { const state = setupState({ initialState: initialPrimitiveState }); const val = state.get(); + const readOnlyVal = state.asReadOnly().get(); expect(val.num).toEqual(initialPrimitiveState.num); + expect(readOnlyVal.num).toEqual(initialPrimitiveState.num); }); }); @@ -166,6 +178,7 @@ describe('RxStateService', () => { testScheduler.run(({ expectObservable }) => { const state = setupState({ initialState: undefined }); expectObservable(state.select()).toBe('-'); + expectObservable(state.asReadOnly().select()).toBe('-'); }); }); @@ -175,14 +188,18 @@ describe('RxStateService', () => { expectObservable(state.select()).toBe('s', { s: initialPrimitiveState, }); + expectObservable(state.asReadOnly().select()).toBe('s', { + s: initialPrimitiveState, + }); }); }); it('should throw with wrong params', () => { const state = setupState({ initialState: initialPrimitiveState }); - - expect(() => state.select(true as any)).toThrowError( - 'wrong params passed to select' + const errorMessage = 'wrong params passed to select'; + expect(() => state.select(true as any)).toThrowError(errorMessage); + expect(() => state.asReadOnly().select(true as any)).toThrowError( + errorMessage, ); }); @@ -191,6 +208,7 @@ describe('RxStateService', () => { testScheduler.run(({ expectObservable }) => { const state = setupState({}); expectObservable(state.select()).toBe(''); + expectObservable(state.asReadOnly().select()).toBe(''); }); }); @@ -202,6 +220,9 @@ describe('RxStateService', () => { state.set({ num: 42 }); expectObservable(state.select('num')).toBe('s', { s: 42 }); + expectObservable(state.asReadOnly().select('num')).toBe('s', { + s: 42, + }); }); }); }); @@ -255,13 +276,25 @@ describe('RxStateService', () => { testScheduler.run(({ expectObservable }) => { const state = setupState({ initialState: initialPrimitiveState }); expectObservable( - state.select(['num', 'str'], ({ num, str }) => `${str}: ${num}`) + state.select(['num', 'str'], ({ num, str }) => `${str}: ${num}`), ).toBe('s', { s: `${initialPrimitiveState.str}: ${initialPrimitiveState.num}`, }); }); }); + it('should return mapped slice with default function if no one provided', () => { + testScheduler.run(({ expectObservable }) => { + const state = setupState({ initialState: initialPrimitiveState }); + expectObservable(state.select(['num', 'str'])).toBe('s', { + s: { + num: 42, + str: 'str', + }, + }); + }); + }); + it('should return mapped slice on select with keys, function and key compare map', () => { testScheduler.run(({ expectObservable }) => { const state = setupState({ @@ -271,8 +304,8 @@ describe('RxStateService', () => { state.select( ['num', 'obj'], ({ num, obj }) => `${num}: ${obj.key1.key11.key111}`, - { obj: (a, b) => a.key1.key11.key111 === b.key1.key11.key111 } - ) + { obj: (a, b) => a.key1.key11.key111 === b.key1.key11.key111 }, + ), ).toBe('s', { s: `${initialPrimitiveState.num}: ${initialNestedState.obj.key1.key11.key111}`, }); @@ -306,7 +339,7 @@ describe('RxStateService', () => { const state = setupState({ initialState: initialPrimitiveState }); expect(() => - state.set('wrong params passed to set' as any) + state.set('wrong params passed to set' as any), ).toThrowError('wrong param'); }); }); @@ -344,6 +377,16 @@ describe('RxStateService', () => { state.select().subscribe((s) => expect(s).toBe({ num: 43 })); }); }); + describe('with read only state', () => { + it('should throw error when trying to call set from readOnlyState', () => { + const readOnlyState: ReadOnlyPrimitiveState = setupState({ + initialState: initialPrimitiveState, + }).asReadOnly(); + expect((): void => { + readOnlyState['set']('num', (state: PrimitiveState) => state.num + 1); + }).toThrowError('readOnlyState.set is not a function'); + }); + }); }); describe('connect', () => { @@ -357,7 +400,7 @@ describe('RxStateService', () => { }); state.connect( - scheduled([{ num: 42 }, { num: 43 }, { num: 44 }], testScheduler) + scheduled([{ num: 42 }, { num: 43 }, { num: 44 }], testScheduler), ); }); }); @@ -375,8 +418,8 @@ describe('RxStateService', () => { 'num', scheduled( [{ num: 42 }, { num: 43 }, { num: 44 }], - testScheduler - ).pipe(map((s) => s.num)) + testScheduler, + ).pipe(map((s) => s.num)), ); }); }); @@ -392,7 +435,7 @@ describe('RxStateService', () => { state.connect( scheduled([{ num: 42 }, { num: 43 }, { num: 44 }], testScheduler), - (s, n) => ({ num: n.num }) + (s, n) => ({ num: n.num }), ); }); }); @@ -409,7 +452,7 @@ describe('RxStateService', () => { state.connect( 'num', scheduled([{ num: 42 }, { num: 43 }, { num: 44 }], testScheduler), - (s, v) => v.num + (s, v) => v.num, ); }); }); @@ -428,9 +471,9 @@ describe('RxStateService', () => { state.connect( scheduled( [{ num: undefined }, { num: 43 }, { num: undefined }], - testScheduler + testScheduler, ), - (o, n) => n + (o, n) => n, ); }); }); @@ -449,7 +492,7 @@ describe('RxStateService', () => { state.connect( 'num', scheduled([undefined, 43, undefined], testScheduler), - (o, n) => n + (o, n) => n, ); }); }); @@ -467,7 +510,7 @@ describe('RxStateService', () => { state.connect( 'num', - scheduled([undefined, 43, undefined], testScheduler) + scheduled([undefined, 43, undefined], testScheduler), ); }); }); @@ -486,9 +529,9 @@ describe('RxStateService', () => { state.connect( scheduled( [{ num: undefined }, { num: 43 }, { num: undefined }], - testScheduler + testScheduler, ), - (sta, newVal) => newVal + (sta, newVal) => newVal, ); }); }); @@ -497,7 +540,7 @@ describe('RxStateService', () => { const state = setupState({ initialState: initialPrimitiveState }); expect(() => state.connect('some string' as any)).toThrowError( - 'wrong params passed to connect' + 'wrong params passed to connect', ); }); @@ -559,15 +602,33 @@ describe('RxStateService', () => { switchMap(() => interval$.pipe( map((num) => ({ num })), - take(3) - ) - ) - ) + take(3), + ), + ), + ), ).toBe(''); expectSubscriptions(interval$.subscriptions).toBe(subs); state.ngOnDestroy(); }); }); + + it('should throw error when trying to call connect from readOnlyState', () => { + testScheduler.run(() => { + const s: { num: number | undefined } = { num: 0 }; + const readOnlyState: ReadOnlyPrimitiveState = setupState({ + initialState: s, + }).asReadOnly(); + expect((): void => { + readOnlyState['connect']( + scheduled( + [{ num: undefined }, { num: 43 }, { num: undefined }], + testScheduler, + ), + (o, n) => n, + ); + }).toThrowError('readOnlyState.connect is not a function'); + }); + }); }); describe('setAccumulator', () => { @@ -628,6 +689,22 @@ describe('RxStateService', () => { expect(numAcc1Calls).toBe(1); expect(numAcc2Calls).toBe(1); }); + it('should throw error when trying to call setAccumulator from readOnlyState', () => { + let numAccCalls = 0; + const customAcc = (s: T, sl: Partial) => { + ++numAccCalls; + return { + ...s, + ...sl, + }; + }; + const readOnlyState: ReadOnlyPrimitiveState = setupState({ + initialState: initialPrimitiveState, + }).asReadOnly(); + expect((): void => { + readOnlyState['setAccumulator'](customAcc); + }).toThrowError('readOnlyState.setAccumulator is not a function'); + }); }); describe('hold', () => { @@ -653,5 +730,22 @@ describe('RxStateService', () => { state.hold(of(1, 2, 3), effect); expect(calls).toBe(3); })); + + it('should throw error when trying to call hold from readOnlyState', () => { + testScheduler.run(({ cold, expectSubscriptions }) => { + const readOnlyState: ReadOnlyPrimitiveState = setupState({ + initialState: initialPrimitiveState, + }).asReadOnly(); + const test$: ColdObservable = cold('(abc)', { + a: 1, + b: 2, + c: 3, + }); + const stop: Subject = new Subject(); + expect((): void => { + readOnlyState['hold'](test$.pipe(takeUntil(stop))); + }).toThrowError('readOnlyState.hold is not a function'); + }); + }); }); }); diff --git a/libs/state/src/lib/rx-state.service.ts b/libs/state/src/lib/rx-state.service.ts index aab643439e..7b76b6f324 100644 --- a/libs/state/src/lib/rx-state.service.ts +++ b/libs/state/src/lib/rx-state.service.ts @@ -30,15 +30,23 @@ import { import { catchError, map, tap } from 'rxjs/operators'; import { createSignalStateProxy, SignalStateProxy } from './signal-state-proxy'; -export type ProjectStateFn = (oldState: T) => Partial; -export type ProjectValueFn = (oldState: T) => T[K]; +export type ProjectStateFn = (oldState: Type) => Partial; -export type ProjectStateReducer = (oldState: T, value: V) => Partial; +export type ProjectValueFn = ( + oldState: Type, +) => Type[Key]; -export type ProjectValueReducer = ( - oldState: T, - value: V -) => T[K]; +export type ProjectStateReducer = ( + oldState: Type, + value: Value, +) => Partial; + +export type ProjectValueReducer = ( + oldState: Type, + value: Value, +) => Type[Key]; + +export type ReadOnly = 'get' | 'select' | 'computed' | 'signal'; /** * @description @@ -60,22 +68,24 @@ export type ProjectValueReducer = ( * @docsPage RxState */ @Injectable() -export class RxState implements OnDestroy, Subscribable { +export class RxState + implements OnDestroy, Subscribable +{ private subscription = new Subscription(); - private accumulator = createAccumulationObservable(); + private accumulator = createAccumulationObservable(); private effectObservable = createSideEffectObservable(); private readonly injector = inject(Injector); - private signalStoreProxy: SignalStateProxy; + private signalStoreProxy: SignalStateProxy; /** * @description - * The unmodified state exposed as `Observable`. It is not shared, distinct or gets replayed. + * The unmodified state exposed as `Observable`. It is not shared, distinct or gets replayed. * Use the `$` property if you want to read the state without having applied {@link stateful} to it. */ - readonly $: Observable = this.accumulator.signal$; + readonly $: Observable = this.accumulator.signal$; /** * @internal @@ -91,6 +101,31 @@ export class RxState implements OnDestroy, Subscribable { this.subscription.unsubscribe(); } + /** + * @description + * + * Return RxState in ReadOnly mode exposing only methods for reading state + * get(), select(), computed() and signal() methods. + * This can be helpful when you don't want others to write in your state. + * + * @example + * ```typescript + * const readOnlyState = state.asReadOnly(); + * const getNum = state.get('num'); + * const selectNum$ = state.select('num'); + * ``` + * + * @return Pick, ReadOnly> + */ + asReadOnly(): Pick, ReadOnly> { + return { + get: this.get.bind(this), + select: this.select.bind(this), + computed: this.computed.bind(this), + signal: this.signal.bind(this), + }; + } + /** * @description * @@ -103,6 +138,9 @@ export class RxState implements OnDestroy, Subscribable { * * this.state.setAccumulator(myAccumulator); * ``` + * + * @param {AccumulationFn} accumulatorFn + * @return void */ setAccumulator(accumulatorFn: AccumulationFn): void { this.accumulator.nextAccumulator(accumulatorFn); @@ -118,9 +156,9 @@ export class RxState implements OnDestroy, Subscribable { * doStuff(); * } * - * @return T + * @return State */ - get(): T; + get(): State; /** * @description @@ -129,89 +167,115 @@ export class RxState implements OnDestroy, Subscribable { * * @example * // Access a single property - * * const bar = state.get('bar'); * * // Access a nested property - * * const foo = state.get('bar', 'foo'); * - * @return T | T[K1] | T[K1][K2] + * @param {KeyA} keyA + * @return State[KeyA] */ + get(keyA: KeyA): State[KeyA]; - get(k1: K1): T[K1]; /** @internal **/ - get(k1: K1, k2: K2): T[K1][K2]; + get( + keyA: KeyA, + keyB: KeyB, + ): State[KeyA][KeyB]; + /** @internal **/ - get( - k1: K1, - k2: K2, - k3: K3 - ): T[K1][K2][K3]; + get< + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + >(keyA: KeyA, keyB: KeyB, keyC: KeyC): State[KeyA][KeyB][KeyC]; + /** @internal **/ get< - K1 extends keyof T, - K2 extends keyof T[K1], - K3 extends keyof T[K1][K2], - K4 extends keyof T[K1][K2][K3] - >(k1: K1, k2: K2, k3: K3, k4: K4): T[K1][K2][K3][K4]; + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + KeyD extends keyof State[KeyA][KeyB][KeyC], + >( + keyA: KeyA, + keyB: KeyB, + keyC: KeyC, + keyD: KeyD, + ): State[KeyA][KeyB][KeyC][KeyD]; + /** @internal **/ get< - K1 extends keyof T, - K2 extends keyof T[K1], - K3 extends keyof T[K1][K2], - K4 extends keyof T[K1][K2][K3], - K5 extends keyof T[K1][K2][K3][K4] - >(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): T[K1][K2][K3][K4][K5]; + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + KeyD extends keyof State[KeyA][KeyB][KeyC], + KeyE extends keyof State[KeyA][KeyB][KeyC][KeyD], + >( + keyA: KeyA, + keyB: KeyB, + keyC: KeyC, + keyD: KeyD, + keyE: KeyE, + ): State[KeyA][KeyB][KeyC][KeyD][KeyE]; + /** @internal **/ get< - K1 extends keyof T, - K2 extends keyof T[K1], - K3 extends keyof T[K1][K2], - K4 extends keyof T[K1][K2][K3], - K5 extends keyof T[K1][K2][K3][K4], - K6 extends keyof T[K1][K2][K3][K4][K5] - >(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6): T[K1][K2][K3][K4][K5][K6]; + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + KeyD extends keyof State[KeyA][KeyB][KeyC], + KeyE extends keyof State[KeyA][KeyB][KeyC][KeyD], + KeyF extends keyof State[KeyA][KeyB][KeyC][KeyD][KeyE], + >( + keyA: KeyA, + keyB: KeyB, + keyC: KeyC, + keyD: KeyD, + keyE: KeyE, + keyF: KeyF, + ): State[KeyA][KeyB][KeyC][KeyD][KeyE][KeyF]; + /** @internal **/ get< - K1 extends keyof T, - K2 extends keyof T[K1], - K3 extends keyof T[K1][K2], - K4 extends keyof T[K1][K2][K3], - K5 extends keyof T[K1][K2][K3][K4], - K6 extends keyof T[K1][K2][K3][K4][K5] + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + KeyD extends keyof State[KeyA][KeyB][KeyC], + KeyE extends keyof State[KeyA][KeyB][KeyC][KeyD], + KeyF extends keyof State[KeyA][KeyB][KeyC][KeyD][KeyE], >( ...keys: - | [K1] - | [K1, K2] - | [K1, K2, K3] - | [K1, K2, K3, K4] - | [K1, K2, K3, K4, K5] - | [K1, K2, K3, K4, K5, K6] + | [KeyA] + | [KeyA, KeyB] + | [KeyA, KeyB, KeyC] + | [KeyA, KeyB, KeyC, KeyD] + | [KeyA, KeyB, KeyC, KeyD, KeyE] + | [KeyA, KeyB, KeyC, KeyD, KeyE, KeyF] ): - | T - | T[K1] - | T[K1][K2] - | T[K1][K2][K3] - | T[K1][K2][K3][K4] - | T[K1][K2][K3][K4][K5] - | T[K1][K2][K3][K4][K5][K6] { + | State + | State[KeyA] + | State[KeyA][KeyB] + | State[KeyA][KeyB][KeyC] + | State[KeyA][KeyB][KeyC][KeyD] + | State[KeyA][KeyB][KeyC][KeyD][KeyE] + | State[KeyA][KeyB][KeyC][KeyD][KeyE][KeyF] { const hasStateAnyKeys = Object.keys(this.accumulator.state).length > 0; if (!!keys && keys.length) { return safePluck(this.accumulator.state, keys); } else { return hasStateAnyKeys ? this.accumulator.state - : (undefined as unknown as T); + : (undefined as unknown as State); } } /** * @description - * Manipulate one or many properties of the state by providing a `Partial` state or a `ProjectionFunction`. + * Manipulate one or many properties of the state by providing + * a `Partial`state or a `ProjectionFunction`. * * @example - * // Update one or many properties of the state by providing a `Partial` + * // Update one or many properties of the state by providing a `Partial` * * const partialState = { * foo: 'bar', @@ -219,37 +283,40 @@ export class RxState implements OnDestroy, Subscribable { * }; * state.set(partialState); * - * // Update one or many properties of the state by providing a `ProjectionFunction` + * // Update one or many properties of the state by providing a `ProjectionFunction` * * const reduceFn = oldState => ({ * bar: oldState.bar + 5 * }); * state.set(reduceFn); * - * @param {Partial|ProjectStateFn} stateOrProjectState + * @param {Partial|ProjectStateFn} stateOrProjectState * @return void */ - set(stateOrProjectState: Partial | ProjectStateFn): void; + set(stateOrProjectState: Partial | ProjectStateFn): void; /** * @description - * Manipulate a single property of the state by the property name and a `ProjectionFunction`. + * Manipulate a single property of the state by the property name and a `ProjectionFunction`. * * @example * const reduceFn = oldState => oldState.bar + 5; * state.set('bar', reduceFn); * - * @param {K} key - * @param {ProjectValueFn} projectSlice + * @param {Key} key + * @param {ProjectValueFn} projectSlice * @return void */ - set(key: K, projectSlice: ProjectValueFn): void; + set( + key: Key, + projectSlice: ProjectValueFn, + ): void; /** * @internal */ - set( - keyOrStateOrProjectState: Partial | ProjectStateFn | K, - stateOrSliceProjectFn?: ProjectValueFn + set( + keyOrStateOrProjectState: Partial | ProjectStateFn | Key, + stateOrSliceProjectFn?: ProjectValueFn, ): void { if ( typeof keyOrStateOrProjectState === 'object' && @@ -264,18 +331,18 @@ export class RxState implements OnDestroy, Subscribable { stateOrSliceProjectFn === undefined ) { this.accumulator.nextSlice( - keyOrStateOrProjectState(this.accumulator.state) + keyOrStateOrProjectState(this.accumulator.state), ); return; } if ( - isKeyOf(keyOrStateOrProjectState) && + isKeyOf(keyOrStateOrProjectState) && typeof stateOrSliceProjectFn === 'function' ) { - const state: Partial = {}; + const state: Partial = {}; state[keyOrStateOrProjectState] = stateOrSliceProjectFn( - this.accumulator.state + this.accumulator.state, ); this.accumulator.nextSlice(state); return; @@ -286,7 +353,7 @@ export class RxState implements OnDestroy, Subscribable { /** * @description - * Connect an `Observable>` to the state `T`. + * Connect an `Observable>` to the state `State`. * Any change emitted by the source will get merged into the state. * Subscription handling is done automatically. * @@ -307,66 +374,94 @@ export class RxState implements OnDestroy, Subscribable { * state.connect(sliceToAdd$, (state, slice) => state.bar += slice.bar); * // every 250ms the properties bar and foo get updated due to the emission of sliceToAdd$. Bar will increase by * // 5 due to the projectionFunction + * + * @param {Observable>} inputOrSlice$ + * @return void */ - connect(inputOrSlice$: Observable>): void; + connect(inputOrSlice$: Observable>): void; + /** * @description - * Connect a `Signal>` to the state `T`. + * Connect a `Signal>` to the state `State`. * Any change emitted by the source will get merged into the state. + * + * @param {Signal>} signal + * @return void */ - connect(signal: Signal>): void; + connect(signal: Signal>): void; /** * @description - * Connect an `Observable` to the state `T`. - * Any change emitted by the source will get forwarded to to project function and merged into the state. + * Connect an `Observable` to the state `State`. + * Any change emitted by the source will get forwarded to project function and merged into the state. * Subscription handling is done automatically. * * You have to provide a `projectionFunction` to access the current state object and do custom mappings. * * @example * const sliceToAdd$ = interval(250); - * state.connect(sliceToAdd$, (s, v) => ({bar: v})); + * state.connect(sliceToAdd$, (type, value) => ({bar: value})); * // every 250ms the property bar get updated due to the emission of sliceToAdd$ - * + * @param {Observable} inputOrSlice$ + * @param {ProjectStateReducer} projectFn + * @return void */ - connect( - inputOrSlice$: Observable, - projectFn: ProjectStateReducer + connect( + inputOrSlice$: Observable, + projectFn: ProjectStateReducer, ): void; + /** * @description - * Connect a `Signal` to the state `T`. + * Connect a `Signal` to the state `State`. * Any change emitted by the source will get forwarded to the project function and merged into the state. * * You have to provide a `projectionFunction` to access the current state object and do custom mappings. + * @param {Signal} signal + * @param {ProjectStateReducer} projectFn + * @return void */ - connect(signal: Signal, projectFn: ProjectStateReducer): void; + connect( + signal: Signal, + projectFn: ProjectStateReducer, + ): void; + /** * * @description - * Connect an `Observable` source to a specific property `K` in the state `T`. Any emitted change will update - * this - * specific property in the state. + * Connect an `Observable` source to a specific property `Key` in the state `State`. + * Any emitted change will update this specific property in the state. * Subscription handling is done automatically. * * @example * const myTimer$ = interval(250); * state.connect('timer', myTimer$); * // every 250ms the property timer will get updated + * @param {Key} key + * @param {Observable} slice$ + * + * @return void */ - connect(key: K, slice$: Observable): void; + connect( + key: Key, + slice$: Observable, + ): void; + /** * * @description - * Connect a `Signal` source to a specific property `K` in the state `T`. Any emitted change will update - * this specific property in the state. + * Connect a `Signal` source to a specific property `Key` in the state `State`. + * Any emitted change will update this specific property in the state. + * @param {Key} key + * @param {Signal} signal + * + * @return void */ - connect(key: K, signal: Signal): void; + connect(key: Key, signal: Signal): void; + /** - * * @description - * Connect an `Observable` source to a specific property in the state. Additionally you can provide a + * Connect an `Observable` source to a specific property in the state. Additionally, you can provide a * `projectionFunction` to access the current state object on every emission of your connected `Observable`. * Any change emitted by the source will get merged into the state. * Subscription handling is done automatically. @@ -375,35 +470,50 @@ export class RxState implements OnDestroy, Subscribable { * const myTimer$ = interval(250); * state.connect('timer', myTimer$, (state, timerChange) => state.timer += timerChange); * // every 250ms the property timer will get updated + * @param {Key} key + * @param {Observable} input$ + * @param {ProjectValueReducer} projectSliceFn + * + * @return void */ - connect( - key: K, - input$: Observable, - projectSliceFn: ProjectValueReducer + connect( + key: Key, + input$: Observable, + projectSliceFn: ProjectValueReducer, ): void; + /** * * @description - * Connect a `Signal` source to a specific property in the state. Additionally, you can provide a + * Connect a `Signal` source to a specific property in the state. Additionally, you can provide a * `projectionFunction` to access the current state object on every emission of your connected `Observable`. * Any change emitted by the source will get merged into the state. * Subscription handling is done automatically. + * @param {Key} key + * @param {Signal} signal + * @param {ProjectValueReducer} projectSliceFn + * + * @return void */ - connect( - key: K, - signal: Signal, - projectSliceFn: ProjectValueReducer + connect( + key: Key, + signal: Signal, + projectSliceFn: ProjectValueReducer, ): void; + /** * @internal */ - connect>( - keyOrInputOrSlice$: K | Observable | V> | Signal | V>, + connect>( + keyOrInputOrSlice$: + | Key + | Observable | Value> + | Signal | Value>, projectOrSlices$?: - | ProjectStateReducer - | Observable - | Signal, - projectValueFn?: ProjectValueReducer + | ProjectStateReducer + | Observable + | Signal, + projectValueFn?: ProjectValueReducer, ): void { /** * From top to bottom the overloads are handled. @@ -419,7 +529,7 @@ export class RxState implements OnDestroy, Subscribable { if (isSignal(keyOrInputOrSlice$) && !projectOrSlices$ && !projectValueFn) { this.accumulator.nextSliceObservable( - toObservable(keyOrInputOrSlice$, { injector: this.injector }) + toObservable(keyOrInputOrSlice$, { injector: this.injector }), ); return; } @@ -432,9 +542,9 @@ export class RxState implements OnDestroy, Subscribable { ) { const projectionStateFn = projectOrSlices$; const slice$ = keyOrInputOrSlice$.pipe( - map((v) => projectionStateFn(this.accumulator.state, v as V)) + map((v) => projectionStateFn(this.accumulator.state, v as Value)), ); - this.accumulator.nextSliceObservable(slice$ as Observable); + this.accumulator.nextSliceObservable(slice$ as Observable); return; } @@ -447,25 +557,27 @@ export class RxState implements OnDestroy, Subscribable { const projectionStateFn = projectOrSlices$; const slice$ = toObservable(keyOrInputOrSlice$, { injector: this.injector, - }).pipe(map((v) => projectionStateFn(this.accumulator.state, v as V))); - this.accumulator.nextSliceObservable(slice$ as Observable); + }).pipe( + map((v) => projectionStateFn(this.accumulator.state, v as Value)), + ); + this.accumulator.nextSliceObservable(slice$ as Observable); return; } if ( - isKeyOf(keyOrInputOrSlice$) && + isKeyOf(keyOrInputOrSlice$) && isObservable(projectOrSlices$) && !projectValueFn ) { const slice$ = projectOrSlices$.pipe( - map((value) => ({ ...{}, [keyOrInputOrSlice$]: value })) + map((value) => ({ ...{}, [keyOrInputOrSlice$]: value })), ); this.accumulator.nextSliceObservable(slice$); return; } if ( - isKeyOf(keyOrInputOrSlice$) && + isKeyOf(keyOrInputOrSlice$) && isSignal(projectOrSlices$) && !projectValueFn ) { @@ -479,15 +591,15 @@ export class RxState implements OnDestroy, Subscribable { if ( projectValueFn && typeof projectValueFn === 'function' && - isKeyOf(keyOrInputOrSlice$) && + isKeyOf(keyOrInputOrSlice$) && isObservable(projectOrSlices$) ) { - const key: K = keyOrInputOrSlice$; + const key: Key = keyOrInputOrSlice$; const slice$ = projectOrSlices$.pipe( map((value) => ({ ...{}, - [key]: projectValueFn(this.get(), value as V), - })) + [key]: projectValueFn(this.get(), value as Value), + })), ); this.accumulator.nextSliceObservable(slice$); return; @@ -499,14 +611,14 @@ export class RxState implements OnDestroy, Subscribable { isKeyOf(keyOrInputOrSlice$) && isSignal(projectOrSlices$) ) { - const key: K = keyOrInputOrSlice$; + const key: Key = keyOrInputOrSlice$; const slice$ = toObservable(projectOrSlices$, { injector: this.injector, }).pipe( map((value) => ({ ...{}, - [key]: projectValueFn(this.get(), value as V), - })) + [key]: projectValueFn(this.get(), value as Value), + })), ); this.accumulator.nextSliceObservable(slice$); return; @@ -517,71 +629,82 @@ export class RxState implements OnDestroy, Subscribable { /** * @description - * Returns the state as cached and distinct `Observable`. This way you don't have to think about **late - * subscribers**, - * **multiple subscribers** or **multiple emissions** of the same value + * Returns the state as cached and distinct `Observable`. + * This way you don't have to think about + * **late subscribers**, **multiple subscribers** or **multiple emissions** of the same value * * @example * const state$ = state.select(); * state$.subscribe(state => doStuff(state)); * - * @returns Observable + * @returns Observable */ - select(): Observable; + select(): Observable; /** * @description - * Returns the state as cached and distinct `Observable`. Accepts arbitrary - * [rxjs operators](https://rxjs-dev.firebaseapp.com/guide/operators) to enrich the selection with reactive - * composition. + * Returns the state as cached and distinct `Observable`. Accepts arbitrary + * [rxjs operators](https://rxjs-dev.firebaseapp.com/guide/operators) + * to enrich the selection with reactive composition. * * @example * const profilePicture$ = state.select( * map((state) => state.profilePicture), * switchMap(profilePicture => mapImageAsync(profilePicture)) * ); - * @param op { OperatorFunction } - * @returns Observable + * @param op { OperatorFunction } + * @returns Observable */ - select(op: OperatorFunction): Observable; + select(op: OperatorFunction): Observable; + /** * @internal */ - select( - op1: OperatorFunction, - op2: OperatorFunction - ): Observable; + select( + op1: OperatorFunction, + op2: OperatorFunction, + ): Observable; + /** * @internal */ - select( - op1: OperatorFunction, - op2: OperatorFunction, - op3: OperatorFunction - ): Observable; + select( + op1: OperatorFunction, + op2: OperatorFunction, + op3: OperatorFunction, + ): Observable; + /** * @internal */ - select( - op1: OperatorFunction, - op2: OperatorFunction, - op3: OperatorFunction, - op4: OperatorFunction - ): Observable; + select( + op1: OperatorFunction, + op2: OperatorFunction, + op3: OperatorFunction, + op4: OperatorFunction, + ): Observable; + /** * @internal */ - select( - op1: OperatorFunction, - op2: OperatorFunction, - op3: OperatorFunction, - op4: OperatorFunction, - op5: OperatorFunction - ): Observable; + select< + TypeA = State, + TypeB = TypeA, + TypeC = TypeB, + TypeD = TypeC, + TypeE = TypeD, + >( + op1: OperatorFunction, + op2: OperatorFunction, + op3: OperatorFunction, + op4: OperatorFunction, + op5: OperatorFunction, + ): Observable; + /** * @description * Transform a slice of the state by providing keys and map function. - * Returns result of applying function to state slice as cached and distinct `Observable`. + * Returns result of applying function to state slice as cached and distinct `Observable`. * * @example * // Project state slice @@ -590,29 +713,41 @@ export class RxState implements OnDestroy, Subscribable { * ({ query, results }) => `${results.length} results found for "${query}"` * ); * - * @return Observable + * @param {Key[]} keys + * @param {(slice: PickSlice) => Value} fn + * @param {KeyCompareMap>} keyCompareMap + * + * @return Observable */ - select( - keys: K[], - fn: (slice: PickSlice) => V, - keyCompareMap?: KeyCompareMap> - ): Observable; + select( + keys: Key[], + fn?: (slice: PickSlice) => Value, + keyCompareMap?: KeyCompareMap>, + ): Observable; + /** * @description * Transform a single property of the state by providing a key and map function. - * Returns result of applying function to state property as cached and distinct `Observable`. + * Returns result of applying function to state property as cached and distinct `Observable`. * * @example * // Project state based on single property * const foo$ = state.select('bar', bar => `bar equals ${bar}`); * - * @return Observable + * @param {Key} key + * @param {(val: Type[Key]) => Value} fn + * + * @return Observable */ - select(k: K, fn: (val: T[K]) => V): Observable; + select( + key: Key, + fn: (val: State[Key]) => Value, + ): Observable; + /** * @description * Access a single property of the state by providing keys. - * Returns a single property of the state as cached and distinct `Observable`. + * Returns a single property of the state as cached and distinct `Observable`. * * @example * // Access a single property @@ -623,77 +758,94 @@ export class RxState implements OnDestroy, Subscribable { * * const foo$ = state.select('bar', 'foo'); * - * @return Observable + * @return Observable */ - select(k1: K1): Observable; + select(keyA: KeyA): Observable; + /** * @internal */ - select( - k1: K1, - k2: K2 - ): Observable; + select( + keyA: KeyA, + keyB: KeyB, + ): Observable; + /** * @internal */ select< - K1 extends keyof T, - K2 extends keyof T[K1], - K3 extends keyof T[K1][K2] - >(k1: K1, k2: K2, k3: K3): Observable; + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + >(keyA: KeyA, keyB: KeyB, keyC: KeyC): Observable; + /** * @internal */ select< - K1 extends keyof T, - K2 extends keyof T[K1], - K3 extends keyof T[K1][K2], - K4 extends keyof T[K1][K2][K3] - >(k1: K1, k2: K2, k3: K3, k4: K4): Observable; + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + KeyD extends keyof State[KeyA][KeyB][KeyC], + >( + keyA: KeyA, + keyB: KeyB, + keyC: KeyC, + keyD: KeyD, + ): Observable; + /** * @internal */ select< - K1 extends keyof T, - K2 extends keyof T[K1], - K3 extends keyof T[K1][K2], - K4 extends keyof T[K1][K2][K3], - K5 extends keyof T[K1][K2][K3][K4] - >(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): Observable; + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + KeyD extends keyof State[KeyA][KeyB][KeyC], + KeyE extends keyof State[KeyA][KeyB][KeyC][KeyD], + >( + keyA: KeyA, + keyB: KeyB, + keyC: KeyC, + keyD: KeyD, + keyE: KeyE, + ): Observable; + /** * @internal */ select< - K1 extends keyof T, - K2 extends keyof T[K1], - K3 extends keyof T[K1][K2], - K4 extends keyof T[K1][K2][K3], - K5 extends keyof T[K1][K2][K3][K4], - K6 extends keyof T[K1][K2][K3][K4][K5] + KeyA extends keyof State, + KeyB extends keyof State[KeyA], + KeyC extends keyof State[KeyA][KeyB], + KeyD extends keyof State[KeyA][KeyB][KeyC], + KeyE extends keyof State[KeyA][KeyB][KeyC][KeyD], + KeyF extends keyof State[KeyA][KeyB][KeyC][KeyD][KeyE], >( - k1: K1, - k2: K2, - k3: K3, - k4: K4, - k5: K5, - k6: K6 - ): Observable; + keyA: KeyA, + keyB: KeyB, + keyC: KeyC, + keyD: KeyD, + keyE: KeyE, + keyF: KeyF, + ): Observable; + /** * @internal */ - select( + select( ...args: - | OperatorFunction[] + | OperatorFunction[] | string[] | [k: string, fn: (val: unknown) => unknown] | [ keys: string[], - fn: (slice: unknown) => unknown, - keyCompareMap?: KeyCompareMap + fn?: (slice: unknown) => unknown, + keyCompareMap?: KeyCompareMap, ] - ): Observable { + ): Observable { return this.accumulator.state$.pipe( - select(...(args as Parameters)) + select(...(args as Parameters)), ); } @@ -702,16 +854,24 @@ export class RxState implements OnDestroy, Subscribable { * Returns a signal of the given key. It's first value is determined by the * current keys value in RxState. Whenever the key gets updated, the signal * will also be updated accordingly. + * @param {Key} key + * + * @return Signal */ - signal(k: K): Signal { - return this.signalStoreProxy[k]; + signal(key: Key): Signal { + return this.signalStoreProxy[key]; } /** * @description - * Lets you create a computed signal based off of multiple keys stored in RxState. + * Lets you create a computed signal based off multiple keys stored in RxState. + * + * @param {(slice: SignalStateProxy) => ComputedType} fn + * @return Signal */ - computed(fn: (slice: SignalStateProxy) => C): Signal { + computed( + fn: (slice: SignalStateProxy) => ComputedType, + ): Signal { return computed(() => { return fn(this.signalStoreProxy); }); @@ -724,39 +884,52 @@ export class RxState implements OnDestroy, Subscribable { * @throws If the initial value is not provided and the signal is not sync. * Use startWith() to provide an initial value. * - * @param op1 { OperatorFunction } - * @returns Observable + // * @param op1 { OperatorFunction } + // * @returns Signal */ - computedFrom(op1: OperatorFunction): Signal; + computedFrom( + op1: OperatorFunction, + ): Signal; + /** @internal */ - computedFrom( - op1: OperatorFunction, - op2: OperatorFunction - ): Signal; + computedFrom( + op1: OperatorFunction, + op2: OperatorFunction, + ): Signal; + /** @internal */ - computedFrom( - op1: OperatorFunction, - op2: OperatorFunction, - op3: OperatorFunction - ): Signal; + computedFrom( + op1: OperatorFunction, + op2: OperatorFunction, + op3: OperatorFunction, + ): Signal; + /** @internal */ - computedFrom( - op1: OperatorFunction, - op2: OperatorFunction, - op3: OperatorFunction, - op4: OperatorFunction - ): Signal; + computedFrom( + op1: OperatorFunction, + op2: OperatorFunction, + op3: OperatorFunction, + op4: OperatorFunction, + ): Signal; + /** @internal */ - computedFrom( - op1: OperatorFunction, - op2: OperatorFunction, - op3: OperatorFunction, - op4: OperatorFunction, - op5: OperatorFunction - ): Signal; + computedFrom< + TypeA = State, + TypeB = TypeA, + TypeC = TypeB, + TypeD = TypeC, + TypeE = TypeD, + >( + op1: OperatorFunction, + op2: OperatorFunction, + op3: OperatorFunction, + op4: OperatorFunction, + op5: OperatorFunction, + ): Signal; + /** @internal */ - computedFrom(...ops: OperatorFunction[]): Signal { - return toSignal(this.select(...(ops as Parameters)), { + computedFrom(...ops: OperatorFunction[]): Signal { + return toSignal(this.select(...(ops as Parameters)), { injector: this.injector, requireSync: true, }); @@ -764,8 +937,8 @@ export class RxState implements OnDestroy, Subscribable { /** * @description - * Manages side-effects of your state. Provide an `Observable` **side-effect** and an optional - * `sideEffectFunction`. + * Manages side-effects of your state. Provide an `Observable` + * **side-effect** and an optional `sideEffectFunction`. * Subscription handling is done automatically. * * @example @@ -780,17 +953,19 @@ export class RxState implements OnDestroy, Subscribable { * const localStorageEffectFn = changes => storeChanges(changes); * state.hold(changes$, localStorageEffectFn); * - * @param {Observable} obsOrObsWithSideEffect + * @param {Observable} obsOrObsWithSideEffect * @param {function} [sideEffectFn] + * + * @return void */ - hold( - obsOrObsWithSideEffect: Observable, - sideEffectFn?: (arg: S) => void + hold( + obsOrObsWithSideEffect: Observable, + sideEffectFn?: (arg: SideEffect) => void, ): void { const sideEffect = obsOrObsWithSideEffect.pipe(catchError((e) => EMPTY)); if (typeof sideEffectFn === 'function') { this.effectObservable.nextEffectObservable( - sideEffect.pipe(tap(sideEffectFn)) + sideEffect.pipe(tap(sideEffectFn)), ); return; } @@ -804,9 +979,9 @@ export class RxState implements OnDestroy, Subscribable { const subscription = new Subscription(); subscription.add(this.accumulator.subscribe()); subscription.add(this.effectObservable.subscribe()); - this.signalStoreProxy = createSignalStateProxy( + this.signalStoreProxy = createSignalStateProxy( this.$, - this.get.bind(this) + this.get.bind(this), ); return subscription; } diff --git a/libs/template/CHANGELOG.md b/libs/template/CHANGELOG.md index 9e48b50277..060981288a 100644 --- a/libs/template/CHANGELOG.md +++ b/libs/template/CHANGELOG.md @@ -2,6 +2,17 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +# [17.2.0](https://github.com/rx-angular/rx-angular/compare/template@17.1.0...template@17.2.0) (2024-05-17) + + +### Features + +* accept subscribable on rx-let input ([#1721](https://github.com/rx-angular/rx-angular/issues/1721)) ([897a5b0](https://github.com/rx-angular/rx-angular/commit/897a5b00e4101f1ab6463f4386aa7dff876dc840)) +* **template:** deprecate parent flag ([a4592e3](https://github.com/rx-angular/rx-angular/commit/a4592e3d26df6567ff4214bc907b245068ac9436)) +* **template:** implement signal support in template package ([35e7d18](https://github.com/rx-angular/rx-angular/commit/35e7d18139799a0c425652911e9a599252b9e646)) + + + # [17.1.0](https://github.com/rx-angular/rx-angular/compare/template@17.0.1...template@17.1.0) (2024-03-03) diff --git a/libs/template/experimental/virtual-scrolling/src/lib/virtual-for.directive.ts b/libs/template/experimental/virtual-scrolling/src/lib/virtual-for.directive.ts index 4ec8e89111..1bc37ba9f6 100644 --- a/libs/template/experimental/virtual-scrolling/src/lib/virtual-for.directive.ts +++ b/libs/template/experimental/virtual-scrolling/src/lib/virtual-for.directive.ts @@ -5,7 +5,9 @@ import { EmbeddedViewRef, ErrorHandler, inject, + Injector, Input, + isSignal, IterableChanges, IterableDiffer, IterableDiffers, @@ -13,10 +15,12 @@ import { NgZone, OnDestroy, OnInit, + Signal, TemplateRef, TrackByFunction, ViewContainerRef, } from '@angular/core'; +import { toObservable } from '@angular/core/rxjs-interop'; import { coerceObservableWith } from '@rx-angular/cdk/coercing'; import { onStrategy, @@ -199,6 +203,8 @@ export class RxVirtualFor = NgIterable> private readonly iterableDiffers = inject(IterableDiffers); private readonly cdRef = inject(ChangeDetectorRef); private readonly ngZone = inject(NgZone); + /** @internal */ + private injector = inject(Injector); readonly viewContainer = inject(ViewContainerRef); private readonly strategyProvider = inject(RxStrategyProvider); private readonly errorHandler = inject(ErrorHandler); @@ -227,23 +233,30 @@ export class RxVirtualFor = NgIterable> * [hero]="hero"> * * - * @param potentialObservable + * @param potentialSignalOrObservable */ @Input() set rxVirtualForOf( - potentialObservable: + potentialSignalOrObservable: | Observable<(U & NgIterable) | undefined | null> + | Signal<(U & NgIterable) | undefined | null> | (U & NgIterable) | null - | undefined + | undefined, ) { - if (!isObservable(potentialObservable)) { - this.staticValue = potentialObservable; + if (isSignal(potentialSignalOrObservable)) { + this.staticValue = undefined; + this.renderStatic = false; + this.observables$.next( + toObservable(potentialSignalOrObservable, { injector: this.injector }), + ); + } else if (!isObservable(potentialSignalOrObservable)) { + this.staticValue = potentialSignalOrObservable; this.renderStatic = true; } else { this.staticValue = undefined; this.renderStatic = false; - this.observables$.next(potentialObservable); + this.observables$.next(potentialSignalOrObservable); } } @@ -262,7 +275,7 @@ export class RxVirtualFor = NgIterable> /** @internal */ private strategyHandler = strategyHandling( this.strategyProvider.primaryStrategy, - this.strategyProvider.strategies + this.strategyProvider.strategies, ); /** * @description @@ -309,7 +322,7 @@ export class RxVirtualFor = NgIterable> */ @Input('rxVirtualForStrategy') set strategy( - strategyName: RxStrategyNames | Observable> + strategyName: RxStrategyNames | Observable>, ) { this.strategyHandler.next(strategyName); } @@ -356,6 +369,8 @@ export class RxVirtualFor = NgIterable> * } * * @param renderParent + * + * @deprecated this flag will be dropped soon, as it is no longer required when using signal based view & content queries */ @Input('rxVirtualForParent') renderParent = false; @@ -466,8 +481,8 @@ export class RxVirtualFor = NgIterable> ) { throw new Error( `trackBy must be typeof function or keyof T, but received ${JSON.stringify( - trackByFnOrKey - )}.` + trackByFnOrKey, + )}.`, ); } if (trackByFnOrKey == null) { @@ -523,7 +538,7 @@ export class RxVirtualFor = NgIterable> * @param renderCallback */ @Input('rxVirtualForRenderCallback') set renderCallback( - renderCallback: Subject + renderCallback: Subject, ) { this._renderCallback = renderCallback; } @@ -561,7 +576,7 @@ export class RxVirtualFor = NgIterable> readonly values$ = this.observables$.pipe( coerceObservableWith(), switchAll(), - shareReplay({ bufferSize: 1, refCount: true }) + shareReplay({ bufferSize: 1, refCount: true }), ); /** @internal */ @@ -583,16 +598,16 @@ export class RxVirtualFor = NgIterable> static ngTemplateContextGuard< T, U extends NgIterable = NgIterable, - K = keyof T + K = keyof T, >( dir: RxVirtualFor, - ctx: any + ctx: any, ): ctx is RxVirtualForViewContext { return true; } constructor( - private readonly templateRef: TemplateRef> + private readonly templateRef: TemplateRef>, ) {} /** @internal */ @@ -637,9 +652,9 @@ export class RxVirtualFor = NgIterable> Array.isArray(values) ? values : values != null - ? Array.from(values) - : [] - ) + ? Array.from(values) + : [], + ), ), this.scrollStrategy.renderedRange$, this.strategyHandler.strategy$.pipe(distinctUntilChanged()), @@ -667,7 +682,7 @@ export class RxVirtualFor = NgIterable> changes, iterable, items.length, - range.start + range.start, ); const updates = listChanges[0].sort((a, b) => a[0] - b[0]); const indicesToPosition = new Set(); @@ -685,7 +700,7 @@ export class RxVirtualFor = NgIterable> this.viewRendered$.next(update as any); } }, - { ngZone: this.patchZone ? this.ngZone : undefined } + { ngZone: this.patchZone ? this.ngZone : undefined }, ); }); this.partiallyFinished = true; @@ -693,7 +708,7 @@ export class RxVirtualFor = NgIterable> this.renderingStart$.next(indicesToPosition); return combineLatest( // emit after all changes are rendered - work$.length > 0 ? work$ : [of(iterable)] + work$.length > 0 ? work$ : [of(iterable)], ).pipe( tap(() => { this.templateManager.setItemCount(items.length); @@ -719,16 +734,16 @@ export class RxVirtualFor = NgIterable> { ngZone: this.patchZone ? this.ngZone : undefined, scope: (this.cdRef as any).context || this.cdRef, - } - ).pipe(ignoreElements()) - ) + }, + ).pipe(ignoreElements()), + ), ) : (o$) => o$, this.handleError(), - map(() => iterable) + map(() => iterable), ); }), - this.handleError() + this.handleError(), ); } @@ -739,7 +754,7 @@ export class RxVirtualFor = NgIterable> this.partiallyFinished = false; this.errorHandler.handleError(err); return of(null); - }) + }), ); } @@ -755,12 +770,12 @@ export class RxVirtualFor = NgIterable> /** @internal */ private createViewContext( item: T, - computedContext: RxListViewComputedContext + computedContext: RxListViewComputedContext, ): RxVirtualForViewContext { return new RxVirtualForViewContext( item, this.values! as U, - computedContext + computedContext, ); } @@ -770,7 +785,7 @@ export class RxVirtualFor = NgIterable> view: EmbeddedViewRef< RxVirtualForViewContext >, - computedContext?: RxListViewComputedContext + computedContext?: RxListViewComputedContext, ): void { view.context.updateContext(computedContext!); view.context.$implicit = item; diff --git a/libs/template/for/src/lib/for.directive.ts b/libs/template/for/src/lib/for.directive.ts index ad2ab5e5d6..de34c82c6f 100644 --- a/libs/template/for/src/lib/for.directive.ts +++ b/libs/template/for/src/lib/for.directive.ts @@ -5,16 +5,20 @@ import { EmbeddedViewRef, ErrorHandler, inject, + Injector, Input, + isSignal, IterableDiffers, NgIterable, NgZone, OnDestroy, OnInit, + Signal, TemplateRef, TrackByFunction, ViewContainerRef, } from '@angular/core'; +import { toObservable } from '@angular/core/rxjs-interop'; import { coerceDistinctWith, coerceObservableWith, @@ -87,6 +91,8 @@ export class RxFor = NgIterable> /** @internal */ private ngZone = inject(NgZone); /** @internal */ + private injector = inject(Injector); + /** @internal */ private viewContainerRef = inject(ViewContainerRef); /** @internal */ private strategyProvider = inject(RxStrategyProvider); @@ -108,25 +114,33 @@ export class RxFor = NgIterable> *
* * @param { Observable<(U & NgIterable) | undefined | null> + * | Signal<(U & NgIterable) | undefined | null> * | (U & NgIterable) * | null - * | undefined } potentialObservable + * | undefined } potentialSignalOrObservable */ @Input() set rxForOf( - potentialObservable: + potentialSignalOrObservable: | Observable<(U & NgIterable) | undefined | null> + | Signal<(U & NgIterable) | undefined | null> | (U & NgIterable) | null - | undefined + | undefined, ) { - if (!isObservable(potentialObservable)) { - this.staticValue = potentialObservable; + if (isSignal(potentialSignalOrObservable)) { + this.staticValue = undefined; + this.renderStatic = false; + this.observables$.next( + toObservable(potentialSignalOrObservable, { injector: this.injector }), + ); + } else if (!isObservable(potentialSignalOrObservable)) { + this.staticValue = potentialSignalOrObservable; this.renderStatic = true; } else { this.staticValue = undefined; this.renderStatic = false; - this.observables$.next(potentialObservable); + this.observables$.next(potentialSignalOrObservable); } } @@ -178,7 +192,7 @@ export class RxFor = NgIterable> */ @Input() set rxForStrategy( - strategyName: RxStrategyNames | Observable | undefined + strategyName: RxStrategyNames | Observable | undefined, ) { this.strategyInput$.next(strategyName); } @@ -223,6 +237,8 @@ export class RxFor = NgIterable> * } * * @param {boolean} renderParent + * + * @deprecated this flag will be dropped soon, as it is no longer required when using signal based view & content queries */ @Input('rxForParent') renderParent = this.strategyProvider.config.parent; @@ -329,8 +345,8 @@ export class RxFor = NgIterable> ) { console.warn( `trackBy must be a function, but received ${JSON.stringify( - trackByFnOrKey - )}.` + trackByFnOrKey, + )}.`, ); } if (trackByFnOrKey == null) { @@ -409,7 +425,7 @@ export class RxFor = NgIterable> private readonly values$ = this.observables$.pipe( coerceObservableWith(), switchAll(), - shareReplay({ refCount: true, bufferSize: 1 }) + shareReplay({ refCount: true, bufferSize: 1 }), ); /** @internal */ @@ -430,7 +446,7 @@ export class RxFor = NgIterable> _distinctBy = (a: T, b: T) => a === b; constructor( - private readonly templateRef: TemplateRef> + private readonly templateRef: TemplateRef>, ) {} /** @internal */ @@ -458,14 +474,14 @@ export class RxFor = NgIterable> this._subscription.add( this.listManager .render(this.values$) - .subscribe((v) => this._renderCallback?.next(v)) + .subscribe((v) => this._renderCallback?.next(v)), ); } /** @internal */ createViewContext( item: T, - computedContext: RxListViewComputedContext + computedContext: RxListViewComputedContext, ): RxForViewContext { return new RxForViewContext(item, this.values, computedContext); } @@ -474,7 +490,7 @@ export class RxFor = NgIterable> updateViewContext( item: T, view: EmbeddedViewRef>, - computedContext: RxListViewComputedContext + computedContext: RxListViewComputedContext, ): void { view.context.updateContext(computedContext); view.context.rxForOf = this.values; @@ -498,7 +514,7 @@ export class RxFor = NgIterable> static ngTemplateContextGuard< T, U extends NgIterable = NgIterable, - K = keyof T + K = keyof T, >(dir: RxFor, ctx: any): ctx is RxForViewContext { return true; } diff --git a/libs/template/for/src/lib/tests/fixtures.ts b/libs/template/for/src/lib/tests/fixtures.ts index bfe5a60ab2..f2d715f16a 100644 --- a/libs/template/for/src/lib/tests/fixtures.ts +++ b/libs/template/for/src/lib/tests/fixtures.ts @@ -1,4 +1,4 @@ -import { Component, ErrorHandler } from '@angular/core'; +import { Component, ErrorHandler, signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BehaviorSubject, Subject } from 'rxjs'; @@ -14,6 +14,7 @@ export class TestComponent { items: any[] = [1, 2]; itemsCold$ = new Subject(); itemsHot$ = new BehaviorSubject([1, 2]); + itemsHotSignal = signal([1, 2]); parent: boolean; renderedValue$ = new Subject(); @@ -35,7 +36,7 @@ const TEMPLATE = '
{{item.toString()}};
'; export function createTestComponent( - template: string = TEMPLATE + template: string = TEMPLATE, ): ComponentFixture { return TestBed.overrideComponent(TestComponent, { set: { template: template }, diff --git a/libs/template/for/src/lib/tests/for.directive.parent-notification.spec.ts b/libs/template/for/src/lib/tests/for.directive.parent-notification.spec.ts index be1c9c2792..74aa1952fc 100644 --- a/libs/template/for/src/lib/tests/for.directive.parent-notification.spec.ts +++ b/libs/template/for/src/lib/tests/for.directive.parent-notification.spec.ts @@ -4,6 +4,7 @@ import { ErrorHandler, QueryList, ViewChildren, + viewChildren, } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { @@ -15,9 +16,7 @@ import { asapScheduler, delay } from 'rxjs'; import { RxFor } from '../for.directive'; import { TestComponent } from './fixtures'; -@Component({ - selector: 'rx-test-cmp', - template: `
+const testTemplate = `
{{ item.toString() }}; -
`, +
`; + +@Component({ + selector: 'rx-test-cmp', + template: testTemplate, }) class ParentNotifyTestComponent extends TestComponent { @ViewChildren('listChild') @@ -41,17 +44,26 @@ class ParentNotifyTestComponent extends TestComponent { forChildren: QueryList>; } -async function rendered( - component: ParentNotifyTestComponent, - behavior: RxRenderBehavior -) { +@Component({ + selector: 'rx-test-cmp', + template: testTemplate, + imports: [RxFor], + standalone: true, +}) +class ParentNotifySignalTestComponent extends TestComponent { + parent = false; + listChildren = viewChildren('listChild'); + forChildren = viewChildren(RxFor); +} + +async function rendered(component: TestComponent, behavior: RxRenderBehavior) { return new Promise((resolve) => { component.renderedValue$ .pipe( behavior({ work: () => {}, }), - delay(0, asapScheduler) + delay(0, asapScheduler), ) .subscribe(() => { resolve(); @@ -60,93 +72,155 @@ async function rendered( } describe('rxFor parent-notifications', () => { - let fixture: ComponentFixture; - let errorHandler: ErrorHandler; let strategyProvider: RxStrategyProvider; - let component: ParentNotifyTestComponent; + let behavior: RxRenderBehavior; - afterEach(() => { - fixture = null as any; - errorHandler = null as any; - }); + function forEachStrategy(testFn: (strategy: string) => void) { + describe.each([ + ['immediate'], + ['userBlocking'], + ['normal'], + ['low'], + ['idle'], + ])('Strategy: %p', (strategy) => { + beforeEach(() => { + behavior = strategyProvider.strategies[strategy].behavior; + }); - beforeAll(() => { - mockConsole(); - }); + testFn(strategy); + }); + } + + describe('legacy queries', () => { + let fixture: ComponentFixture; + let errorHandler: ErrorHandler; + let component: ParentNotifyTestComponent; - beforeEach(() => { - TestBed.configureTestingModule({ - declarations: [ParentNotifyTestComponent], - imports: [RxFor], - teardown: { destroyAfterEach: true }, + afterEach(() => { + fixture = null as any; + errorHandler = null as any; }); - fixture = TestBed.createComponent(ParentNotifyTestComponent); - component = fixture.componentInstance; - strategyProvider = TestBed.inject(RxStrategyProvider); - }); - describe.each([ - ['immediate'], - ['userBlocking'], - ['normal'], - ['low'], - ['idle'], - ])('Strategy: %p', (strategy) => { - let behavior: RxRenderBehavior; + beforeAll(() => { + mockConsole(); + }); beforeEach(() => { - behavior = strategyProvider.strategies[strategy].behavior; + TestBed.configureTestingModule({ + declarations: [ParentNotifyTestComponent], + imports: [RxFor], + teardown: { destroyAfterEach: true }, + }); + fixture = TestBed.createComponent(ParentNotifyTestComponent); + component = fixture.componentInstance; + strategyProvider = TestBed.inject(RxStrategyProvider); }); - describe('parent: true', () => { - beforeEach(() => { - component.strategy = strategy; - component.parent = true; - fixture.detectChanges(); - component.itemsCold$.next([1, 2]); - }); + forEachStrategy((strategy) => { + describe('parent: true', () => { + beforeEach(() => { + component.strategy = strategy; + component.parent = true; + fixture.detectChanges(); + component.itemsCold$.next([1, 2]); + }); - it('should update ViewChild', async () => { - await rendered(component, behavior); - expect(component.listChildren.length).toBe(2); - }); + it('should update ViewChild', async () => { + await rendered(component, behavior); + expect(component.listChildren.length).toBe(2); + }); + + it('should update parent', async () => { + const cdRef = (component.forChildren.first as any).cdRef; + cdRef.detectChanges = jest.fn(); + await rendered(component, behavior); + expect(cdRef.detectChanges).toHaveBeenCalled(); + }); - it('should update parent', async () => { - const cdRef = (component.forChildren.first as any).cdRef; - cdRef.detectChanges = jest.fn(); - await rendered(component, behavior); - expect(cdRef.detectChanges).toHaveBeenCalled(); + it('should scope parent notifications', async () => { + const cdRef = (component.forChildren.first as any).cdRef; + const cdRef2 = (component.forChildren.last as any).cdRef; + expect(cdRef2).toEqual(cdRef); + cdRef.detectChanges = jest.fn(); + await rendered(component, behavior); + expect(cdRef.detectChanges).toHaveBeenCalledTimes(1); + }); }); - it('should scope parent notifications', async () => { - const cdRef = (component.forChildren.first as any).cdRef; - const cdRef2 = (component.forChildren.last as any).cdRef; - expect(cdRef2).toEqual(cdRef); - cdRef.detectChanges = jest.fn(); - await rendered(component, behavior); - expect(cdRef.detectChanges).toHaveBeenCalledTimes(1); + describe('parent: false', () => { + beforeEach(() => { + component.strategy = strategy; + component.parent = false; + fixture.detectChanges(); + component.itemsCold$.next([1, 2]); + }); + + it('should not update ViewChild', async () => { + await rendered(component, behavior); + expect(component.listChildren.length).toBe(0); + }); + + it('should not update parent', async () => { + const cdRef = (component.forChildren.first as any).cdRef; + cdRef.detectChanges = jest.fn(); + const behavior = strategyProvider.strategies[strategy].behavior; + await rendered(component, behavior); + expect(cdRef.detectChanges).not.toHaveBeenCalled(); + }); }); }); - describe('parent: false', () => { + /*describe.each([ + ['immediate'], + ['userBlocking'], + ['normal'], + ['low'], + ['idle'], + ])('Strategy: %p', (strategy) => { + let behavior: RxRenderBehavior; + beforeEach(() => { - component.strategy = strategy; - component.parent = false; - fixture.detectChanges(); - component.itemsCold$.next([1, 2]); + behavior = strategyProvider.strategies[strategy].behavior; }); - it('should not update ViewChild', async () => { - await rendered(component, behavior); - expect(component.listChildren.length).toBe(0); + + + });*/ + }); + + describe('signal queries', () => { + let fixture: ComponentFixture; + let component: ParentNotifySignalTestComponent; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ParentNotifySignalTestComponent], }); + fixture = TestBed.createComponent(ParentNotifySignalTestComponent); + component = fixture.componentInstance; + strategyProvider = TestBed.inject(RxStrategyProvider); + }); + + forEachStrategy((strategy) => { + describe('parent: false', () => { + beforeEach(() => { + component.strategy = strategy; + fixture.detectChanges(); + component.itemsCold$.next([1, 2]); + }); + + it('should update viewchildren', async () => { + await rendered(component, behavior); + expect(component.listChildren().length).toBe(2); + }); - it('should not update parent', async () => { - const cdRef = (component.forChildren.first as any).cdRef; - cdRef.detectChanges = jest.fn(); - const behavior = strategyProvider.strategies[strategy].behavior; - await rendered(component, behavior); - expect(cdRef.detectChanges).not.toHaveBeenCalled(); + it('should not update parent', async () => { + const cdRef = (component.forChildren()[0] as any)?.cdRef; + cdRef.detectChanges = jest.fn(); + const behavior = strategyProvider.strategies[strategy].behavior; + await rendered(component, behavior); + expect(cdRef.detectChanges).not.toHaveBeenCalled(); + }); }); }); }); diff --git a/libs/template/for/src/lib/tests/for.directive.signal.spec.ts b/libs/template/for/src/lib/tests/for.directive.signal.spec.ts new file mode 100644 index 0000000000..5e13be7391 --- /dev/null +++ b/libs/template/for/src/lib/tests/for.directive.signal.spec.ts @@ -0,0 +1,608 @@ +import { CommonModule } from '@angular/common'; +import { ErrorHandler } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; +import { RxFor } from '../for.directive'; +import { + createErrorHandler, + createTestComponent as utilCreateTestComponent, + setThis, + TestComponent, + thisArg, +} from './fixtures'; + +const customErrorHandler: ErrorHandler = { + handleError: jest.fn(), +}; + +function createTestComponent( + template = `
{{item.toString()}};
`, +) { + return utilCreateTestComponent(template); +} + +describe('rxFor with signals', () => { + let fixture: ComponentFixture; + let errorHandler: ErrorHandler; + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(); + + function getComponent(): TestComponent { + return fixture.componentInstance; + } + + function detectChangesAndExpectText(text: string): void { + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe(text); + } + + function expectText(text: string) { + expect(fixture.nativeElement.textContent).toBe(text); + } + + afterEach(() => { + fixture = null as any; + errorHandler = null as any; + }); + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestComponent], + imports: [CommonModule, RxFor], + providers: [ + { + provide: ErrorHandler, + useValue: customErrorHandler, + }, + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: { + primaryStrategy: 'native', + }, + }, + ], + }); + warnSpy.mockClear(); + }); + + it('should reflect initial elements', waitForAsync(() => { + fixture = createTestComponent(); + detectChangesAndExpectText('1;2;'); + })); + + it('should reflect added elements', () => { + fixture = createTestComponent(); + fixture.detectChanges(); + getComponent().itemsHotSignal.update((x) => { + x.push(3); + return [...x]; + }); + TestBed.flushEffects(); + expectText('1;2;3;'); + }); + + it('should reflect removed elements', () => { + fixture = createTestComponent(); + fixture.detectChanges(); + const newValues = getComponent().itemsHotSignal(); + newValues.splice(1, 1); + getComponent().itemsHotSignal.set([...newValues]); + TestBed.flushEffects(); + expectText('1;'); + }); + + it('should reflect moved elements', () => { + fixture = createTestComponent(); + fixture.detectChanges(); + const newValues = getComponent().itemsHotSignal(); + newValues.splice(0, 1); + newValues.push(1); + getComponent().itemsHotSignal.set([...newValues]); + TestBed.flushEffects(); + expectText('2;1;'); + }); + + it('should reflect a mix of all changes (additions/removals/moves)', () => { + fixture = createTestComponent(); + fixture.detectChanges(); + getComponent().itemsHotSignal.set([0, 1, 2, 3, 4, 5]); + getComponent().itemsHotSignal.set([6, 2, 7, 0, 4, 8]); + + TestBed.flushEffects(); + expectText('6;2;7;0;4;8;'); + }); + + it('should iterate over an array of objects', waitForAsync(() => { + const template = + '
  • {{item["name"]}};
'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + // INIT + getComponent().itemsHotSignal.set([{ name: 'misko' }, { name: 'shyam' }]); + TestBed.flushEffects(); + expectText('misko;shyam;'); + + // GROW + const values = getComponent().itemsHotSignal(); + values.push({ name: 'adam' }); + getComponent().itemsHotSignal.set([...values]); + TestBed.flushEffects(); + expectText('misko;shyam;adam;'); + + // SHRINK + values.splice(2, 1); + values.splice(0, 1); + getComponent().itemsHotSignal.set([...values]); + TestBed.flushEffects(); + expectText('shyam;'); + })); + + it('should gracefully handle nulls', waitForAsync(() => { + const template = + '
  • {{item}};
'; + fixture = createTestComponent(template); + getComponent().itemsHotSignal.set(null); + errorHandler = createErrorHandler(); + fixture.detectChanges(); + const errorSpy = jest.spyOn(errorHandler, 'handleError'); + + expectText(''); + expect(errorSpy).toBeCalledTimes(0); + errorSpy.mockClear(); + })); + + it('should gracefully handle ref changing to null and back', waitForAsync(() => { + fixture = createTestComponent(); + errorHandler = createErrorHandler(); + const errorSpy = jest.spyOn(errorHandler, 'handleError'); + + detectChangesAndExpectText('1;2;'); + + getComponent().itemsHotSignal.set(null); + TestBed.flushEffects(); + expectText(''); + + getComponent().itemsHotSignal.set([1, 2, 3]); + TestBed.flushEffects(); + expectText('1;2;3;'); + expect(errorSpy).toBeCalledTimes(0); + errorSpy.mockClear(); + })); + + it('should throw on non-iterable ref and suggest using an array', waitForAsync(() => { + fixture = createTestComponent(); + errorHandler = createErrorHandler(); + const errorSpy = jest.spyOn(errorHandler, 'handleError'); + + const expectedError = new Error( + "NG0901: Cannot find a differ supporting object 'whaaa' of type 'string'", + ); + getComponent().itemsHotSignal.set('whaaa'); + fixture.detectChanges(); + expect(errorSpy).toHaveBeenCalledWith(expectedError); + errorSpy.mockClear(); + })); + + it('should throw on ref changing to string', () => { + fixture = createTestComponent(); + errorHandler = createErrorHandler(); + const errorSpy = jest.spyOn(errorHandler, 'handleError'); + const expectedError = new Error( + "NG0900: Error trying to diff 'whaaa'. Only arrays and iterables are allowed", + ); + detectChangesAndExpectText('1;2;'); + + getComponent().itemsHotSignal.set('whaaa'); + TestBed.flushEffects(); + expect(errorSpy).toHaveBeenCalledWith(expectedError); + errorSpy.mockClear(); + }); + + it('should works with duplicates', waitForAsync(() => { + fixture = createTestComponent(); + fixture.detectChanges(); + + const a = new Foo(); + getComponent().itemsHotSignal.set([a, a]); + TestBed.flushEffects(); + expectText('foo;foo;'); + })); + + it('should repeat over nested arrays', waitForAsync(() => { + const template = + '
' + + '
{{subitem}}-{{item.length}};
|' + + '
'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([['a', 'b'], ['c']]); + TestBed.flushEffects(); + expectText('a-2;b-2;|c-1;|'); + + getComponent().itemsHotSignal.set([['e'], ['f', 'g']]); + TestBed.flushEffects(); + expectText('e-1;|f-2;g-2;|'); + })); + + it('should repeat over nested arrays with no intermediate element', waitForAsync(() => { + const template = + '
' + + '
{{subitem}}-{{item.length}};
' + + '
'; + fixture = createTestComponent(template); + fixture.detectChanges(); + getComponent().itemsHotSignal.set([['a', 'b'], ['c']]); + TestBed.flushEffects(); + expectText('a-2;b-2;c-1;'); + + getComponent().itemsHotSignal.set([['e'], ['f', 'g']]); + TestBed.flushEffects(); + expectText('e-1;f-2;g-2;'); + })); + + it('should repeat over nested arrays using select with no intermediate element', waitForAsync(() => { + const template = + '
' + + '
{{subitem}}-{{col.length}};
' + + '
'; + fixture = createTestComponent(template); + fixture.detectChanges(); + getComponent().itemsHotSignal.set([{ items: ['a', 'b', 'c'] }]); + TestBed.flushEffects(); + expectText('a-3;b-3;c-3;'); + + getComponent().itemsHotSignal.set([{ items: ['d', 'e', 'f'] }]); + TestBed.flushEffects(); + expectText('d-3;e-3;f-3;'); + })); + + it('should repeat over nested ngIf that are the last node in the rxFor template', waitForAsync(() => { + const template = + `
` + + `
{{i}}|
` + + `
even|
` + + `
`; + + fixture = createTestComponent(template); + fixture.detectChanges(); + + const items = [1]; + getComponent().itemsHotSignal.set([...items]); + TestBed.flushEffects(); + expectText('0|even|'); + + items.push(1); + getComponent().itemsHotSignal.set([...items]); + TestBed.flushEffects(); + expectText('0|even|1|'); + + items.push(1); + getComponent().itemsHotSignal.set([...items]); + TestBed.flushEffects(); + expectText('0|even|1|2|even|'); + })); + + it('should allow of saving the collection', waitForAsync(() => { + const template = + '
  • {{i}}/{{collection.length}} -' + + ' {{item}};
'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + expectText('0/2 - 1;1/2 - 2;'); + + getComponent().itemsHotSignal.set([1, 2, 3]); + TestBed.flushEffects(); + expectText('0/3 - 1;1/3 - 2;2/3 - 3;'); + })); + + it('should display indices correctly', waitForAsync(() => { + const template = + '{{i.toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + TestBed.flushEffects(); + expectText('0123456789'); + + getComponent().itemsHotSignal.set([1, 2, 6, 7, 4, 3, 5, 8, 9, 0]); + TestBed.flushEffects(); + expectText('0123456789'); + })); + + it('should display indices$ correctly', waitForAsync(() => { + const template = + '{{(i | async).toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + TestBed.flushEffects(); + expectText('0123456789'); + + getComponent().itemsHotSignal.set([1, 2, 6, 7, 4, 3, 5, 8, 9, 0]); + TestBed.flushEffects(); + expectText('0123456789'); + })); + + it('should display count correctly', waitForAsync(() => { + const template = + '{{len}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2]); + TestBed.flushEffects(); + expectText('333'); + + getComponent().itemsHotSignal.set([4, 3, 2, 1, 0, -1]); + TestBed.flushEffects(); + expectText('666666'); + })); + + it('should display count$ correctly', waitForAsync(() => { + const template = + '{{len | async }}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2]); + TestBed.flushEffects(); + expectText('333'); + + getComponent().itemsHotSignal.set([4, 3, 2, 1, 0, -1]); + TestBed.flushEffects(); + expectText('666666'); + })); + + it('should display first item correctly', waitForAsync(() => { + const template = + '{{isFirst.toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2]); + TestBed.flushEffects(); + expectText('truefalsefalse'); + + getComponent().itemsHotSignal.set([2, 1]); + TestBed.flushEffects(); + expectText('truefalse'); + })); + + it('should display first$ item correctly', waitForAsync(() => { + const template = + '{{(isFirst | async).toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2]); + TestBed.flushEffects(); + expectText('truefalsefalse'); + + getComponent().itemsHotSignal.set([2, 1]); + TestBed.flushEffects(); + expectText('truefalse'); + })); + + it('should display last item correctly', waitForAsync(() => { + const template = + '{{isLast.toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2]); + TestBed.flushEffects(); + expectText('falsefalsetrue'); + + getComponent().itemsHotSignal.set([2, 1]); + TestBed.flushEffects(); + expectText('falsetrue'); + })); + + it('should display last item correctly', waitForAsync(() => { + const template = + '{{(isLast | async ).toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2]); + TestBed.flushEffects(); + expectText('falsefalsetrue'); + + getComponent().itemsHotSignal.set([2, 1]); + TestBed.flushEffects(); + expectText('falsetrue'); + })); + + it('should display even items correctly', waitForAsync(() => { + const template = + '{{isEven.toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2]); + TestBed.flushEffects(); + expectText('truefalsetrue'); + + getComponent().itemsHotSignal.set([2, 1]); + TestBed.flushEffects(); + expectText('truefalse'); + })); + + it('should display even$ items correctly', waitForAsync(() => { + const template = + '{{(isEven | async).toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2]); + TestBed.flushEffects(); + expectText('truefalsetrue'); + + getComponent().itemsHotSignal.set([2, 1]); + TestBed.flushEffects(); + expectText('truefalse'); + })); + + it('should display odd items correctly', waitForAsync(() => { + const template = + '{{isOdd.toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2, 3]); + TestBed.flushEffects(); + expectText('falsetruefalsetrue'); + + getComponent().itemsHotSignal.set([2, 1]); + TestBed.flushEffects(); + expectText('falsetrue'); + })); + + it('should display odd$ items correctly', waitForAsync(() => { + const template = + '{{(isOdd | async).toString()}}'; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([0, 1, 2, 3]); + TestBed.flushEffects(); + expectText('falsetruefalsetrue'); + + getComponent().itemsHotSignal.set([2, 1]); + TestBed.flushEffects(); + expectText('falsetrue'); + })); + + it('should allow to use a custom template', waitForAsync(() => { + const template = + '' + + '

{{i}}: {{item}};

'; + fixture = createTestComponent(template); + fixture.detectChanges(); + getComponent().itemsHotSignal.set(['a', 'b', 'c']); + TestBed.flushEffects(); + expectText('0: a;1: b;2: c;'); + })); + + it('should use a default template if a custom one is null', waitForAsync(() => { + const template = `
    {{i}}: {{item}};
`; + fixture = createTestComponent(template); + fixture.detectChanges(); + getComponent().itemsHotSignal.set(['a', 'b', 'c']); + TestBed.flushEffects(); + expectText('0: a;1: b;2: c;'); + })); + + it('should use a custom template when both default and a custom one are present', waitForAsync(() => { + const template = + '{{i}};' + + '{{i}}: {{item}};'; + fixture = createTestComponent(template); + fixture.detectChanges(); + getComponent().itemsHotSignal.set(['a', 'b', 'c']); + TestBed.flushEffects(); + expectText('0: a;1: b;2: c;'); + })); + + describe('track by', () => { + it('should console.warn if trackBy is not a function', waitForAsync(() => { + const template = `

`; + fixture = createTestComponent(template); + fixture.componentInstance.value = 0; + fixture.detectChanges(); + expect(warnSpy).toBeCalledTimes(1); + })); + + it('should track by identity when trackBy is to `null` or `undefined`', waitForAsync(() => { + const template = `

{{ item }}

`; + fixture = createTestComponent(template); + fixture.componentInstance.itemsHotSignal.set(['a', 'b', 'c']); + fixture.componentInstance.value = null; + detectChangesAndExpectText('abc'); + fixture.componentInstance.value = undefined; + detectChangesAndExpectText('abc'); + expect(warnSpy).toBeCalledTimes(0); + })); + + it('should set the context to the component instance', waitForAsync(() => { + const template = `

`; + fixture = createTestComponent(template); + + setThis(null); + fixture.detectChanges(); + expect(thisArg).toBe(getComponent()); + })); + + it('should not replace tracked items', waitForAsync(() => { + const template = `

{{items[i]}}

`; + fixture = createTestComponent(template); + fixture.detectChanges(); + + const buildItemList = () => { + getComponent().itemsHotSignal.set([{ id: 'a' }]); + return fixture.debugElement.queryAll(By.css('p'))[0]; + }; + + const firstP = buildItemList(); + const finalP = buildItemList(); + expect(finalP.nativeElement).toBe(firstP.nativeElement); + })); + + it('should update implicit local variable on view', waitForAsync(() => { + const template = `
{{item['color']}}
`; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([{ id: 'a', color: 'blue' }]); + TestBed.flushEffects(); + expectText('blue'); + + getComponent().itemsHotSignal.set([{ id: 'a', color: 'red' }]); + TestBed.flushEffects(); + expectText('red'); + })); + + it('should move items around and keep them updated ', waitForAsync(() => { + const template = `
{{item['color']}}
`; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set([ + { id: 'a', color: 'blue' }, + { id: 'b', color: 'yellow' }, + ]); + TestBed.flushEffects(); + expectText('blueyellow'); + + getComponent().itemsHotSignal.set([ + { id: 'b', color: 'orange' }, + { id: 'a', color: 'red' }, + ]); + TestBed.flushEffects(); + expectText('orangered'); + })); + + it('should handle added and removed items properly when tracking by index', waitForAsync(() => { + const template = `
{{item}}
`; + fixture = createTestComponent(template); + fixture.detectChanges(); + + getComponent().itemsHotSignal.set(['a', 'b', 'c', 'd']); + getComponent().itemsHotSignal.set(['e', 'f', 'g', 'h']); + getComponent().itemsHotSignal.set(['e', 'f', 'h']); + TestBed.flushEffects(); + expectText('efh'); + })); + }); +}); + +class Foo { + toString() { + return 'foo'; + } +} diff --git a/libs/template/if/src/lib/if.directive.ts b/libs/template/if/src/lib/if.directive.ts index 7ff8d96ec9..5f6e5a0257 100644 --- a/libs/template/if/src/lib/if.directive.ts +++ b/libs/template/if/src/lib/if.directive.ts @@ -2,15 +2,19 @@ import { ChangeDetectorRef, Directive, inject, + Injector, Input, + isSignal, NgZone, OnChanges, OnDestroy, OnInit, + Signal, SimpleChanges, TemplateRef, ViewContainerRef, } from '@angular/core'; +import { toObservable } from '@angular/core/rxjs-interop'; import { coerceAllFactory } from '@rx-angular/cdk/coercing'; import { createTemplateNotifier, @@ -77,7 +81,8 @@ export class RxIf private ngZone = inject(NgZone); /** @internal */ private viewContainerRef = inject(ViewContainerRef); - + /** @internal */ + private injector = inject(Injector); /** @internal */ private subscription = new Subscription(); /** @internal */ @@ -107,7 +112,7 @@ export class RxIf * * @param { ObservableInput | T } rxIf */ - @Input() rxIf: ObservableInput | T; + @Input() rxIf: ObservableInput | Signal | T; /** * @description @@ -387,6 +392,8 @@ export class RxIf * } * * @param {boolean} renderParent + * + * @deprecated this flag will be dropped soon, as it is no longer required when using signal based view & content queries */ @Input('rxIfParent') renderParent = this.strategyProvider.config.parent; @@ -477,7 +484,7 @@ export class RxIf /** @internal */ private readonly strategyHandler = coerceAllFactory( () => new ReplaySubject>(1), - mergeAll() + mergeAll(), ); /** @internal */ private readonly rendered$ = new Subject(); @@ -498,10 +505,10 @@ export class RxIf NEVER, this.completeTrigger?.pipe(map(() => RxNotificationKind.Complete)) || NEVER, - this.errorTrigger?.pipe(map(() => RxNotificationKind.Error)) || NEVER + this.errorTrigger?.pipe(map(() => RxNotificationKind.Error)) || NEVER, ) .pipe(filter((v) => !!v)) - .subscribe((t) => this.triggerHandler.next(t)) + .subscribe((t) => this.triggerHandler.next(t)), ); this.subscription.add( this.templateManager @@ -509,7 +516,7 @@ export class RxIf .subscribe((n) => { this.rendered$.next(n); this._renderObserver?.next(n); - }) + }), ); } @@ -522,7 +529,7 @@ export class RxIf if (changes.then && !changes.then.firstChange) { this.templateManager.addTemplateRef( RxIfTemplateNames.then, - this.thenTemplate + this.thenTemplate, ); } @@ -533,14 +540,14 @@ export class RxIf if (changes.complete) { this.templateManager.addTemplateRef( RxIfTemplateNames.complete, - this.complete + this.complete, ); } if (changes.suspense) { this.templateManager.addTemplateRef( RxIfTemplateNames.suspense, - this.suspense + this.suspense, ); this.templateNotifier.withInitialSuspense(!!this.suspense); } @@ -549,7 +556,13 @@ export class RxIf this.templateManager.addTemplateRef(RxIfTemplateNames.error, this.error); } if (changes.rxIf) { - this.templateNotifier.next(this.rxIf); + if (isSignal(this.rxIf)) { + this.templateNotifier.next( + toObservable(this.rxIf, { injector: this.injector }), + ); + } else { + this.templateNotifier.next(this.rxIf); + } } } @@ -564,8 +577,8 @@ export class RxIf return value ? RxIfTemplateNames.then : this.else - ? RxIfTemplateNames.else - : undefined; + ? RxIfTemplateNames.else + : undefined; }; this.templateManager = createTemplateManager< T, @@ -596,7 +609,7 @@ export class RxIf }); this.templateManager.addTemplateRef( RxIfTemplateNames.then, - this.thenTemplate + this.thenTemplate, ); this.templateManager.nextStrategy(this.strategyHandler.values$); } @@ -622,7 +635,7 @@ export class RxIf */ static ngTemplateContextGuard( dir: RxIf, - ctx: any + ctx: any, ): ctx is RxIfViewContext> { return true; } diff --git a/libs/template/if/src/lib/tests/fixtures.ts b/libs/template/if/src/lib/tests/fixtures.ts index d79db4d8c9..1415355f22 100644 --- a/libs/template/if/src/lib/tests/fixtures.ts +++ b/libs/template/if/src/lib/tests/fixtures.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RxNotificationKind } from '@rx-angular/cdk/notifications'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; @@ -7,10 +7,13 @@ import { BehaviorSubject, Observable, Subject } from 'rxjs'; export class TestComponent { booleanCondition = true; booleanCondition$ = new BehaviorSubject(true); + booleanConditionSignal = signal(true); nestedBooleanCondition = true; nestedBooleanCondition$ = new BehaviorSubject(true); + nestedBooleanSignal = signal(true); numberCondition = 1; numberCondition$ = new BehaviorSubject(1); + numberConditionSignal = signal(1); stringCondition = 'foo'; renderedValue$ = new Subject(); strategy: string; @@ -27,7 +30,7 @@ export class TestComponent { } export function createTestComponent( - template: string + template: string, ): ComponentFixture { return TestBed.overrideComponent(TestComponent, { set: { template: template }, diff --git a/libs/template/if/src/lib/tests/if.directive.parent-notification.spec.ts b/libs/template/if/src/lib/tests/if.directive.parent-notification.spec.ts new file mode 100644 index 0000000000..bfc0280a7e --- /dev/null +++ b/libs/template/if/src/lib/tests/if.directive.parent-notification.spec.ts @@ -0,0 +1,90 @@ +import { Component, ElementRef, viewChild } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { + RxRenderBehavior, + RxStrategyProvider, +} from '@rx-angular/cdk/render-strategies'; +import { asapScheduler, delay, Observable, ReplaySubject, Subject } from 'rxjs'; +import { RxIf } from '../if.directive'; + +@Component({ + selector: 'rx-if-test', + template: ` +
+ hello +
+ `, + standalone: true, + imports: [RxIf], +}) +class RxIfTestComponent { + ifChild = viewChild('ifChild'); + strategy: string; + value$ = new ReplaySubject(1); + rendered$ = new Subject(); +} + +describe('RxIf signal parent notification', () => { + let fixture: ComponentFixture; + let componentInstance: RxIfTestComponent; + let strategyProvider: RxStrategyProvider; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [RxIfTestComponent], + }); + fixture = TestBed.createComponent(RxIfTestComponent); + componentInstance = fixture.componentInstance; + strategyProvider = TestBed.inject(RxStrategyProvider); + }); + + describe.each([ + ['immediate'], + ['userBlocking'], + ['normal'], + ['low'], + ['idle'], + ])('Strategy: %p', (strategy) => { + describe('parent: false', () => { + beforeEach(() => { + componentInstance.strategy = strategy; + fixture.detectChanges(); + componentInstance.value$.next(true); + }); + + it('should update ViewChild', async () => { + const behavior = strategyProvider.strategies[strategy].behavior; + await rendered(componentInstance.rendered$, behavior); + expect( + componentInstance.ifChild()?.nativeElement?.textContent?.trim(), + ).toBe('hello'); + }); + }); + }); +}); + +async function rendered( + rendered$: Observable, + behavior: RxRenderBehavior, +) { + return new Promise((resolve) => { + rendered$ + .pipe( + behavior({ + work: () => {}, + }), + delay(0, asapScheduler), + ) + .subscribe(() => { + resolve(); + }); + }); +} diff --git a/libs/template/if/src/lib/tests/if.directive.signal.spec.ts b/libs/template/if/src/lib/tests/if.directive.signal.spec.ts new file mode 100644 index 0000000000..5336510689 --- /dev/null +++ b/libs/template/if/src/lib/tests/if.directive.signal.spec.ts @@ -0,0 +1,458 @@ +import { signal } from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; +import { startWith, tap, throwError } from 'rxjs'; +import { RxIf } from '../if.directive'; +import { createTestComponent, TestComponent } from './fixtures'; + +describe('rxIf directive signal values', () => { + let fixture: ComponentFixture; + + function getComponent(): TestComponent { + return fixture.componentInstance; + } + + afterEach(() => { + fixture = null!; + }); + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestComponent], + imports: [RxIf], + providers: [ + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: { + primaryStrategy: 'custom', + customStrategies: { + custom: { + name: 'custom', + work: (cdRef) => { + cdRef.detectChanges(); + }, + behavior: + ({ work }) => + (o$) => + o$.pipe(tap(() => work())), + }, + }, + }, + }, + ], + }); + }); + + it('should work in a template attribute', waitForAsync(() => { + const template = 'hello'; + fixture = createTestComponent(template); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelectorAll('span').length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello'); + })); + + it('should accept signal directly without being called in a template attribute', waitForAsync(() => { + const template = 'hello'; + fixture = createTestComponent(template); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelectorAll('span').length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello'); + + fixture.componentInstance.booleanConditionSignal.set(false); + fixture.detectChanges(); + + expect(fixture.nativeElement.querySelectorAll('span').length).toEqual(0); + })); + + it('should work on a template element', waitForAsync(() => { + const template = + 'hello2'; + fixture = createTestComponent(template); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('hello2'); + })); + + it('should toggle node when condition changes', waitForAsync(() => { + fixture = createTestComponent(` + hello + `); + + getComponent().booleanConditionSignal.set(false); + fixture.detectChanges(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); + expect(fixture.nativeElement.textContent).toBe(''); + + getComponent().booleanConditionSignal.set(true); + fixture.detectChanges(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello'); + + getComponent().booleanConditionSignal.set(false); + fixture.detectChanges(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); + expect(fixture.nativeElement.textContent).toBe(''); + })); + + it('should toggle node with not called signal when condition changes', fakeAsync(() => { + fixture = createTestComponent(` + hello + `); + // this is needed here in order to register the effect + // otherwise the effect will not be registered and the signal change will not be detected + fixture.detectChanges(); + + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello'); + + getComponent().booleanConditionSignal.set(false); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); + expect(fixture.nativeElement.textContent).toBe(''); + + getComponent().booleanConditionSignal.set(true); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello'); + + getComponent().booleanConditionSignal.set(false); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); + expect(fixture.nativeElement.textContent).toBe(''); + })); + + it('should handle nested if correctly', waitForAsync(() => { + const template = + '
hello
'; + + fixture = createTestComponent(template); + + getComponent().booleanConditionSignal.set(false); + fixture.detectChanges(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); + expect(fixture.nativeElement.textContent).toBe(''); + + getComponent().booleanConditionSignal.set(true); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello'); + + getComponent().nestedBooleanSignal.set(false); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); + expect(fixture.nativeElement.textContent).toBe(''); + + getComponent().nestedBooleanSignal.set(true); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello'); + + getComponent().booleanConditionSignal.set(false); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); + expect(fixture.nativeElement.textContent).toBe(''); + })); + + it('should update several nodes with if', waitForAsync(() => { + const template = + 'hello1' + + 'hello2'; + + fixture = createTestComponent(template); + + fixture.detectChanges(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(2); + expect(fixture.nativeElement.textContent).toEqual('hello1hello2'); + + getComponent().booleanConditionSignal.set(false); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello2'); + + getComponent().booleanConditionSignal.set(true); + getComponent().nestedBooleanSignal.set(false); + TestBed.flushEffects(); + expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); + expect(fixture.nativeElement.textContent).toBe('hello1'); + })); + + it('should not add the element twice if the condition goes from truthy to truthy', waitForAsync(() => { + const template = 'hello'; + + fixture = createTestComponent(template); + + fixture.detectChanges(); + let els = fixture.debugElement.queryAll(By.css('span')); + expect(els.length).toEqual(1); + els[0].nativeElement.classList.add('marker'); + expect(fixture.nativeElement.textContent).toBe('hello'); + + getComponent().numberConditionSignal.set(2); + TestBed.flushEffects(); + els = fixture.debugElement.queryAll(By.css('span')); + expect(els.length).toEqual(1); + expect(els[0].nativeElement.classList.contains('marker')).toBe(true); + + expect(fixture.nativeElement.textContent).toBe('hello'); + })); + + describe('then/else templates', () => { + it('should support else', waitForAsync(() => { + const template = + 'TRUE' + + 'FALSE'; + + fixture = createTestComponent(template); + + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('TRUE'); + + getComponent().booleanConditionSignal.set(false); + TestBed.flushEffects(); + expect(fixture.nativeElement.textContent).toBe('FALSE'); + })); + + it('should support then and else', waitForAsync(() => { + const template = + 'IGNORE' + + 'THEN' + + 'ELSE'; + + fixture = createTestComponent(template); + + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('THEN'); + + getComponent().booleanConditionSignal.set(false); + TestBed.flushEffects(); + expect(fixture.nativeElement.textContent).toBe('ELSE'); + })); + + it('should support removing the then/else templates', () => { + const template = ` + Template`; + + fixture = createTestComponent(template); + const comp = fixture.componentInstance; + // then template + comp.booleanConditionSignal.set(true); + + comp.nestedBooleanSignal.set(true); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('Template'); + + comp.nestedBooleanSignal.set(false); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe(''); + + // else template + comp.booleanConditionSignal.set(true); + + comp.nestedBooleanSignal.set(true); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('Template'); + + comp.nestedBooleanSignal.set(false); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe(''); + }); + + it('should support dynamic else', waitForAsync(() => { + const template = + 'TRUE' + + 'FALSE1' + + 'FALSE2'; + + fixture = createTestComponent(template); + + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('TRUE'); + + getComponent().booleanConditionSignal.set(false); + TestBed.flushEffects(); + expect(fixture.nativeElement.textContent).toBe('FALSE1'); + + getComponent().nestedBooleanCondition = false; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('FALSE2'); + })); + + it('should support binding to variable using let', waitForAsync(() => { + const template = + '{{v}}' + + '{{v}}'; + + fixture = createTestComponent(template); + + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('true'); + + getComponent().booleanConditionSignal.set(false); + TestBed.flushEffects(); + expect(fixture.nativeElement.textContent).toBe('false'); + })); + + it('should support binding to variable using as', waitForAsync(() => { + fixture = createTestComponent(` + {{v}} + {{v}} + `); + + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('true'); + + getComponent().booleanConditionSignal.set(false); + + // TODO: discuss this + // because we are using effects, we need to flush them + // is this a breaking change? + // We can't have synchronous effects ?? as that would break the "glitch-free" feature they provide + TestBed.flushEffects(); + + expect(fixture.nativeElement.textContent).toBe('false'); + })); + }); + + describe('Type guarding', () => { + it('should throw when then block is not template', waitForAsync(() => { + const template = + 'IGNORE' + + '
THEN
'; + + fixture = createTestComponent(template); + + expect(() => fixture.detectChanges()).toThrowError( + /rxThen must be a TemplateRef, but received/, + ); + })); + + it('should throw when else block is not template', waitForAsync(() => { + const template = + 'IGNORE' + + '
ELSE
'; + + fixture = createTestComponent(template); + + expect(() => fixture.detectChanges()).toThrowError( + /rxElse must be a TemplateRef, but received/, + ); + })); + }); + + fdescribe('Templates & Context', () => { + it('should render suspense template when value is undefined', waitForAsync(() => { + fixture = createTestComponent(` + {{v}} + suspended + `); + + getComponent().booleanConditionSignal.set(undefined); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('suspended'); + + getComponent().booleanConditionSignal.set(true); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('true'); + })); + + it('should not have suspense context', waitForAsync(() => { + const template = + '{{suspense}}'; + + fixture = createTestComponent(template); + getComponent().booleanConditionSignal.set(true); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('false'); + + getComponent().booleanConditionSignal.set(undefined); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe(''); + })); + + it('should not have suspense context', waitForAsync(() => { + const template = + '{{suspense}}'; + + fixture = createTestComponent(template); + getComponent().booleanConditionSignal.set(false); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe(''); + + getComponent().booleanConditionSignal.set(undefined); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe(''); + })); + + // TODO: signals do not support complete and error + xit('should render complete template when source completes', waitForAsync(() => { + const template = + '{{v}}' + + 'completed'; + + fixture = createTestComponent(template); + getComponent().booleanConditionSignal = signal(undefined); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('completed'); + + getComponent().booleanConditionSignal = signal(true); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('true'); + })); + + // TODO: signals do not support complete and error + xit('should render error template when source throws', waitForAsync(() => { + const template = + '{{v}}' + + 'error'; + + fixture = createTestComponent(template); + getComponent().booleanConditionSignal = throwError(() => null) as any; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('error'); + + getComponent().booleanConditionSignal = signal(true); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('true'); + })); + + // TODO: signals do not support complete and error + xit('should have error context when source throws', waitForAsync(() => { + const template = + '{{error}}'; + + fixture = createTestComponent(template); + getComponent().booleanConditionSignal = throwError(() => null).pipe( + startWith(true), + ) as any; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('true'); + + getComponent().booleanConditionSignal = signal(true); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('false'); + })); + + // TODO: signals do not support complete and error + xit('should have error context on else template', waitForAsync(() => { + const template = + 'then' + + 'else{{e}}'; + + fixture = createTestComponent(template); + getComponent().booleanConditionSignal = throwError(() => null) as any; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('elsetrue'); + + getComponent().booleanConditionSignal = signal(true); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('then'); + })); + }); +}); diff --git a/libs/template/let/src/lib/let.directive.ts b/libs/template/let/src/lib/let.directive.ts index 3f01af54d2..7e126cf94a 100644 --- a/libs/template/let/src/lib/let.directive.ts +++ b/libs/template/let/src/lib/let.directive.ts @@ -3,16 +3,20 @@ import { Directive, ErrorHandler, inject, + Injector, Input, + isSignal, NgZone, OnChanges, OnDestroy, OnInit, Output, + Signal, SimpleChanges, TemplateRef, ViewContainerRef, } from '@angular/core'; +import { toObservable } from '@angular/core/rxjs-interop'; import { coerceAllFactory } from '@rx-angular/cdk/coercing'; import { createTemplateNotifier, @@ -38,6 +42,7 @@ import { ObservableInput, ReplaySubject, Subject, + Subscribable, Subscription, } from 'rxjs'; import { filter, map } from 'rxjs/operators'; @@ -98,6 +103,8 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { private strategyProvider = inject(RxStrategyProvider); /** @internal */ private cdRef = inject(ChangeDetectorRef); + + private injector = inject(Injector); /** @internal */ private ngZone = inject(NgZone); /** @internal */ @@ -125,7 +132,13 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { * * @param { ObservableInput | U | null | undefined } rxLet */ - @Input() rxLet: ObservableInput | U | null | undefined; + @Input() rxLet: + | ObservableInput + | Subscribable + | Signal + | U + | null + | undefined; /** * @description @@ -395,7 +408,7 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { * } * } * - * @param {Subject} renderCallback + * @param callback */ @Input('rxLetRenderCallback') set renderCallback(callback: NextObserver) { @@ -443,6 +456,8 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { * } * * @param boolean + * + * @deprecated this flag will be dropped soon, as it is no longer required when using signal based view & content queries */ @Input('rxLetParent') renderParent = this.strategyProvider.config.parent; @@ -483,7 +498,7 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { private observablesHandler = createTemplateNotifier(); /** @internal */ private strategyHandler = coerceAllFactory( - () => new ReplaySubject(1) + () => new ReplaySubject(1), ); /** @internal */ private triggerHandler = new ReplaySubject(1); @@ -515,7 +530,7 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { /** @internal */ static ngTemplateContextGuard( dir: RxLet, - ctx: unknown | null | undefined + ctx: unknown | null | undefined, ): ctx is RxLetViewContext { return true; } @@ -530,7 +545,7 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { .subscribe((n) => { this.rendered$.next(n); this._renderObserver?.next(n); - }) + }), ); this.subscription.add( merge( @@ -540,10 +555,10 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { NEVER, this.completeTrigger?.pipe(map(() => RxNotificationKind.Complete)) || NEVER, - this.errorTrigger?.pipe(map(() => RxNotificationKind.Error)) || NEVER + this.errorTrigger?.pipe(map(() => RxNotificationKind.Error)) || NEVER, ) .pipe(filter((v) => !!v)) - .subscribe((t) => this.triggerHandler.next(t)) + .subscribe((t) => this.triggerHandler.next(t)), ); } @@ -556,14 +571,14 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { if (changes.complete) { this.templateManager.addTemplateRef( RxLetTemplateNames.complete, - this.complete + this.complete, ); } if (changes.suspense) { this.templateManager.addTemplateRef( RxLetTemplateNames.suspense, - this.suspense + this.suspense, ); this.observablesHandler.withInitialSuspense(!!this.suspense); } @@ -573,7 +588,13 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { } if (changes.rxLet) { - this.observablesHandler.next(this.rxLet); + if (isSignal(this.rxLet)) { + this.observablesHandler.next( + toObservable(this.rxLet, { injector: this.injector }), + ); + } else { + this.observablesHandler.next(this.rxLet); + } } } @@ -615,7 +636,7 @@ export class RxLet implements OnInit, OnDestroy, OnChanges { this.templateManager.addTemplateRef( RxLetTemplateNames.next, - this.templateRef + this.templateRef, ); this.templateManager.nextStrategy(this.strategyHandler.values$); } diff --git a/libs/template/let/src/lib/tests/let.directive.signal-parent-notification.spec.ts b/libs/template/let/src/lib/tests/let.directive.signal-parent-notification.spec.ts new file mode 100644 index 0000000000..e9275e93c6 --- /dev/null +++ b/libs/template/let/src/lib/tests/let.directive.signal-parent-notification.spec.ts @@ -0,0 +1,103 @@ +import { JsonPipe } from '@angular/common'; +import { Component, ElementRef, viewChild, viewChildren } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { RxStrategyProvider } from '@rx-angular/cdk/render-strategies'; +import { asapScheduler, delay, ReplaySubject, Subject } from 'rxjs'; +import { RxLet } from '../let.directive'; + +@Component({ + template: ` +
+ {{ (value | json) || 'undefined' }} +
+ +
+ {{ (value | json) || 'undefined' }} +
+ `, + standalone: true, + imports: [RxLet, JsonPipe], +}) +class LetDirectiveTestStrategyComponent { + letChild = viewChild('letChild'); + letChildren = viewChildren(RxLet); + strategy: string; + value$ = new ReplaySubject(1); + rendered$ = new Subject(); +} + +describe('LetDirective signal parent notification', () => { + let fixture: ComponentFixture; + let componentInstance: LetDirectiveTestStrategyComponent; + let strategyProvider: RxStrategyProvider; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [LetDirectiveTestStrategyComponent], + teardown: { destroyAfterEach: true }, + }); + fixture = TestBed.createComponent(LetDirectiveTestStrategyComponent); + componentInstance = fixture.componentInstance; + strategyProvider = TestBed.inject(RxStrategyProvider); + }); + + describe.each([ + ['immediate'], + ['userBlocking'], + ['normal'], + ['low'], + ['idle'], + ])('Strategy: %p', (strategy) => { + describe('parent: false', () => { + beforeEach(() => { + componentInstance.strategy = strategy; + componentInstance.value$.next(42); + }); + + it('should update ViewChild', (done) => { + const behavior = strategyProvider.strategies[strategy].behavior; + componentInstance.rendered$ + .pipe( + behavior({ + work: () => {}, + }), + delay(0, asapScheduler), + ) + .subscribe(() => { + expect(componentInstance.letChild()).toBeDefined(); + done(); + }); + fixture.detectChanges(); + }); + + it('should not update parent', (done) => { + fixture.detectChanges(); + const cdRef = (componentInstance.letChildren()[0] as any).cdRef; + cdRef.detectChanges = jest.fn(); + const behavior = strategyProvider.strategies[strategy].behavior; + componentInstance.rendered$ + .pipe( + behavior({ + work: () => {}, + }), + delay(0, asapScheduler), + ) + .subscribe(() => { + expect(cdRef.detectChanges).not.toHaveBeenCalled(); + done(); + }); + }); + }); + }); +}); diff --git a/libs/template/let/src/lib/tests/let.directive.signal-set.spec.ts b/libs/template/let/src/lib/tests/let.directive.signal-set.spec.ts new file mode 100644 index 0000000000..61bb543de4 --- /dev/null +++ b/libs/template/let/src/lib/tests/let.directive.signal-set.spec.ts @@ -0,0 +1,140 @@ +import { + ChangeDetectorRef, + Component, + Signal, + signal, + TemplateRef, + ViewContainerRef, + WritableSignal, +} from '@angular/core'; +import { fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; +import { mockConsole } from '@test-helpers/rx-angular'; +import { interval, NEVER } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { RxLet } from '../let.directive'; +import { MockChangeDetectorRef } from './fixtures'; + +@Component({ + template: ` + {{ + v === undefined ? 'undefined' : v === null ? 'null' : (v | json) + }} + `, +}) +class LetDirectiveTestComponent { + value = signal(42); +} + +let fixtureLetDirectiveTestComponent: any; +let letDirectiveTestComponent: { + strategy: string; + value: Signal | unknown | undefined | null; +}; +let componentNativeElement: any; + +const setupLetDirectiveTestComponent = (): void => { + TestBed.configureTestingModule({ + declarations: [LetDirectiveTestComponent], + imports: [RxLet], + providers: [ + { provide: ChangeDetectorRef, useClass: MockChangeDetectorRef }, + TemplateRef, + ViewContainerRef, + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: { + primaryStrategy: 'native', + }, + }, + ], + teardown: { destroyAfterEach: true }, + }); + fixtureLetDirectiveTestComponent = TestBed.createComponent( + LetDirectiveTestComponent, + ); + letDirectiveTestComponent = + fixtureLetDirectiveTestComponent.componentInstance; + componentNativeElement = fixtureLetDirectiveTestComponent.nativeElement; +}; + +describe('LetDirective with signals as values', () => { + beforeAll(() => mockConsole()); + beforeEach(setupLetDirectiveTestComponent); + + it('should render undefined as value when initially signal(undefined) was passed (as undefined was emitted)', () => { + letDirectiveTestComponent.value = signal(undefined); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('undefined'); + }); + + it('should render null as value when initially signal(null) was passed (as null was emitted)', () => { + letDirectiveTestComponent.value = signal(null); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('null'); + }); + + it('should render emitted value from passed signal without changing it', () => { + letDirectiveTestComponent.value = signal(42); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('42'); + }); + + it('should render undefined as value when a new observable NEVER was passed (as no value ever was emitted from new observable)', () => { + letDirectiveTestComponent.value = signal(42); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('42'); + letDirectiveTestComponent.value = NEVER; + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('undefined'); + }); + + it('should render new value as value when a new signal was passed', () => { + TestBed.flushEffects(); + letDirectiveTestComponent.value = signal(42); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('42'); + letDirectiveTestComponent.value = signal(45); + fixtureLetDirectiveTestComponent.detectChanges(); + TestBed.flushEffects(); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('45'); + }); + + it('should render the last value when a new signal was passed', () => { + letDirectiveTestComponent.value = signal(42); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('42'); + + (letDirectiveTestComponent.value as WritableSignal).set(45); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('45'); + }); + + it('should render values over time when a new signal was passed', fakeAsync(() => { + letDirectiveTestComponent.value = signal(undefined); + + interval(1000) + .pipe(take(3)) + .subscribe((v) => { + (letDirectiveTestComponent.value as WritableSignal).set(v); + }); + + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('undefined'); + tick(1000); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('0'); + tick(1000); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('1'); + tick(1000); + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent).toBe('2'); + + tick(1000); + fixtureLetDirectiveTestComponent.detectChanges(); + // Remains at 2, since that was the last value. + expect(componentNativeElement.textContent).toBe('2'); + })); +}); diff --git a/libs/template/let/src/lib/tests/let.directive.subscribable.spec.ts b/libs/template/let/src/lib/tests/let.directive.subscribable.spec.ts new file mode 100644 index 0000000000..12147e12aa --- /dev/null +++ b/libs/template/let/src/lib/tests/let.directive.subscribable.spec.ts @@ -0,0 +1,80 @@ +import { + ChangeDetectorRef, + Component, + TemplateRef, + ViewContainerRef, +} from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; +import { mockConsole } from '@test-helpers/rx-angular'; +import { Subscribable } from 'rxjs'; +import { RxLet } from '../let.directive'; +import { MockChangeDetectorRef } from './fixtures'; + +@Component({ + template: ` + + {{ value }} + + `, +}) +class LetDirectiveSubscribableTestComponent { + value$: Subscribable; +} + +let fixtureLetDirectiveTestComponent: any; +let letDirectiveTestComponent: { + strategy: string; + value$: Subscribable | unknown | undefined | null; +}; +let componentNativeElement: any; + +const setupLetDirectiveTestComponent = (): void => { + TestBed.configureTestingModule({ + declarations: [LetDirectiveSubscribableTestComponent], + imports: [RxLet], + providers: [ + { provide: ChangeDetectorRef, useClass: MockChangeDetectorRef }, + TemplateRef, + ViewContainerRef, + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: { + primaryStrategy: 'native', + }, + }, + ], + teardown: { destroyAfterEach: true }, + }); + fixtureLetDirectiveTestComponent = TestBed.createComponent( + LetDirectiveSubscribableTestComponent, + ); + letDirectiveTestComponent = + fixtureLetDirectiveTestComponent.componentInstance; + componentNativeElement = fixtureLetDirectiveTestComponent.nativeElement; +}; +describe('RxLet Directive with Subscribable input', () => { + beforeAll(() => mockConsole()); + beforeEach(setupLetDirectiveTestComponent); + + it('should be instantiable', () => { + expect(fixtureLetDirectiveTestComponent).toBeDefined(); + expect(letDirectiveTestComponent).toBeDefined(); + expect(componentNativeElement).toBeDefined(); + }); + + it('should display value from Subscribable', () => { + letDirectiveTestComponent.value$ = { + subscribe: ({ next }) => { + next(42); + return { + unsubscribe() { + /**EMPTY*/ + }, + }; + }, + }; + fixtureLetDirectiveTestComponent.detectChanges(); + expect(componentNativeElement.textContent.trim()).toBe('42'); + }); +}); diff --git a/libs/template/let/src/lib/tests/let.directive.template-binding.all.signal.spec.ts b/libs/template/let/src/lib/tests/let.directive.template-binding.all.signal.spec.ts new file mode 100644 index 0000000000..65dc3a3499 --- /dev/null +++ b/libs/template/let/src/lib/tests/let.directive.template-binding.all.signal.spec.ts @@ -0,0 +1,201 @@ +import { + ChangeDetectorRef, + Component, + Injector, + Signal, + signal, + TemplateRef, + ViewContainerRef, +} from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from '@angular/core/testing'; +import { RxNotificationKind } from '@rx-angular/cdk/notifications'; +import { RX_RENDER_STRATEGIES_CONFIG } from '@rx-angular/cdk/render-strategies'; +import { mockConsole } from '@test-helpers/rx-angular'; +import { interval, NEVER, Subject, throwError } from 'rxjs'; +import { take, tap } from 'rxjs/operators'; +import { RxLet } from '../let.directive'; +import { MockChangeDetectorRef } from './fixtures'; + +@Component({ + template: ` + {{ + value === undefined + ? 'undefined' + : value === null + ? 'null' + : (value | json) + }} + + complete + error + suspense + `, +}) +class LetDirectiveAllTemplatesTestComponent { + valueSignal: Signal = signal(1); + completeTrg = new Subject(); + nextTrg = new Subject(); + suspenseTrg = new Subject(); + errorTrg = new Subject(); + trg = new Subject(); +} + +let fixture: ComponentFixture; +let component: LetDirectiveAllTemplatesTestComponent; +let nativeElement: HTMLElement; +let injector: Injector; + +const setupTestComponent = () => { + TestBed.configureTestingModule({ + declarations: [LetDirectiveAllTemplatesTestComponent], + imports: [RxLet], + providers: [ + { provide: ChangeDetectorRef, useClass: MockChangeDetectorRef }, + TemplateRef, + ViewContainerRef, + { + provide: RX_RENDER_STRATEGIES_CONFIG, + useValue: { + primaryStrategy: 'urgent', + customStrategies: { + urgent: { + name: 'urgent', + work: (cdRef) => cdRef.detectChanges(), + behavior: + ({ work }) => + (o$) => + o$.pipe(tap(() => work())), + }, + }, + }, + }, + ], + teardown: { destroyAfterEach: true }, + }); +}; + +const setUpFixture = () => { + fixture = TestBed.createComponent(LetDirectiveAllTemplatesTestComponent); + component = fixture.componentInstance; + nativeElement = fixture.nativeElement; + injector = TestBed.inject(Injector); +}; + +describe('LetDirective reactive context templates w/ signals', () => { + beforeAll(() => mockConsole()); + beforeEach(() => { + setupTestComponent(); + setUpFixture(); + }); + + it('should be initiated', () => { + expect(component).toBeDefined(); + }); + + it('should render "suspense" template before the first value is emitted', () => { + component.valueSignal = signal(undefined); + fixture.detectChanges(); + expectContentToBe('suspense'); + }); + + it('should render "error" template on observable error', () => { + component.valueSignal = toSignal( + throwError(() => new Error('test error')), + { injector }, + ); + fixture.detectChanges(); + expectContentToBe('error'); + }); + + it('should render "suspense"->"next"->"complete" templates and update view context for the full observable lifecycle', fakeAsync(() => { + component.valueSignal = toSignal(interval(1000).pipe(take(3)), { + requireSync: false, + injector, + }); + fixture.detectChanges(); + expectContentToBe('suspense'); + + tick(1000); + expectContentToBe('0'); + + tick(1000); + expectContentToBe('1'); + + tick(1000); + // the last emitted value ('2') and complete notification are in sync + // so we expect "complete" here + expectContentToBe('2'); + })); + + it('should render "suspense" template when observable never emits (by passing NEVER)', () => { + component.valueSignal = toSignal(NEVER, { requireSync: false, injector }); + fixture.detectChanges(); + expectContentToBe('suspense'); + }); + + describe('triggers', () => { + beforeEach(() => { + component.valueSignal = signal(1); + fixture.detectChanges(); + }); + + it('should render suspense', () => { + component.suspenseTrg.next(); + expectContentToBe('suspense'); + }); + + it('should render complete', () => { + component.completeTrg.next(); + expectContentToBe('complete'); + }); + + it('should render error', () => { + component.errorTrg.next(); + expectContentToBe('error'); + }); + + it('should render "suspense"->"complete"->"error"->"next" templates', () => { + component.suspenseTrg.next(); + expectContentToBe('suspense'); + component.completeTrg.next(); + expectContentToBe('complete'); + component.errorTrg.next(); + expectContentToBe('error'); + component.nextTrg.next(); + expectContentToBe('1'); + + component.trg.next(RxNotificationKind.Suspense); + expectContentToBe('suspense'); + component.trg.next(RxNotificationKind.Complete); + expectContentToBe('complete'); + component.trg.next(RxNotificationKind.Error); + expectContentToBe('error'); + component.trg.next(RxNotificationKind.Next); + expectContentToBe('1'); + }); + }); +}); + +function expectContentToBe(content: string): void { + expect(nativeElement.textContent).toBe(content); +} diff --git a/libs/template/package.json b/libs/template/package.json index e05122f544..364ab6db34 100644 --- a/libs/template/package.json +++ b/libs/template/package.json @@ -1,6 +1,6 @@ { "name": "@rx-angular/template", - "version": "17.1.0", + "version": "17.2.0", "description": "**Fully** Reactive Component Template Rendering in Angular. @rx-angular/template aims to be a reflection of Angular's built in renderings just reactive.", "publishConfig": { "access": "public" diff --git a/libs/template/schematics/src/migrations/drop-modules/__snapshots__/index.spec.ts.snap b/libs/template/schematics/src/migrations/drop-modules/__snapshots__/index.spec.ts.snap index 7b9a298af2..46cb25253e 100644 --- a/libs/template/schematics/src/migrations/drop-modules/__snapshots__/index.spec.ts.snap +++ b/libs/template/schematics/src/migrations/drop-modules/__snapshots__/index.spec.ts.snap @@ -1,53 +1,59 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Template Migration drop-modules should replace LetDirective with RxLet 1`] = ` -"import { RxLet } from '@rx-angular/template/let'; +"import { RxLet } from "@rx-angular/template/let"; -import { Component } from '@angular/core'; + import { Component } from '@angular/core'; -@Component({ - imports: [RxLet], -}) -export class Component {} -" + @Component({ + imports: [RxLet] + }) + export class Component { } + " `; -exports[`Template Migration drop-modules should should replace modules with standalone 1`] = ` -"import { RxIf } from '@rx-angular/template/if'; -import { RxPush } from '@rx-angular/template/push'; -import { RxUnpatch } from '@rx-angular/template/unpatch'; -import { RxFor } from '@rx-angular/template/for'; -import { RxLet } from '@rx-angular/template/let'; - -import { Component } from '@angular/core'; - -@Component({ - imports: [RxLet, RxFor, RxUnpatch, RxPush, RxIf], -}) -export class Component {} -" +exports[`Template Migration drop-modules should replace PushPipe with RxPush 1`] = ` +"import { RxPush } from "@rx-angular/template/push"; + + import { Component } from '@angular/core'; + + @Component({ + imports: [RxPush] + }) + export class Component { } + " `; exports[`Template Migration drop-modules should replace UnpatchDirective with RxUnpatch 1`] = ` -"import { RxUnpatch } from '@rx-angular/template/unpatch'; +"import { RxUnpatch } from "@rx-angular/template/unpatch"; -import { Component } from '@angular/core'; + import { Component } from '@angular/core'; -@Component({ - imports: [RxUnpatch], -}) -export class Component {} -" + @Component({ + imports: [RxUnpatch] + }) + export class Component { } + " `; -exports[`Template Migration drop-modules should replace PushPipe with RxPush 1`] = ` -"import { RxPush } from '@rx-angular/template/push'; - -import { Component } from '@angular/core'; - -@Component({ - imports: [RxPush], -}) -export class Component {} -" +exports[`Template Migration drop-modules should should replace modules with standalone 1`] = ` +"import { RxIf } from "@rx-angular/template/if"; +import { RxPush } from "@rx-angular/template/push"; +import { RxUnpatch } from "@rx-angular/template/unpatch"; +import { RxFor } from "@rx-angular/template/for"; +import { RxLet } from "@rx-angular/template/let"; + + import { Component } from '@angular/core'; + + @Component({ + imports: [ + RxLet, + RxFor, + RxUnpatch, + RxPush, + RxIf + ] + }) + export class Component { } + " `; diff --git a/libs/template/schematics/src/migrations/introduce-rxfor-stable/__snapshots__/index.spec.ts.snap b/libs/template/schematics/src/migrations/introduce-rxfor-stable/__snapshots__/index.spec.ts.snap index 2b210e9841..ac0ab5d5db 100644 --- a/libs/template/schematics/src/migrations/introduce-rxfor-stable/__snapshots__/index.spec.ts.snap +++ b/libs/template/schematics/src/migrations/introduce-rxfor-stable/__snapshots__/index.spec.ts.snap @@ -1,18 +1,23 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Template Migration introduce-rxfor-stable should replace module specifier 1`] = ` -"import { ForModule, RxFor, RxForViewContext } from '@rx-angular/template/for'; +"import { ForModule, RxFor, RxForViewContext } from "@rx-angular/template/for"; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, ForModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule, + ForModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; diff --git a/libs/template/schematics/src/migrations/introduce-rxif-stable/__snapshots__/index.spec.ts.snap b/libs/template/schematics/src/migrations/introduce-rxif-stable/__snapshots__/index.spec.ts.snap index 51dbbe47f7..0327ecd4f1 100644 --- a/libs/template/schematics/src/migrations/introduce-rxif-stable/__snapshots__/index.spec.ts.snap +++ b/libs/template/schematics/src/migrations/introduce-rxif-stable/__snapshots__/index.spec.ts.snap @@ -1,18 +1,23 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Template Migration introduce-rxif-stable should replace module specifier 1`] = ` -"import { IfModule, RxIf, RxIfViewContext } from '@rx-angular/template/if'; +"import { IfModule, RxIf, RxIfViewContext } from "@rx-angular/template/if"; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, IfModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule, + IfModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; diff --git a/libs/template/schematics/src/migrations/update-1.0.0-beta.30/__snapshots__/index.spec.ts.snap b/libs/template/schematics/src/migrations/update-1.0.0-beta.30/__snapshots__/index.spec.ts.snap index 969826fd6a..2cbb1f4827 100644 --- a/libs/template/schematics/src/migrations/update-1.0.0-beta.30/__snapshots__/index.spec.ts.snap +++ b/libs/template/schematics/src/migrations/update-1.0.0-beta.30/__snapshots__/index.spec.ts.snap @@ -1,90 +1,115 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Template Migration 1.0.0-beta.30 should replace LetModule + LetDirective module specifier 1`] = ` -"import { LetModule, LetDirective } from '@rx-angular/template/let'; +"import { LetModule, LetDirective } from "@rx-angular/template/let"; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, LetModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule, + LetModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`Template Migration 1.0.0-beta.30 should replace PushModule + PushPipe module specifier 1`] = ` -"import { PushModule, PushPipe } from '@rx-angular/template/push'; +"import { PushModule, PushPipe } from "@rx-angular/template/push"; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, PushModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule, + PushModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`Template Migration 1.0.0-beta.30 should replace UnpatchEventsModule + UnpatchDirective module specifier 1`] = ` -"import { UnpatchModule, UnpatchDirective } from '@rx-angular/template/unpatch'; +"import { UnpatchModule, UnpatchDirective } from "@rx-angular/template/unpatch"; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, UnpatchModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule, + UnpatchModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`Template Migration 1.0.0-beta.30 should replace UnpatchEventsModule identifier 1`] = ` -"import { UnpatchModule } from '@rx-angular/template/unpatch'; -import { PushModule } from '@rx-angular/template/push'; -import { LetModule } from '@rx-angular/template/let'; +"import { UnpatchModule } from "@rx-angular/template/unpatch"; +import { PushModule } from "@rx-angular/template/push"; +import { LetModule } from "@rx-angular/template/let"; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, UnpatchModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule, + UnpatchModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; exports[`Template Migration 1.0.0-beta.30 should replace all module specifiers 1`] = ` -"import { UnpatchModule } from '@rx-angular/template/unpatch'; -import { PushModule } from '@rx-angular/template/push'; -import { LetModule } from '@rx-angular/template/let'; +"import { UnpatchModule } from "@rx-angular/template/unpatch"; +import { PushModule } from "@rx-angular/template/push"; +import { LetModule } from "@rx-angular/template/let"; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppComponent } from './app.component'; + import { NgModule } from '@angular/core'; + import { BrowserModule } from '@angular/platform-browser'; + import { AppComponent } from './app.component'; -@NgModule({ - declarations: [AppComponent], - imports: [BrowserModule, UnpatchModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -" + @NgModule({ + declarations: [ + AppComponent, + ], + imports: [ + BrowserModule, + UnpatchModule + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + " `; diff --git a/libs/template/schematics/src/utils/format-files.ts b/libs/template/schematics/src/utils/format-files.ts deleted file mode 100644 index 6787de1f81..0000000000 --- a/libs/template/schematics/src/utils/format-files.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CreateFileAction, noop, OverwriteFileAction, Rule, SchematicContext, Tree } from '@angular-devkit/schematics'; -import * as path from 'path'; -import { from } from 'rxjs'; -import { filter, map, mergeMap } from 'rxjs/operators'; - -export function formatFiles( - options: { skipFormat: boolean } = { skipFormat: false } -): Rule { - let prettier: any; - try { - prettier = require('prettier'); - } catch (e) {} - - if (options.skipFormat) { - return noop(); - } - - return (host: Tree, context: SchematicContext): any => { - if (!prettier) { - return host; - } - - const files = new Set( - host.actions - .filter((action) => action.kind !== 'd' && action.kind !== 'r') - .map((action) => ({ - path: action.path, - content: ( - action as OverwriteFileAction | CreateFileAction - ).content.toString(), - })) - ); - if (files.size === 0) { - return host; - } - return from(files).pipe( - filter((file) => host.exists(file.path)), - mergeMap(async (file) => { - const systemPath = path.join(process.cwd(), file.path); - let options: any = { - filepath: systemPath, - }; - const resolvedOptions = await prettier.resolveConfig(systemPath); - if (resolvedOptions) { - options = { - ...options, - ...resolvedOptions, - }; - } - const support = await prettier.getFileInfo(systemPath, options); - if (support.ignored || !support.inferredParser) { - return; - } - - try { - host.overwrite(file.path, prettier.format(file.content, options)); - } catch (e) { - context.logger.warn( - `Could not format ${file.path} because ${e.message}` - ); - } - }), - map(() => host) - ); - }; -} diff --git a/libs/template/schematics/src/utils/renaming-rule.ts b/libs/template/schematics/src/utils/renaming-rule.ts index 8bbc6ff7b4..6951192003 100644 --- a/libs/template/schematics/src/utils/renaming-rule.ts +++ b/libs/template/schematics/src/utils/renaming-rule.ts @@ -9,7 +9,6 @@ import { saveActiveProject, setActiveProject, } from 'ng-morph'; -import { formatFiles } from './format-files'; type ImportConfig = Pick; type RenameConfig = Record; @@ -20,6 +19,9 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { return (): Rule => { return chain([ (tree: Tree) => { + console.log( + 'Migration schematics might cause your code to be formatted incorrectly. Make sure to run your formatter of choice after the migration.', + ); setActiveProject(createProject(tree, '/', ['**/*.ts'])); const imports = getImports('**/*.ts', { @@ -79,7 +81,6 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { saveActiveProject(); }, - formatFiles(), ]); }; } @@ -87,7 +88,7 @@ export function renamingRule(packageName: Pattern, renames: RenameConfig) { function renameReferences( importSpecifier: ImportSpecifier, oldName: string, - newName: string + newName: string, ) { importSpecifier .getNameNode() diff --git a/nx.json b/nx.json index 1da30c57c3..62cb8b7eda 100644 --- a/nx.json +++ b/nx.json @@ -7,9 +7,6 @@ } } }, - "affected": { - "defaultBase": "origin/main" - }, "cli": { "analytics": false, "packageManager": "yarn" @@ -108,5 +105,6 @@ } }, "nxCloudAccessToken": "OTg2OGFkNmMtNzA5Zi00MjBiLWFhMmQtOGYwNTQ1MjM1ZjQ3fHJlYWQtd3JpdGU=", - "parallel": 1 + "parallel": 1, + "defaultBase": "origin/main" } diff --git a/package.json b/package.json index e7b51e4c2f..45b42ced50 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "generate-typescript-docs": "ts-node -P tools/tsconfig.tools.json tools/scripts/docs/generate-typescript-docs.ts", "tracerbench": "tracerbench compare --controlURL http://localhost:4200/rx-angular/demos --experimentURL http://localhost:4242/rx-angular/demos --markers startRouting,endRouting --headless --report", "postinstall": "husky install", + "prepack": "pinst --disable", + "postpack": "pinst --enable", "ssr:isr:dev": "nx build ssr-isr --configuration=development --watch", "ssr:isr:serve": "node dist/apps/ssr-isr/server/server.mjs" }, @@ -37,20 +39,20 @@ "libs/**" ], "dependencies": { - "@angular/animations": "17.1.3", - "@angular/cdk": "17.1.2", - "@angular/cdk-experimental": "17.0.1", - "@angular/common": "17.1.3", - "@angular/compiler": "17.1.3", - "@angular/core": "17.1.3", - "@angular/forms": "17.1.3", + "@angular/animations": "17.3.2", + "@angular/cdk": "17.3.2", + "@angular/cdk-experimental": "17.3.2", + "@angular/common": "17.3.2", + "@angular/compiler": "17.3.2", + "@angular/core": "17.3.2", + "@angular/forms": "17.3.2", "@angular/material": "^16.2.0", - "@angular/platform-browser": "17.1.3", - "@angular/platform-browser-dynamic": "17.1.3", - "@angular/platform-server": "17.1.3", - "@angular/router": "17.1.3", - "@angular/ssr": "17.1.4", - "@typescript-eslint/utils": "6.21.0", + "@angular/platform-browser": "17.3.2", + "@angular/platform-browser-dynamic": "17.3.2", + "@angular/platform-server": "17.3.2", + "@angular/router": "17.3.2", + "@angular/ssr": "17.3.2", + "@typescript-eslint/utils": "7.4.0", "bootstrap": "^5.2.3", "eslint-plugin-unused-imports": "^3.1.0", "ngx-skeleton-loader": "^7.0.0", @@ -63,28 +65,28 @@ "zone.js": "0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "17.1.4", - "@angular-devkit/core": "17.1.4", - "@angular-devkit/schematics": "17.1.4", - "@angular-eslint/eslint-plugin": "17.1.0", - "@angular-eslint/eslint-plugin-template": "17.1.0", - "@angular-eslint/template-parser": "17.1.0", - "@angular/cli": "~17.1.0", - "@angular/compiler-cli": "17.1.3", - "@angular/language-service": "17.1.3", - "@commitlint/cli": "^17.3.0", - "@commitlint/config-angular": "^17.3.0", + "@angular-devkit/build-angular": "17.3.2", + "@angular-devkit/core": "17.3.2", + "@angular-devkit/schematics": "17.3.2", + "@angular-eslint/eslint-plugin": "17.3.0", + "@angular-eslint/eslint-plugin-template": "17.3.0", + "@angular-eslint/template-parser": "17.3.0", + "@angular/cli": "~17.3.0", + "@angular/compiler-cli": "17.3.2", + "@angular/language-service": "17.3.2", + "@commitlint/cli": "^19.2.1", + "@commitlint/config-angular": "^19.1.0", "@jscutlery/semver": "^4.1.0", "@nx-plus/docusaurus": "14.1.0", - "@nx/angular": "18.0.6", - "@nx/cypress": "18.0.6", - "@nx/eslint": "18.0.6", - "@nx/eslint-plugin": "18.0.6", - "@nx/jest": "18.0.6", - "@nx/js": "18.0.6", - "@nx/node": "18.0.6", - "@nx/workspace": "18.0.6", - "@schematics/angular": "17.1.4", + "@nx/angular": "18.2.1", + "@nx/cypress": "18.2.1", + "@nx/eslint": "18.2.1", + "@nx/eslint-plugin": "18.2.1", + "@nx/jest": "18.2.1", + "@nx/js": "18.2.1", + "@nx/node": "18.2.1", + "@nx/workspace": "18.2.1", + "@schematics/angular": "17.3.2", "@swc-node/register": "1.8.0", "@swc/core": "~1.3.85", "@types/benchmark": "^2.1.0", @@ -93,37 +95,37 @@ "@types/klaw-sync": "^6.0.0", "@types/lodash": "^4.14.196", "@types/node": "^18.16.9", - "@typescript-eslint/eslint-plugin": "6.21.0", - "@typescript-eslint/parser": "6.21.0", + "@typescript-eslint/eslint-plugin": "7.4.0", + "@typescript-eslint/parser": "7.4.0", "autoprefixer": "^10.4.0", "benchmark": "^2.1.4", "browser-sync": "^3.0.0", "cpx": "^1.5.0", - "cypress": "^13.5.0", - "eslint": "8.48.0", - "eslint-config-prettier": "9.0.0", + "cypress": "^13.6.6", + "eslint": "8.57.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-cypress": "2.15.1", "eslint-plugin-simple-import-sort": "^12.0.0", "express": "4.18.2", - "husky": "^8.0.3", + "husky": "^9.0.11", "jest": "^29.4.1", "jest-environment-jsdom": "29.5.0", - "jest-preset-angular": "13.1.6", + "jest-preset-angular": "14.0.3", "jsonc-eslint-parser": "^2.1.0", "klaw-sync": "^6.0.0", "lint-staged": "^12.0.3", "lodash": "^4.17.21", "markdown-link-check": "^3.11.2", "ng-morph": "^4.0.3", - "ng-packagr": "17.1.2", - "nx": "18.0.6", + "ng-packagr": "17.3.0", + "nx": "18.2.1", "postcss": "^8.4.6", "postcss-import": "14.1.0", "postcss-preset-env": "7.5.0", "postcss-url": "10.1.3", - "prettier": "2.8.4", + "prettier": "3.2.5", "ts-jest": "29.1.0", "ts-node": "10.9.1", - "typescript": "5.3.3" + "typescript": "5.4.3" } } diff --git a/yarn.lock b/yarn.lock index a6fc4a747a..bc0a748d62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -140,7 +140,15 @@ "@algolia/logger-common" "4.17.0" "@algolia/requester-common" "4.17.0" -"@ampproject/remapping@2.2.1", "@ampproject/remapping@^2.2.0": +"@ampproject/remapping@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== @@ -148,251 +156,250 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1701.4": - version "0.1701.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1701.4.tgz#7d517dd5cd686c7dcd99b9b1351a642adf888756" - integrity sha512-FHEp6etsxjD+04vsrx9QbULRhLoyLfThK/sNMNnRI4n0CaNOS2879ZBua9dRedUEUYR8DzKXw1rPJX0t/65X6g== +"@angular-devkit/architect@0.1703.2": + version "0.1703.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1703.2.tgz#42cf1f1de946d9d9530030e35bd53a8f3b9249d8" + integrity sha512-fT5gSzwDHOyGv8zF97t8rjeoYSGSxXjWWstl3rN1nXdO0qgJ5m6Sv0fupON+HltdXDCBLRH+2khNpqx/Fh0Qww== dependencies: - "@angular-devkit/core" "17.1.4" + "@angular-devkit/core" "17.3.2" rxjs "7.8.1" -"@angular-devkit/build-angular@17.1.4": - version "17.1.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.1.4.tgz#fa0a50033a894059bde69ad7a9ee63be080f56b2" - integrity sha512-9IunLi7MHr7yMHfnYKHLP+mKjwlh+np110G8dERLo/nzIUeN0WvuZBqXuJnrAcUgklpQkGfcDfwaIjo3o76GWQ== +"@angular-devkit/build-angular@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.3.2.tgz#3d0167c2495acac11c74ee2799006481cce714bf" + integrity sha512-muPCUyL0uHvRkLH4NLWiccER6P2vCm/Q5DDvqyN4XOzzY3tAHHLrKrpvY87sgd2oNJ6Ci8x7GPNcfzR5KELCnw== dependencies: - "@ampproject/remapping" "2.2.1" - "@angular-devkit/architect" "0.1701.4" - "@angular-devkit/build-webpack" "0.1701.4" - "@angular-devkit/core" "17.1.4" - "@babel/core" "7.23.7" + "@ampproject/remapping" "2.3.0" + "@angular-devkit/architect" "0.1703.2" + "@angular-devkit/build-webpack" "0.1703.2" + "@angular-devkit/core" "17.3.2" + "@babel/core" "7.24.0" "@babel/generator" "7.23.6" "@babel/helper-annotate-as-pure" "7.22.5" "@babel/helper-split-export-declaration" "7.22.6" - "@babel/plugin-transform-async-generator-functions" "7.23.7" + "@babel/plugin-transform-async-generator-functions" "7.23.9" "@babel/plugin-transform-async-to-generator" "7.23.3" - "@babel/plugin-transform-runtime" "7.23.7" - "@babel/preset-env" "7.23.7" - "@babel/runtime" "7.23.7" + "@babel/plugin-transform-runtime" "7.24.0" + "@babel/preset-env" "7.24.0" + "@babel/runtime" "7.24.0" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "17.1.4" - "@vitejs/plugin-basic-ssl" "1.0.2" + "@ngtools/webpack" "17.3.2" + "@vitejs/plugin-basic-ssl" "1.1.0" ansi-colors "4.1.3" - autoprefixer "10.4.16" + autoprefixer "10.4.18" babel-loader "9.1.3" babel-plugin-istanbul "6.1.1" browserslist "^4.21.5" copy-webpack-plugin "11.0.0" - critters "0.0.20" - css-loader "6.8.1" - esbuild-wasm "0.19.11" + critters "0.0.22" + css-loader "6.10.0" + esbuild-wasm "0.20.1" fast-glob "3.3.2" http-proxy-middleware "2.0.6" - https-proxy-agent "7.0.2" - inquirer "9.2.12" - jsonc-parser "3.2.0" + https-proxy-agent "7.0.4" + inquirer "9.2.15" + jsonc-parser "3.2.1" karma-source-map-support "1.4.0" less "4.2.0" less-loader "11.1.0" license-webpack-plugin "4.0.2" loader-utils "3.2.1" - magic-string "0.30.5" - mini-css-extract-plugin "2.7.6" + magic-string "0.30.8" + mini-css-extract-plugin "2.8.1" mrmime "2.0.0" open "8.4.2" ora "5.4.1" parse5-html-rewriting-stream "7.0.0" - picomatch "3.0.1" - piscina "4.2.1" - postcss "8.4.33" - postcss-loader "7.3.4" + picomatch "4.0.1" + piscina "4.4.0" + postcss "8.4.35" + postcss-loader "8.1.1" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.69.7" - sass-loader "13.3.3" - semver "7.5.4" + sass "1.71.1" + sass-loader "14.1.1" + semver "7.6.0" source-map-loader "5.0.0" source-map-support "0.5.21" - terser "5.26.0" - text-table "0.2.0" + terser "5.29.1" tree-kill "1.2.2" tslib "2.6.2" - undici "6.2.1" - vite "5.0.12" + undici "6.7.1" + vite "5.1.5" watchpack "2.4.0" - webpack "5.89.0" - webpack-dev-middleware "6.1.1" + webpack "5.90.3" + webpack-dev-middleware "6.1.2" webpack-dev-server "4.15.1" webpack-merge "5.10.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.19.11" + esbuild "0.20.1" -"@angular-devkit/build-webpack@0.1701.4": - version "0.1701.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1701.4.tgz#caf8a3cba9e9b682e2c7a5d406dafd648e05413a" - integrity sha512-Ahx6uepMJ5C2z7GCXBHVOfPGU0M1BUk9XzRePu9KaWmGkhskD4iOP1xvLZZqX84GK2WgksiOFmFlBjlioK34vg== +"@angular-devkit/build-webpack@0.1703.2": + version "0.1703.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1703.2.tgz#3d8f508e2fd982d329fbdf3e129fb35e74c39c6d" + integrity sha512-w7rVFQcZK4iTCd/MLfQWIkDkwBOfAs++txNQyS9qYID8KvLs1V+oWYd2qDBRelRv1u3YtaCIS1pQx3GFKBC3OA== dependencies: - "@angular-devkit/architect" "0.1701.4" + "@angular-devkit/architect" "0.1703.2" rxjs "7.8.1" -"@angular-devkit/core@17.1.4": - version "17.1.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.1.4.tgz#6c8b8d17604847a23f78ed701c7bd85629920b35" - integrity sha512-6qM5W+iw7f08i0w+6LsXbyWm43fPEqPzPS9bBRbyZbf/JtGn4yvGIv0RfUvrBKFZp+lrKsxH3abdbdKWnBWl4g== +"@angular-devkit/core@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.3.2.tgz#877c9443a4042c794a84857f4193b309459e3bea" + integrity sha512-1vxKo9+pdSwTOwqPDSYQh84gZYmCJo6OgR5+AZoGLGMZSeqvi9RG5RiUcOMLQYOnuYv0arlhlWxz0ZjyR8ApKw== dependencies: ajv "8.12.0" ajv-formats "2.1.1" - jsonc-parser "3.2.0" - picomatch "3.0.1" + jsonc-parser "3.2.1" + picomatch "4.0.1" rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@17.1.4": - version "17.1.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.1.4.tgz#a63618751340ec398ad1a9716c30c5ab9763078f" - integrity sha512-Jv67vpYNMjnBOOL/98uSmchIpHX+sOPpOKRiphLJJbndNdfAEEj0wRHfvunWngKEpYkHYW+XPbbfk7lm/Qj/xQ== +"@angular-devkit/schematics@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.3.2.tgz#52250e936034f5292e3da85a9eb5304edf716fb8" + integrity sha512-AYO6oc6QpFGigc1KiDzEVT1CeLnwvnIedU5Q/U3JDZ/Yqmvgc09D64g9XXER2kg6tV7iEgLxiYnonIAQOHq7eA== dependencies: - "@angular-devkit/core" "17.1.4" - jsonc-parser "3.2.0" - magic-string "0.30.5" + "@angular-devkit/core" "17.3.2" + jsonc-parser "3.2.1" + magic-string "0.30.8" ora "5.4.1" rxjs "7.8.1" -"@angular-eslint/bundled-angular-compiler@17.1.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.1.0.tgz#71494f60ddb0cfabb047446a1d8a914f6a83eae4" - integrity sha512-Y+CN/8nQZaYjsb2b2sXbkQr0LrgBWhCzyLZ+rLfnLE60B9k4GeDt5b7z/OdSObi1xozXfqiaAZ1eXo0iQMN3JA== +"@angular-eslint/bundled-angular-compiler@17.3.0": + version "17.3.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz#08b8b1bebbb677a1f208b56516fc9177a289d212" + integrity sha512-ejfNzRuBeHUV8m2fkgs+M809rj5STuCuQo4fdfc6ccQpzXDI6Ha7BKpTznWfg5g529q/wrkoGSGgFxU9Yc2/dQ== -"@angular-eslint/eslint-plugin-template@17.1.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.1.0.tgz#34aba27cd5054dc63561349aad0aa7534b53cd77" - integrity sha512-nL9VhChwFQLIRQM4xbTY8Vo095Q4/D77hPtqt3ShYIrORjYTwaWa8+neexToAqXVMapce7oFmFa/OqtxvEerLg== +"@angular-eslint/eslint-plugin-template@17.3.0": + version "17.3.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.3.0.tgz#712a99503b4ef12e9f37979375539c3ace44375b" + integrity sha512-9l/aRfpE9MCRVDWRb+rSB9Zei0paep1vqV6M/87VUnzBnzqeMRnVuPvQowilh2zweVSGKBF25Vp4HkwOL6ExDQ== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.0" - "@angular-eslint/utils" "17.1.0" - "@typescript-eslint/type-utils" "6.11.0" - "@typescript-eslint/utils" "6.11.0" + "@angular-eslint/bundled-angular-compiler" "17.3.0" + "@angular-eslint/utils" "17.3.0" + "@typescript-eslint/type-utils" "7.2.0" + "@typescript-eslint/utils" "7.2.0" aria-query "5.3.0" axobject-query "4.0.0" -"@angular-eslint/eslint-plugin@17.1.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-17.1.0.tgz#461be368ba0558a4a648a1da0eca0cbb56407e48" - integrity sha512-pQac5h+XwsquDzaasK/xs9tjdQ/f9eLq8e5An9eXJGHWy4KcrMmQ1XrpaMMMg503LF3rRG/dHKBskGsYgSN9oQ== +"@angular-eslint/eslint-plugin@17.3.0": + version "17.3.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-17.3.0.tgz#b5037877cdc64d407649247e5ca09851c8674b4e" + integrity sha512-81cQbOEPoQupFX8WmpqZn+y8VA7JdVRGBtt+uJNKBXcJknTpPWdLBZRFlgVakmC24iEZ0Fint/N3NBBQI3mz2A== dependencies: - "@angular-eslint/utils" "17.1.0" - "@typescript-eslint/utils" "6.11.0" + "@angular-eslint/utils" "17.3.0" + "@typescript-eslint/utils" "7.2.0" -"@angular-eslint/template-parser@17.1.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-17.1.0.tgz#27b670b6ec1b1b8d1fc01a23d3ab53cc54bc1e3c" - integrity sha512-CTxzB3stjynngTabdO8xTkiPc6Jvo15C2fxb1pYIlDIH2LgPJJxxCHi+IAt9oJpJOPa8QjLVF9VAXE3fLKAcpg== +"@angular-eslint/template-parser@17.3.0": + version "17.3.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-17.3.0.tgz#580a703cbaa4967d36a953a00f5c347987c14171" + integrity sha512-m+UzAnWgtjeS0x6skSmR0eXltD/p7HZA+c8pPyAkiHQzkxE7ohhfyZc03yWGuYJvWQUqQAKKdO/nQop14TP0bg== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.0" - eslint-scope "^7.0.0" + "@angular-eslint/bundled-angular-compiler" "17.3.0" + eslint-scope "^8.0.0" -"@angular-eslint/utils@17.1.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-17.1.0.tgz#eb8a8855d6ae30649cccdf869d0b556a6f6ed7ba" - integrity sha512-AmG0xpRtnBQwrbHObonSilmD3hiFEtZHwFY3LT28VWxznB6WIAHFE7SrKWrRsRsXlib8LaRo4uobR5+MO8aLpw== +"@angular-eslint/utils@17.3.0": + version "17.3.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-17.3.0.tgz#85915e864c7b7f33df1fdf15f74cc99fd5895e1e" + integrity sha512-PJT9pxWqpvI9OXO+7L5SIVhvMW+RFjeafC7PYjtvSbNFpz+kF644BiAcfMJ0YqBnkrw3JXt+RAX25CT4mXIoXw== dependencies: - "@angular-eslint/bundled-angular-compiler" "17.1.0" - "@typescript-eslint/utils" "6.11.0" + "@angular-eslint/bundled-angular-compiler" "17.3.0" + "@typescript-eslint/utils" "7.2.0" -"@angular/animations@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.1.3.tgz#be67fc479cfc700d7c1270222003c6d2bc622194" - integrity sha512-AS9CHOjjKqkuAzlKEMJfAkZfkIdSoagB3D8HwvH+ZHo6GVJc9KbtLQn/okNijFK+Fg7QK/hYbQ3lJhjgk0GQDA== +"@angular/animations@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.3.2.tgz#ab2408e9ca18e10ab6dda356563e85ab1659c0ef" + integrity sha512-9RplCRS3dS7I8UeMmnwVCAxEaixQCj98UkSqjErO+GX5KJwMsFPydh7HKWH0/yclidJe5my41psEiQkyEyGKww== dependencies: tslib "^2.3.0" -"@angular/cdk-experimental@17.0.1": - version "17.0.1" - resolved "https://registry.yarnpkg.com/@angular/cdk-experimental/-/cdk-experimental-17.0.1.tgz#23524d9eda3d57eacd0d2fedb2719a22d09a202b" - integrity sha512-oW10hhW04YwcNTptAYAVmKSJnO5eZAG2u8c/mUXMplJd0E1PBs6MnkpdGqZxImHS5Yfi8fqGnwH5N4VnB0FXfQ== +"@angular/cdk-experimental@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/cdk-experimental/-/cdk-experimental-17.3.2.tgz#6975bc0a1ea1911aa975ae5a288b3385f4d967a8" + integrity sha512-JbB1Vv7k6EBaY+a5OFX15u/manY0osRxB4Q7Pvfcgi+3fCvJ3CwqTw7KpHNczGU8m9+SYAOGdLpoOo4YUFEJeA== dependencies: tslib "^2.3.0" -"@angular/cdk@17.1.2": - version "17.1.2" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.1.2.tgz#f79bbf57fbbd0cf59ed9a1611c2c5ffacea11628" - integrity sha512-eu9D60RQv213qi7oh6ae9Z+d6+AG/aqi0y70Ag9BjwqTiatDiYvSySxswxYYKdzPp0hx0ZUTGi16LqtT6pyj6Q== +"@angular/cdk@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.3.2.tgz#b438da913cdc482216a7b4a856c7c106c5baa2cd" + integrity sha512-mC2U7aoIf7RSpGgIwVyfQEbaPDDX59plQt88KeTz15wjF8vosLt2DG0rZEoV8Mq14YS47J+jI76q/LJfd6/GCw== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@~17.1.0": - version "17.1.4" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.1.4.tgz#1c1ead2a3c4953bffb91b8f453680d323da63c41" - integrity sha512-3hY+7G8RvWF5r8uQWvCXig/LI74bAji4TR6x3TcFclQ9fIY8Lgs7SDUZ6paWOqdex4lPTZw41+ryUydrXYpTtA== +"@angular/cli@~17.3.0": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.3.2.tgz#7ee53207284607b478182c94cb8a523b8d622006" + integrity sha512-g6r4XZyGnh9P6GmWgaFh8RmR4L6UdQ408e3SpG3rjncuPRD57Ur8806GfCLPt6HIA9TARiKmaJ0EJ3RsIjag0g== dependencies: - "@angular-devkit/architect" "0.1701.4" - "@angular-devkit/core" "17.1.4" - "@angular-devkit/schematics" "17.1.4" - "@schematics/angular" "17.1.4" + "@angular-devkit/architect" "0.1703.2" + "@angular-devkit/core" "17.3.2" + "@angular-devkit/schematics" "17.3.2" + "@schematics/angular" "17.3.2" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" - ini "4.1.1" - inquirer "9.2.12" - jsonc-parser "3.2.0" + ini "4.1.2" + inquirer "9.2.15" + jsonc-parser "3.2.1" npm-package-arg "11.0.1" npm-pick-manifest "9.0.0" open "8.4.2" ora "5.4.1" - pacote "17.0.5" + pacote "17.0.6" resolve "1.22.8" - semver "7.5.4" + semver "7.6.0" symbol-observable "4.0.0" yargs "17.7.2" -"@angular/common@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.1.3.tgz#d8411db80510a99a23ad01a56264c3594625936a" - integrity sha512-AzLzoNSeRSNGBQk0K+iG0XdYG36SDeJqYqE8rfoiWuv1NDFLL05UJM2/fQfaMNg0oX5bHOlHUqHFj3sFR/NVpw== +"@angular/common@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.3.2.tgz#3feb3b86ac0d9ca412dc52c4fbac85da04b366c0" + integrity sha512-7fo+hrQEzo+VX0fJAKK+P4YNeiEnpdMOAkyIdwweyAeUZYeFIs6TKtax3CiJAubnkIkhQ/52uxiusDhK3Wg/WQ== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.1.3.tgz#f1cbb68eb089c7aa161bab315cdc1a0004fac768" - integrity sha512-bNDHXo3Twub0BZK9OmXly+0REs0RuR1SUXlTAeq+0XubCvnBDvpg9peL7UTTGS5YRo9sUTBnR6faSUA1F5objQ== +"@angular/compiler-cli@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.3.2.tgz#01108b802f0e83d4fbc55fb7d9ea6e0738d49c5f" + integrity sha512-PG81BrJjeF679tkafjt+t9VEBE1rPq39cdLoBTnPY7Q+E/thVoem5JTRG6hmnLmwEc0xxY6sfYpvx2BB5ywUSA== dependencies: - "@babel/core" "7.23.2" + "@babel/core" "7.23.9" "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^3.0.0" convert-source-map "^1.5.1" - reflect-metadata "^0.1.2" + reflect-metadata "^0.2.0" semver "^7.0.0" tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.1.3.tgz#157e834eb4b0cb4f339bc8a0da8dcb438e92034a" - integrity sha512-k/s21gPPKStxVOLr6l4Y145OIxyBY7BhTPVOl/qEAgE+IcZ9vkiA8dYl8yjL884Kl1ZKPmFA3AofMJjWjZGNag== +"@angular/compiler@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.3.2.tgz#c36c351828362c1b3522cb8b4d02a037de05a47a" + integrity sha512-+/l/FQpVsOPbxZzSKyqEra+yxoI/r8LlTRqshVACv10+DKMWJMHnDkVUrNxvWHutfn4RszpGMtbtHp3yM9rxcA== dependencies: tslib "^2.3.0" -"@angular/core@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.1.3.tgz#12f4adb8d1037ba1572c7531997d82a82fbe8fc1" - integrity sha512-2lZ4DRHN8KJ/aQads+YXIcx5Ri9yyeFIlw69m5Pn7wAi/+Rakg7IsclgLaWs7aBtWwMHG7LnqFKxAVq7CjXKtA== +"@angular/core@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.3.2.tgz#78e7253563ed1233afcd3e5f1399f5d770ca6c5b" + integrity sha512-eylatBGaN8uihKomEcXkaSHmAea5bEqu1OXifEoVOJiJpJA9Dbt/VcLXkIRFnRGH2NWUT5W79vSoU9GRvPMk5w== dependencies: tslib "^2.3.0" -"@angular/forms@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.1.3.tgz#1e87b39e237a1d6f7cc2f78ad8d6b597b5ef08aa" - integrity sha512-aNa0jGLT5d+hnKVrSo8tk3TRo/NLNu1RxLNx8RhIczKAeCK3eD8SvTMy27iJtyXmNG2GWN7QPiDeGepd75nbxQ== +"@angular/forms@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.3.2.tgz#538fdef417d6a0b97889eae89379c4a464d8e5fe" + integrity sha512-sbHYjAEeEWW+02YDEKuuuTEUukm6AayQuHiAu37vACj/2q/2RWQar49IoRcSJfAwP2ckqRSK4mmLoDX4IG/KSg== dependencies: tslib "^2.3.0" -"@angular/language-service@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-17.1.3.tgz#40ec52fa58ee67624ebf8a2eaf20dab04c2a01fb" - integrity sha512-SO1xXfLwfTvPzxzJoan/sx5Agt1k3WlpEO9siPlZdNsD6zCkRziS0DotWIblGFtxCPUA4x205V3ihx+gaFi3DA== +"@angular/language-service@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-17.3.2.tgz#32cae8ed097003d7662af3c2c25e43efed290751" + integrity sha512-IYlPHPi6RIQB9BQFwCY7rKRymlb4KhEr2UmXEpxIcj1QqVlMchYBVg2+twZloRj3qj/YQ19y2xxyPcgQRWHLIA== "@angular/material@^16.2.0": version "16.2.14" @@ -448,48 +455,43 @@ "@material/typography" "15.0.0-canary.bc9ae6c9c.0" tslib "^2.3.0" -"@angular/platform-browser-dynamic@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.1.3.tgz#7391d547a22b85e95de8ee1f16faf6b876f26ae1" - integrity sha512-0lFhcFJfDzCSSVe8l8OY+UgUiwUwcbxwpvLod3XWBpf1iEUlr5720FIMA3VJYwpW3Oj4Uey3nVm13EMtRqpqdA== +"@angular/platform-browser-dynamic@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.2.tgz#439b71b68d74a320943e0ae30287b29fee7b6400" + integrity sha512-fcGo9yQ+t9VaG9zPgjQW5HIizbYOKj+9kVk9FPru+uJbYyvJUwEDgpD3aI0DUrQy/OvSf4NMzY/Ucgw1AUknQw== dependencies: tslib "^2.3.0" -"@angular/platform-browser@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.1.3.tgz#3883cf089f2e5bd24b99df1e7c2cdd3df3d97514" - integrity sha512-onPCvdk9f/6OhOo2zP6nfGKpzLma1QIxpFqD3jymbmIJTcVMOOQDMYW3eLtY+uSX8ribcJ7GQcbDGIM4rliTFg== +"@angular/platform-browser@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.3.2.tgz#cfaa9d270237536a53d716e994994257f42cdbff" + integrity sha512-rBVmpJ/uh+CTjYef3Nib1K+31GFbM4mZaw2R2PowKZLgWOT3MWXKy41i44NEyM8qY1dxESmzMzy4NuGfZol42Q== dependencies: tslib "^2.3.0" -"@angular/platform-server@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-17.1.3.tgz#b30236072a8a6f97198eaf41a121759e62922477" - integrity sha512-EB+sk4oZuUPEbkGSM0jpHAKiZVH98IBlXaRYDcmRCRw1hjZwsxl0kAQNuInSGfwJlyjVF7WCrZ6eNCuxlxXiAQ== +"@angular/platform-server@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-17.3.2.tgz#e0afd83ab8ed7e6bebbd8154d4a6167f1f6dd201" + integrity sha512-DXd1jT1GY5yaj7+IVj//cUAiLXBcCBiAEBg7TIUipLyuiWC29TzDxh2yok57pHk2cPUwkscnd4dsHe4Ig07i1Q== dependencies: tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@17.1.3": - version "17.1.3" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.1.3.tgz#30d12b43079f44fda2ab968cde41da3548450d9e" - integrity sha512-6HigdtFjm+76UU2hiLGLE2SpOecQhD6TnAVTocDuRitpN5m0dyiffBrqxarfNwoZuMdIiXyqClJR4JRo1rJjoQ== +"@angular/router@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.3.2.tgz#de01c34f7e5d3d97bbbb67d6c825ea482cc5986b" + integrity sha512-BJiaG7zldhe8FPsg3Xv1o2xsmWNMIuntubRiSt2NlSceAr/NEgHoARpZfAGKTaFSngl6jc407wHOmBBPPALECw== dependencies: tslib "^2.3.0" -"@angular/ssr@17.1.4": - version "17.1.4" - resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-17.1.4.tgz#f2ad6078fb3858ef31c4ace0610e6f362ed23c08" - integrity sha512-HOTsO6BWFTthqlabEBg7yML8jIbdJeQ0EhZzaUiQP5UKJ7RZof1nv0OrhHU6cmBJqQT9drMh6oAnuVCKFvDJfg== +"@angular/ssr@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-17.3.2.tgz#3e1ec9cb825ee1689c90363311112b523397ce2d" + integrity sha512-8q/SWM8jRGxRpIg+zAhvou2ITSePmpdzgMXr5mjj/i4k0vGulo5Rmw3ksYdrb/IIJe91m+/w3rpATwCguKRcXw== dependencies: - critters "0.0.20" + critters "0.0.22" tslib "^2.3.0" -"@assemblyscript/loader@^0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" - integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.8.3": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" @@ -513,6 +515,14 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" +"@babel/code-frame@^7.24.1": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" @@ -550,42 +560,42 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== +"@babel/core@7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/core@7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" - integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== +"@babel/core@7.24.0", "@babel/core@^7.23.2": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" + integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.7" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" + "@babel/helpers" "^7.24.0" + "@babel/parser" "^7.24.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -613,27 +623,6 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.23.2": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" - integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.0" - "@babel/parser" "^7.24.0" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.0" - "@babel/types" "^7.24.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - "@babel/generator@7.23.6", "@babel/generator@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" @@ -654,14 +643,14 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" + integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@7.22.5", "@babel/helper-annotate-as-pure@^7.22.5": @@ -784,17 +773,6 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-define-polyfill-provider@^0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" - integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - "@babel/helper-define-polyfill-provider@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" @@ -1101,16 +1079,16 @@ "@babel/traverse" "^7.21.0" "@babel/types" "^7.21.0" -"@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.23.9": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" + integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" -"@babel/helpers@^7.23.7", "@babel/helpers@^7.24.0": +"@babel/helpers@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== @@ -1146,17 +1124,32 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.18.8", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": +"@babel/parser@^7.22.15": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/parser@^7.23.6", "@babel/parser@^7.24.0": +"@babel/parser@^7.23.9", "@babel/parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" + integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== + +"@babel/parser@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== @@ -1552,17 +1545,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" - integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-generator-functions@^7.23.7", "@babel/plugin-transform-async-generator-functions@^7.23.9": +"@babel/plugin-transform-async-generator-functions@7.23.9", "@babel/plugin-transform-async-generator-functions@^7.23.9": version "7.23.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== @@ -1658,7 +1641,7 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.23.5", "@babel/plugin-transform-classes@^7.23.8": +"@babel/plugin-transform-classes@^7.23.8": version "7.23.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== @@ -1894,7 +1877,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" -"@babel/plugin-transform-modules-systemjs@^7.23.3", "@babel/plugin-transform-modules-systemjs@^7.23.9": +"@babel/plugin-transform-modules-systemjs@^7.23.9": version "7.23.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw== @@ -1966,7 +1949,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.23.4", "@babel/plugin-transform-object-rest-spread@^7.24.0": +"@babel/plugin-transform-object-rest-spread@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz#7b836ad0088fdded2420ce96d4e1d3ed78b71df1" integrity sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w== @@ -2126,16 +2109,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-runtime@7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" - integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== +"@babel/plugin-transform-runtime@7.24.0", "@babel/plugin-transform-runtime@^7.23.2": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz#e308fe27d08b74027d42547081eefaf4f2ffbcc9" + integrity sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA== dependencies: "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.7" - babel-plugin-polyfill-corejs3 "^0.8.7" - babel-plugin-polyfill-regenerator "^0.5.4" + "@babel/helper-plugin-utils" "^7.24.0" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" semver "^6.3.1" "@babel/plugin-transform-runtime@^7.18.6": @@ -2150,18 +2133,6 @@ babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" -"@babel/plugin-transform-runtime@^7.23.2": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz#e308fe27d08b74027d42547081eefaf4f2ffbcc9" - integrity sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA== - dependencies: - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" - babel-plugin-polyfill-corejs2 "^0.4.8" - babel-plugin-polyfill-corejs3 "^0.9.0" - babel-plugin-polyfill-regenerator "^0.5.5" - semver "^6.3.1" - "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" @@ -2300,14 +2271,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.7.tgz#e5d69b9f14db8a13bae4d8e5ce7f360973626241" - integrity sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA== +"@babel/preset-env@7.24.0", "@babel/preset-env@^7.23.2": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.0.tgz#11536a7f4b977294f0bdfad780f01a8ac8e183fc" + integrity sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA== dependencies: "@babel/compat-data" "^7.23.5" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-validator-option" "^7.23.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" @@ -2332,13 +2303,13 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-generator-functions" "^7.23.9" "@babel/plugin-transform-async-to-generator" "^7.23.3" "@babel/plugin-transform-block-scoped-functions" "^7.23.3" "@babel/plugin-transform-block-scoping" "^7.23.4" "@babel/plugin-transform-class-properties" "^7.23.3" "@babel/plugin-transform-class-static-block" "^7.23.4" - "@babel/plugin-transform-classes" "^7.23.5" + "@babel/plugin-transform-classes" "^7.23.8" "@babel/plugin-transform-computed-properties" "^7.23.3" "@babel/plugin-transform-destructuring" "^7.23.3" "@babel/plugin-transform-dotall-regex" "^7.23.3" @@ -2354,13 +2325,13 @@ "@babel/plugin-transform-member-expression-literals" "^7.23.3" "@babel/plugin-transform-modules-amd" "^7.23.3" "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.9" "@babel/plugin-transform-modules-umd" "^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" "@babel/plugin-transform-new-target" "^7.23.3" "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" "@babel/plugin-transform-numeric-separator" "^7.23.4" - "@babel/plugin-transform-object-rest-spread" "^7.23.4" + "@babel/plugin-transform-object-rest-spread" "^7.24.0" "@babel/plugin-transform-object-super" "^7.23.3" "@babel/plugin-transform-optional-catch-binding" "^7.23.4" "@babel/plugin-transform-optional-chaining" "^7.23.4" @@ -2380,9 +2351,9 @@ "@babel/plugin-transform-unicode-regex" "^7.23.3" "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.7" - babel-plugin-polyfill-corejs3 "^0.8.7" - babel-plugin-polyfill-regenerator "^0.5.4" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" core-js-compat "^3.31.0" semver "^6.3.1" @@ -2467,92 +2438,6 @@ core-js-compat "^3.25.1" semver "^6.3.0" -"@babel/preset-env@^7.23.2": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.0.tgz#11536a7f4b977294f0bdfad780f01a8ac8e183fc" - integrity sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.23.3" - "@babel/plugin-syntax-import-attributes" "^7.23.3" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.9" - "@babel/plugin-transform-async-to-generator" "^7.23.3" - "@babel/plugin-transform-block-scoped-functions" "^7.23.3" - "@babel/plugin-transform-block-scoping" "^7.23.4" - "@babel/plugin-transform-class-properties" "^7.23.3" - "@babel/plugin-transform-class-static-block" "^7.23.4" - "@babel/plugin-transform-classes" "^7.23.8" - "@babel/plugin-transform-computed-properties" "^7.23.3" - "@babel/plugin-transform-destructuring" "^7.23.3" - "@babel/plugin-transform-dotall-regex" "^7.23.3" - "@babel/plugin-transform-duplicate-keys" "^7.23.3" - "@babel/plugin-transform-dynamic-import" "^7.23.4" - "@babel/plugin-transform-exponentiation-operator" "^7.23.3" - "@babel/plugin-transform-export-namespace-from" "^7.23.4" - "@babel/plugin-transform-for-of" "^7.23.6" - "@babel/plugin-transform-function-name" "^7.23.3" - "@babel/plugin-transform-json-strings" "^7.23.4" - "@babel/plugin-transform-literals" "^7.23.3" - "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" - "@babel/plugin-transform-member-expression-literals" "^7.23.3" - "@babel/plugin-transform-modules-amd" "^7.23.3" - "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.9" - "@babel/plugin-transform-modules-umd" "^7.23.3" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" - "@babel/plugin-transform-numeric-separator" "^7.23.4" - "@babel/plugin-transform-object-rest-spread" "^7.24.0" - "@babel/plugin-transform-object-super" "^7.23.3" - "@babel/plugin-transform-optional-catch-binding" "^7.23.4" - "@babel/plugin-transform-optional-chaining" "^7.23.4" - "@babel/plugin-transform-parameters" "^7.23.3" - "@babel/plugin-transform-private-methods" "^7.23.3" - "@babel/plugin-transform-private-property-in-object" "^7.23.4" - "@babel/plugin-transform-property-literals" "^7.23.3" - "@babel/plugin-transform-regenerator" "^7.23.3" - "@babel/plugin-transform-reserved-words" "^7.23.3" - "@babel/plugin-transform-shorthand-properties" "^7.23.3" - "@babel/plugin-transform-spread" "^7.23.3" - "@babel/plugin-transform-sticky-regex" "^7.23.3" - "@babel/plugin-transform-template-literals" "^7.23.3" - "@babel/plugin-transform-typeof-symbol" "^7.23.3" - "@babel/plugin-transform-unicode-escapes" "^7.23.3" - "@babel/plugin-transform-unicode-property-regex" "^7.23.3" - "@babel/plugin-transform-unicode-regex" "^7.23.3" - "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.8" - babel-plugin-polyfill-corejs3 "^0.9.0" - babel-plugin-polyfill-regenerator "^0.5.5" - core-js-compat "^3.31.0" - semver "^6.3.1" - "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" @@ -2620,10 +2505,10 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" -"@babel/runtime@7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193" - integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA== +"@babel/runtime@7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" + integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== dependencies: regenerator-runtime "^0.14.0" @@ -2659,7 +2544,7 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/template@^7.24.0": +"@babel/template@^7.23.9", "@babel/template@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== @@ -2684,23 +2569,23 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.23.9", "@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" globals "^11.1.0" -"@babel/traverse@^7.23.7", "@babel/traverse@^7.24.0": +"@babel/traverse@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== @@ -2734,7 +2619,7 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.23.6", "@babel/types@^7.24.0": +"@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== @@ -2753,171 +2638,165 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@commitlint/cli@^17.3.0": - version "17.5.1" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.5.1.tgz#db176538db7b4140c8856c88a46bd15ec705f881" - integrity sha512-pRRgGSzdHQHehxZbGA3qF6wVPyl+EEQgTe/t321rtMLFbuJ7nRj2waS17s/v5oEbyZtiY5S8PGB6XtEIm0I+Sg== - dependencies: - "@commitlint/format" "^17.4.4" - "@commitlint/lint" "^17.4.4" - "@commitlint/load" "^17.5.0" - "@commitlint/read" "^17.5.1" - "@commitlint/types" "^17.4.4" - execa "^5.0.0" - lodash.isfunction "^3.0.9" - resolve-from "5.0.0" - resolve-global "1.0.0" +"@commitlint/cli@^19.2.1": + version "19.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.2.1.tgz#8f00d27a8b7c7780e75b06fd4658fdc1e9209f1b" + integrity sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg== + dependencies: + "@commitlint/format" "^19.0.3" + "@commitlint/lint" "^19.1.0" + "@commitlint/load" "^19.2.0" + "@commitlint/read" "^19.2.1" + "@commitlint/types" "^19.0.3" + execa "^8.0.1" yargs "^17.0.0" -"@commitlint/config-angular-type-enum@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-angular-type-enum/-/config-angular-type-enum-17.4.0.tgz#5b6c882f192d1c7f4b0f42526637295434179d7f" - integrity sha512-qbmfOfVqQHMKfc6CxS0A9b7+EFsOyEBoh4+i8Qa05uk8YhT/zY1CeIXK5V3wwemMDcHUegyL/ZnwCvWD7g8GxA== +"@commitlint/config-angular-type-enum@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-angular-type-enum/-/config-angular-type-enum-19.1.0.tgz#d72ff2cfbc4dfab6bb567dc5e41eb3ce433c6c42" + integrity sha512-eLjt7vSArP62kpDmmIZNdIBjPzbqY8jss6mVOcSDm4t1KfDw4UmPrtPh/7zcIL3GI5uf/7W8d2s3K0qisf9C+g== -"@commitlint/config-angular@^17.3.0": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/config-angular/-/config-angular-17.4.4.tgz#6d9f2fd55287fb20ac20168a7e51312989710228" - integrity sha512-ulCgBc1sDWwwW0HKGQDurcfWbWw1PZjwOFzeL2PZq3jcOgPfOzEHqE3dIjycB5DKlWNx4kUMcgwMWaX/zUtBNg== +"@commitlint/config-angular@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-angular/-/config-angular-19.1.0.tgz#f326677d5fa9cb76446a66b16daa3dfb1d1642ef" + integrity sha512-qZyG9FHjPoG+VaHxH1OruWI8cmWWRe00sAS73jXAhACimT74k4Dex5jI2cKFcXSH8Ebh1yGwxfjzSgup5O0ykA== dependencies: - "@commitlint/config-angular-type-enum" "^17.4.0" + "@commitlint/config-angular-type-enum" "^19.1.0" -"@commitlint/config-validator@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.4.4.tgz#d0742705719559a101d2ee49c0c514044af6d64d" - integrity sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg== +"@commitlint/config-validator@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.0.3.tgz#052b181a30da6b4fc16dc5230f4589ac95e0bc81" + integrity sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q== dependencies: - "@commitlint/types" "^17.4.4" + "@commitlint/types" "^19.0.3" ajv "^8.11.0" -"@commitlint/ensure@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.4.4.tgz#a36e7719bdb9c2b86c8b8c2e852b463a7bfda5fa" - integrity sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g== +"@commitlint/ensure@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-19.0.3.tgz#d172b1b72ca88cbd317ea1ee79f3a03dbaccc76e" + integrity sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ== dependencies: - "@commitlint/types" "^17.4.4" + "@commitlint/types" "^19.0.3" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.snakecase "^4.1.1" lodash.startcase "^4.4.0" lodash.upperfirst "^4.3.1" -"@commitlint/execute-rule@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939" - integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== +"@commitlint/execute-rule@^19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz#928fb239ae8deec82a6e3b05ec9cfe20afa83856" + integrity sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw== -"@commitlint/format@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.4.4.tgz#0f6e1b4d7a301c7b1dfd4b6334edd97fc050b9f5" - integrity sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ== +"@commitlint/format@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-19.0.3.tgz#6e3dcdc028b39d370ba717b8bde0853705c467dc" + integrity sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q== dependencies: - "@commitlint/types" "^17.4.4" - chalk "^4.1.0" + "@commitlint/types" "^19.0.3" + chalk "^5.3.0" -"@commitlint/is-ignored@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz#82e03f1abe2de2c0c8c162a250b8d466225e922b" - integrity sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw== - dependencies: - "@commitlint/types" "^17.4.4" - semver "7.3.8" - -"@commitlint/lint@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.4.4.tgz#0ecd70b44ec5f4823c2e00e0c4b04ebd41d42856" - integrity sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw== - dependencies: - "@commitlint/is-ignored" "^17.4.4" - "@commitlint/parse" "^17.4.4" - "@commitlint/rules" "^17.4.4" - "@commitlint/types" "^17.4.4" - -"@commitlint/load@^17.5.0": - version "17.5.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.5.0.tgz#be45dbbb50aaf5eb7e8e940e1e0d6171d1426bab" - integrity sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q== - dependencies: - "@commitlint/config-validator" "^17.4.4" - "@commitlint/execute-rule" "^17.4.0" - "@commitlint/resolve-extends" "^17.4.4" - "@commitlint/types" "^17.4.4" - "@types/node" "*" - chalk "^4.1.0" - cosmiconfig "^8.0.0" - cosmiconfig-typescript-loader "^4.0.0" +"@commitlint/is-ignored@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-19.0.3.tgz#a64e0e217044f2d916127369d21ea12324a834fe" + integrity sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ== + dependencies: + "@commitlint/types" "^19.0.3" + semver "^7.6.0" + +"@commitlint/lint@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-19.1.0.tgz#0f4b26b1452d59a92a28b5fa6de9bdbee18399a1" + integrity sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw== + dependencies: + "@commitlint/is-ignored" "^19.0.3" + "@commitlint/parse" "^19.0.3" + "@commitlint/rules" "^19.0.3" + "@commitlint/types" "^19.0.3" + +"@commitlint/load@^19.2.0": + version "19.2.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.2.0.tgz#3ca51fdead4f1e1e09c9c7df343306412b1ef295" + integrity sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ== + dependencies: + "@commitlint/config-validator" "^19.0.3" + "@commitlint/execute-rule" "^19.0.0" + "@commitlint/resolve-extends" "^19.1.0" + "@commitlint/types" "^19.0.3" + chalk "^5.3.0" + cosmiconfig "^9.0.0" + cosmiconfig-typescript-loader "^5.0.0" lodash.isplainobject "^4.0.6" lodash.merge "^4.6.2" lodash.uniq "^4.5.0" - resolve-from "^5.0.0" - ts-node "^10.8.1" - typescript "^4.6.4 || ^5.0.0" - -"@commitlint/message@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.4.2.tgz#f4753a79701ad6db6db21f69076e34de6580e22c" - integrity sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q== - -"@commitlint/parse@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.4.4.tgz#8311b12f2b730de6ea0679ae2a37b386bcc5b04b" - integrity sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg== - dependencies: - "@commitlint/types" "^17.4.4" - conventional-changelog-angular "^5.0.11" - conventional-commits-parser "^3.2.2" - -"@commitlint/read@^17.5.1": - version "17.5.1" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.5.1.tgz#fec903b766e2c41e3cefa80630040fcaba4f786c" - integrity sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg== - dependencies: - "@commitlint/top-level" "^17.4.0" - "@commitlint/types" "^17.4.4" - fs-extra "^11.0.0" - git-raw-commits "^2.0.11" - minimist "^1.2.6" -"@commitlint/resolve-extends@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz#8f931467dea8c43b9fe38373e303f7c220de6fdc" - integrity sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A== +"@commitlint/message@^19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-19.0.0.tgz#f789dd1b7a1f9c784578e0111f46cc3fecf5a531" + integrity sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw== + +"@commitlint/parse@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-19.0.3.tgz#a2d09876d458e17ad0e1695b04f41af8b50a41c2" + integrity sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA== + dependencies: + "@commitlint/types" "^19.0.3" + conventional-changelog-angular "^7.0.0" + conventional-commits-parser "^5.0.0" + +"@commitlint/read@^19.2.1": + version "19.2.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-19.2.1.tgz#7296b99c9a989e60e5927fff8388a1dd44299c2f" + integrity sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw== dependencies: - "@commitlint/config-validator" "^17.4.4" - "@commitlint/types" "^17.4.4" - import-fresh "^3.0.0" + "@commitlint/top-level" "^19.0.0" + "@commitlint/types" "^19.0.3" + execa "^8.0.1" + git-raw-commits "^4.0.0" + minimist "^1.2.8" + +"@commitlint/resolve-extends@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz#fa5b8f921e9c8d76f53624c35bf25b9676bd73fa" + integrity sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg== + dependencies: + "@commitlint/config-validator" "^19.0.3" + "@commitlint/types" "^19.0.3" + global-directory "^4.0.1" + import-meta-resolve "^4.0.0" lodash.mergewith "^4.6.2" resolve-from "^5.0.0" - resolve-global "^1.0.0" -"@commitlint/rules@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.4.4.tgz#9b33f41e5eb529f916396bac7c62e61f0edd6791" - integrity sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ== +"@commitlint/rules@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-19.0.3.tgz#de647a9055847cae4f3ae32b4798096b604584f3" + integrity sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw== dependencies: - "@commitlint/ensure" "^17.4.4" - "@commitlint/message" "^17.4.2" - "@commitlint/to-lines" "^17.4.0" - "@commitlint/types" "^17.4.4" - execa "^5.0.0" + "@commitlint/ensure" "^19.0.3" + "@commitlint/message" "^19.0.0" + "@commitlint/to-lines" "^19.0.0" + "@commitlint/types" "^19.0.3" + execa "^8.0.1" -"@commitlint/to-lines@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.4.0.tgz#9bd02e911e7d4eab3fb4a50376c4c6d331e10d8d" - integrity sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg== +"@commitlint/to-lines@^19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-19.0.0.tgz#aa6618eb371bafbc0cd3b48f0db565c4a40462c6" + integrity sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw== -"@commitlint/top-level@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.4.0.tgz#540cac8290044cf846fbdd99f5cc51e8ac5f27d6" - integrity sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g== +"@commitlint/top-level@^19.0.0": + version "19.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-19.0.0.tgz#9c44d7cec533bb9598bfae9658737e2d6a903605" + integrity sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ== dependencies: - find-up "^5.0.0" + find-up "^7.0.0" -"@commitlint/types@^17.4.4": - version "17.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.4.tgz#1416df936e9aad0d6a7bbc979ecc31e55dade662" - integrity sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ== +"@commitlint/types@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.0.3.tgz#feff4ecac2b5c359f2a57f9ab094b2ac80ef0266" + integrity sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA== dependencies: - chalk "^4.1.0" + "@types/conventional-commits-parser" "^5.0.0" + chalk "^5.3.0" "@cspotcode/source-map-support@^0.8.0": version "0.8.1" @@ -3698,455 +3577,350 @@ mark.js "^8.11.1" tslib "^2.4.0" -"@esbuild/aix-ppc64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" - integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== - "@esbuild/aix-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== -"@esbuild/android-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz#7b18cab5f4d93e878306196eed26b6d960c12576" - integrity sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q== +"@esbuild/aix-ppc64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz#eafa8775019b3650a77e8310ba4dbd17ca7af6d5" + integrity sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA== -"@esbuild/android-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" - integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== -"@esbuild/android-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz#276c5f99604054d3dbb733577e09adae944baa90" - integrity sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ== - -"@esbuild/android-arm@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.16.tgz#5c47f6a7c2cada6ed4b4d4e72d8c66e76d812812" - integrity sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw== +"@esbuild/android-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz#68791afa389550736f682c15b963a4f37ec2f5f6" + integrity sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A== -"@esbuild/android-arm@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" - integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== -"@esbuild/android-arm@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.5.tgz#4a3cbf14758166abaae8ba9c01a80e68342a4eec" - integrity sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA== - -"@esbuild/android-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.16.tgz#8686a6e98359071ffd5312046551943e7244c51a" - integrity sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow== +"@esbuild/android-arm@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.1.tgz#38c91d8ee8d5196f7fbbdf4f0061415dde3a473a" + integrity sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw== -"@esbuild/android-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" - integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== -"@esbuild/android-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.5.tgz#21a3d11cd4613d2d3c5ccb9e746c254eb9265b0a" - integrity sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA== - -"@esbuild/darwin-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz#aa79fbf447630ca0696a596beba962a775bbf394" - integrity sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA== +"@esbuild/android-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.1.tgz#93f6190ce997b313669c20edbf3645fc6c8d8f22" + integrity sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA== -"@esbuild/darwin-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" - integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== -"@esbuild/darwin-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz#714cb839f467d6a67b151ee8255886498e2b9bf6" - integrity sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw== - -"@esbuild/darwin-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz#d5d68ee510507104da7e7503224c647c957e163e" - integrity sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ== +"@esbuild/darwin-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz#0d391f2e81fda833fe609182cc2fbb65e03a3c46" + integrity sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA== -"@esbuild/darwin-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" - integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== -"@esbuild/darwin-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz#2c553e97a6d2b4ae76a884e35e6cbab85a990bbf" - integrity sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA== - -"@esbuild/freebsd-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz#b00b4cc8c2e424907cfe3a607384ab24794edd52" - integrity sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA== +"@esbuild/darwin-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz#92504077424584684862f483a2242cfde4055ba2" + integrity sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA== -"@esbuild/freebsd-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" - integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== -"@esbuild/freebsd-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz#d554f556718adb31917a0da24277bf84b6ee87f3" - integrity sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ== +"@esbuild/freebsd-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz#a1646fa6ba87029c67ac8a102bb34384b9290774" + integrity sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw== -"@esbuild/freebsd-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz#84af4430a07730b50bbc945a90cf7036c1853b76" - integrity sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g== - -"@esbuild/freebsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" - integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== -"@esbuild/freebsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz#288f7358a3bb15d99e73c65c9adaa3dabb497432" - integrity sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ== +"@esbuild/freebsd-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz#41c9243ab2b3254ea7fb512f71ffdb341562e951" + integrity sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg== -"@esbuild/linux-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz#35571d15de6272c862d9ce6341372fb3cef0f266" - integrity sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA== - -"@esbuild/linux-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" - integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== -"@esbuild/linux-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz#95933ae86325c93cb6b5e8333d22120ecfdc901b" - integrity sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA== +"@esbuild/linux-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz#f3c1e1269fbc9eedd9591a5bdd32bf707a883156" + integrity sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w== -"@esbuild/linux-arm@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz#b65c7cd5b0eadd08f91aab66b9dda81b6a4b2a70" - integrity sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw== - -"@esbuild/linux-arm@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" - integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== -"@esbuild/linux-arm@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz#0acef93aa3e0579e46d33b666627bddb06636664" - integrity sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ== - -"@esbuild/linux-ia32@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz#673a68cb251ce44a00a6422ada29064c5a1cd2c0" - integrity sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA== +"@esbuild/linux-arm@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz#4503ca7001a8ee99589c072801ce9d7540717a21" + integrity sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw== -"@esbuild/linux-ia32@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" - integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== -"@esbuild/linux-ia32@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz#b6e5c9e80b42131cbd6b1ddaa48c92835f1ed67f" - integrity sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ== - -"@esbuild/linux-loong64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz#477e2da34ab46ffdbf4740fa6441e80045249385" - integrity sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ== +"@esbuild/linux-ia32@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz#98c474e3e0cbb5bcbdd8561a6e65d18f5767ce48" + integrity sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw== -"@esbuild/linux-loong64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" - integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== -"@esbuild/linux-loong64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz#e5f0cf95a180158b01ff5f417da796a1c09dfbea" - integrity sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw== - -"@esbuild/linux-mips64el@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz#e1e9687bbdaa831d7c34edc9278200982c1a4bf4" - integrity sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA== +"@esbuild/linux-loong64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz#a8097d28d14b9165c725fe58fc438f80decd2f33" + integrity sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA== -"@esbuild/linux-mips64el@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" - integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== -"@esbuild/linux-mips64el@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz#ae36fb86c7d5f641f3a0c8472e83dcb6ea36a408" - integrity sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg== - -"@esbuild/linux-ppc64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz#2f19075d63622987e86e83a4b7866cd57b796c60" - integrity sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q== +"@esbuild/linux-mips64el@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz#c44f6f0d7d017c41ad3bb15bfdb69b690656b5ea" + integrity sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA== -"@esbuild/linux-ppc64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" - integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== -"@esbuild/linux-ppc64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz#7960cb1666f0340ddd9eef7b26dcea3835d472d0" - integrity sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q== +"@esbuild/linux-ppc64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz#0765a55389a99237b3c84227948c6e47eba96f0d" + integrity sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw== -"@esbuild/linux-riscv64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz#bbf40a38f03ba2434fe69b5ceeec5d13c742b329" - integrity sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA== - -"@esbuild/linux-riscv64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" - integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== -"@esbuild/linux-riscv64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz#32207df26af60a3a9feea1783fc21b9817bade19" - integrity sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag== +"@esbuild/linux-riscv64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz#e4153b032288e3095ddf4c8be07893781b309a7e" + integrity sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg== -"@esbuild/linux-s390x@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz#d2b8c0779ccd2b7917cdf0fab8831a468e0f9c01" - integrity sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw== - -"@esbuild/linux-s390x@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" - integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== -"@esbuild/linux-s390x@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz#b38d5681db89a3723862dfa792812397b1510a7d" - integrity sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw== +"@esbuild/linux-s390x@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz#b9ab8af6e4b73b26d63c1c426d7669a5d53eb5a7" + integrity sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ== -"@esbuild/linux-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz#da48b39cfdc1b12a74976625f583f031eac43590" - integrity sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g== - -"@esbuild/linux-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" - integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== -"@esbuild/linux-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz#46feba2ad041a241379d150f415b472fe3885075" - integrity sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A== +"@esbuild/linux-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz#0b25da17ac38c3e11cdd06ca3691d4d6bef2755f" + integrity sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA== -"@esbuild/netbsd-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz#ddef985aed37cc81908d2573b66c0299dbc49037" - integrity sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA== - -"@esbuild/netbsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" - integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== -"@esbuild/netbsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz#3b5c1fb068f26bfc681d31f682adf1bea4ef0702" - integrity sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g== +"@esbuild/netbsd-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz#3148e48406cd0d4f7ba1e0bf3f4d77d548c98407" + integrity sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg== -"@esbuild/openbsd-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz#85035bf89efd66e9068bc72aa6bb85a2c317d090" - integrity sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew== - -"@esbuild/openbsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" - integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== -"@esbuild/openbsd-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz#ca6830316ca68056c5c88a875f103ad3235e00db" - integrity sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA== +"@esbuild/openbsd-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz#7b73e852986a9750192626d377ac96ac2b749b76" + integrity sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw== -"@esbuild/sunos-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz#16338ecab854cb2d831cc9ee9cc21ef69566e1f3" - integrity sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag== - -"@esbuild/sunos-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" - integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== -"@esbuild/sunos-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz#9efc4eb9539a7be7d5a05ada52ee43cda0d8e2dd" - integrity sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg== +"@esbuild/sunos-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz#402a441cdac2eee98d8be378c7bc23e00c1861c5" + integrity sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q== -"@esbuild/win32-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz#423f46bb744aff897a5f74435469e1ef4952e343" - integrity sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg== - -"@esbuild/win32-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" - integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== -"@esbuild/win32-arm64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz#29f8184afa7a02a956ebda4ed638099f4b8ff198" - integrity sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg== - -"@esbuild/win32-ia32@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz#1978be5b192c7063bd2c8d5960eb213e1964740e" - integrity sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA== +"@esbuild/win32-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz#36c4e311085806a6a0c5fc54d1ac4d7b27e94d7b" + integrity sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A== -"@esbuild/win32-ia32@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" - integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== -"@esbuild/win32-ia32@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz#f3de07afb292ecad651ae4bb8727789de2d95b05" - integrity sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw== - -"@esbuild/win32-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz#260f19b0a3300d22c3a3f52722c671dc561edaa3" - integrity sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg== +"@esbuild/win32-ia32@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz#0cf933be3fb9dc58b45d149559fe03e9e22b54fe" + integrity sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw== -"@esbuild/win32-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" - integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== -"@esbuild/win32-x64@0.19.5": - version "0.19.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz#faad84c41ba12e3a0acb52571df9bff37bee75f6" - integrity sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw== +"@esbuild/win32-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz#77583b6ea54cee7c1410ebbd54051b6a3fcbd8ba" + integrity sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -4165,7 +3939,7 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== -"@eslint/eslintrc@^2.1.2", "@eslint/eslintrc@^2.1.4": +"@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== @@ -4180,21 +3954,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.48.0": - version "8.48.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" - integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== - "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@fastify/busboy@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" - integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== - "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -4207,15 +3971,6 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@humanwhocodes/config-array@^0.11.10": - version "0.11.12" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.12.tgz#549afec9bfce5232ac6325db12765f407e70e3a0" - integrity sha512-NlGesA1usRNn6ctHCZ21M4/dKPgW9Nn1FypRdIKKgZOKzkVV4T1FlK5mBiLhHBCDmEbdQG0idrcXlbZfksJ+RA== - dependencies: - "@humanwhocodes/object-schema" "^2.0.0" - debug "^4.1.1" - minimatch "^3.0.5" - "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -4230,11 +3985,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.0.tgz#04ad39d82176c7da1591c81e78b993cffd8348d8" - integrity sha512-9S9QrXY2K0L4AGDcSgTi9vgiCcG8VcBv4Mp7/1hDPYoswIy6Z6KO5blYto82BT8M0MZNRWmCFLpCs3HlpYGGdw== - "@humanwhocodes/object-schema@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" @@ -4673,6 +4423,15 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" @@ -4688,6 +4447,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/source-map@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" @@ -4738,6 +4502,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jscutlery/semver@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@jscutlery/semver/-/semver-4.1.0.tgz#f897e2b98e58744dda4688040d1e0926fcfe3df1" @@ -4766,12 +4538,12 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@ljharb/through@^2.3.11": - version "2.3.12" - resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.12.tgz#c418c43060eee193adce48b15c2206096a28e9ea" - integrity sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g== +"@ljharb/through@^2.3.12": + version "2.3.13" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.13.tgz#b7e4766e0b65aa82e529be945ab078de79874edc" + integrity sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" "@material/animation@15.0.0-canary.bc9ae6c9c.0": version "15.0.0-canary.bc9ae6c9c.0" @@ -5510,10 +5282,10 @@ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== -"@ngtools/webpack@17.1.4": - version "17.1.4" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.1.4.tgz#0474df6ec48a7770f58c06b4af9eb0a3557f17b9" - integrity sha512-RJotg78ZGmmwzxVaI4AfsGvFKhXGd931xBhrI0IK7226+uQn/uqnYj4a5cF4h9vAULzs9AkvwtdiUmy2Y0omSQ== +"@ngtools/webpack@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.3.2.tgz#68722408def021ed8cf4ebda3f9e1c64c38ac0e2" + integrity sha512-E8zejFF4aJ8l2XcF+GgnE/1IqsZepnPT1xzulLB4LXtjVuXLFLoF9xkHQwxs7cJWWZsxd/SlNsCIcn/ezrYBcQ== "@node-rs/jieba-android-arm-eabi@1.6.2": version "1.6.2" @@ -5683,27 +5455,27 @@ read-package-json-fast "^3.0.0" which "^4.0.0" -"@nrwl/angular@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-18.0.6.tgz#9f57e84aaf2b7495dc49b7b2f3f7c96c1b710972" - integrity sha512-5q7gk5NOAzNARRduEu8vyAigsuPa6uDyIRszZsQXQ2VIn1wA3dLAiZcFmugvuynr12eOaUzE7B6YfqHCOlM7zQ== +"@nrwl/angular@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-18.2.1.tgz#c1a0710ee4982a86f8cceba009d0b432c971b1fc" + integrity sha512-9j8281u8vwHAkW2Ilgb86UXEDAU4ht8GCtQgrRVXul7TjxjF8WLj+2mq+3IHMSZq0Fg5MD0m1D5xRSNOhp0Sag== dependencies: - "@nx/angular" "18.0.6" + "@nx/angular" "18.2.1" tslib "^2.3.0" -"@nrwl/cypress@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-18.0.6.tgz#4a29e59a9761bedfed499e6a36dfc47e97ce026e" - integrity sha512-oaNvJPfrUfr8FzF0j6DdcMFkDusK2UgHUOhRE1dTAAYsG8OS1ZIOAwzC1ZMkiYes8K00d2iD2JrvIlnp4oijjA== +"@nrwl/cypress@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-18.2.1.tgz#28c62ea4affc365543c47cc62142022e28fbe23b" + integrity sha512-swJ1rIBMfZV1IAgBYso8kaik1E0vdIzYyPVotY1q4X+jet23FcCmTrx5Gf/QAdOubCU5POjufnuSCqg6OWGr/Q== dependencies: - "@nx/cypress" "18.0.6" + "@nx/cypress" "18.2.1" -"@nrwl/devkit@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.0.6.tgz#3cf72b7c6fa77ff4e3d42847743243923d19a171" - integrity sha512-WknkRl2jiZ+Ue8y0XLuZe+O2SB0Iy75GCltxuCxmiNwycElb4cfQWhovmkTQR/95J9iodLHGAVf7VdXMBmNSTA== +"@nrwl/devkit@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.2.1.tgz#4c0e60a5c5e73ca7b2b69a772ecd03630d45892e" + integrity sha512-D//NSihg/hyoinB+CpNMjecwdMIagoQgLlc2HLZtEpmBxM9b3ilX6J7js9HOqEO+jY5YBJWwHg20+qPDYz1Kqw== dependencies: - "@nx/devkit" "18.0.6" + "@nx/devkit" "18.2.1" "@nrwl/devkit@^14.3.6": version "14.8.8" @@ -5715,62 +5487,62 @@ ignore "^5.0.4" tslib "^2.3.0" -"@nrwl/eslint-plugin-nx@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-18.0.6.tgz#91f28e6405c70faf82f5b63f55b92166375ae33e" - integrity sha512-CzzXmkwI3eFktpPWZz/m7uYztxylkoJNiXFdj3dWyvYmelQXJ7J0e/f98xdVlAeU2QEupMKg1I2rcpJaqZytog== +"@nrwl/eslint-plugin-nx@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-18.2.1.tgz#ebdc76789dc70d1d52b468d87fa61bfdd44426a7" + integrity sha512-R6OWtEB3aN4qKg1m+G4+OtP7Zl94nVbYScm6meWTtkwts2h1uscDIv1ACfbcvPaofB6+HzGp7kPkwZOp96TgeA== dependencies: - "@nx/eslint-plugin" "18.0.6" + "@nx/eslint-plugin" "18.2.1" -"@nrwl/jest@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-18.0.6.tgz#8059a3ac8379e3ff6d71ca83b450b0b6aade6294" - integrity sha512-FUa33lnCFtoI95wmMxm5lsJaYaI8IDxYYoUhQz0eBkuOBTZfzFQhFK1OqFWyiV52i7fYJGiqiu8dISPcgND9Pw== +"@nrwl/jest@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-18.2.1.tgz#84891f3fc24e8283c3b7677376789e0412acaa8f" + integrity sha512-ZB9HZ0Jtc8iltk9yiuJ+Zd5MB51bXFFm2YCDxRgqcs7XuuzjjtwCnl7cOY0nw4lbL893UNOA5dH1RYg4Pk1WNw== dependencies: - "@nx/jest" "18.0.6" + "@nx/jest" "18.2.1" -"@nrwl/js@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-18.0.6.tgz#cc3623d7342d2bd0c2902135942b876d7b799866" - integrity sha512-iGC/uwOCMATObmFcrn1T5gt4e9yrcBTyWaDgaaQHkj9ycP3db+6oheR70sNQyH0yPiNjBRgPz3LRO30Sz1J4/Q== +"@nrwl/js@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-18.2.1.tgz#d9dce1bf7f11426646fca76a3b6a3e2daf564745" + integrity sha512-FXyuZjIA5nG7jMVEwO7WfaLGJLqdA6L4ScwH1JUiPWT0/z+ZCEtjaB+AA9Okzqwm+5f/hA2e7BIHhF1Bkzkt7A== dependencies: - "@nx/js" "18.0.6" + "@nx/js" "18.2.1" -"@nrwl/node@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-18.0.6.tgz#398d8679f3a78e3443f544fb109e93e0629f18de" - integrity sha512-Sf799nZ+mhk9aS1lCSImWnWdmzFjC/nJiMf8NqNGn6ZhcQ+238kZhDdrH1P5dgEEeljGt3IsBzPeDCX+fnAcew== +"@nrwl/node@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-18.2.1.tgz#020bcd3f8aa5d95d4f8d3e2558a597cf5af604be" + integrity sha512-mLvt028ENmuC8tBdmm38hNwQJ7Biry2xdohY7v48kmP+x+RQTQyk0J4o097KcbSzmEmA4QomX2UFgN6k9givsg== dependencies: - "@nx/node" "18.0.6" + "@nx/node" "18.2.1" -"@nrwl/tao@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.0.6.tgz#b85160181cfc1a5bbcb9bffdf2f7697472c0ba00" - integrity sha512-jWmAR0w77Wkt+RQy7ZbK8Xv9pAm3Pla0j8IBmQ5cwTtg0B9na4gDpmawi6urP1CqRMie1amvDl50jm1R4gzWhw== +"@nrwl/tao@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.2.1.tgz#dfa24e2d02c7c17f3c8dc296544947dd56bf7293" + integrity sha512-QOk9pCNBtu8Qk8Cr7WVbI4+Q/PdxXX+nWMU+xk1KyTjH+XYdAvVksrMqFndPAThIsPvC1fP2XCcMCxOX10F3rQ== dependencies: - nx "18.0.6" + nx "18.2.1" tslib "^2.3.0" -"@nrwl/web@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-18.0.6.tgz#3331372a27e11531d6a7fc727b598609c4be89d8" - integrity sha512-7i3Cd/EOunBqNrsqTQgYYvf82QAuWyW3I8TvzfAjKhaVLfS6Cnz7WLJSnmPWkVkh+u/ePkclfL+8h1BnGvmy3Q== +"@nrwl/web@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-18.2.1.tgz#fb39ec9b4a124b075bb2f9dd2dc3eec61ac1038d" + integrity sha512-2Mwb/vFrjnKZ6BBc++tKTEOquVyWJaLSwIKGjhIRb5jHnxUQeLPBMJOQsFTjyB7hvmB0DTVSAih2KWvxm17psg== dependencies: - "@nx/web" "18.0.6" + "@nx/web" "18.2.1" -"@nrwl/webpack@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-18.0.6.tgz#14b5dbe1219c5828527e85e7a8b54bf48f8accac" - integrity sha512-edz9ybAYXBipxgINCEIvvxTRX0ntvsdDMLvK6Xrq3j44vwOscqtW0GQkU05mJBZTPzny5f4czttvL2DrvzjiIg== +"@nrwl/webpack@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-18.2.1.tgz#2e0859c6a9b179c12f66efbb6b6c5a0919550383" + integrity sha512-1NZql7aFr8KmdxVjKCuEu0jywQSrvxEC6gh52DiG5KeW5wp+tGmVoZK9rOBjZ4ENn0bbo/8KKTz+bdHYo98xDA== dependencies: - "@nx/webpack" "18.0.6" + "@nx/webpack" "18.2.1" -"@nrwl/workspace@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-18.0.6.tgz#843729cc15ebb1f133929e5448ceb36ad9ab52e2" - integrity sha512-N5lOeLV7bG3M9tKmMb1vgDgx8I+t+Wtljh+0rdEPxDzgiRQPAjAEK0U+wSbRMLjz5GS8QhGUpIs1miMqqMQoXA== +"@nrwl/workspace@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-18.2.1.tgz#63b84001228283e00eae04856a25f9c90cbe1a96" + integrity sha512-G+fGGTOX7I6pLQml+g7K2OOh6Yifv/5U2zCbd0YhbqRJXgui2KKdPVZ+2noZleF3/HXCBo1cO5FJc+iA2aWtkA== dependencies: - "@nx/workspace" "18.0.6" + "@nx/workspace" "18.2.1" "@nx-plus/docusaurus@14.1.0": version "14.1.0" @@ -5779,53 +5551,51 @@ dependencies: "@nrwl/devkit" "^14.3.6" -"@nx/angular@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-18.0.6.tgz#6124cd1c19ae4f0c673df95dc56d957b88b46757" - integrity sha512-Uo5Gt9hCDV5/ROzzOAn51XYGbcG3BtPIGfCmeuzpKaCv1tP6sPb90wxKbgHEyaTW0/2XrOp1tkJ/BO2c6mgZXg== - dependencies: - "@nrwl/angular" "18.0.6" - "@nx/cypress" "18.0.6" - "@nx/devkit" "18.0.6" - "@nx/eslint" "18.0.6" - "@nx/jest" "18.0.6" - "@nx/js" "18.0.6" - "@nx/web" "18.0.6" - "@nx/webpack" "18.0.6" - "@nx/workspace" "18.0.6" +"@nx/angular@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-18.2.1.tgz#04f748eaddb42dd70f251d5f6057a2aecedf5dbf" + integrity sha512-MPsfda1bSAyIp3UCaYVZ+F+m06mbOoSlYpVcOuS9der19pOj69Ks7/OlQiVy+KnxA1Bjk2m58e3fz+kk+/OUuw== + dependencies: + "@nrwl/angular" "18.2.1" + "@nx/devkit" "18.2.1" + "@nx/eslint" "18.2.1" + "@nx/js" "18.2.1" + "@nx/web" "18.2.1" + "@nx/webpack" "18.2.1" + "@nx/workspace" "18.2.1" "@phenomnomnominal/tsquery" "~5.0.1" - "@typescript-eslint/type-utils" "^6.9.1" + "@typescript-eslint/type-utils" "^7.3.0" chalk "^4.1.0" find-cache-dir "^3.3.2" ignore "^5.0.4" magic-string "~0.30.2" minimatch "9.0.3" - piscina "^4.2.1" + piscina "^4.4.0" semver "^7.5.3" tslib "^2.3.0" webpack "^5.80.0" webpack-merge "^5.8.0" -"@nx/cypress@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-18.0.6.tgz#4dd1cc3e72d0d330fe22060726046a224d6432f7" - integrity sha512-JHFSRX/6R9bB/0xT5f9QplffA8AkPWGk6gJcdN/m3tD6teAEPXtIRI5hDxcjsrVlahV0BsMfOVwsR4Yn7txApw== +"@nx/cypress@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-18.2.1.tgz#6ab7f6bc1a0d3f65b057fd9442fa923660f6a082" + integrity sha512-ujjUMgrjYPjMcMkpOdqNtE89xAkru/h2sbMbPL/GBpVB/dHhI3d73uQ41LTNgpfZMzHWxv43+Zw/4nokf8Ckdw== dependencies: - "@nrwl/cypress" "18.0.6" - "@nx/devkit" "18.0.6" - "@nx/eslint" "18.0.6" - "@nx/js" "18.0.6" + "@nrwl/cypress" "18.2.1" + "@nx/devkit" "18.2.1" + "@nx/eslint" "18.2.1" + "@nx/js" "18.2.1" "@phenomnomnominal/tsquery" "~5.0.1" detect-port "^1.5.1" semver "^7.5.3" tslib "^2.3.0" -"@nx/devkit@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.0.6.tgz#b863762018175c20b758e4ce889275eb30faf1e6" - integrity sha512-yk46tuFUMipC+f3FnkMeGU/Gz/OF3+E5keSbCznNglYjCiQS1PHGBRZrw6yWL8QwHXVaFQInzq/+pbvbZEeLVw== +"@nx/devkit@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.2.1.tgz#ea409c13be5fde073eee7378194b069c997764c0" + integrity sha512-zEWm/lYgD0fHUU2Qgdd1OkIuBDbp8sCIiwv0iMITJy9CZf+fxg3rzRaUwVSbIXXSdeaSIFT75WI4zoI+7EQ/9w== dependencies: - "@nrwl/devkit" "18.0.6" + "@nrwl/devkit" "18.2.1" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -5834,44 +5604,44 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/eslint-plugin@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-18.0.6.tgz#37e61bf789fd9f0dac350e88dc9812e127643677" - integrity sha512-bRyXiji+SSko/EWgrzLDdVRtew/uAt0tHUmJaFiKyuXv7dEjm3Dn3eKzFZDiy7oAbhdWR/2Wr21vQN8u33vWUQ== +"@nx/eslint-plugin@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-18.2.1.tgz#301ff9d41407bc628fb58722f98f2c4d6715807f" + integrity sha512-E4mSD2dqEqH0sVSdW/+TBNlKcvS5TmNLjctDZbg74fUZ0t4MgJpqnFGZxki72LSRf47pJAkaFmT0a0Y7ytzwUg== dependencies: - "@nrwl/eslint-plugin-nx" "18.0.6" - "@nx/devkit" "18.0.6" - "@nx/js" "18.0.6" - "@typescript-eslint/type-utils" "^6.13.2" - "@typescript-eslint/utils" "^6.13.2" + "@nrwl/eslint-plugin-nx" "18.2.1" + "@nx/devkit" "18.2.1" + "@nx/js" "18.2.1" + "@typescript-eslint/type-utils" "^7.3.0" + "@typescript-eslint/utils" "^7.3.0" chalk "^4.1.0" confusing-browser-globals "^1.0.9" jsonc-eslint-parser "^2.1.0" semver "^7.5.3" tslib "^2.3.0" -"@nx/eslint@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-18.0.6.tgz#24987a1228422cf03b690774f96cad7647692f4c" - integrity sha512-++ZixSPM8PvCx97sg5rhiSMMnp05caCjY87YCaN3k6AAfw6inx+zghbhipooemCC5xRJ9ikyUBUmLsHA9Kn40w== +"@nx/eslint@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-18.2.1.tgz#508c3f5fa8cebcb1f2f09b51e8e02dedd20f37e3" + integrity sha512-T7BMOily5zIa6LoEma+v6PgKerjCkl/vrDuKaHPsD6OCH62b2rrlQMoFcw6fnc02Pb5Up78xxXRxfl7QDKhLpw== dependencies: - "@nx/devkit" "18.0.6" - "@nx/js" "18.0.6" - "@nx/linter" "18.0.6" + "@nx/devkit" "18.2.1" + "@nx/js" "18.2.1" + "@nx/linter" "18.2.1" eslint "^8.0.0" tslib "^2.3.0" - typescript "~5.3.2" + typescript "~5.4.2" -"@nx/jest@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-18.0.6.tgz#82115196b386364e64e6581e738567e19ab408f0" - integrity sha512-4Xdj4Wv4oupivMMJd/uZIxztT5tEeX9z3KSnH4yEa8x2SM4wNYpadv2u7D9E2/TCZSyO6X5LnfFsQSU8sfomAQ== +"@nx/jest@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-18.2.1.tgz#301b4e7046fa1f3fe53a3a3f2ae193aaa373d1b8" + integrity sha512-qgGWyeE6POJGbSdYM5FuccoCHwv818/tiWrjfESlv2aY+X4uEozZqtFQ8drR3hgCvuU4/MFfaU/y31SC4WDKTA== dependencies: "@jest/reporters" "^29.4.1" "@jest/test-result" "^29.4.1" - "@nrwl/jest" "18.0.6" - "@nx/devkit" "18.0.6" - "@nx/js" "18.0.6" + "@nrwl/jest" "18.2.1" + "@nx/devkit" "18.2.1" + "@nx/js" "18.2.1" "@phenomnomnominal/tsquery" "~5.0.1" chalk "^4.1.0" identity-obj-proxy "3.0.0" @@ -5881,11 +5651,12 @@ minimatch "9.0.3" resolve.exports "1.1.0" tslib "^2.3.0" + yargs-parser "21.1.1" -"@nx/js@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-18.0.6.tgz#a49bcd9474afe81e6525699c3339b89e93e65be2" - integrity sha512-NjN9FW70i4Agt8Iy9D6apth9EFItElhD2oJhJg59szAjtFlzurboBdioZV5qHs5JksiDCQAv3/3ItFdTjwSsUg== +"@nx/js@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-18.2.1.tgz#d6c1e7693d797f90eacec0aecbc43b7b3f43512c" + integrity sha512-HRLZ9OD9cgL8oZb+avpHEHVasfq0ZzqvcE3DaHJg0fAMvU3yibZIK10npbIfFh+xSv+2FN5ZqA1UHYNaXsF+3A== dependencies: "@babel/core" "^7.23.2" "@babel/plugin-proposal-decorators" "^7.22.7" @@ -5894,9 +5665,9 @@ "@babel/preset-env" "^7.23.2" "@babel/preset-typescript" "^7.22.5" "@babel/runtime" "^7.22.6" - "@nrwl/js" "18.0.6" - "@nx/devkit" "18.0.6" - "@nx/workspace" "18.0.6" + "@nrwl/js" "18.2.1" + "@nx/devkit" "18.2.1" + "@nx/workspace" "18.2.1" "@phenomnomnominal/tsquery" "~5.0.1" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" @@ -5918,97 +5689,97 @@ tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/linter@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-18.0.6.tgz#9c8416b99eb30e0122c8e079b4134c0c4b0b2c56" - integrity sha512-vbeg3oUBLOgIhhk8NPNPOzc/o13wQYDQWkUKzlWQ2ekWxkamLYi1TbuUJEkikFlLLNpEgw9Z9ZZyFQTlzddCdA== +"@nx/linter@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-18.2.1.tgz#b2f75b5de78f4192291452596001cb329783b150" + integrity sha512-ZQ8utodzPw1AIVz9hLKqml90GozJYn8A8LrUGfUkbw1aeM8kYSfVvm+i7AFWJOkAP1S0YD+zlNtibdVbAhs6+Q== dependencies: - "@nx/eslint" "18.0.6" + "@nx/eslint" "18.2.1" -"@nx/node@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-18.0.6.tgz#6c33c8560712ebe8a66c893607fa3a00020ebc98" - integrity sha512-B0AuHbunAECgoGReKSr9AVzRm4MrEfAZU3uyXLcLuH55JO8c6+OXIy/0B3VtZmt6Ant+pl9ludWrQTVkf82TvQ== +"@nx/node@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-18.2.1.tgz#6c04b1ed91ff20ce40d7a431e5ac36011472f571" + integrity sha512-3MVn0qxSSOh5pqZCf0lsA2Jgm01ZHnmPbHd/u57gHXmGM8AFdIeeO/K3f4RlPLrr7mJH8O1XuI4tqkDuFDWCpA== dependencies: - "@nrwl/node" "18.0.6" - "@nx/devkit" "18.0.6" - "@nx/eslint" "18.0.6" - "@nx/jest" "18.0.6" - "@nx/js" "18.0.6" + "@nrwl/node" "18.2.1" + "@nx/devkit" "18.2.1" + "@nx/eslint" "18.2.1" + "@nx/jest" "18.2.1" + "@nx/js" "18.2.1" tslib "^2.3.0" -"@nx/nx-darwin-arm64@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.0.6.tgz#3a4947d5b24ddd4bae56da41e3e98c88a3e5b2df" - integrity sha512-L90rlEqyhpGscI1vM2TKzFVk2WBsxF5cs0XwzeX8nISV56GN7sR3N2tKQc8pehbHAilYuYtFXzwOPsBvhBnWCQ== - -"@nx/nx-darwin-x64@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.0.6.tgz#fbcf0e51407f4fc92812bec62289c476f2aa1d4f" - integrity sha512-afJZJQtbsEkiOj5N5OfTFRj/fDuUT+mgPUmkMew3hYs04cd/iov/ZP4Enwqvp2D+H5UlPVCITrHINFqe4p75Hw== - -"@nx/nx-freebsd-x64@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.0.6.tgz#5f2df1520bca8afd68acb5954df18725b1946d42" - integrity sha512-u8FawMbsnw2J1EmhhuQf8fYe78Tf0IpAaO3UJay3nXMJHSIaLVNDOcYlIsDJ0pY1kzG0yozlRJ96acMClhVQ5A== - -"@nx/nx-linux-arm-gnueabihf@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.0.6.tgz#3685792e8df121b87684eda2c3ab7cb7aaecc822" - integrity sha512-eRf8Lgz8wPHO5ABAdZtExxENmEX1DniPW0P0EBBFj7erIiwP3vSitT8jYqqWfYrJM/+g1J/AYFwl+r1Ky1cBOg== - -"@nx/nx-linux-arm64-gnu@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.0.6.tgz#65b6726d9db7e2c78def0157e0842be0521075fb" - integrity sha512-BMfIPEoMJETbAixkW+hYYBf7agEsdOlg1G/+sxOGXIj4LZ0k1SO3a9zuKAWKeCbXa7sxpszFknKrUwEXHZIOkQ== - -"@nx/nx-linux-arm64-musl@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.0.6.tgz#5be1bd194f2f1aa3b0eb580402bf62f0748ea258" - integrity sha512-2tCRFLWLWZY0sYaV2IDkCuY5Ik/F8i5gzqlmJTDL8gXISgsMLQEhTTsLBNhKUwxCspzsn5AKOpHf+KU6LC6Qfg== - -"@nx/nx-linux-x64-gnu@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.0.6.tgz#1e39b6d5293baafaa989ed7f84abe365146300ab" - integrity sha512-8XHe5rIbWVPFKjnzjQBTshzE4OT2I6HKg2jTklGfe8kUzsigeieSAtm2knftiFXld2KNeIcyzLGLzT0UbgiNIg== - -"@nx/nx-linux-x64-musl@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.0.6.tgz#084f7f19cad04c65eb79b9bb9c34374e667acfa6" - integrity sha512-KbpiNQcP9Pz5IGFLsMkjV5H3P5S3xbPhGM2cuqSkZ+50VvKwAh7QuDWhnc5m6VB0MoLsOpm2zONu9wM6u+aVKA== - -"@nx/nx-win32-arm64-msvc@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.0.6.tgz#04e1933b849cb9d960cf55e3d06338d90580c07b" - integrity sha512-KWmRe6Nmf3L2Bv6OX1Xp7facFDRXQEzSH12EhDzZkxv0cB2OreFkoFV9AAeQwfa6hYXDrswEw4vmcig2e1ajuA== - -"@nx/nx-win32-x64-msvc@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.0.6.tgz#0cd0886e12db909f890af0c108554e30d500b5ea" - integrity sha512-w/N4Jik86fcwfcpsZPIRBXhyJCpHvO27J31JMJbF5Mjh90u31vzr8+tpjjaQOkUwtxvsCNh2twkTswuxkAPdEA== - -"@nx/web@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-18.0.6.tgz#c5b96408f1cd3ca74314cede6873d87b797dbb09" - integrity sha512-cgZtqwKUsf6QyZqn5Eil3DaAJKcDzPM27lBRDEAZ9yL1PWjl30APgpbhRsuCiPp84YFos4/9gkdwchFlcVtX2w== - dependencies: - "@nrwl/web" "18.0.6" - "@nx/devkit" "18.0.6" - "@nx/js" "18.0.6" +"@nx/nx-darwin-arm64@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.2.1.tgz#b59468e4c82bd5d83044fa683cb099a94b5a6306" + integrity sha512-s6ilEYpzyBoeyjM4PkK0nOPWu2uBL2TPDAVIwVh7J2RuM3xINy45zgbmYBUwC4JZUCSJv7e0GQ7OpxEQVlOjDA== + +"@nx/nx-darwin-x64@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.2.1.tgz#7f643015ff2cd2df73eb6f488bca4292c039be66" + integrity sha512-WpsnI+Z4qfqs0uyFyERLGKZSw3OIpKx3yr7fgFEyfUQS9pqIzqngh2gnoAnf/eYHKBZ2GNPjJ1n+fPHIuLP/dw== + +"@nx/nx-freebsd-x64@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.2.1.tgz#e694bc8fc7e39112652f173ebd104b06c27b09b6" + integrity sha512-AnbYoxvGHQPDXA5A+nPsVTYEQnXayKnC+NLUcxwoH5gW0Io4oBpck+RW4yf8Dt3zoB/RUw4X/TMKPAMXbD7HuA== + +"@nx/nx-linux-arm-gnueabihf@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.2.1.tgz#6b6d72518d55b046add163429a8aaa93845fabff" + integrity sha512-01M5fq1hYQQPlSJ7VIJ+ADmadlRvrvrOngbhBWPdWM70XKNz46Z8Z8JrOq1n67QviAPwIYELBMR2c8Bi/NU7FQ== + +"@nx/nx-linux-arm64-gnu@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.2.1.tgz#91cc02c62c0113cf0d50ffabd5cdd6e743661f2e" + integrity sha512-mQf0/NAAYDrvhhkHbw8/xFiIJ8ldzMxT0sHe2syYbWdnAYWxbXUlDvaalHgILZNiELNsLopbZ6zyKbyj7gTMbw== + +"@nx/nx-linux-arm64-musl@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.2.1.tgz#e893f35e17f3b458d5abefd6d22b34199a2f4855" + integrity sha512-iP2vKQfiCNNUZm81jbIVz2IshtyUUFw7BLi4vTWYIxcknbRJIchNb0dubJBmJUx4593z3O3wst252rg2QlP+cw== + +"@nx/nx-linux-x64-gnu@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.2.1.tgz#50fcb0398506070a7674c52fbb788b4da3b406d5" + integrity sha512-LHO+MlMgnm/v1CR0E/UfCUD9bfQWrA8btohv1ju/uHw32wW5P/MiMuLk0jrythWk++NZxpMzBIqcZrO2AcQgUg== + +"@nx/nx-linux-x64-musl@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.2.1.tgz#0d68185b8e2c809097714c0e35dec6decf82d86a" + integrity sha512-dXNf2P5bRg+u+xDCkqmmP5OABlHZ+zw7D5++uOnGT0D3Y9ZfNl7LVrTqKrTAFJlR6Ycb4ffjhauXF5Yh2tedeA== + +"@nx/nx-win32-arm64-msvc@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.2.1.tgz#6c0aeb65f593a764c87f01adaad6d1d9182f3dbb" + integrity sha512-6Dt3/qU2qKwzfXeaB+dS+oEasMbC16ZMC7E6pZTsiXqyjkh25lomiOYLBxBlHdGR4M06CzhFI3Vxtk8Hr7ltuQ== + +"@nx/nx-win32-x64-msvc@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.2.1.tgz#5027e833c368a15609d24ae11df9c077d9d0f7ff" + integrity sha512-FsX7Y22WezvH+Z2sUUXSTKUyG8MGL7ObmIRTZxacY2sV1IiaXY5i3J/46AKkJ+lfp6ALULJ4lRlLwXo9jDHbiA== + +"@nx/web@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-18.2.1.tgz#cf70aa99f182c674b1dad969b78d195b9e649902" + integrity sha512-Rk0STt8QFNGLweGXuHYYXdS2pk44AmkjUUtNMrwFHxjCj+gUs2egsmRuafxIqP1xdX5Hbvt1ahxYx+NAXvS7VQ== + dependencies: + "@nrwl/web" "18.2.1" + "@nx/devkit" "18.2.1" + "@nx/js" "18.2.1" chalk "^4.1.0" detect-port "^1.5.1" http-server "^14.1.0" tslib "^2.3.0" -"@nx/webpack@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-18.0.6.tgz#3ed18c93cdef0ad0b2daf373eb22252df2e7d3ef" - integrity sha512-oHxKWZBEGs5UhXzDMK/ttEDhswx/FejnU5UxRyuQg7W1nogHG8Hn30Rbx3BrK68+aUtGLVlLWU4ZNnCgfX9Udw== +"@nx/webpack@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-18.2.1.tgz#0caf25e5f29d12632eac604d681499e911032570" + integrity sha512-13C/7/53kL0rF5KveE4snLilamN/icFVH+/+dryXrsBUQ5kdWG+UIYHDfi5OVnnzjSCcglLDBTDaQJv+ut4lsA== dependencies: "@babel/core" "^7.23.2" - "@nrwl/webpack" "18.0.6" - "@nx/devkit" "18.0.6" - "@nx/js" "18.0.6" + "@nrwl/webpack" "18.2.1" + "@nx/devkit" "18.2.1" + "@nx/js" "18.2.1" ajv "^8.12.0" autoprefixer "^10.4.9" babel-loader "^9.1.2" @@ -6043,16 +5814,16 @@ webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nx/workspace@18.0.6": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-18.0.6.tgz#393b645af6de2bb6607e540dc848da4baa0fe3fe" - integrity sha512-+IeLUbEAHDPieKyCQ1wddOB5pj2Ad9BNKlWNaR5lnu7/hoQkw4in6m+9VIIeq6ggkF4ZFneT5WbJttqG6d0k5Q== +"@nx/workspace@18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-18.2.1.tgz#11dc4c9e13d348ca65a755690ec4fc079c02937a" + integrity sha512-cM/JjreLngGZBLCpZ/q5w9OVdwfq20vDjZRZTV+L4CGuSFbBGuXOY2C5Tdi2eys9sq/dnDAtPRo4gImIbdQM1w== dependencies: - "@nrwl/workspace" "18.0.6" - "@nx/devkit" "18.0.6" + "@nrwl/workspace" "18.2.1" + "@nx/devkit" "18.2.1" chalk "^4.1.0" enquirer "~2.3.6" - nx "18.0.6" + nx "18.2.1" tslib "^2.3.0" yargs-parser "21.1.1" @@ -6242,14 +6013,14 @@ optionalDependencies: fsevents "~2.3.2" -"@schematics/angular@17.1.4": - version "17.1.4" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.1.4.tgz#3a2f0347e7061643c28a3208ce83c27786d8d855" - integrity sha512-GNBfGWMJ3A0mRYYmXocgbg/ZcLnGtbRcSkjo88Vc2qRQJ7NJI4tW0X5OH6x7DeiWXmlDLvepbPXygKyuRVcqKQ== +"@schematics/angular@17.3.2": + version "17.3.2" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.3.2.tgz#7e8227ef7c04bbc7b876c22a6f7d0146c0de2d2d" + integrity sha512-zPINvow0Qo6ionnDl25ZzSSLDyDxBjqRPEJWGHU70expbjXK4A2caQT9P/8ImhapbJAXJCfxg4GF9z1d/sWe4w== dependencies: - "@angular-devkit/core" "17.1.4" - "@angular-devkit/schematics" "17.1.4" - jsonc-parser "3.2.0" + "@angular-devkit/core" "17.3.2" + "@angular-devkit/schematics" "17.3.2" + jsonc-parser "3.2.1" "@sideway/address@^4.1.3": version "4.1.4" @@ -6268,34 +6039,49 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== -"@sigstore/bundle@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.1.0.tgz#c6140ca97b68815edf7c4fb7bdbf58d656525c39" - integrity sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng== +"@sigstore/bundle@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.2.0.tgz#e3f555a5c503fe176d8d1e0e829b00f842502e46" + integrity sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ== dependencies: - "@sigstore/protobuf-specs" "^0.2.1" + "@sigstore/protobuf-specs" "^0.3.0" -"@sigstore/protobuf-specs@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" - integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== +"@sigstore/core@^1.0.0", "@sigstore/core@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-1.1.0.tgz#5583d8f7ffe599fa0a89f2bf289301a5af262380" + integrity sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== -"@sigstore/sign@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.2.0.tgz#4918207d8356877ab42d85d360d5729e9b3ec65a" - integrity sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA== +"@sigstore/protobuf-specs@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.0.tgz#bdcc773671f625bb81591bca86ec5314d57297f3" + integrity sha512-zxiQ66JFOjVvP9hbhGj/F/qNdsZfkGb/dVXSanNRNuAzMlr4MC95voPUBX8//ZNnmv3uSYzdfR/JSkrgvZTGxA== + +"@sigstore/sign@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.2.3.tgz#f07bcd2cfee654fade867db44ae260f1a0142ba4" + integrity sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw== dependencies: - "@sigstore/bundle" "^2.1.0" - "@sigstore/protobuf-specs" "^0.2.1" + "@sigstore/bundle" "^2.2.0" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.0" make-fetch-happen "^13.0.0" -"@sigstore/tuf@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.2.0.tgz#ef636239687e41af3f2ce10667ab88f5ca6165b3" - integrity sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA== +"@sigstore/tuf@^2.3.1": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.3.2.tgz#e9c5bffc2a5f3434f87195902d7f9cd7f48c70fa" + integrity sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w== dependencies: - "@sigstore/protobuf-specs" "^0.2.1" - tuf-js "^2.1.0" + "@sigstore/protobuf-specs" "^0.3.0" + tuf-js "^2.2.0" + +"@sigstore/verify@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-1.1.1.tgz#f90f66e6d738434e687e00590c3619a15934ac69" + integrity sha512-BNANJms49rw9Q5J+fJjrDqOQSzjXDcOq/pgKDaVdDoIvQwqIfaoUriy+fQfh8sBX04hr4bkkrwu3EbhQqoQH7A== + dependencies: + "@sigstore/bundle" "^2.2.0" + "@sigstore/core" "^1.1.0" + "@sigstore/protobuf-specs" "^0.3.0" "@sinclair/typebox@^0.25.16": version "0.25.24" @@ -6683,6 +6469,13 @@ dependencies: "@types/node" "*" +"@types/conventional-commits-parser@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8" + integrity sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ== + dependencies: + "@types/node" "*" + "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" @@ -6716,7 +6509,7 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== -"@types/estree@1.0.5": +"@types/estree@1.0.5", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -6876,11 +6669,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - "@types/node@*": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" @@ -6905,16 +6693,6 @@ dependencies: undici-types "~5.26.4" -"@types/node@^18.17.5": - version "18.18.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.6.tgz#26da694f75cdb057750f49d099da5e3f3824cb3e" - integrity sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - "@types/normalize-package-data@^2.4.1": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -7100,16 +6878,16 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" - integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== +"@typescript-eslint/eslint-plugin@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz#de61c3083842fc6ac889d2fc83c9a96b55ab8328" + integrity sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/type-utils" "6.21.0" - "@typescript-eslint/utils" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/type-utils" "7.4.0" + "@typescript-eslint/utils" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -7117,15 +6895,15 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== +"@typescript-eslint/parser@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.4.0.tgz#540f4321de1e52b886c0fa68628af1459954c1f1" + integrity sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ== dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/typescript-estree" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" debug "^4.3.4" "@typescript-eslint/scope-manager@6.10.0": @@ -7136,49 +6914,39 @@ "@typescript-eslint/types" "6.10.0" "@typescript-eslint/visitor-keys" "6.10.0" -"@typescript-eslint/scope-manager@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz#621f603537c89f4d105733d949aa4d55eee5cea8" - integrity sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A== - dependencies: - "@typescript-eslint/types" "6.11.0" - "@typescript-eslint/visitor-keys" "6.11.0" - -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== +"@typescript-eslint/scope-manager@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" + integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" -"@typescript-eslint/type-utils@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz#d0b8b1ab6c26b974dbf91de1ebc5b11fea24e0d1" - integrity sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA== +"@typescript-eslint/scope-manager@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz#acfc69261f10ece7bf7ece1734f1713392c3655f" + integrity sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw== dependencies: - "@typescript-eslint/typescript-estree" "6.11.0" - "@typescript-eslint/utils" "6.11.0" - debug "^4.3.4" - ts-api-utils "^1.0.1" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" -"@typescript-eslint/type-utils@6.21.0", "@typescript-eslint/type-utils@^6.13.2": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" - integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== +"@typescript-eslint/type-utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz#7be5c30e9b4d49971b79095a1181324ef6089a19" + integrity sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA== dependencies: - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/utils" "7.2.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/type-utils@^6.9.1": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz#1007faede067c78bdbcef2e8abb31437e163e2e1" - integrity sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg== +"@typescript-eslint/type-utils@7.4.0", "@typescript-eslint/type-utils@^7.3.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz#cfcaab21bcca441c57da5d3a1153555e39028cbd" + integrity sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw== dependencies: - "@typescript-eslint/typescript-estree" "6.10.0" - "@typescript-eslint/utils" "6.10.0" + "@typescript-eslint/typescript-estree" "7.4.0" + "@typescript-eslint/utils" "7.4.0" debug "^4.3.4" ts-api-utils "^1.0.1" @@ -7187,15 +6955,15 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.10.0.tgz#f4f0a84aeb2ac546f21a66c6e0da92420e921367" integrity sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg== -"@typescript-eslint/types@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.11.0.tgz#8ad3aa000cbf4bdc4dcceed96e9b577f15e0bf53" - integrity sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA== +"@typescript-eslint/types@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" + integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== +"@typescript-eslint/types@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.4.0.tgz#ee9dafa75c99eaee49de6dcc9348b45d354419b6" + integrity sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw== "@typescript-eslint/typescript-estree@6.10.0": version "6.10.0" @@ -7210,26 +6978,27 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz#7b52c12a623bf7f8ec7f8a79901b9f98eb5c7990" - integrity sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ== +"@typescript-eslint/typescript-estree@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" + integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== dependencies: - "@typescript-eslint/types" "6.11.0" - "@typescript-eslint/visitor-keys" "6.11.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" + minimatch "9.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== +"@typescript-eslint/typescript-estree@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz#12dbcb4624d952f72c10a9f4431284fca24624f4" + integrity sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg== dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/visitor-keys" "7.4.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -7237,43 +7006,43 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.10.0", "@typescript-eslint/utils@^6.10.0": - version "6.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.10.0.tgz#4d76062d94413c30e402c9b0df8c14aef8d77336" - integrity sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg== +"@typescript-eslint/utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.2.0.tgz#fc8164be2f2a7068debb4556881acddbf0b7ce2a" + integrity sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.10.0" - "@typescript-eslint/types" "6.10.0" - "@typescript-eslint/typescript-estree" "6.10.0" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" semver "^7.5.4" -"@typescript-eslint/utils@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.11.0.tgz#11374f59ef4cea50857b1303477c08aafa2ca604" - integrity sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g== +"@typescript-eslint/utils@7.4.0", "@typescript-eslint/utils@^7.3.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.4.0.tgz#d889a0630cab88bddedaf7c845c64a00576257bd" + integrity sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.11.0" - "@typescript-eslint/types" "6.11.0" - "@typescript-eslint/typescript-estree" "6.11.0" + "@typescript-eslint/scope-manager" "7.4.0" + "@typescript-eslint/types" "7.4.0" + "@typescript-eslint/typescript-estree" "7.4.0" semver "^7.5.4" -"@typescript-eslint/utils@6.21.0", "@typescript-eslint/utils@^6.13.2": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" - integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== +"@typescript-eslint/utils@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.10.0.tgz#4d76062d94413c30e402c9b0df8c14aef8d77336" + integrity sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/scope-manager" "6.10.0" + "@typescript-eslint/types" "6.10.0" + "@typescript-eslint/typescript-estree" "6.10.0" semver "^7.5.4" "@typescript-eslint/visitor-keys@6.10.0": @@ -7284,20 +7053,20 @@ "@typescript-eslint/types" "6.10.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@6.11.0": - version "6.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz#d991538788923f92ec40d44389e7075b359f3458" - integrity sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ== +"@typescript-eslint/visitor-keys@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" + integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== dependencies: - "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/types" "7.2.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== +"@typescript-eslint/visitor-keys@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz#0c8ff2c1f8a6fe8d7d1a57ebbd4a638e86a60a94" + integrity sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA== dependencies: - "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/types" "7.4.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -7305,10 +7074,10 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@vitejs/plugin-basic-ssl@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.2.tgz#bac6553842b215f17b052d27c82e2b2ef29236dc" - integrity sha512-DKHKVtpI+eA5fvObVgQ3QtTGU70CcCnedalzqmGSR050AzKZMdUzgC8KmlOneHWH8dF2hJ3wkC9+8FDVAaDRCw== +"@vitejs/plugin-basic-ssl@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz#8b840305a6b48e8764803435ec0c716fa27d3802" + integrity sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A== "@webassemblyjs/ast@1.11.1": version "1.11.1" @@ -7582,7 +7351,7 @@ dependencies: argparse "^2.0.1" -JSONStream@^1.0.4, JSONStream@^1.3.5: +JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -7922,11 +7691,6 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - arrify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" @@ -7996,19 +7760,7 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@10.4.16: - version "10.4.16" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" - integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== - dependencies: - browserslist "^4.21.10" - caniuse-lite "^1.0.30001538" - fraction.js "^4.3.6" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -autoprefixer@^10.4.0: +autoprefixer@10.4.18, autoprefixer@^10.4.0: version "10.4.18" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.18.tgz#fcb171a3b017be7cb5d8b7a825f5aacbf2045163" integrity sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g== @@ -8187,7 +7939,7 @@ babel-plugin-polyfill-corejs2@^0.3.3: "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs2@^0.4.7, babel-plugin-polyfill-corejs2@^0.4.8: +babel-plugin-polyfill-corejs2@^0.4.8: version "0.4.8" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== @@ -8204,14 +7956,6 @@ babel-plugin-polyfill-corejs3@^0.6.0: "@babel/helper-define-polyfill-provider" "^0.3.3" core-js-compat "^3.25.1" -babel-plugin-polyfill-corejs3@^0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" - integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.4" - core-js-compat "^3.33.1" - babel-plugin-polyfill-corejs3@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" @@ -8227,7 +7971,7 @@ babel-plugin-polyfill-regenerator@^0.4.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" -babel-plugin-polyfill-regenerator@^0.5.4, babel-plugin-polyfill-regenerator@^0.5.5: +babel-plugin-polyfill-regenerator@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== @@ -8290,7 +8034,7 @@ base16@^1.0.0: resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== -base64-js@^1.2.0, base64-js@^1.3.1: +base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -8609,7 +8353,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -8698,7 +8442,7 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -call-bind@^1.0.5: +call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -8727,15 +8471,6 @@ camelcase-css@2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -8761,11 +8496,6 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz#0ef8a1cf8b16be47a0f9fc4ecfc952232724b32a" integrity sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw== -caniuse-lite@^1.0.30001538: - version "1.0.30001561" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz#752f21f56f96f1b1a52e97aae98c57c562d5d9da" - integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw== - caniuse-lite@^1.0.30001541: version "1.0.30001551" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz#1f2cfa8820bd97c971a57349d7fd8f6e08664a3e" @@ -9155,10 +8885,10 @@ commander@^10.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== +commander@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" + integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== commander@^2.2.0, commander@^2.20.0: version "2.20.3" @@ -9302,14 +9032,6 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -conventional-changelog-angular@^5.0.11: - version "5.0.13" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" - integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== - dependencies: - compare-func "^2.0.0" - q "^1.5.1" - conventional-changelog-angular@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" @@ -9416,18 +9138,6 @@ conventional-commits-filter@^4.0.0: resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz#845d713e48dc7d1520b84ec182e2773c10c7bf7f" integrity sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A== -conventional-commits-parser@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - conventional-commits-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" @@ -9530,7 +9240,7 @@ core-js-compat@^3.31.0: dependencies: browserslist "^4.22.1" -core-js-compat@^3.33.1, core-js-compat@^3.34.0: +core-js-compat@^3.34.0: version "3.36.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.0.tgz#087679119bc2fdbdefad0d45d8e5d307d45ba190" integrity sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw== @@ -9575,11 +9285,18 @@ corser@^2.0.1: resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== -cosmiconfig-typescript-loader@^4.0.0, cosmiconfig-typescript-loader@^4.3.0: +cosmiconfig-typescript-loader@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== +cosmiconfig-typescript-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" + integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== + dependencies: + jiti "^1.19.1" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -9602,7 +9319,7 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^8.0.0, cosmiconfig@^8.1.3: +cosmiconfig@^8.1.3: version "8.1.3" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== @@ -9612,15 +9329,15 @@ cosmiconfig@^8.0.0, cosmiconfig@^8.1.3: parse-json "^5.0.0" path-type "^4.0.0" -cosmiconfig@^8.3.5: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: + env-paths "^2.2.1" import-fresh "^3.3.0" js-yaml "^4.1.0" parse-json "^5.2.0" - path-type "^4.0.0" cpx@^1.5.0: version "1.5.0" @@ -9644,10 +9361,10 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -critters@0.0.20: - version "0.0.20" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.20.tgz#08ddb961550ab7b3a59370537e4f01df208f7646" - integrity sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw== +critters@0.0.22: + version "0.0.22" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.22.tgz#ce76b1cbc70078c89d23725646357e3850236dae" + integrity sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw== dependencies: chalk "^4.1.0" css-select "^5.1.0" @@ -9655,7 +9372,7 @@ critters@0.0.20: domhandler "^5.0.2" htmlparser2 "^8.0.2" postcss "^8.4.23" - pretty-bytes "^5.3.0" + postcss-media-query-parser "^0.2.3" cross-fetch@^3.1.5: version "3.1.5" @@ -9697,19 +9414,19 @@ css-has-pseudo@^3.0.4: dependencies: postcss-selector-parser "^6.0.9" -css-loader@6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== +css-loader@6.10.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" + integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== dependencies: icss-utils "^5.1.0" - postcss "^8.4.21" + postcss "^8.4.33" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" + postcss-modules-local-by-default "^4.0.4" + postcss-modules-scope "^3.1.1" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.8" + semver "^7.5.4" css-loader@^6.4.0, css-loader@^6.7.1: version "6.7.3" @@ -9965,20 +9682,19 @@ cuint@^0.2.2: resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== -cypress@^13.5.0: - version "13.5.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.5.0.tgz#8c149074186130972f08b2cdce6ded41f014bacd" - integrity sha512-oh6U7h9w8wwHfzNDJQ6wVcAeXu31DlIYlNOBvfd6U4CcB8oe4akawQmH+QJVOMZlM42eBoCne015+svVqdwdRQ== +cypress@^13.6.6: + version "13.7.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.1.tgz#d1208eb04efd46ef52a30480a5da71a03373261a" + integrity sha512-4u/rpFNxOFCoFX/Z5h+uwlkBO4mWzAjveURi3vqdSu56HPvVdyGTxGw4XKGWt399Y1JwIn9E1L9uMXQpc0o55w== dependencies: "@cypress/request" "^3.0.0" "@cypress/xvfb" "^1.2.4" - "@types/node" "^18.17.5" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" arch "^2.2.0" blob-util "^2.0.2" bluebird "^3.7.2" - buffer "^5.6.0" + buffer "^5.7.1" cachedir "^2.3.0" chalk "^4.1.0" check-more-types "^2.24.0" @@ -9996,7 +9712,7 @@ cypress@^13.5.0: figures "^3.2.0" fs-extra "^9.1.0" getos "^3.2.1" - is-ci "^3.0.0" + is-ci "^3.0.1" is-installed-globally "~0.4.0" lazy-ass "^1.6.0" listr2 "^3.8.3" @@ -10014,11 +9730,6 @@ cypress@^13.5.0: untildify "^4.0.0" yauzl "^2.10.0" -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - dargs@^8.0.0: version "8.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-8.1.0.tgz#a34859ea509cbce45485e5aa356fef70bfcc7272" @@ -10066,19 +9777,6 @@ debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" @@ -10592,7 +10290,7 @@ entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== -env-paths@^2.2.0: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== @@ -10638,105 +10336,73 @@ es-module-lexer@^1.2.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== -esbuild-wasm@0.19.11: - version "0.19.11" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.11.tgz#4ed96cdd1a289bc08432a25fd38b7331d3eac98d" - integrity sha512-MIhnpc1TxERUHomteO/ZZHp+kUawGEc03D/8vMHGzffLvbFLeDe6mwxqEZwlqBNY7SLWbyp6bBQAcCen8+wpjQ== - -esbuild-wasm@>=0.13.8: - version "0.17.16" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.17.16.tgz#d50c2a937ea637cdb52a3c62c3fc4b3f2106c06f" - integrity sha512-o5DNFwnYThm9LXYIEoZEnJrk7cI08GwVjHKMUHDFSN8vo0y8eKdEOAgNH3rSoBK/8E34PeKr1UO0liEBIH/GFQ== - -esbuild-wasm@^0.19.5: - version "0.19.5" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz#28f4563d7e3bcbe9462813e376b2fb6024931fd9" - integrity sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA== - -esbuild@0.19.11: - version "0.19.11" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" - integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.11" - "@esbuild/android-arm" "0.19.11" - "@esbuild/android-arm64" "0.19.11" - "@esbuild/android-x64" "0.19.11" - "@esbuild/darwin-arm64" "0.19.11" - "@esbuild/darwin-x64" "0.19.11" - "@esbuild/freebsd-arm64" "0.19.11" - "@esbuild/freebsd-x64" "0.19.11" - "@esbuild/linux-arm" "0.19.11" - "@esbuild/linux-arm64" "0.19.11" - "@esbuild/linux-ia32" "0.19.11" - "@esbuild/linux-loong64" "0.19.11" - "@esbuild/linux-mips64el" "0.19.11" - "@esbuild/linux-ppc64" "0.19.11" - "@esbuild/linux-riscv64" "0.19.11" - "@esbuild/linux-s390x" "0.19.11" - "@esbuild/linux-x64" "0.19.11" - "@esbuild/netbsd-x64" "0.19.11" - "@esbuild/openbsd-x64" "0.19.11" - "@esbuild/sunos-x64" "0.19.11" - "@esbuild/win32-arm64" "0.19.11" - "@esbuild/win32-ia32" "0.19.11" - "@esbuild/win32-x64" "0.19.11" - -esbuild@>=0.13.8: - version "0.17.16" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.16.tgz#5efec24a8ff29e0c157359f27e1b5532a728b720" - integrity sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg== +esbuild-wasm@0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz#fdc14b95e3e16ec8e082dd641edb96140c1723f7" + integrity sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A== + +esbuild-wasm@>=0.15.13, esbuild-wasm@^0.20.0: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.20.2.tgz#bbee2a729776b0b88b765c014f161b627435c5b6" + integrity sha512-7o6nmsEqlcXJXMNqnx5K+M4w4OPx7yTFXQHcJyeP3SkXb8p2T8N9E1ayK4vd/qDBepH6fuPoZwiFvZm8x5qv+w== + +esbuild@0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.1.tgz#1e4cbb380ad1959db7609cb9573ee77257724a3e" + integrity sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA== optionalDependencies: - "@esbuild/android-arm" "0.17.16" - "@esbuild/android-arm64" "0.17.16" - "@esbuild/android-x64" "0.17.16" - "@esbuild/darwin-arm64" "0.17.16" - "@esbuild/darwin-x64" "0.17.16" - "@esbuild/freebsd-arm64" "0.17.16" - "@esbuild/freebsd-x64" "0.17.16" - "@esbuild/linux-arm" "0.17.16" - "@esbuild/linux-arm64" "0.17.16" - "@esbuild/linux-ia32" "0.17.16" - "@esbuild/linux-loong64" "0.17.16" - "@esbuild/linux-mips64el" "0.17.16" - "@esbuild/linux-ppc64" "0.17.16" - "@esbuild/linux-riscv64" "0.17.16" - "@esbuild/linux-s390x" "0.17.16" - "@esbuild/linux-x64" "0.17.16" - "@esbuild/netbsd-x64" "0.17.16" - "@esbuild/openbsd-x64" "0.17.16" - "@esbuild/sunos-x64" "0.17.16" - "@esbuild/win32-arm64" "0.17.16" - "@esbuild/win32-ia32" "0.17.16" - "@esbuild/win32-x64" "0.17.16" - -esbuild@^0.19.0: - version "0.19.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.5.tgz#53a0e19dfbf61ba6c827d51a80813cf071239a8c" - integrity sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ== + "@esbuild/aix-ppc64" "0.20.1" + "@esbuild/android-arm" "0.20.1" + "@esbuild/android-arm64" "0.20.1" + "@esbuild/android-x64" "0.20.1" + "@esbuild/darwin-arm64" "0.20.1" + "@esbuild/darwin-x64" "0.20.1" + "@esbuild/freebsd-arm64" "0.20.1" + "@esbuild/freebsd-x64" "0.20.1" + "@esbuild/linux-arm" "0.20.1" + "@esbuild/linux-arm64" "0.20.1" + "@esbuild/linux-ia32" "0.20.1" + "@esbuild/linux-loong64" "0.20.1" + "@esbuild/linux-mips64el" "0.20.1" + "@esbuild/linux-ppc64" "0.20.1" + "@esbuild/linux-riscv64" "0.20.1" + "@esbuild/linux-s390x" "0.20.1" + "@esbuild/linux-x64" "0.20.1" + "@esbuild/netbsd-x64" "0.20.1" + "@esbuild/openbsd-x64" "0.20.1" + "@esbuild/sunos-x64" "0.20.1" + "@esbuild/win32-arm64" "0.20.1" + "@esbuild/win32-ia32" "0.20.1" + "@esbuild/win32-x64" "0.20.1" + +esbuild@>=0.15.13, esbuild@^0.20.0: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== optionalDependencies: - "@esbuild/android-arm" "0.19.5" - "@esbuild/android-arm64" "0.19.5" - "@esbuild/android-x64" "0.19.5" - "@esbuild/darwin-arm64" "0.19.5" - "@esbuild/darwin-x64" "0.19.5" - "@esbuild/freebsd-arm64" "0.19.5" - "@esbuild/freebsd-x64" "0.19.5" - "@esbuild/linux-arm" "0.19.5" - "@esbuild/linux-arm64" "0.19.5" - "@esbuild/linux-ia32" "0.19.5" - "@esbuild/linux-loong64" "0.19.5" - "@esbuild/linux-mips64el" "0.19.5" - "@esbuild/linux-ppc64" "0.19.5" - "@esbuild/linux-riscv64" "0.19.5" - "@esbuild/linux-s390x" "0.19.5" - "@esbuild/linux-x64" "0.19.5" - "@esbuild/netbsd-x64" "0.19.5" - "@esbuild/openbsd-x64" "0.19.5" - "@esbuild/sunos-x64" "0.19.5" - "@esbuild/win32-arm64" "0.19.5" - "@esbuild/win32-ia32" "0.19.5" - "@esbuild/win32-x64" "0.19.5" + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" esbuild@^0.19.3: version "0.19.12" @@ -10797,11 +10463,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -10814,10 +10475,10 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f" - integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-plugin-cypress@2.15.1: version "2.15.1" @@ -10851,14 +10512,6 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" @@ -10867,60 +10520,25 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" - integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== - -eslint@8.48.0: - version "8.48.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155" - integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.48.0" - "@humanwhocodes/config-array" "^0.11.10" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" +eslint-scope@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" + integrity sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== -eslint@^8.0.0: +eslint@8.57.0, eslint@^8.0.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -11080,6 +10698,21 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -11377,14 +11010,6 @@ figures@3.2.0, figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" -figures@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-5.0.0.tgz#126cd055052dea699f8a54e8c9450e6ecfc44d5f" - integrity sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg== - dependencies: - escape-string-regexp "^5.0.0" - is-unicode-supported "^1.2.0" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -11529,6 +11154,15 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" +find-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb" + integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== + dependencies: + locate-path "^7.2.0" + path-exists "^5.0.0" + unicorn-magic "^0.1.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -11655,7 +11289,7 @@ fraction.js@^4.2.0: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -fraction.js@^4.3.6, fraction.js@^4.3.7: +fraction.js@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== @@ -11695,7 +11329,7 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.0.0, fs-extra@^11.1.0: +fs-extra@^11.1.0: version "11.1.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== @@ -11825,6 +11459,11 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -11844,17 +11483,6 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-raw-commits@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== - dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - git-raw-commits@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285" @@ -11952,12 +11580,12 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== dependencies: - ini "^1.3.4" + ini "4.1.1" global-dirs@^3.0.0: version "3.0.1" @@ -12104,11 +11732,6 @@ handlebars@^4.7.7: optionalDependencies: uglify-js "^3.1.4" -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - harmony-reflect@^1.4.6: version "1.6.2" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" @@ -12266,20 +11889,6 @@ hastscript@^6.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" -hdr-histogram-js@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz#0b860534655722b6e3f3e7dca7b78867cf43dcb5" - integrity sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g== - dependencies: - "@assemblyscript/loader" "^0.10.1" - base64-js "^1.2.0" - pako "^1.0.3" - -hdr-histogram-percentiles-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" - integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== - he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -12304,18 +11913,6 @@ hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.7.0" -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - hosted-git-info@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322" @@ -12512,10 +12109,10 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@7.0.2, https-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" - integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== +https-proxy-agent@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== dependencies: agent-base "^7.0.2" debug "4" @@ -12528,6 +12125,14 @@ https-proxy-agent@^5.0.1: agent-base "6" debug "4" +https-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" + integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -12538,10 +12143,15 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -husky@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +husky@^9.0.11: + version "9.0.11" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" + integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -12618,7 +12228,7 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -12639,6 +12249,11 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-meta-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz#0b1195915689f60ab00f830af0f15cc841e8919e" + integrity sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -12682,7 +12297,12 @@ ini@4.1.1: resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.2.tgz#7f646dbd9caea595e61f88ef60bfff8b01f8130a" + integrity sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw== + +ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -12720,18 +12340,18 @@ inquirer@8.2.6: through "^2.3.6" wrap-ansi "^6.0.1" -inquirer@9.2.12: - version "9.2.12" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.12.tgz#0348e9311765b7c93fce143bb1c0ef1ae879b1d7" - integrity sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q== +inquirer@9.2.15: + version "9.2.15" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.15.tgz#2135a36190a6e5c92f5d205e0af1fea36b9d3492" + integrity sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg== dependencies: - "@ljharb/through" "^2.3.11" + "@ljharb/through" "^2.3.12" ansi-escapes "^4.3.2" chalk "^5.3.0" cli-cursor "^3.1.0" cli-width "^4.1.0" external-editor "^3.1.0" - figures "^5.0.0" + figures "^3.2.0" lodash "^4.17.21" mute-stream "1.0.0" ora "^5.4.1" @@ -12848,14 +12468,14 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-ci@^3.0.0: +is-ci@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" -is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.11.0, is-core-module@^2.8.1: version "2.12.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== @@ -13058,11 +12678,6 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - is-plain-obj@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" @@ -13117,12 +12732,10 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-text-path@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== - dependencies: - text-extensions "^1.0.0" +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-text-path@^2.0.0: version "2.0.0" @@ -13141,11 +12754,6 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-unicode-supported@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" - integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== - is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -13703,19 +13311,19 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-preset-angular@13.1.6: - version "13.1.6" - resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-13.1.6.tgz#c32af7b3071a917c7fc75534f5aa00db1f36700a" - integrity sha512-0pXSm6168Qn+qKp7DpzYoaIp0uyMHdQaWYVp8jlw7Mh+NEBtrBjKqts3kLeBHgAhGMQArp07S2IxZ6eCr8fc7Q== +jest-preset-angular@14.0.3: + version "14.0.3" + resolved "https://registry.yarnpkg.com/jest-preset-angular/-/jest-preset-angular-14.0.3.tgz#ce78451a61bad0e4828bd75dd36542ad5bf48dac" + integrity sha512-usgBL7x0rXMnMSx8iEFeOozj50W6fp+YAmQcQBUdAXhN+PAXRy4UXL6I/rfcAOU09rnnq7RKsLsmhpp/fFEuag== dependencies: bs-logger "^0.2.6" - esbuild-wasm ">=0.13.8" + esbuild-wasm ">=0.15.13" jest-environment-jsdom "^29.0.0" jest-util "^29.0.0" pretty-format "^29.0.0" ts-jest "^29.0.0" optionalDependencies: - esbuild ">=0.13.8" + esbuild ">=0.15.13" jest-regex-util@^29.4.3: version "29.4.3" @@ -14062,7 +13670,7 @@ jest@^29.4.1: import-local "^3.0.2" jest-cli "^29.6.2" -jiti@^1.20.0: +jiti@^1.19.1, jiti@^1.20.0: version "1.21.0" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== @@ -14205,6 +13813,11 @@ jsonc-parser@3.2.0, jsonc-parser@^3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== +jsonc-parser@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== + jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" @@ -14269,7 +13882,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -14514,7 +14127,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -locate-path@^7.1.0: +locate-path@^7.1.0, locate-path@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== @@ -14546,11 +14159,6 @@ lodash.isfinite@^3.3.2: resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" integrity sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA== -lodash.isfunction@^3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== - lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -14601,7 +14209,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -14682,7 +14290,14 @@ lunr@^2.3.9: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== -magic-string@0.30.5, magic-string@~0.30.2: +magic-string@0.30.8: + version "0.30.8" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +magic-string@~0.30.2: version "0.30.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== @@ -14738,16 +14353,6 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -14872,23 +14477,6 @@ meow@^12.0.1: resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== -meow@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" - integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -14999,22 +14587,23 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-css-extract-plugin@2.7.6: - version "2.7.6" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" - integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== +mini-css-extract-plugin@2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz#75245f3f30ce3a56dbdd478084df6fe475f02dc7" + integrity sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA== dependencies: schema-utils "^4.0.0" + tapable "^2.2.1" mini-css-extract-plugin@^2.6.1: version "2.7.5" @@ -15077,15 +14666,6 @@ minimatch@~3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -15319,10 +14899,10 @@ ng-morph@^4.0.3: ts-morph "20.0.0" tslib "2.6.2" -ng-packagr@17.1.2: - version "17.1.2" - resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-17.1.2.tgz#9ba4cfb3b618e9d0d51e53e301a17ffa9ee5cc09" - integrity sha512-H7WRiqbM91lOItixrKc9XP1ZLpsxwIk3l0JDnhSePvKQlMe1UsNrnYHzBek6iVyMolCuz86YR0Dovbpyi4aOzA== +ng-packagr@17.3.0: + version "17.3.0" + resolved "https://registry.yarnpkg.com/ng-packagr/-/ng-packagr-17.3.0.tgz#c7036f79aa6b927ee399cd9de62706c44793896c" + integrity sha512-kMSqxeDgv88SWCoapWNRRN1UdBgwu9/Pw/j7u2WFGmzrIWUFivNWBBSSL94kMxr2La+Z9wMwiL8EwKNvmCpg2A== dependencies: "@rollup/plugin-json" "^6.0.1" "@rollup/plugin-node-resolve" "^15.2.3" @@ -15332,22 +14912,22 @@ ng-packagr@17.1.2: browserslist "^4.22.1" cacache "^18.0.0" chokidar "^3.5.3" - commander "^11.1.0" + commander "^12.0.0" convert-source-map "^2.0.0" dependency-graph "^1.0.0" - esbuild-wasm "^0.19.5" + esbuild-wasm "^0.20.0" fast-glob "^3.3.1" find-cache-dir "^3.3.2" injection-js "^2.4.0" jsonc-parser "^3.2.0" less "^4.2.0" ora "^5.1.0" - piscina "^4.2.0" + piscina "^4.4.0" postcss "^8.4.31" rxjs "^7.8.1" sass "^1.69.5" optionalDependencies: - esbuild "^0.19.0" + esbuild "^0.20.0" rollup "^4.5.0" ngx-skeleton-loader@^7.0.0: @@ -15463,26 +15043,6 @@ normalize-css@^2.3.1: dependencies: insert-css "0.0.0" -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - normalize-package-data@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" @@ -15586,6 +15146,13 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + nprogress@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" @@ -15603,12 +15170,12 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.3.tgz#00e04dfd5a4a751e5ec2fecdc75dfd2f0db820fa" integrity sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw== -nx@18.0.6: - version "18.0.6" - resolved "https://registry.yarnpkg.com/nx/-/nx-18.0.6.tgz#c9556a2341976b08db78b4a638b6207a0e87c062" - integrity sha512-x+xDOnY6+NTswASyOfWQbahmW6remJC986GklbvKHk76QPTs4Gydp8so4M7chFi/+/DvqPqY4w1wzIDr/Z4o8g== +nx@18.2.1: + version "18.2.1" + resolved "https://registry.yarnpkg.com/nx/-/nx-18.2.1.tgz#6eab05216615acc83e2f888f6aed11d4e1303bf0" + integrity sha512-wUYr1x6GnPvtHMY5pHVijuJbD077ObwGCX+pHZc1IreugAQBLmQ6bxPNCxuI0YjGeM39PD9ME+rxi6aAcJbUKw== dependencies: - "@nrwl/tao" "18.0.6" + "@nrwl/tao" "18.2.1" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" @@ -15643,16 +15210,16 @@ nx@18.0.6: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "18.0.6" - "@nx/nx-darwin-x64" "18.0.6" - "@nx/nx-freebsd-x64" "18.0.6" - "@nx/nx-linux-arm-gnueabihf" "18.0.6" - "@nx/nx-linux-arm64-gnu" "18.0.6" - "@nx/nx-linux-arm64-musl" "18.0.6" - "@nx/nx-linux-x64-gnu" "18.0.6" - "@nx/nx-linux-x64-musl" "18.0.6" - "@nx/nx-win32-arm64-msvc" "18.0.6" - "@nx/nx-win32-x64-msvc" "18.0.6" + "@nx/nx-darwin-arm64" "18.2.1" + "@nx/nx-darwin-x64" "18.2.1" + "@nx/nx-freebsd-x64" "18.2.1" + "@nx/nx-linux-arm-gnueabihf" "18.2.1" + "@nx/nx-linux-arm64-gnu" "18.2.1" + "@nx/nx-linux-arm64-musl" "18.2.1" + "@nx/nx-linux-x64-gnu" "18.2.1" + "@nx/nx-linux-x64-musl" "18.2.1" + "@nx/nx-win32-arm64-msvc" "18.2.1" + "@nx/nx-win32-x64-msvc" "18.2.1" object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -15748,6 +15315,13 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + open@8.4.2, open@^8.0.9, open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -15916,10 +15490,10 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" -pacote@17.0.5: - version "17.0.5" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.5.tgz#e9854edee7a073635cdd36b0c07cd4f2ab1757b6" - integrity sha512-TAE0m20zSDMnchPja9vtQjri19X3pZIyRpm2TJVeI+yU42leJBBDTRYhOcWFsPhaMxf+3iwQkFiKz16G9AEeeA== +pacote@17.0.6: + version "17.0.6" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.6.tgz#874bb59cda5d44ab784d0b6530fcb4a7d9b76a60" + integrity sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ== dependencies: "@npmcli/git" "^5.0.0" "@npmcli/installed-package-contents" "^2.0.1" @@ -15936,15 +15510,10 @@ pacote@17.0.5: promise-retry "^2.0.1" read-package-json "^7.0.0" read-package-json-fast "^3.0.0" - sigstore "^2.0.0" + sigstore "^2.2.0" ssri "^10.0.0" tar "^6.1.11" -pako@^1.0.3: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -16107,6 +15676,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -16172,10 +15746,10 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" - integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== +picomatch@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.1.tgz#68c26c8837399e5819edce48590412ea07f17a07" + integrity sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -16207,17 +15781,7 @@ pirates@^4.0.6: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -piscina@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.2.1.tgz#efb7f009d3a961e02ae08f1909bd24b5423e77fa" - integrity sha512-LShp0+lrO+WIzB9LXO+ZmO4zGHxtTJNZhEO56H9SSu+JPaUQb6oLcTCzWi5IL2DS8/vIkCE88ElahuSSw4TAkA== - dependencies: - hdr-histogram-js "^2.0.1" - hdr-histogram-percentiles-obj "^3.0.0" - optionalDependencies: - nice-napi "^1.0.2" - -piscina@^4.2.0, piscina@^4.2.1: +piscina@4.4.0, piscina@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.4.0.tgz#e3af8e5721d8fad08c6ccaf8a64f9f42279efbb5" integrity sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg== @@ -16502,12 +16066,12 @@ postcss-lab-function@^4.2.0: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-loader@7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" - integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== +postcss-loader@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-8.1.1.tgz#2822589e7522927344954acb55bbf26e8b195dfe" + integrity sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ== dependencies: - cosmiconfig "^8.3.5" + cosmiconfig "^9.0.0" jiti "^1.20.0" semver "^7.5.4" @@ -16540,6 +16104,11 @@ postcss-media-minmax@^5.0.0: resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + postcss-merge-idents@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" @@ -16662,10 +16231,10 @@ postcss-modules-local-by-default@^4.0.0: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== +postcss-modules-local-by-default@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" + integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -16678,6 +16247,13 @@ postcss-modules-scope@^3.0.0: dependencies: postcss-selector-parser "^6.0.4" +postcss-modules-scope@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" + integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== + dependencies: + postcss-selector-parser "^6.0.4" + postcss-modules-values@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" @@ -17046,10 +16622,10 @@ postcss-zindex@^5.1.0: resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -postcss@8.4.33: - version "8.4.33" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" - integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== +postcss@8.4.35: + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" @@ -17064,15 +16640,6 @@ postcss@^8.2.14, postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4 picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.21, postcss@^8.4.6: - version "8.4.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.31: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" @@ -17082,13 +16649,22 @@ postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.32: - version "8.4.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" - integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== +postcss@^8.4.33, postcss@^8.4.35: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" + source-map-js "^1.2.0" + +postcss@^8.4.6: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" source-map-js "^1.0.2" prelude-ls@^1.2.1: @@ -17111,12 +16687,12 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== -prettier@2.8.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" - integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== +prettier@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== -pretty-bytes@^5.3.0, pretty-bytes@^5.6.0: +pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== @@ -17298,11 +16874,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== -q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - qs@6.10.4: version "6.10.4" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" @@ -17341,11 +16912,6 @@ queue@6.0.2: dependencies: inherits "~2.0.3" -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" @@ -17601,25 +17167,6 @@ read-pkg-up@^10.0.0: read-pkg "^8.1.0" type-fest "^4.2.0" -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - read-pkg@^8.0.0, read-pkg@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-8.1.0.tgz#6cf560b91d90df68bce658527e7e3eee75f7c4c7" @@ -17630,15 +17177,6 @@ read-pkg@^8.0.0, read-pkg@^8.1.0: parse-json "^7.0.0" type-fest "^4.2.0" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@^2.0.1, readable-stream@^2.0.2: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -17652,6 +17190,15 @@ readable-stream@^2.0.1, readable-stream@^2.0.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -17687,18 +17234,10 @@ recursive-readdir@^2.2.2: dependencies: minimatch "^3.0.5" -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reflect-metadata@^0.1.2: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +reflect-metadata@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== regenerate-unicode-properties@^10.1.0: version "10.1.0" @@ -17916,22 +17455,15 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@5.0.0, resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-global@1.0.0, resolve-global@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" - integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== - dependencies: - global-dirs "^0.1.1" +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-pathname@^3.0.0: version "3.0.0" @@ -17973,7 +17505,7 @@ resolve@1.22.8: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.3.2: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.3.2: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -18166,10 +17698,10 @@ safevalues@^0.3.4: resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.3.4.tgz#82e846a02b6956d7d40bf9f41e92e13fce0186db" integrity sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw== -sass-loader@13.3.3: - version "13.3.3" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.3.tgz#60df5e858788cffb1a3215e5b92e9cba61e7e133" - integrity sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA== +sass-loader@14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-14.1.1.tgz#2c9d2277c5b1c5fe789cd0570c046d8ad23cb7ca" + integrity sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw== dependencies: neo-async "^2.6.2" @@ -18181,10 +17713,10 @@ sass-loader@^12.2.0: klona "^2.0.4" neo-async "^2.6.2" -sass@1.69.7: - version "1.69.7" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.7.tgz#6e7e1c8f51e8162faec3e9619babc7da780af3b7" - integrity sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ== +sass@1.71.1: + version "1.71.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.1.tgz#dfb09c63ce63f89353777bbd4a88c0a38386ee54" + integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -18325,22 +17857,10 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@7.5.4, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== +semver@7.6.0, semver@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" @@ -18351,6 +17871,11 @@ semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^ dependencies: lru-cache "^6.0.0" +semver@^5.4.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -18361,6 +17886,13 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -18552,15 +18084,22 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.1.tgz#96a61033896120ec9335d96851d902cc98f0ba2a" integrity sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw== -sigstore@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.1.0.tgz#c577b596642b3f360dc4135d476466e6edeb2364" - integrity sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.2.2.tgz#5e4ff39febeae9e0679bafa22180cb0f445a7e35" + integrity sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg== dependencies: - "@sigstore/bundle" "^2.1.0" - "@sigstore/protobuf-specs" "^0.2.1" - "@sigstore/sign" "^2.1.0" - "@sigstore/tuf" "^2.1.0" + "@sigstore/bundle" "^2.2.0" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.0" + "@sigstore/sign" "^2.2.3" + "@sigstore/tuf" "^2.3.1" + "@sigstore/verify" "^1.1.0" sirv@^1.0.7: version "1.0.19" @@ -18732,6 +18271,11 @@ sort-css-media-queries@2.1.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + source-map-loader@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-5.0.0.tgz#f593a916e1cc54471cfc8851b905c8a845fc7e38" @@ -18865,13 +18409,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@^3.0.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - split2@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" @@ -19050,12 +18587,10 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^3.0.0: +strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-json-comments@^3.1.1: version "3.1.1" @@ -19245,6 +18780,17 @@ terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: serialize-javascript "^6.0.1" terser "^5.16.5" +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + terser-webpack-plugin@^5.3.7: version "5.3.8" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz#415e03d2508f7de63d59eca85c5d102838f06610" @@ -19256,10 +18802,10 @@ terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" -terser@5.26.0: - version "5.26.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" - integrity sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ== +terser@5.29.1: + version "5.29.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.1.tgz#44e58045b70c09792ba14bfb7b4e14ca8755b9fa" + integrity sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -19286,6 +18832,16 @@ terser@^5.16.8: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.26.0: + version "5.30.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.0.tgz#64cb2af71e16ea3d32153f84d990f9be0cdc22bf" + integrity sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -19295,17 +18851,12 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-extensions@^1.0.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" - integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== - text-extensions@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== -text-table@0.2.0, text-table@^0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== @@ -19315,13 +18866,6 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -19450,11 +18994,6 @@ tree-kill@1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - trim-trailing-lines@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" @@ -19521,7 +19060,7 @@ ts-morph@20.0.0: "@ts-morph/common" "~0.21.0" code-block-writer "^12.0.0" -ts-node@10.9.1, ts-node@^10.8.1: +ts-node@10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -19568,10 +19107,10 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.4 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -tuf-js@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.1.0.tgz#87aa36d5a166e7522f1e2050eb502a3a9b0bde72" - integrity sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA== +tuf-js@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.2.0.tgz#4daaa8620ba7545501d04dfa933c98abbcc959b9" + integrity sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg== dependencies: "@tufjs/models" "2.0.0" debug "^4.3.4" @@ -19608,11 +19147,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -19623,16 +19157,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-fest@^2.5.0: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" @@ -19668,15 +19192,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@5.3.3, typescript@~5.3.2: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== - -"typescript@^4.6.4 || ^5.0.0": - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== +typescript@5.4.3, typescript@~5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== typescript@^4.7.4: version "4.9.5" @@ -19703,12 +19222,10 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.2.1.tgz#554293044619e065d986c37a4c92185c3bc02121" - integrity sha512-7Wa9thEM6/LMnnKtxJHlc8SrTlDmxqJecgz1iy8KlsN0/iskQXOQCuPkrZLXbElPaSw5slFFyKIKXyJ3UtbApw== - dependencies: - "@fastify/busboy" "^2.0.0" +undici@6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.7.1.tgz#3cb27222fd5d72c1b2058f4e18bf9b53dd933af8" + integrity sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ== unherit@^1.0.4: version "1.1.3" @@ -19741,6 +19258,11 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unicorn-magic@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" + integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== + unified@9.2.0: version "9.2.0" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" @@ -20032,7 +19554,7 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: +validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -20089,13 +19611,13 @@ vfile@^4.0.0: unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" -vite@5.0.12: - version "5.0.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.12.tgz#8a2ffd4da36c132aec4adafe05d7adde38333c47" - integrity sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w== +vite@5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.5.tgz#bdbc2b15e8000d9cc5172f059201178f9c9de5fb" + integrity sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q== dependencies: esbuild "^0.19.3" - postcss "^8.4.32" + postcss "^8.4.35" rollup "^4.2.0" optionalDependencies: fsevents "~2.3.3" @@ -20178,10 +19700,10 @@ webpack-bundle-analyzer@^4.5.0: sirv "^1.0.7" ws "^7.3.1" -webpack-dev-middleware@6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz#6bbc257ec83ae15522de7a62f995630efde7cc3d" - integrity sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ== +webpack-dev-middleware@6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz#0463232e59b7d7330fa154121528d484d36eb973" + integrity sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ== dependencies: colorette "^2.0.10" memfs "^3.4.12" @@ -20306,19 +19828,19 @@ webpack-subresource-integrity@5.1.0, webpack-subresource-integrity@^5.1.0: dependencies: typed-assert "^1.0.8" -webpack@5.89.0: - version "5.89.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" - integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== +webpack@5.90.3: + version "5.90.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.3.tgz#37b8f74d3ded061ba789bb22b31e82eed75bd9ac" + integrity sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" + "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.11.5" "@webassemblyjs/wasm-edit" "^1.11.5" "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" enhanced-resolve "^5.15.0" es-module-lexer "^1.2.1" @@ -20332,7 +19854,7 @@ webpack@5.89.0: neo-async "^2.6.2" schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" + terser-webpack-plugin "^5.3.10" watchpack "^2.4.0" webpack-sources "^3.2.3" @@ -20632,11 +20154,6 @@ yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs@17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"