Merge pull request #5255 from Ombi-app/tests

Tests
This commit is contained in:
Jamie Rees 2025-08-25 00:01:42 +02:00 committed by GitHub
commit 81de60187c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
31 changed files with 1194 additions and 604 deletions

View file

@ -19,7 +19,7 @@ jobs:
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@v1 uses: actions/setup-dotnet@v1
with: with:
dotnet-version: 6.0.x dotnet-version: 8.0.x
- uses: actions/setup-node@v2 - uses: actions/setup-node@v2
with: with:
node-version: '20' node-version: '20'
@ -34,14 +34,22 @@ jobs:
- name: Install Frontend Deps - name: Install Frontend Deps
run: yarn --cwd ./src/Ombi/ClientApp install run: yarn --cwd ./src/Ombi/ClientApp install
- name: Build Frontend - name: Install Test Dependencies
run: yarn --cwd ./src/Ombi/ClientApp build run: yarn --cwd ./tests install
- name: Build Docker Image - name: Start Frontend
run: docker build -t ombi src/ run: |
nohup yarn --cwd ./src/Ombi/ClientApp start &
- name: Run Docker Image - name: Restore .NET Dependencies
run: nohup docker run --rm -p 5000:5000 ombi & run: dotnet restore ./src/Ombi/Ombi.csproj
- name: Build .NET Project
run: dotnet build ./src/Ombi/Ombi.csproj --no-restore
- name: Start Backend
run: |
nohup dotnet run --project ./src/Ombi -- --host http://*:3577 &
- name: Run Wiremock - name: Run Wiremock
run: nohup docker run --rm -p 32400:8080 --name wiremock wiremock/wiremock:2.35.0 & run: nohup docker run --rm -p 32400:8080 --name wiremock wiremock/wiremock:2.35.0 &
@ -49,17 +57,6 @@ jobs:
- name: Sleep for server to start - name: Sleep for server to start
run: sleep 20 run: sleep 20
# - name: Start Frontend
# run: |
# nohup yarn --cwd ./src/Ombi/ClientApp start &
# - name: Install Automation Deps
# run: yarn --cwd ./tests install
# - name: Start Backend
# run: |
# nohup dotnet run --project ./src/Ombi -- --host http://*:3577 &
- name: Cypress Tests - name: Cypress Tests
uses: cypress-io/github-action@v4 uses: cypress-io/github-action@v4
with: with:
@ -67,15 +64,15 @@ jobs:
browser: chrome browser: chrome
headless: true headless: true
working-directory: tests working-directory: tests
wait-on: http://localhost:5000/ wait-on: http://localhost:3577/
# 10 minutes # 10 minutes
wait-on-timeout: 600 wait-on-timeout: 600
env: env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Stop Docker - name: Stop Services
if: always() if: always()
run: | run: |
docker ps -q | xargs -I {} docker logs {} pkill -f "dotnet.*Ombi" || true
docker container kill $(docker ps -q) docker container kill wiremock || true

View file

@ -25,6 +25,18 @@
"assets": [ "assets": [
"src/assets" "src/assets"
], ],
"optimization": true,
"buildOptimizer": true,
"aot": true,
"vendorChunk": true,
"extractLicenses": true,
"sourceMap": false,
"namedChunks": true,
"subresourceIntegrity": true,
"allowedCommonJsDependencies": [
"jquery",
"bootstrap"
],
"styles": [ "styles": [
"node_modules/@angular/material/prebuilt-themes/indigo-pink.css", "node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
"src/styles/_imports.scss", "src/styles/_imports.scss",
@ -42,11 +54,27 @@
] ]
}, },
"configurations": { "configurations": {
"development": {
"optimization": false,
"buildOptimizer": false,
"aot": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true,
"subresourceIntegrity": false
},
"production": { "production": {
"budgets": [ "budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
},
{ {
"type": "anyComponentStyle", "type": "anyComponentStyle",
"maximumWarning": "6kb" "maximumWarning": "6kb",
"maximumError": "10kb"
} }
], ],
"fileReplacements": [ "fileReplacements": [
@ -55,7 +83,15 @@
"with": "src/environments/environment.prod.ts" "with": "src/environments/environment.prod.ts"
} }
], ],
"outputHashing": "all" "outputHashing": "all",
"optimization": true,
"buildOptimizer": true,
"aot": true,
"vendorChunk": true,
"extractLicenses": true,
"sourceMap": false,
"namedChunks": true,
"subresourceIntegrity": true
}, },
"hmr": { "hmr": {
"budgets": [ "budgets": [
@ -75,7 +111,8 @@
"vendorChunk": true, "vendorChunk": true,
"extractLicenses": false, "extractLicenses": false,
"sourceMap": true, "sourceMap": true,
"namedChunks": true "namedChunks": true,
"aot": false
} }
} }
}, },
@ -85,6 +122,9 @@
"buildTarget": "ombi:build" "buildTarget": "ombi:build"
}, },
"configurations": { "configurations": {
"development": {
"buildTarget": "ombi:build:development"
},
"production": { "production": {
"buildTarget": "ombi:build:production" "buildTarget": "ombi:build:production"
}, },

View file

@ -3,8 +3,11 @@
"version": "4.0.0", "version": "4.0.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve --port 3578 --configuration hmr", "start": "ng serve --port 3578 --configuration development",
"start:hmr": "ng serve --port 3578 --configuration hmr",
"build": "node --max_old_space_size=6144 node_modules/@angular/cli/bin/ng build -c production", "build": "node --max_old_space_size=6144 node_modules/@angular/cli/bin/ng build -c production",
"build:dev": "node --max_old_space_size=6144 node_modules/@angular/cli/bin/ng build -c development",
"build:prod": "node --max_old_space_size=6144 node_modules/@angular/cli/bin/ng build -c production",
"lint": "ng lint", "lint": "ng lint",
"docs:json": "compodoc -p ./tsconfig.json -e json -d .", "docs:json": "compodoc -p ./tsconfig.json -e json -d .",
"storybook": "start-storybook -p 6006", "storybook": "start-storybook -p 6006",

View file

@ -1,21 +1,25 @@
<div class="right" *ngIf="discoverType !== DiscoverType.Seasonal"> @if (discoverType() !== DiscoverType.Seasonal) {
<mat-button-toggle-group name="discoverMode" (change)="toggleChanged($event)" value="{{discoverOptions}}" class="discover-filter-buttons-group"> <div class="right">
<mat-button-toggle id="{{id}}Combined" [ngClass]="{'button-active': discoverOptions === DiscoverOption.Combined}" value="{{DiscoverOption.Combined}}" class="discover-filter-button">{{'Discovery.Combined' | translate}}</mat-button-toggle> <mat-button-toggle-group name="discoverMode" (change)="toggleChanged($event)" [value]="discoverOptions()" class="discover-filter-buttons-group">
<mat-button-toggle id="{{id}}Movie" [ngClass]="{'button-active': discoverOptions === DiscoverOption.Movie}" value="{{DiscoverOption.Movie}}" class="discover-filter-button">{{'Discovery.Movies' | translate}}</mat-button-toggle> <mat-button-toggle [id]="id() + 'Combined'" [class.button-active]="discoverOptions() === DiscoverOption.Combined" [value]="DiscoverOption.Combined" class="discover-filter-button">{{'Discovery.Combined' | translate}}</mat-button-toggle>
<mat-button-toggle id="{{id}}Tv" [ngClass]="{'button-active': discoverOptions === DiscoverOption.Tv}" value="{{DiscoverOption.Tv}}" class="discover-filter-button">{{'Discovery.Tv' | translate}}</mat-button-toggle> <mat-button-toggle [id]="id() + 'Movie'" [class.button-active]="discoverOptions() === DiscoverOption.Movie" [value]="DiscoverOption.Movie" class="discover-filter-button">{{'Discovery.Movies' | translate}}</mat-button-toggle>
</mat-button-toggle-group> <mat-button-toggle [id]="id() + 'Tv'" [class.button-active]="discoverOptions() === DiscoverOption.Tv" [value]="DiscoverOption.Tv" class="discover-filter-button">{{'Discovery.Tv' | translate}}</mat-button-toggle>
</div> </mat-button-toggle-group>
@defer (when discoverResults.length > 0; prefetch on idle) { </div>
<p-carousel #carousel [numVisible]="10" [numScroll]="10" [page]="0" [value]="discoverResults" [responsiveOptions]="responsiveOptions" (onPage)="newPage()"> }
<ng-template let-result pTemplate="item">
<discover-card [discoverType]="discoverType" [isAdmin]="isAdmin" [result]="result" [is4kEnabled]="is4kEnabled"></discover-card> @defer (when hasResults(); prefetch on idle) {
</ng-template> <p-carousel #carousel [numVisible]="10" [numScroll]="10" [page]="0" [value]="discoverResults()" [responsiveOptions]="responsiveOptions" (onPage)="newPage()">
</p-carousel> <ng-template let-result pTemplate="item">
} <discover-card [discoverType]="discoverType()" [isAdmin]="isAdmin()" [result]="result" [is4kEnabled]="is4kEnabled()"></discover-card>
@placeholder(minimum 300) { </ng-template>
<div class="row loading-container"> </p-carousel>
<div class="col-2" *ngFor="let item of [1,2,3,4,5,6,7,8,9,10]"> } @placeholder(minimum 300) {
<p-skeleton width="100%" height="270px"></p-skeleton> <div class="row loading-container">
</div> @for (item of [1,2,3,4,5,6,7,8,9,10]; track item) {
<div class="col-2">
<p-skeleton width="100%" height="270px"></p-skeleton>
</div>
}
</div> </div>
} }

View file

@ -1,4 +1,4 @@
import { Component, OnInit, Input, ViewChild, Output, EventEmitter, Inject } from "@angular/core"; import { Component, ViewChild, Inject, input, output, signal, computed, inject, ChangeDetectionStrategy } from "@angular/core";
import { DiscoverOption, IDiscoverCardResult } from "../../interfaces"; import { DiscoverOption, IDiscoverCardResult } from "../../interfaces";
import { ISearchMovieResult, ISearchTvResult, RequestType } from "../../../interfaces"; import { ISearchMovieResult, ISearchTvResult, RequestType } from "../../../interfaces";
import { SearchV2Service } from "../../../services"; import { SearchV2Service } from "../../../services";
@ -17,46 +17,55 @@ export enum DiscoverType {
} }
@Component({ @Component({
standalone: false, standalone: false,
selector: "carousel-list", selector: "carousel-list",
templateUrl: "./carousel-list.component.html", templateUrl: "./carousel-list.component.html",
styleUrls: ["./carousel-list.component.scss"], styleUrls: ["./carousel-list.component.scss"],
changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class CarouselListComponent implements OnInit { export class CarouselListComponent {
// Inputs using new input() function
public discoverType = input.required<DiscoverType>();
public id = input.required<string>();
public isAdmin = input<boolean>(false);
// Output using new output() function
public movieCount = output<number>();
@Input() public discoverType: DiscoverType;
@Input() public id: string;
@Input() public isAdmin: boolean;
@Output() public movieCount: EventEmitter<number> = new EventEmitter();
@ViewChild('carousel', {static: false}) carousel: Carousel; @ViewChild('carousel', {static: false}) carousel: Carousel;
// Services using inject() function
private searchService = inject(SearchV2Service);
private storageService = inject(StorageService);
private featureFacade = inject(FeaturesFacade);
private baseUrl = inject(APP_BASE_HREF);
// Public constants
public DiscoverOption = DiscoverOption; public DiscoverOption = DiscoverOption;
public discoverOptions: DiscoverOption = DiscoverOption.Combined;
public discoverResults: IDiscoverCardResult[] = [];
public movies: ISearchMovieResult[] = [];
public tvShows: ISearchTvResult[] = [];
public responsiveOptions: any;
public RequestType = RequestType; public RequestType = RequestType;
public loadingFlag: boolean;
public DiscoverType = DiscoverType; public DiscoverType = DiscoverType;
public is4kEnabled = false;
// State using signals
public discoverOptions = signal<DiscoverOption>(DiscoverOption.Combined);
public discoverResults = signal<IDiscoverCardResult[]>([]);
public movies = signal<ISearchMovieResult[]>([]);
public tvShows = signal<ISearchTvResult[]>([]);
public loadingFlag = signal<boolean>(false);
public is4kEnabled = signal<boolean>(false);
// Computed properties
public hasResults = computed(() => this.discoverResults().length > 0);
public totalResults = computed(() => this.discoverResults().length);
get mediaTypeStorageKey() { get mediaTypeStorageKey() {
return "DiscoverOptions" + this.discoverType.toString(); return "DiscoverOptions" + this.discoverType().toString();
}; };
private amountToLoad = 10; private amountToLoad = 10;
private currentlyLoaded = 0; private currentlyLoaded = 0;
private baseUrl: string = ""; public responsiveOptions: any;
constructor() {
constructor(private searchService: SearchV2Service,
private storageService: StorageService,
private featureFacade: FeaturesFacade,
@Inject(APP_BASE_HREF) private href: string) {
if (this.href.length > 1) {
this.baseUrl = this.href;
}
Carousel.prototype.onTouchMove = () => { }, Carousel.prototype.onTouchMove = () => { },
this.responsiveOptions = [ this.responsiveOptions = [
@ -149,12 +158,14 @@ export class CarouselListComponent implements OnInit {
} }
public async ngOnInit() { public async ngOnInit() {
// Initialize 4K feature flag
this.is4kEnabled = this.featureFacade.is4kEnabled(); this.is4kEnabled.set(this.featureFacade.is4kEnabled());
this.currentlyLoaded = 0; this.currentlyLoaded = 0;
// Load saved discover options from storage
const localDiscoverOptions = +this.storageService.get(this.mediaTypeStorageKey); const localDiscoverOptions = +this.storageService.get(this.mediaTypeStorageKey);
if (localDiscoverOptions) { if (localDiscoverOptions) {
this.discoverOptions = DiscoverOption[DiscoverOption[localDiscoverOptions]]; this.discoverOptions.set(DiscoverOption[DiscoverOption[localDiscoverOptions]]);
} }
// Load initial data - just enough to fill the first carousel page // Load initial data - just enough to fill the first carousel page
@ -162,10 +173,9 @@ export class CarouselListComponent implements OnInit {
await this.loadData(false); await this.loadData(false);
// If we don't have enough results to fill the carousel, load one more batch // If we don't have enough results to fill the carousel, load one more batch
if (this.discoverResults.length < 10) { if (this.discoverResults().length < 10) {
await this.loadData(false); await this.loadData(false);
} }
} }
public async toggleChanged(event: MatButtonToggleChange) { public async toggleChanged(event: MatButtonToggleChange) {
@ -183,7 +193,7 @@ export class CarouselListComponent implements OnInit {
if (end) { if (end) {
var moviePromise: Promise<void>; var moviePromise: Promise<void>;
var tvPromise: Promise<void>; var tvPromise: Promise<void>;
switch (+this.discoverOptions) { switch (+this.discoverOptions()) {
case DiscoverOption.Combined: case DiscoverOption.Combined:
moviePromise = this.loadMovies(); moviePromise = this.loadMovies();
tvPromise = this.loadTv(); tvPromise = this.loadTv();
@ -205,7 +215,7 @@ export class CarouselListComponent implements OnInit {
private async loadData(clearExisting: boolean = true) { private async loadData(clearExisting: boolean = true) {
var moviePromise: Promise<void>; var moviePromise: Promise<void>;
var tvPromise: Promise<void>; var tvPromise: Promise<void>;
switch (+this.discoverOptions) { switch (+this.discoverOptions()) {
case DiscoverOption.Combined: case DiscoverOption.Combined:
moviePromise = this.loadMovies(); moviePromise = this.loadMovies();
tvPromise = this.loadTv(); tvPromise = this.loadTv();
@ -223,50 +233,50 @@ export class CarouselListComponent implements OnInit {
} }
private async switchDiscoverMode(newMode: DiscoverOption) { private async switchDiscoverMode(newMode: DiscoverOption) {
if (this.discoverOptions === newMode) { if (this.discoverOptions() === newMode) {
return; return;
} }
this.loading(); this.loading();
this.currentlyLoaded = 0; this.currentlyLoaded = 0;
this.discoverOptions = +newMode; this.discoverOptions.set(+newMode);
this.storageService.save(this.mediaTypeStorageKey, newMode.toString()); this.storageService.save(this.mediaTypeStorageKey, newMode.toString());
await this.loadData(); await this.loadData();
this.finishLoading(); this.finishLoading();
} }
private async loadMovies() { private async loadMovies() {
switch (this.discoverType) { switch (this.discoverType()) {
case DiscoverType.Popular: case DiscoverType.Popular:
this.movies = await this.searchService.popularMoviesByPage(this.currentlyLoaded, this.amountToLoad); this.movies.set(await this.searchService.popularMoviesByPage(this.currentlyLoaded, this.amountToLoad));
break; break;
case DiscoverType.Trending: case DiscoverType.Trending:
this.movies = await this.searchService.nowPlayingMoviesByPage(this.currentlyLoaded, this.amountToLoad); this.movies.set(await this.searchService.nowPlayingMoviesByPage(this.currentlyLoaded, this.amountToLoad));
break; break;
case DiscoverType.Upcoming: case DiscoverType.Upcoming:
this.movies = await this.searchService.upcomingMoviesByPage(this.currentlyLoaded, this.amountToLoad); this.movies.set(await this.searchService.upcomingMoviesByPage(this.currentlyLoaded, this.amountToLoad));
break break;
case DiscoverType.RecentlyRequested: case DiscoverType.RecentlyRequested:
this.movies = await this.searchService.recentlyRequestedMoviesByPage(this.currentlyLoaded, this.amountToLoad); this.movies.set(await this.searchService.recentlyRequestedMoviesByPage(this.currentlyLoaded, this.amountToLoad));
break; break;
case DiscoverType.Seasonal: case DiscoverType.Seasonal:
this.movies = await this.searchService.seasonalMoviesByPage(this.currentlyLoaded, this.amountToLoad); this.movies.set(await this.searchService.seasonalMoviesByPage(this.currentlyLoaded, this.amountToLoad));
break; break;
} }
this.movieCount.emit(this.movies.length); this.movieCount.emit(this.movies().length);
this.currentlyLoaded += this.amountToLoad; this.currentlyLoaded += this.amountToLoad;
} }
private async loadTv() { private async loadTv() {
switch (this.discoverType) { switch (this.discoverType()) {
case DiscoverType.Popular: case DiscoverType.Popular:
this.tvShows = await this.searchService.popularTvByPage(this.currentlyLoaded, this.amountToLoad); this.tvShows.set(await this.searchService.popularTvByPage(this.currentlyLoaded, this.amountToLoad));
break; break;
case DiscoverType.Trending: case DiscoverType.Trending:
this.tvShows = await this.searchService.trendingTvByPage(this.currentlyLoaded, this.amountToLoad); this.tvShows.set(await this.searchService.trendingTvByPage(this.currentlyLoaded, this.amountToLoad));
break; break;
case DiscoverType.Upcoming: case DiscoverType.Upcoming:
this.tvShows = await this.searchService.anticipatedTvByPage(this.currentlyLoaded, this.amountToLoad); this.tvShows.set(await this.searchService.anticipatedTvByPage(this.currentlyLoaded, this.amountToLoad));
break break;
case DiscoverType.RecentlyRequested: case DiscoverType.RecentlyRequested:
// this.tvShows = await this.searchService.recentlyRequestedMoviesByPage(this.currentlyLoaded, this.amountToLoad); // TODO need to do some more mapping // this.tvShows = await this.searchService.recentlyRequestedMoviesByPage(this.currentlyLoaded, this.amountToLoad); // TODO need to do some more mapping
break; break;
@ -284,7 +294,7 @@ export class CarouselListComponent implements OnInit {
private createModel() { private createModel() {
const tempResults = <IDiscoverCardResult[]>[]; const tempResults = <IDiscoverCardResult[]>[];
switch (+this.discoverOptions) { switch (+this.discoverOptions()) {
case DiscoverOption.Combined: case DiscoverOption.Combined:
tempResults.push(...this.mapMovieModel()); tempResults.push(...this.mapMovieModel());
tempResults.push(...this.mapTvModel()); tempResults.push(...this.mapTvModel());
@ -298,14 +308,14 @@ export class CarouselListComponent implements OnInit {
break; break;
} }
this.discoverResults.push(...tempResults); this.discoverResults.update(current => [...current, ...tempResults]);
this.finishLoading(); this.finishLoading();
} }
private mapMovieModel(): IDiscoverCardResult[] { private mapMovieModel(): IDiscoverCardResult[] {
const tempResults = <IDiscoverCardResult[]>[]; const tempResults = <IDiscoverCardResult[]>[];
this.movies.forEach(m => { this.movies().forEach(m => {
tempResults.push({ tempResults.push({
available: m.available, available: m.available,
posterPath: m.posterPath ? `https://image.tmdb.org/t/p/w500/${m.posterPath}` : this.baseUrl + "/images/default_movie_poster.png", posterPath: m.posterPath ? `https://image.tmdb.org/t/p/w500/${m.posterPath}` : this.baseUrl + "/images/default_movie_poster.png",
@ -327,7 +337,7 @@ export class CarouselListComponent implements OnInit {
private mapTvModel(): IDiscoverCardResult[] { private mapTvModel(): IDiscoverCardResult[] {
const tempResults = <IDiscoverCardResult[]>[]; const tempResults = <IDiscoverCardResult[]>[];
this.tvShows.forEach(m => { this.tvShows().forEach(m => {
tempResults.push({ tempResults.push({
available: m.fullyAvailable, available: m.fullyAvailable,
posterPath: m.backdropPath ? `https://image.tmdb.org/t/p/w500/${m.backdropPath}` : this.baseUrl + "/images/default_tv_poster.png", posterPath: m.backdropPath ? `https://image.tmdb.org/t/p/w500/${m.backdropPath}` : this.baseUrl + "/images/default_tv_poster.png",
@ -348,7 +358,7 @@ export class CarouselListComponent implements OnInit {
} }
private clear() { private clear() {
this.discoverResults = []; this.discoverResults.set([]);
} }
private shuffle(discover: IDiscoverCardResult[]): IDiscoverCardResult[] { private shuffle(discover: IDiscoverCardResult[]): IDiscoverCardResult[] {
@ -360,11 +370,11 @@ export class CarouselListComponent implements OnInit {
} }
private loading() { private loading() {
this.loadingFlag = true; this.loadingFlag.set(true);
} }
private finishLoading() { private finishLoading() {
this.loadingFlag = false; this.loadingFlag.set(false);
} }

View file

@ -22,50 +22,58 @@
<div class="section"> <div class="section">
<h2>{{ 'Discovery.RecentlyRequestedTab' | translate }}</h2> <h2>{{ 'Discovery.RecentlyRequestedTab' | translate }}</h2>
<div class="row loading-container"> <div class="row loading-container">
<div class="col-2" *ngFor="let item of [1,2,3,4,5]"> @for (item of [1,2,3,4,5]; track item) {
<p-skeleton width="100%" height="270px"></p-skeleton> <div class="col-2">
</div> <p-skeleton width="100%" height="270px"></p-skeleton>
</div>
}
</div> </div>
</div> </div>
} }
@defer (on viewport; prefetch on idle) { @if (showSeasonal()) {
<div class="section" [hidden]="!showSeasonal"> @defer (on viewport; prefetch on idle) {
<h2>{{ 'Discovery.SeasonalTab' | translate }}</h2> <div class="section">
<div> <h2>{{ 'Discovery.SeasonalTab' | translate }}</h2>
<carousel-list <div>
[id]="'seasonal'" <carousel-list
[isAdmin]="isAdmin" [id]="'seasonal'"
[discoverType]="DiscoverType.Seasonal" [isAdmin]="isAdmin()"
(movieCount)="setSeasonalMovieCount($event)" [discoverType]="DiscoverType.Seasonal"
></carousel-list> (movieCount)="setSeasonalMovieCount($event)"
</div> ></carousel-list>
</div>
} @placeholder(minimum 300) {
<div class="section">
<h2>{{ 'Discovery.SeasonalTab' | translate }}</h2>
<div class="row loading-container">
<div class="col-2" *ngFor="let item of [1,2,3,4,5,6,7,8,9,10]">
<p-skeleton width="100%" height="270px"></p-skeleton>
</div> </div>
</div> </div>
</div> } @placeholder(minimum 300) {
<div class="section">
<h2>{{ 'Discovery.SeasonalTab' | translate }}</h2>
<div class="row loading-container">
@for (item of [1,2,3,4,5,6,7,8,9,10]; track item) {
<div class="col-2">
<p-skeleton width="100%" height="270px"></p-skeleton>
</div>
}
</div>
</div>
}
} }
@defer (on viewport; prefetch on idle) { @defer (on viewport; prefetch on idle) {
<div class="section"> <div class="section">
<h2>{{ 'Discovery.PopularTab' | translate }}</h2> <h2>{{ 'Discovery.PopularTab' | translate }}</h2>
<div> <div>
<carousel-list [id]="'popular'" [isAdmin]="isAdmin" [discoverType]="DiscoverType.Popular"></carousel-list> <carousel-list [id]="'popular'" [isAdmin]="isAdmin()" [discoverType]="DiscoverType.Popular"></carousel-list>
</div> </div>
</div> </div>
} @placeholder(minimum 300) { } @placeholder(minimum 300) {
<div class="section"> <div class="section">
<h2>{{ 'Discovery.PopularTab' | translate }}</h2> <h2>{{ 'Discovery.PopularTab' | translate }}</h2>
<div class="row loading-container"> <div class="row loading-container">
<div class="col-2" *ngFor="let item of [1,2,3,4,5,6,7,8,9,10]"> @for (item of [1,2,3,4,5,6,7,8,9,10]; track item) {
<p-skeleton width="100%" height="270px"></p-skeleton> <div class="col-2">
</div> <p-skeleton width="100%" height="270px"></p-skeleton>
</div>
}
</div> </div>
</div> </div>
} }
@ -73,17 +81,19 @@
@defer (on viewport; prefetch on idle) { @defer (on viewport; prefetch on idle) {
<div class="section"> <div class="section">
<h2>{{ 'Discovery.TrendingTab' | translate }}</h2> <h2>{{ 'Discovery.TrendingTab' | translate }}</h2>
<div> <div>
<carousel-list [id]="'trending'" [isAdmin]="isAdmin" [discoverType]="DiscoverType.Trending"></carousel-list> <carousel-list [id]="'trending'" [isAdmin]="isAdmin()" [discoverType]="DiscoverType.Trending"></carousel-list>
</div> </div>
</div> </div>
} @placeholder(minimum 300) { } @placeholder(minimum 300) {
<div class="section"> <div class="section">
<h2>{{ 'Discovery.TrendingTab' | translate }}</h2> <h2>{{ 'Discovery.TrendingTab' | translate }}</h2>
<div class="row loading-container"> <div class="row loading-container">
<div class="col-2" *ngFor="let item of [1,2,3,4,5,6,7,8,9,10]"> @for (item of [1,2,3,4,5,6,7,8,9,10]; track item) {
<p-skeleton width="100%" height="270px"></p-skeleton> <div class="col-2">
</div> <p-skeleton width="100%" height="270px"></p-skeleton>
</div>
}
</div> </div>
</div> </div>
} }
@ -91,17 +101,19 @@
@defer (on viewport; prefetch on idle) { @defer (on viewport; prefetch on idle) {
<div class="section"> <div class="section">
<h2>{{ 'Discovery.UpcomingTab' | translate }}</h2> <h2>{{ 'Discovery.UpcomingTab' | translate }}</h2>
<div> <div>
<carousel-list [id]="'upcoming'" [isAdmin]="isAdmin" [discoverType]="DiscoverType.Upcoming"></carousel-list> <carousel-list [id]="'upcoming'" [isAdmin]="isAdmin()" [discoverType]="DiscoverType.Upcoming"></carousel-list>
</div> </div>
</div> </div>
} @placeholder(minimum 300) { } @placeholder(minimum 300) {
<div class="section"> <div class="section">
<h2>{{ 'Discovery.UpcomingTab' | translate }}</h2> <h2>{{ 'Discovery.UpcomingTab' | translate }}</h2>
<div class="row loading-container"> <div class="row loading-container">
<div class="col-2" *ngFor="let item of [1,2,3,4,5,6,7,8,9,10]"> @for (item of [1,2,3,4,5,6,7,8,9,10]; track item) {
<p-skeleton width="100%" height="270px"></p-skeleton> <div class="col-2">
</div> <p-skeleton width="100%" height="270px"></p-skeleton>
</div>
}
</div> </div>
</div> </div>
} }

View file

@ -1,29 +1,34 @@
import { Component, OnInit } from "@angular/core"; import { Component, computed, inject, signal, ChangeDetectionStrategy } from "@angular/core";
import { AuthService } from "../../../auth/auth.service"; import { AuthService } from "../../../auth/auth.service";
import { DiscoverType } from "../carousel-list/carousel-list.component"; import { DiscoverType } from "../carousel-list/carousel-list.component";
@Component({ @Component({
standalone: false, standalone: false,
templateUrl: "./discover.component.html", templateUrl: "./discover.component.html",
styleUrls: ["./discover.component.scss"], styleUrls: ["./discover.component.scss"],
changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class DiscoverComponent implements OnInit { export class DiscoverComponent {
// Services using inject() function
private authService = inject(AuthService);
// Public constants
public DiscoverType = DiscoverType; public DiscoverType = DiscoverType;
public isAdmin: boolean;
public showSeasonal: boolean;
constructor(private authService: AuthService) { } // State using signals
public isAdmin = signal<boolean>(false);
public seasonalMovieCount = signal<number>(0);
public ngOnInit(): void { // Computed properties
this.isAdmin = this.authService.isAdmin(); public showSeasonal = computed(() => this.seasonalMovieCount() > 0);
constructor() {
// Initialize admin status
this.isAdmin.set(this.authService.isAdmin());
} }
public setSeasonalMovieCount(count: number) { public setSeasonalMovieCount(count: number): void {
if (count > 0) { this.seasonalMovieCount.set(count);
this.showSeasonal = true;
}
} }
} }

View file

@ -1,28 +1,43 @@
<div class="small-middle-container"> <div class="small-middle-container">
<div *ngIf="count"> @if (count()) {
<mat-tab-group> <mat-tab-group>
<mat-tab label="{{'Issues.PendingTitle' | translate}}"> <mat-tab label="{{'Issues.PendingTitle' | translate}}">
<ng-template matTabContent> <ng-template matTabContent>
<div *ngIf="pendingIssues.length > 0"> @if (hasPendingIssues()) {
<issues-table [issues]="pendingIssues" (changePage)="changePagePending($event)" [totalRecords]="count.pending"></issues-table> <issues-table
</div> [issues]="pendingIssues()"
</ng-template> (changePage)="changePagePending($event)"
</mat-tab> [totalRecords]="count()?.pending">
<mat-tab *ngIf="inProgressIssues.length > 0" label="{{'Issues.InProgressTitle' | translate}}"> </issues-table>
<ng-template matTabContent> }
<div *ngIf="inProgressIssues">
<issues-table [issues]="inProgressIssues" (changePage)="changePageInProg($event)" [totalRecords]="count.inProgress"></issues-table>
</div>
</ng-template> </ng-template>
</mat-tab> </mat-tab>
@if (hasInProgressIssues()) {
<mat-tab label="{{'Issues.InProgressTitle' | translate}}">
<ng-template matTabContent>
@if (inProgressIssues()) {
<issues-table
[issues]="inProgressIssues()"
(changePage)="changePageInProg($event)"
[totalRecords]="count()?.inProgress">
</issues-table>
}
</ng-template>
</mat-tab>
}
<mat-tab label="{{'Issues.ResolvedTitle' | translate}}"> <mat-tab label="{{'Issues.ResolvedTitle' | translate}}">
<ng-template matTabContent> <ng-template matTabContent>
<div *ngIf="resolvedIssues.length > 0"> @if (hasResolvedIssues()) {
<issues-table [issues]="resolvedIssues" (changePage)="changePageResolved($event)" [totalRecords]="count.resolved"></issues-table> <issues-table
</div> [issues]="resolvedIssues()"
(changePage)="changePageResolved($event)"
[totalRecords]="count()?.resolved">
</issues-table>
}
</ng-template> </ng-template>
</mat-tab> </mat-tab>
</mat-tab-group> </mat-tab-group>
</div> }
</div> </div>

View file

@ -1,69 +1,84 @@
import { Component, OnInit } from "@angular/core"; import { Component, computed, inject, signal, ChangeDetectionStrategy } from "@angular/core";
import { IssuesService } from "../services";
import { IIssueCount, IIssues, IIssuesSummary, IPagenator, IssueStatus } from "../interfaces";
import { PageEvent } from '@angular/material/paginator'; import { PageEvent } from '@angular/material/paginator';
import { IssuesService } from "../services";
import { IssuesV2Service } from "../services/issuesv2.service"; import { IssuesV2Service } from "../services/issuesv2.service";
import { IIssueCount, IIssues, IIssuesSummary, IssueStatus } from "../interfaces";
import { CommonModule } from "@angular/common";
import { MatPaginatorModule } from "@angular/material/paginator";
@Component({ @Component({
standalone: false, standalone: false,
templateUrl: "issues.component.html", templateUrl: "issues.component.html",
styleUrls: ['issues.component.scss'] styleUrls: ['issues.component.scss']
}) })
export class IssuesComponent implements OnInit { export class IssuesComponent {
// Services using inject() function
private issuev2Service = inject(IssuesV2Service);
private issueService = inject(IssuesService);
public pendingIssues: IIssuesSummary[]; // State using signals
public inProgressIssues: IIssuesSummary[]; private pendingSkip = signal(0);
public resolvedIssues: IIssuesSummary[]; private inProgressSkip = signal(0);
private resolvedSkip = signal(0);
public count: IIssueCount;
private takeAmount = 50; private takeAmount = 50;
private pendingSkip = 0;
private inProgressSkip = 0;
private resolvedSkip = 0;
constructor(private issuev2Service: IssuesV2Service, private issueService: IssuesService) { } // Public state signals
public pendingIssues = signal<IIssuesSummary[]>([]);
public inProgressIssues = signal<IIssuesSummary[]>([]);
public resolvedIssues = signal<IIssuesSummary[]>([]);
public count = signal<IIssueCount | null>(null);
public ngOnInit() { // Computed properties for derived state
public hasPendingIssues = computed(() => this.pendingIssues().length > 0);
public hasInProgressIssues = computed(() => this.inProgressIssues().length > 0);
public hasResolvedIssues = computed(() => this.resolvedIssues().length > 0);
public totalIssues = computed(() => {
const count = this.count();
if (!count) return 0;
return count.pending + count.inProgress + count.resolved;
});
constructor() {
// Initialize data
this.loadInitialData();
}
private loadInitialData(): void {
this.getPending(); this.getPending();
this.getInProg(); this.getInProg();
this.getResolved(); this.getResolved();
this.issueService.getIssuesCount().subscribe(x => this.count = x); this.issueService.getIssuesCount().subscribe(count => this.count.set(count));
} }
public changePagePending(event: PageEvent) { public changePagePending(event: PageEvent): void {
this.pendingSkip = event.pageSize * event.pageIndex++; this.pendingSkip.set(event.pageSize * event.pageIndex);
this.getPending(); this.getPending();
} }
public changePageInProg(event: PageEvent) { public changePageInProg(event: PageEvent): void {
this.inProgressSkip = event.pageSize * event.pageIndex++; this.inProgressSkip.set(event.pageSize * event.pageIndex);
this.getInProg(); this.getInProg();
} }
public changePageResolved(event: PageEvent) { public changePageResolved(event: PageEvent): void {
this.resolvedSkip = event.pageSize * event.pageIndex++; this.resolvedSkip.set(event.pageSize * event.pageIndex);
this.getResolved(); this.getResolved();
} }
private getPending() { private getPending(): void {
this.issuev2Service.getIssues(this.pendingSkip, this.takeAmount, IssueStatus.Pending).subscribe(x => { this.issuev2Service.getIssues(this.pendingSkip(), this.takeAmount, IssueStatus.Pending)
this.pendingIssues = x; .subscribe(issues => this.pendingIssues.set(issues));
});
} }
private getInProg() { private getInProg(): void {
this.issuev2Service.getIssues(this.inProgressSkip, this.takeAmount, IssueStatus.InProgress).subscribe(x => { this.issuev2Service.getIssues(this.inProgressSkip(), this.takeAmount, IssueStatus.InProgress)
this.inProgressIssues = x; .subscribe(issues => this.inProgressIssues.set(issues));
});
} }
private getResolved() { private getResolved(): void {
this.issuev2Service.getIssues(this.resolvedSkip, this.takeAmount, IssueStatus.Resolved).subscribe(x => { this.issuev2Service.getIssues(this.resolvedSkip(), this.takeAmount, IssueStatus.Resolved)
this.resolvedIssues = x; .subscribe(issues => this.resolvedIssues.set(issues));
});
} }
} }

View file

@ -76,7 +76,6 @@
<button *ngIf="!request.denied" mat-raised-button color="danger" (click)="deny(request);">{{ 'Requests.Deny' | translate }}</button> <button *ngIf="!request.denied" mat-raised-button color="danger" (click)="deny(request);">{{ 'Requests.Deny' | translate }}</button>
</div> </div>
--> -->
<button *ngIf="!tv.fullyAvailable && requestable" mat-fab color="accent" id="addFabBtn" class="floating-fab" [matMenuTriggerFor]="aboveMenu"> <button *ngIf="!tv.fullyAvailable && requestable" mat-fab color="accent" id="addFabBtn" class="floating-fab" [matMenuTriggerFor]="aboveMenu">
<i class="fas fa-plus fa-lg"></i> <i class="fas fa-plus fa-lg"></i>
<mat-menu #aboveMenu="matMenu" yPosition="above"> <mat-menu #aboveMenu="matMenu" yPosition="above">
@ -89,3 +88,4 @@
<button id="requestSelected" mat-menu-item (click)="submitRequests()">{{ 'Common.Request' | translate }}</button> <button id="requestSelected" mat-menu-item (click)="submitRequests()">{{ 'Common.Request' | translate }}</button>
</mat-menu> </mat-menu>
</button> </button>

View file

@ -192,11 +192,13 @@
</div> </div>
<div class="col-12 col-md-10"> <div class="col-12 col-md-10">
@defer (on viewport; prefetch on idle) { <tv-request-grid
<tv-request-grid id="requests-grid" [tvRequest]="tvRequest" [isAdmin]="isAdmin" [tv]="tv"></tv-request-grid> id="requests-grid"
} @placeholder { [tvRequest]="tvRequest"
<p-skeleton height="2rem" styleClass="mb-2"></p-skeleton> [isAdmin]="isAdmin"
} [tv]="tv">
</tv-request-grid>
</div> </div>
<div class="col-12 col-md-2"> <div class="col-12 col-md-2">

View file

@ -99,6 +99,14 @@
min-height: 600px; min-height: 600px;
} }
// FAB Button styling moved from tv-request-grid component
.floating-fab {
position: fixed;
right: 3%;
bottom: 6%;
z-index: 10;
}
#info-wrapper .sidebar.affixable.affix-top { #info-wrapper .sidebar.affixable.affix-top {
position: relative !important; position: relative !important;
} }

View file

@ -4,24 +4,39 @@ import { addCucumberPreprocessorPlugin } from "@badeball/cypress-cucumber-prepro
import createEsbuildPlugin from "@badeball/cypress-cucumber-preprocessor/esbuild"; import createEsbuildPlugin from "@badeball/cypress-cucumber-preprocessor/esbuild";
export default defineConfig({ export default defineConfig({
watchForFileChanges: true, // Performance optimizations
video: true, watchForFileChanges: false, // Disable in CI
video: false, // Disable video recording for faster runs
screenshotOnRunFailure: true,
trashAssetsBeforeRuns: true,
// Security and viewport
chromeWebSecurity: false, chromeWebSecurity: false,
viewportWidth: 2560, viewportWidth: 1920,
viewportHeight: 1440, viewportHeight: 1080,
// Retry configuration
retries: { retries: {
runMode: 2, runMode: 2,
openMode: 0, openMode: 0,
}, },
// Environment variables
env: { env: {
username: 'a', username: 'a',
password: 'a', password: 'a',
dockerhost: 'http://172.17.0.1' dockerhost: 'http://172.17.0.1',
// Add test environment flags
isCI: process.env.CI === 'true',
// Add API base URL
apiBaseUrl: 'http://localhost:3577/api/v1'
}, },
// Project configuration
projectId: 'o5451s', projectId: 'o5451s',
e2e: { e2e: {
// We've imported your old cypress plugins here. // Setup node events
// You may want to clean this up later by importing these.
async setupNodeEvents( async setupNodeEvents(
on: Cypress.PluginEvents, on: Cypress.PluginEvents,
config: Cypress.PluginConfigOptions config: Cypress.PluginConfigOptions
@ -35,12 +50,53 @@ export default defineConfig({
}) })
); );
// Make sure to return the config object as it might have been modified by the plugin. // Add performance monitoring
on('task', {
log(message) {
console.log(message);
return null;
},
table(message) {
console.table(message);
return null;
}
});
return config; return config;
// return require('./cypress/plugins/index.js')(on, config)
}, },
baseUrl: 'http://localhost:5000',
specPattern: ['cypress/tests/**/*.spec.ts*', '**/*.feature'], // Base configuration
excludeSpecPattern: ['**/snapshots/*'], baseUrl: 'http://localhost:3577',
specPattern: [
'cypress/tests/**/*.spec.ts*',
'cypress/features/**/*.feature'
],
excludeSpecPattern: [
'**/snapshots/*',
'**/examples/*',
'**/*.skip.ts'
],
// Test isolation and performance
experimentalRunAllSpecs: true,
experimentalModifyObstructiveThirdPartyCode: true,
// Better error handling
defaultCommandTimeout: 10000,
requestTimeout: 10000,
responseTimeout: 10000,
// Screenshot and video settings
screenshotsFolder: 'cypress/screenshots',
videosFolder: 'cypress/videos',
}, },
})
// Component testing (if needed later)
component: {
devServer: {
framework: 'angular',
bundler: 'webpack',
},
specPattern: 'cypress/component/**/*.cy.ts',
},
});

View file

@ -1,10 +1,80 @@
import { navBar as NavBar } from './shared/NavBar'; import { navBar as NavBar } from './shared/NavBar';
export abstract class BasePage {
abstract visit(options: Cypress.VisitOptions): Cypress.Chainable<Cypress.AUTWindow>;
abstract visit(): Cypress.Chainable<Cypress.AUTWindow>;
abstract visit(id: string): Cypress.Chainable<Cypress.AUTWindow>;
abstract visit(id: string, options: Cypress.VisitOptions): Cypress.Chainable<Cypress.AUTWindow>;
navbar = NavBar; export abstract class BasePage {
// Abstract visit methods
abstract visit(options?: any): Cypress.Chainable<any>;
abstract visit(id?: string, options?: any): Cypress.Chainable<any>;
// Common page properties
navbar = NavBar;
// Common page methods
/**
* Wait for page to be fully loaded
*/
waitForPageLoad(): Cypress.Chainable<any> {
return cy.get('body').should('be.visible');
}
/**
* Check if page is loaded by verifying a unique element
*/
isPageLoaded(uniqueSelector: string): Cypress.Chainable<any> {
return cy.get(uniqueSelector).should('exist').then(() => true);
}
/**
* Scroll to element with smooth behavior
*/
scrollToElement(selector: string): Cypress.Chainable<any> {
return cy.get(selector).scrollIntoView();
}
/**
* Wait for loading spinner to disappear
*/
waitForLoadingToComplete(): Cypress.Chainable<any> {
return cy.get('[data-test="loading-spinner"]', { timeout: 10000 }).should('not.exist');
}
/**
* Get element by data-test attribute
*/
getByData(selector: string): Cypress.Chainable<any> {
return cy.get(`[data-test="${selector}"]`);
}
/**
* Get element by data-test attribute with partial match
*/
getByDataLike(selector: string): Cypress.Chainable<any> {
return cy.get(`[data-test*="${selector}"]`);
}
/**
* Check if element is visible and enabled
*/
isElementInteractive(selector: string): Cypress.Chainable<any> {
return cy.get(selector)
.should('be.visible')
.should('not.be.disabled')
.then(() => true);
}
/**
* Take screenshot of current page
*/
takeScreenshot(name?: string): Cypress.Chainable<any> {
const screenshotName = name || `${this.constructor.name}_${Date.now()}`;
return cy.screenshot(screenshotName);
}
/**
* Log page action for debugging
*/
logAction(action: string, details?: any): void {
// Use console.log instead of cy.log to avoid promise/cy command mixing
console.log(`[${this.constructor.name}] ${action}`, details);
}
} }

View file

@ -1,36 +1,147 @@
import { BasePage } from "../base.page"; import { BasePage } from "../base.page";
class LoginPage extends BasePage { export class LoginPage extends BasePage {
// Page selectors
private readonly selectors = {
username: '#username-field',
password: '#password-field',
ombiSignInButton: '[data-cy=OmbiButton]',
plexSignInButton: '[data-cy=oAuthPlexButton]',
loginForm: '[data-test="login-form"]',
errorMessage: '[data-test="error-message"]',
loadingSpinner: '[data-test="loading-spinner"]'
} as const;
// Getters for page elements
get username() {
return cy.get(this.selectors.username);
}
get username(): Cypress.Chainable<any> { get password() {
return cy.get('#username-field'); return cy.get(this.selectors.password);
} }
get password(): Cypress.Chainable<any> { get ombiSignInButton() {
return cy.get('#password-field'); return cy.get(this.selectors.ombiSignInButton);
} }
get ombiSignInButton(): Cypress.Chainable<any> { get plexSignInButton() {
return cy.get('[data-cy=OmbiButton]'); return cy.get(this.selectors.plexSignInButton);
} }
get plexSignInButton(): Cypress.Chainable<any> { get loginForm() {
return cy.get('[data-cy=oAuthPlexButton]'); return cy.get(this.selectors.loginForm);
} }
constructor() { get errorMessage() {
super(); return cy.get(this.selectors.errorMessage);
} }
visit(options: Cypress.VisitOptions): Cypress.Chainable<Cypress.AUTWindow>; get loadingSpinner() {
visit(): Cypress.Chainable<Cypress.AUTWindow>; return cy.get(this.selectors.loadingSpinner);
visit(id: string): Cypress.Chainable<Cypress.AUTWindow>; }
visit(id: string, options: Cypress.VisitOptions): Cypress.Chainable<Cypress.AUTWindow>;
visit(id?: any, options?: any) {
return cy.visit(`/login`, options);
}
// Page visit method
visit(options?: any): Cypress.Chainable<any> {
this.logAction('Visiting login page');
return cy.visit('/login', options);
}
// Page-specific methods
/**
* Fill login form with credentials
*/
fillLoginForm(username: string, password: string): Cypress.Chainable<any> {
this.logAction('Filling login form', { username });
return cy.wrap(null).then(() => {
this.username.clear().type(username);
this.password.clear().type(password);
});
}
/**
* Submit login form
*/
submitLoginForm(): Cypress.Chainable<any> {
this.logAction('Submitting login form');
return this.ombiSignInButton.click();
}
/**
* Complete login flow
*/
login(username: string, password: string): Cypress.Chainable<any> {
this.logAction('Performing login', { username });
return this.fillLoginForm(username, password)
.then(() => this.submitLoginForm());
}
/**
* Wait for login to complete
*/
waitForLoginComplete(): Cypress.Chainable<any> {
this.logAction('Waiting for login to complete');
return cy.url().should('not.include', '/login')
.then(() => {
this.logAction('Login completed successfully');
});
}
/**
* Check if login form is visible
*/
isLoginFormVisible(): Cypress.Chainable<any> {
return this.loginForm.should('be.visible').then(() => true);
}
/**
* Check if Plex OAuth button is visible
*/
isPlexOAuthVisible(): Cypress.Chainable<any> {
return this.plexSignInButton.should('be.visible').then(() => true);
}
/**
* Check if error message is displayed
*/
isErrorMessageVisible(): Cypress.Chainable<any> {
return this.errorMessage.should('be.visible').then(() => true);
}
/**
* Get error message text
*/
getErrorMessageText(): Cypress.Chainable<any> {
return this.errorMessage.invoke('text');
}
/**
* Clear login form
*/
clearLoginForm(): Cypress.Chainable<any> {
this.logAction('Clearing login form');
return cy.wrap(null).then(() => {
this.username.clear();
this.password.clear();
});
}
/**
* Verify page is loaded
*/
verifyPageLoaded(): Cypress.Chainable<any> {
this.logAction('Verifying login page is loaded');
return this.waitForPageLoad()
.then(() => this.isLoginFormVisible())
.then(() => {
this.logAction('Login page loaded successfully');
});
}
} }
export const loginPage = new LoginPage(); export const loginPage = new LoginPage();

View file

@ -1,126 +1,165 @@
// *********************************************** // ***********************************************
// This example commands.js shows you how to // Enhanced custom commands with better TypeScript support
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// *********************************************** // ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add("login", (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
import 'cypress-wait-until'; import 'cypress-wait-until';
Cypress.Commands.add("landingSettings", (enabled) => { // Type definitions for custom commands
cy.fixture('login/landingPageSettings').then((settings) => { declare global {
settings.enabled = enabled; namespace Cypress {
cy.intercept("GET", "**/Settings/LandingPage", settings).as("landingPageSettingsDisabled"); interface Chainable {
}) landingSettings(enabled: boolean): Chainable<void>;
}) loginWithCreds(username: string, password: string): Chainable<void>;
login(): Chainable<void>;
Cypress.Commands.add('loginWithCreds', (username, password) => { removeLogin(): Chainable<void>;
cy.request({ verifyNotification(text: string): Chainable<void>;
method: 'POST', createUser(username: string, password: string, claims: string[]): Chainable<void>;
url: '/api/v1/token', generateUniqueId(): Chainable<string>;
body: { getByData(selector: string): Chainable<JQuery<HTMLElement>>;
username: username, getByDataLike(selector: string): Chainable<JQuery<HTMLElement>>;
password: password, triggerHover(elements: JQuery<HTMLElement>): Chainable<void>;
} waitForApiResponse(alias: string, timeout?: number): Chainable<void>;
}) clearTestData(): Chainable<void>;
.then((resp) => { seedTestData(fixture: string): Chainable<void>;
window.localStorage.setItem('id_token', resp.body.access_token); api(options: any): Chainable<any>;
});
});
Cypress.Commands.add('login', () => {
cy.clearLocalStorage();
cy.request({
method: 'POST',
url: '/api/v1/token',
body: {
username: Cypress.env('username'),
password: Cypress.env('password'),
}
})
.then((resp) => {
window.localStorage.setItem('id_token', resp.body.access_token);
});
});
Cypress.Commands.add('removeLogin', () => {
window.localStorage.removeItem('id_token');
});
Cypress.Commands.add('verifyNotification', (text) => {
cy.contains(text, {timeout: 10000});
});
Cypress.Commands.add('createUser', (username, password, claims) => {
cy.request({
method: 'POST',
url: '/api/v1/identity',
body: {
UserName: username,
Password: password,
Claims: claims,
},
headers: {
'Authorization': 'Bearer ' + window.localStorage.getItem('id_token'),
}
})
})
Cypress.Commands.add('generateUniqueId', () => {
const uniqueSeed = Date.now().toString();
const id = Cypress._.uniqueId(uniqueSeed);
cy.wrap(id);
});
Cypress.Commands.add("getByData", (selector, ...args) => {
return cy.get(`[data-test=${selector}]`, ...args);
});
Cypress.Commands.add("getByData", (selector) => {
return cy.get(`[data-test=${selector}]`);
});
Cypress.Commands.add("getByDataLike", (selector) => {
return cy.get(`[data-test*=${selector}]`);
});
Cypress.Commands.add('triggerHover', function(elements) {
fireEvent(elements, 'mouseover');
function fireEvent(element, event) {
if (element.fireEvent) {
element.fireEvent('on' + event);
} else {
const evObj = document.createEvent('Events');
evObj.initEvent(event, true, false);
element.dispatchEvent(evObj);
}
} }
}
}
// Enhanced landing page settings command
Cypress.Commands.add("landingSettings", (enabled: boolean) => {
cy.fixture('login/landingPageSettings').then((settings) => {
settings.enabled = enabled;
cy.intercept("GET", "**/Settings/LandingPage", settings).as("landingPageSettings");
});
});
// Enhanced login with credentials
Cypress.Commands.add('loginWithCreds', (username: string, password: string) => {
cy.request({
method: 'POST',
url: '/api/v1/token',
body: { username, password },
failOnStatusCode: false
}).then((resp) => {
if (resp.status === 200) {
window.localStorage.setItem('id_token', resp.body.access_token);
}
}); });
// Log outside of the promise chain
cy.log(`Login attempt for user: ${username}`);
});
// Enhanced default login
Cypress.Commands.add('login', () => {
cy.clearLocalStorage();
cy.clearCookies();
const username = Cypress.env('username');
const password = Cypress.env('password');
if (!username || !password) {
throw new Error('Username and password must be set in environment variables');
}
cy.loginWithCreds(username, password);
});
// Enhanced login removal
Cypress.Commands.add('removeLogin', () => {
cy.clearLocalStorage();
cy.clearCookies();
cy.log('Cleared authentication data');
});
// Enhanced notification verification with better error handling
Cypress.Commands.add('verifyNotification', (text: string) => {
cy.contains(text, { timeout: 10000 })
.should('be.visible');
});
// Enhanced user creation with better error handling
Cypress.Commands.add('createUser', (username: string, password: string, claims: string[]) => {
const token = window.localStorage.getItem('id_token');
if (!token) {
throw new Error('No authentication token found. Please login first.');
}
cy.request({
method: 'POST',
url: '/api/v1/identity',
body: {
UserName: username,
Password: password,
Claims: claims,
},
headers: {
'Authorization': `Bearer ${token}`,
},
failOnStatusCode: false
}).then((resp) => {
if (resp.status !== 200) {
// Use console.log instead of cy.log inside promise
console.log(`Failed to create user ${username}: ${resp.status}`);
}
});
// Log outside of the promise chain
cy.log(`Creating user: ${username}`);
});
// Enhanced unique ID generation
Cypress.Commands.add('generateUniqueId', () => {
const uniqueSeed = Date.now().toString();
const id = Cypress._.uniqueId(uniqueSeed);
cy.wrap(id);
});
// Enhanced data attribute selectors with better typing
Cypress.Commands.add("getByData", (selector: string) => {
return cy.get(`[data-test="${selector}"]`);
});
Cypress.Commands.add("getByDataLike", (selector: string) => {
return cy.get(`[data-test*="${selector}"]`);
});
// Enhanced hover trigger with better event handling
Cypress.Commands.add('triggerHover', function(elements: JQuery<HTMLElement>) {
elements.each((index, element) => {
const mouseoverEvent = new MouseEvent('mouseover', {
bubbles: true,
cancelable: true,
view: window
});
element.dispatchEvent(mouseoverEvent);
});
});
// New command: Wait for API response with timeout
Cypress.Commands.add('waitForApiResponse', (alias: string, timeout: number = 10000) => {
cy.wait(`@${alias}`, { timeout });
});
// New command: Clear test data
Cypress.Commands.add('clearTestData', () => {
cy.clearLocalStorage();
cy.clearCookies();
cy.clearAllSessionStorage();
cy.log('All test data cleared');
});
// New command: Seed test data from fixture
Cypress.Commands.add('seedTestData', (fixture: string) => {
cy.fixture(fixture).then((data) => {
// Implementation depends on your seeding strategy
// Example: cy.request('POST', '/api/v1/test/seed', data);
});
// Log outside of the promise chain
cy.log(`Seeding test data from ${fixture}`);
});

View file

@ -19,7 +19,8 @@ import './request.commands';
import './plex-settings.commands'; import './plex-settings.commands';
import './mock-data.commands'; import './mock-data.commands';
import "cypress-real-events/support"; import "cypress-real-events/support";
import '@bahmutov/cy-api/support'; import "@bahmutov/cy-api/support";
// Alternatively you can use CommonJS syntax: // Alternatively you can use CommonJS syntax:
// require('./commands') // require('./commands')

View file

@ -1,3 +1,12 @@
// Type definitions for mock data commands
declare global {
namespace Cypress {
interface Chainable {
addMock(mapping: any): Chainable<void>;
clearMocks(): Chainable<void>;
}
}
}
Cypress.Commands.add('addMock', (mapping) => { Cypress.Commands.add('addMock', (mapping) => {
cy.request({ cy.request({
@ -13,3 +22,5 @@ Cypress.Commands.add('clearMocks', () => {
url: 'http://localhost:32400/__admin/mappings' url: 'http://localhost:32400/__admin/mappings'
}) })
}) })
export {};

View file

@ -1,3 +1,11 @@
// Type definitions for plex settings commands
declare global {
namespace Cypress {
interface Chainable {
clearPlexServers(): Chainable<void>;
}
}
}
Cypress.Commands.add('clearPlexServers', () => { Cypress.Commands.add('clearPlexServers', () => {
cy.request({ cy.request({
@ -10,3 +18,5 @@ Cypress.Commands.add('clearPlexServers', () => {
} }
}) })
}) })
export {};

View file

@ -1,3 +1,14 @@
// Type definitions for request commands
declare global {
namespace Cypress {
interface Chainable {
requestGenericMovie(): Chainable<void>;
requestMovie(movieId: number): Chainable<void>;
requestAllTv(tvId: number): Chainable<any>;
removeAllMovieRequests(): Chainable<void>;
}
}
}
Cypress.Commands.add('requestGenericMovie', () => { Cypress.Commands.add('requestGenericMovie', () => {
cy.request({ cy.request({
@ -48,3 +59,5 @@ Cypress.Commands.add('removeAllMovieRequests', () => {
} }
}); });
}) })
export {};

View file

@ -83,3 +83,5 @@ describe("TV Request V1 API tests", () => {
}); });
}); });
}); });
export {};

View file

@ -100,3 +100,5 @@ describe("TV Search V1 API tests", () => {
}); });
}); });
}); });
export {};

View file

@ -67,7 +67,7 @@ describe("TV Details Buttons", () => {
}); });
it.only("Issues Enabled", () => { it("Issues Enabled", () => {
cy.intercept("GET", "**/Settings/issuesenabled", 'true').as('issuesEnabled'); cy.intercept("GET", "**/Settings/issuesenabled", 'true').as('issuesEnabled');
cy.visit("/details/tv/1399"); cy.visit("/details/tv/1399");

View file

@ -190,3 +190,5 @@ describe("TV Requests Grid", function () {
.should('have.class', 'requested') .should('have.class', 'requested')
}); });
}); });
export {};

View file

@ -27,3 +27,5 @@ describe("Discover Responsive Tests", () => {
}); });
export {};

View file

@ -76,3 +76,5 @@ cy.wait("@authSettings");
cy.url().should("include", "/discover"); cy.url().should("include", "/discover");
}); });
}); });
export {};

View file

@ -50,3 +50,5 @@ describe("Requests Tests", () => {
row.title.should('not.exist'); row.title.should('not.exist');
}); });
}); });
export {};

View file

@ -161,3 +161,5 @@ describe('User Management Page', () => {
cy.get('#rolePowerUser').should('have.class', 'mat-checked'); cy.get('#rolePowerUser').should('have.class', 'mat-checked');
}); });
}); });
export {};

View file

@ -2,9 +2,10 @@
"devDependencies": { "devDependencies": {
"@badeball/cypress-cucumber-preprocessor": "^14.0.0", "@badeball/cypress-cucumber-preprocessor": "^14.0.0",
"@bahmutov/cy-api": "^1.5.0", "@bahmutov/cy-api": "^1.5.0",
"@bahmutov/cypress-esbuild-preprocessor": "^2.1.5", "@bahmutov/cypress-esbuild-preprocessor": "^2.2.5",
"cypress": "13.17.0", "cypress": "13.17.0",
"cypress-wait-until": "^1.7.1", "cypress-wait-until": "^1.7.1",
"esbuild": "^0.18.0",
"typescript": "^4.2.3" "typescript": "^4.2.3"
}, },
"name": "ombiautomation", "name": "ombiautomation",

View file

@ -1,16 +1,36 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "es6", "target": "ES2022",
"lib": ["ES2022", "DOM"],
"module": "ESNext",
"moduleResolution": "node",
"strict": true,
"esModuleInterop": true, "esModuleInterop": true,
"lib": ["es2018", "dom"], "skipLibCheck": true,
"types": ["cypress", "cypress-wait-until", "cypress-image-snapshot", "cypress-real-events", "@bahmutov/cy-api", "node"], "forceConsistentCasingInFileNames": true,
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"types": [
"cypress",
"cypress-wait-until",
"cypress-real-events",
"node"
],
"baseUrl": "./cypress", "baseUrl": "./cypress",
"paths": { "paths": {
"@/*": ["./*"] "@/*": ["./*"],
"@fixtures/*": ["./fixtures/*"],
"@page-objects/*": ["./integration/page-objects/*"],
"@support/*": ["./support/*"]
} }
}, },
"include": [ "include": [
"**/*.ts", "**/*.ts",
"support/*.ts" "support/*.ts"
],
"exclude": [
"node_modules"
] ]
} }

View file

@ -3,30 +3,38 @@
"@babel/code-frame@^7.0.0": "@babel/code-frame@^7.0.0":
version "7.18.6" version "7.27.1"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be"
integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
dependencies: dependencies:
"@babel/highlight" "^7.18.6" "@babel/helper-validator-identifier" "^7.27.1"
"@babel/helper-validator-identifier@^7.18.6":
version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
"@babel/highlight@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
dependencies:
"@babel/helper-validator-identifier" "^7.18.6"
chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
picocolors "^1.1.1"
"@babel/helper-string-parser@^7.27.1":
version "7.27.1"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
"@babel/helper-validator-identifier@^7.27.1":
version "7.27.1"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8"
integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
"@babel/parser@^7.18.8": "@babel/parser@^7.18.8":
version "7.20.5" version "7.28.3"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71"
integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==
dependencies:
"@babel/types" "^7.28.2"
"@babel/types@^7.28.2":
version "7.28.2"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b"
integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==
dependencies:
"@babel/helper-string-parser" "^7.27.1"
"@babel/helper-validator-identifier" "^7.27.1"
"@badeball/cypress-configuration@^4.0.0": "@badeball/cypress-configuration@^4.0.0":
version "4.2.0" version "4.2.0"
@ -75,12 +83,12 @@
dependencies: dependencies:
common-tags "1.8.2" common-tags "1.8.2"
"@bahmutov/cypress-esbuild-preprocessor@^2.1.5": "@bahmutov/cypress-esbuild-preprocessor@^2.2.5":
version "2.1.5" version "2.2.5"
resolved "https://registry.yarnpkg.com/@bahmutov/cypress-esbuild-preprocessor/-/cypress-esbuild-preprocessor-2.1.5.tgz#6e4746a470f097f3833a25f5e72bdcac178cbc41" resolved "https://registry.yarnpkg.com/@bahmutov/cypress-esbuild-preprocessor/-/cypress-esbuild-preprocessor-2.2.5.tgz#92ca9a623b5d6b3d9c488b75f1b9557802c0b5ca"
integrity sha512-cJMlZOZ3kUb/s2KQ8p7DJNiOzwApSoYCiK1toJKBvz58MbqBIeBjD7F8NFJE1MrFzYBYAOQcSMVWHp4y1l/Fjg== integrity sha512-T8jugcaKdK3G470eWTo9fxeLXupnlTHLdWrjcfWuFM9spkHrASkiG20IpmAKiSPUjeXU0+A1EDssD48XMMxaKg==
dependencies: dependencies:
debug "4.3.4" debug "4.4.1"
"@colors/colors@1.5.0": "@colors/colors@1.5.0":
version "1.5.0" version "1.5.0"
@ -88,9 +96,9 @@
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
"@cucumber/cucumber-expressions@^16.0.0": "@cucumber/cucumber-expressions@^16.0.0":
version "16.1.0" version "16.1.2"
resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.0.tgz#2a2538b775e83b84a275ea10f618242717937968" resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.2.tgz#8c7200a4490b48a0309f5cc4e058cf6578b5b578"
integrity sha512-Q/tKDNje9RrcOXF2TO2NwTW92rzk+RwKkhYYKLxQT26Co8Qbjom0Cz02HsCMA2wjJ8dw6/d2IbWgiOay9RQA+w== integrity sha512-CfHEbxJ5FqBwF6mJyLLz4B353gyHkoi6cCL4J0lfDZ+GorpcWw4n2OUAdxJmP7ZlREANWoTFlp4FhmkLKrCfUA==
dependencies: dependencies:
regexp-match-indices "1.0.2" regexp-match-indices "1.0.2"
@ -127,9 +135,9 @@
integrity sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA== integrity sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA==
"@cypress/request@^3.0.6": "@cypress/request@^3.0.6":
version "3.0.7" version "3.0.9"
resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.7.tgz#6a74a4da98d9e5ae9121d6e2d9c14780c9b5cf1a" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.9.tgz#8ed6e08fea0c62998b5552301023af7268f11625"
integrity sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg== integrity sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==
dependencies: dependencies:
aws-sign2 "~0.7.0" aws-sign2 "~0.7.0"
aws4 "^1.8.0" aws4 "^1.8.0"
@ -137,14 +145,14 @@
combined-stream "~1.0.6" combined-stream "~1.0.6"
extend "~3.0.2" extend "~3.0.2"
forever-agent "~0.6.1" forever-agent "~0.6.1"
form-data "~4.0.0" form-data "~4.0.4"
http-signature "~1.4.0" http-signature "~1.4.0"
is-typedarray "~1.0.0" is-typedarray "~1.0.0"
isstream "~0.1.2" isstream "~0.1.2"
json-stringify-safe "~5.0.1" json-stringify-safe "~5.0.1"
mime-types "~2.1.19" mime-types "~2.1.19"
performance-now "^2.1.0" performance-now "^2.1.0"
qs "6.13.1" qs "6.14.0"
safe-buffer "^5.1.2" safe-buffer "^5.1.2"
tough-cookie "^5.0.0" tough-cookie "^5.0.0"
tunnel-agent "^0.6.0" tunnel-agent "^0.6.0"
@ -158,20 +166,132 @@
debug "^3.1.0" debug "^3.1.0"
lodash.once "^4.1.1" lodash.once "^4.1.1"
"@esbuild/android-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
"@esbuild/android-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
"@esbuild/android-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
"@esbuild/darwin-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
"@esbuild/darwin-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
"@esbuild/freebsd-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
"@esbuild/freebsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
"@esbuild/linux-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
"@esbuild/linux-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
"@esbuild/linux-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
"@esbuild/linux-loong64@0.14.54": "@esbuild/linux-loong64@0.14.54":
version "0.14.54" version "0.14.54"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
"@esbuild/linux-loong64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
"@esbuild/linux-mips64el@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
"@esbuild/linux-ppc64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
"@esbuild/linux-riscv64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
"@esbuild/linux-s390x@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
"@esbuild/linux-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
"@esbuild/netbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
"@esbuild/openbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
"@esbuild/sunos-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
"@esbuild/win32-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
"@esbuild/win32-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
"@esbuild/win32-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
"@types/node@*": "@types/node@*":
version "18.11.10" version "24.3.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.0.tgz#89b09f45cb9a8ee69466f18ee5864e4c3eb84dec"
integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ== integrity sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==
dependencies:
undici-types "~7.10.0"
"@types/parse-json@^4.0.0": "@types/parse-json@^4.0.0":
version "4.0.0" version "4.0.2"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
"@types/sinonjs__fake-timers@8.1.1": "@types/sinonjs__fake-timers@8.1.1":
version "8.1.1" version "8.1.1"
@ -179,9 +299,9 @@
integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==
"@types/sizzle@^2.3.2": "@types/sizzle@^2.3.2":
version "2.3.3" version "2.3.9"
resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2"
integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==
"@types/uuid@8.3.4": "@types/uuid@8.3.4":
version "8.3.4" version "8.3.4"
@ -189,9 +309,9 @@
integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==
"@types/yauzl@^2.9.1": "@types/yauzl@^2.9.1":
version "2.10.0" version "2.10.3"
resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999"
integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
@ -220,13 +340,6 @@ ansi-regex@^5.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.0.0, ansi-styles@^4.1.0: ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
@ -257,9 +370,9 @@ astral-regex@^2.0.0:
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async@^3.2.0: async@^3.2.0:
version "3.2.4" version "3.2.6"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
asynckit@^0.4.0: asynckit@^0.4.0:
version "0.4.0" version "0.4.0"
@ -277,9 +390,9 @@ aws-sign2@~0.7.0:
integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
aws4@^1.8.0: aws4@^1.8.0:
version "1.11.0" version "1.13.2"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
balanced-match@^1.0.0: balanced-match@^1.0.0:
version "1.0.2" version "1.0.2"
@ -309,9 +422,9 @@ bluebird@^3.7.2:
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
brace-expansion@^1.1.7: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.12"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843"
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==
dependencies: dependencies:
balanced-match "^1.0.0" balanced-match "^1.0.0"
concat-map "0.0.1" concat-map "0.0.1"
@ -330,25 +443,25 @@ buffer@^5.7.1:
ieee754 "^1.1.13" ieee754 "^1.1.13"
cachedir@^2.3.0: cachedir@^2.3.0:
version "2.3.0" version "2.4.0"
resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d"
integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==
call-bind-apply-helpers@^1.0.1: call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
version "1.0.1" version "1.0.2"
resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
dependencies: dependencies:
es-errors "^1.3.0" es-errors "^1.3.0"
function-bind "^1.1.2" function-bind "^1.1.2"
call-bound@^1.0.2: call-bound@^1.0.2:
version "1.0.3" version "1.0.4"
resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
dependencies: dependencies:
call-bind-apply-helpers "^1.0.1" call-bind-apply-helpers "^1.0.2"
get-intrinsic "^1.2.6" get-intrinsic "^1.3.0"
callsites@^3.0.0: callsites@^3.0.0:
version "3.1.0" version "3.1.0"
@ -360,15 +473,6 @@ caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
chalk@^2.0.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^4.1.0, chalk@^4.1.2: chalk@^4.1.0, chalk@^4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
@ -383,9 +487,9 @@ check-more-types@^2.24.0:
integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==
ci-info@^4.0.0: ci-info@^4.0.0:
version "4.1.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.1.0.tgz#92319d2fa29d2620180ea5afed31f589bc98cf83" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.0.tgz#c39b1013f8fdbd28cd78e62318357d02da160cd7"
integrity sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A== integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==
class-transformer@0.5.1: class-transformer@0.5.1:
version "0.5.1" version "0.5.1"
@ -405,9 +509,9 @@ cli-cursor@^3.1.0:
restore-cursor "^3.1.0" restore-cursor "^3.1.0"
cli-table3@~0.6.1: cli-table3@~0.6.1:
version "0.6.3" version "0.6.5"
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f"
integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==
dependencies: dependencies:
string-width "^4.2.0" string-width "^4.2.0"
optionalDependencies: optionalDependencies:
@ -428,13 +532,6 @@ cli-truncate@^2.1.0:
slice-ansi "^3.0.0" slice-ansi "^3.0.0"
string-width "^4.2.0" string-width "^4.2.0"
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-convert@^2.0.1: color-convert@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
@ -442,20 +539,15 @@ color-convert@^2.0.1:
dependencies: dependencies:
color-name "~1.1.4" color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4: color-name@~1.1.4:
version "1.1.4" version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
colorette@^2.0.16: colorette@^2.0.16:
version "2.0.19" version "2.0.20"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
colors@1.0.3: colors@1.0.3:
version "1.0.3" version "1.0.3"
@ -506,18 +598,18 @@ cosmiconfig@^7.0.1:
yaml "^1.10.0" yaml "^1.10.0"
cross-spawn@^7.0.0: cross-spawn@^7.0.0:
version "7.0.3" version "7.0.6"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
dependencies: dependencies:
path-key "^3.1.0" path-key "^3.1.0"
shebang-command "^2.0.0" shebang-command "^2.0.0"
which "^2.0.1" which "^2.0.1"
cypress-real-events@^1.13.0: cypress-real-events@^1.13.0:
version "1.13.0" version "1.14.0"
resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.13.0.tgz#6b7cd32dcac172db1493608f97a2576c7d0bd5af" resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.14.0.tgz#c5495db50a2bd247f4accde983af7153566945d3"
integrity sha512-LoejtK+dyZ1jaT8wGT5oASTPfsNV8/ClRp99ruN60oPj8cBJYod80iJDyNwfPAu4GCxTXOhhAv9FO65Hpwt6Hg== integrity sha512-XmI8y3OZLh6cjRroPalzzS++iv+pGCaD9G9kfIbtspgv7GVsDt30dkZvSXfgZb4rAN+3pOkMVB7e0j4oXydW7Q==
cypress-wait-until@^1.7.1: cypress-wait-until@^1.7.1:
version "1.7.2" version "1.7.2"
@ -581,16 +673,16 @@ dashdash@^1.12.0:
assert-plus "^1.0.0" assert-plus "^1.0.0"
dayjs@^1.10.4: dayjs@^1.10.4:
version "1.11.6" version "1.11.13"
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.6.tgz#2e79a226314ec3ec904e3ee1dd5a4f5e5b1c7afb" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
integrity sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ== integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
debug@4.3.4, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: debug@4.4.1, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4:
version "4.3.4" version "4.4.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
dependencies: dependencies:
ms "2.1.2" ms "^2.1.3"
debug@^3.1.0: debug@^3.1.0:
version "3.2.7" version "3.2.7"
@ -627,18 +719,19 @@ emoji-regex@^8.0.0:
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
end-of-stream@^1.1.0: end-of-stream@^1.1.0:
version "1.4.4" version "1.4.5"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==
dependencies: dependencies:
once "^1.4.0" once "^1.4.0"
enquirer@^2.3.6: enquirer@^2.3.6:
version "2.3.6" version "2.4.1"
resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
dependencies: dependencies:
ansi-colors "^4.1.1" ansi-colors "^4.1.1"
strip-ansi "^6.0.1"
error-ex@^1.3.1: error-ex@^1.3.1:
version "1.3.2" version "1.3.2"
@ -664,13 +757,23 @@ es-errors@^1.3.0:
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
es-object-atoms@^1.0.0: es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
version "1.0.0" version "1.1.1"
resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
dependencies: dependencies:
es-errors "^1.3.0" es-errors "^1.3.0"
es-set-tostringtag@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
dependencies:
es-errors "^1.3.0"
get-intrinsic "^1.2.6"
has-tostringtag "^1.0.2"
hasown "^2.0.2"
esbuild-android-64@0.14.54: esbuild-android-64@0.14.54:
version "0.14.54" version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
@ -798,6 +901,34 @@ esbuild@^0.14.23:
esbuild-windows-64 "0.14.54" esbuild-windows-64 "0.14.54"
esbuild-windows-arm64 "0.14.54" esbuild-windows-arm64 "0.14.54"
esbuild@^0.18.0:
version "0.18.20"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6"
integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
optionalDependencies:
"@esbuild/android-arm" "0.18.20"
"@esbuild/android-arm64" "0.18.20"
"@esbuild/android-x64" "0.18.20"
"@esbuild/darwin-arm64" "0.18.20"
"@esbuild/darwin-x64" "0.18.20"
"@esbuild/freebsd-arm64" "0.18.20"
"@esbuild/freebsd-x64" "0.18.20"
"@esbuild/linux-arm" "0.18.20"
"@esbuild/linux-arm64" "0.18.20"
"@esbuild/linux-ia32" "0.18.20"
"@esbuild/linux-loong64" "0.18.20"
"@esbuild/linux-mips64el" "0.18.20"
"@esbuild/linux-ppc64" "0.18.20"
"@esbuild/linux-riscv64" "0.18.20"
"@esbuild/linux-s390x" "0.18.20"
"@esbuild/linux-x64" "0.18.20"
"@esbuild/netbsd-x64" "0.18.20"
"@esbuild/openbsd-x64" "0.18.20"
"@esbuild/sunos-x64" "0.18.20"
"@esbuild/win32-arm64" "0.18.20"
"@esbuild/win32-ia32" "0.18.20"
"@esbuild/win32-x64" "0.18.20"
escape-string-regexp@^1.0.5: escape-string-regexp@^1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@ -875,13 +1006,15 @@ forever-agent@~0.6.1:
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
form-data@~4.0.0: form-data@~4.0.4:
version "4.0.1" version "4.0.4"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4"
integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==
dependencies: dependencies:
asynckit "^0.4.0" asynckit "^0.4.0"
combined-stream "^1.0.8" combined-stream "^1.0.8"
es-set-tostringtag "^2.1.0"
hasown "^2.0.2"
mime-types "^2.1.12" mime-types "^2.1.12"
fs-extra@^9.1.0: fs-extra@^9.1.0:
@ -904,23 +1037,23 @@ function-bind@^1.1.2:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0:
version "1.2.7" version "1.3.0"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA== integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
dependencies: dependencies:
call-bind-apply-helpers "^1.0.1" call-bind-apply-helpers "^1.0.2"
es-define-property "^1.0.1" es-define-property "^1.0.1"
es-errors "^1.3.0" es-errors "^1.3.0"
es-object-atoms "^1.0.0" es-object-atoms "^1.1.1"
function-bind "^1.1.2" function-bind "^1.1.2"
get-proto "^1.0.0" get-proto "^1.0.1"
gopd "^1.2.0" gopd "^1.2.0"
has-symbols "^1.1.0" has-symbols "^1.1.0"
hasown "^2.0.2" hasown "^2.0.2"
math-intrinsics "^1.1.0" math-intrinsics "^1.1.0"
get-proto@^1.0.0: get-proto@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
@ -974,25 +1107,27 @@ gopd@^1.2.0:
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
graceful-fs@^4.1.6, graceful-fs@^4.2.0: graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.10" version "4.2.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
has-flag@^4.0.0: has-flag@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
has-symbols@^1.1.0: has-symbols@^1.0.3, has-symbols@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
has-tostringtag@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
has-symbols "^1.0.3"
hasown@^2.0.2: hasown@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
@ -1020,9 +1155,9 @@ ieee754@^1.1.13:
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
import-fresh@^3.2.1: import-fresh@^3.2.1:
version "3.3.0" version "3.3.1"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
dependencies: dependencies:
parent-module "^1.0.0" parent-module "^1.0.0"
resolve-from "^4.0.0" resolve-from "^4.0.0"
@ -1124,9 +1259,9 @@ json-stringify-safe@~5.0.1:
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
jsonfile@^6.0.1: jsonfile@^6.0.1:
version "6.1.0" version "6.2.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62"
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==
dependencies: dependencies:
universalify "^2.0.0" universalify "^2.0.0"
optionalDependencies: optionalDependencies:
@ -1234,16 +1369,11 @@ minimist@^1.2.8:
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
module-alias@^2.2.2: module-alias@^2.2.2:
version "2.2.2" version "2.2.3"
resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.3.tgz#ec2e85c68973bda6ab71ce7c93b763ec96053221"
integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== integrity sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==
ms@2.1.2: ms@^2.1.1, ms@^2.1.3:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
ms@^2.1.1:
version "2.1.3" version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@ -1261,9 +1391,9 @@ npm-run-path@^4.0.0:
path-key "^3.0.0" path-key "^3.0.0"
object-inspect@^1.13.3: object-inspect@^1.13.3:
version "1.13.3" version "1.13.4"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
once@^1.3.0, once@^1.3.1, once@^1.4.0: once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0" version "1.4.0"
@ -1333,6 +1463,11 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
pify@^2.2.0: pify@^2.2.0:
version "2.3.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@ -1354,19 +1489,19 @@ proxy-from-env@1.0.0:
integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==
pump@^3.0.0: pump@^3.0.0:
version "3.0.0" version "3.0.3"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d"
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==
dependencies: dependencies:
end-of-stream "^1.1.0" end-of-stream "^1.1.0"
once "^1.3.1" once "^1.3.1"
qs@6.13.1: qs@6.14.0:
version "6.13.1" version "6.14.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930"
integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==
dependencies: dependencies:
side-channel "^1.0.6" side-channel "^1.1.0"
reflect-metadata@0.1.13: reflect-metadata@0.1.13:
version "0.1.13" version "0.1.13"
@ -1381,9 +1516,9 @@ regexp-match-indices@1.0.2:
regexp-tree "^0.1.11" regexp-tree "^0.1.11"
regexp-tree@^0.1.11: regexp-tree@^0.1.11:
version "0.1.24" version "0.1.27"
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd"
integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==
request-progress@^3.0.0: request-progress@^3.0.0:
version "3.0.0" version "3.0.0"
@ -1418,14 +1553,14 @@ restore-cursor@^3.1.0:
signal-exit "^3.0.2" signal-exit "^3.0.2"
rfdc@^1.3.0: rfdc@^1.3.0:
version "1.3.0" version "1.4.1"
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca"
integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
rxjs@^7.5.1: rxjs@^7.5.1:
version "7.5.7" version "7.8.2"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b"
integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==
dependencies: dependencies:
tslib "^2.1.0" tslib "^2.1.0"
@ -1440,9 +1575,9 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
semver@^7.5.3: semver@^7.5.3:
version "7.6.3" version "7.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
shebang-command@^2.0.0: shebang-command@^2.0.0:
version "2.0.0" version "2.0.0"
@ -1485,7 +1620,7 @@ side-channel-weakmap@^1.0.2:
object-inspect "^1.13.3" object-inspect "^1.13.3"
side-channel-map "^1.0.1" side-channel-map "^1.0.1"
side-channel@^1.0.6: side-channel@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
@ -1520,9 +1655,9 @@ slice-ansi@^4.0.0:
is-fullwidth-code-point "^3.0.0" is-fullwidth-code-point "^3.0.0"
source-map@^0.7.4: source-map@^0.7.4:
version "0.7.4" version "0.7.6"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02"
integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==
sshpk@^1.18.0: sshpk@^1.18.0:
version "1.18.0" version "1.18.0"
@ -1565,13 +1700,6 @@ strip-final-newline@^2.0.0:
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-color@^7.1.0: supports-color@^7.1.0:
version "7.2.0" version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
@ -1587,36 +1715,36 @@ supports-color@^8.1.1:
has-flag "^4.0.0" has-flag "^4.0.0"
throttleit@^1.0.0: throttleit@^1.0.0:
version "1.0.0" version "1.0.1"
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5"
integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==
through@^2.3.8: through@^2.3.8:
version "2.3.8" version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
tldts-core@^6.1.70: tldts-core@^6.1.86:
version "6.1.70" version "6.1.86"
resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.70.tgz#a954e93237ece2e1705b438600793c86a25f8c00" resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.86.tgz#a93e6ed9d505cb54c542ce43feb14c73913265d8"
integrity sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg== integrity sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==
tldts@^6.1.32: tldts@^6.1.32:
version "6.1.70" version "6.1.86"
resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.70.tgz#b571e5645ab9dc6f289453115d52602b8a384cfe" resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.86.tgz#087e0555b31b9725ee48ca7e77edc56115cd82f7"
integrity sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA== integrity sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==
dependencies: dependencies:
tldts-core "^6.1.70" tldts-core "^6.1.86"
tmp@~0.2.3: tmp@~0.2.3:
version "0.2.3" version "0.2.5"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8"
integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==
tough-cookie@^5.0.0: tough-cookie@^5.0.0:
version "5.0.0" version "5.1.2"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.2.tgz#66d774b4a1d9e12dc75089725af3ac75ec31bed7"
integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== integrity sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==
dependencies: dependencies:
tldts "^6.1.32" tldts "^6.1.32"
@ -1626,9 +1754,9 @@ tree-kill@1.2.2:
integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
tslib@^2.1.0: tslib@^2.1.0:
version "2.4.1" version "2.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
tunnel-agent@^0.6.0: tunnel-agent@^0.6.0:
version "0.6.0" version "0.6.0"
@ -1648,14 +1776,19 @@ type-fest@^0.21.3:
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
typescript@^4.2.3: typescript@^4.2.3:
version "4.9.3" version "4.9.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
undici-types@~7.10.0:
version "7.10.0"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350"
integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==
universalify@^2.0.0: universalify@^2.0.0:
version "2.0.0" version "2.0.1"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
untildify@^4.0.0: untildify@^4.0.0:
version "4.0.0" version "4.0.0"