From e7f521eca3fd74c0a6ba58f7fe293c72e30d954d Mon Sep 17 00:00:00 2001 From: Rena Date: Wed, 9 Feb 2022 18:08:29 -0800 Subject: [PATCH 01/49] Revert "Update to call List Supported Virtual Machine and Cloud Service SKUs (#2400)" This reverts commit 7e9ce2e5dd4becf9892a09db78bf1e1f2b08e57c. --- .../toggle-filter-button.component.spec.ts | 2 +- ...gallery-application-list.component.spec.ts | 2 +- .../services/compute/vm-size.service.spec.ts | 128 +++++--- src/app/services/compute/vm-size.service.ts | 297 +++++------------- .../compute/vmsize_sample_responses.ts | 71 +++-- 5 files changed, 207 insertions(+), 293 deletions(-) diff --git a/src/@batch-flask/ui/browse-layout/toggle-filter-button/toggle-filter-button.component.spec.ts b/src/@batch-flask/ui/browse-layout/toggle-filter-button/toggle-filter-button.component.spec.ts index cbd211f14b..a77adc26f2 100644 --- a/src/@batch-flask/ui/browse-layout/toggle-filter-button/toggle-filter-button.component.spec.ts +++ b/src/@batch-flask/ui/browse-layout/toggle-filter-button/toggle-filter-button.component.spec.ts @@ -48,7 +48,7 @@ describe("ToggleFilterButtonComponent", () => { }); }); - describe("when filter is empty", () => { + describe("when fitler is empty", () => { it("should not show marker", () => { expect(de.query(By.css(".filtering"))).toBeFalsy(); }); diff --git a/src/app/components/gallery/application-list/gallery-application-list.component.spec.ts b/src/app/components/gallery/application-list/gallery-application-list.component.spec.ts index 2f229fc42f..f42281d90d 100644 --- a/src/app/components/gallery/application-list/gallery-application-list.component.spec.ts +++ b/src/app/components/gallery/application-list/gallery-application-list.component.spec.ts @@ -88,7 +88,7 @@ describe("GalleryApplicationList", () => { expect(apps[3].query(By.css(".logo")).nativeElement.getAttribute("src")).toEqual(applications[2].icon); }); - it("filter", () => { + it("fitler", () => { testComponent.filter = "m"; fixture.detectChanges(); diff --git a/src/app/services/compute/vm-size.service.spec.ts b/src/app/services/compute/vm-size.service.spec.ts index 98cc779989..5e8a5f617e 100644 --- a/src/app/services/compute/vm-size.service.spec.ts +++ b/src/app/services/compute/vm-size.service.spec.ts @@ -3,10 +3,9 @@ import { BehaviorSubject, of } from "rxjs"; import { take } from "rxjs/operators"; import { VmSizeService } from "./vm-size.service"; import { + vmSizeSampleResponse as vmSizesResponse, badResponseIsNaN, - responseWithExtraCapability, - virtualMachineResponse, - cloudServiceResponse + responseWithExtraCapability } from "./vmsize_sample_responses"; const sub1 = new ArmSubscription({ @@ -14,9 +13,31 @@ const sub1 = new ArmSubscription({ subscriptionId: "sub1", }); +const githubDataResponse = { + category: { + all: [".*"], + memory: [ + "^standard_d[0-9a-z]*$", + ], + }, + all: [ + "^standard_d[0-9]*$", + ], + paas: [ + "small", + "medium", + "large", + "extralarge", + ], + iaas: [ + "^standard_a[1-9][0-9]*$", + ], +}; + describe("VMSizeService", () => { let service: VmSizeService; let armSpy; + let githubDataSpy; let accountServiceSpy; const testWestusAccount = new ArmBatchAccount({ @@ -27,34 +48,19 @@ describe("VMSizeService", () => { subscription: sub1, }); - const testBrazilAccount = new ArmBatchAccount({ - id: "/subs/sub-1/batchaccounts/acc-2", - name: "acc-2", - location: "brazilsouth", - properties: {} as any, - subscription: sub1, - }); - - // westus account - const westusCloudServiceQuery = `/subscriptions/${testWestusAccount.subscription.subscriptionId}/providers/Microsoft.Batch/locations/${testWestusAccount.location}/cloudServiceSkus?api-version=2021-06-01`; - const westusVMQuery = `/subscriptions/${testWestusAccount.subscription.subscriptionId}/providers/Microsoft.Batch/locations/${testWestusAccount.location}/virtualMachineSkus?api-version=2021-06-01`; - // brazilsouth account - const brazilCloudServiceQuery = `/subscriptions/${testBrazilAccount.subscription.subscriptionId}/providers/Microsoft.Batch/locations/${testBrazilAccount.location}/cloudServiceSkus?api-version=2021-06-01` - const brazilVMQuery = `/subscriptions/${testBrazilAccount.subscription.subscriptionId}/providers/Microsoft.Batch/locations/${testBrazilAccount.location}/virtualMachineSkus?api-version=2021-06-01` - beforeEach(() => { armSpy = { - get: jasmine.createSpy("arm.get") - .withArgs(westusVMQuery).and.returnValue(of(virtualMachineResponse)) - .withArgs(westusCloudServiceQuery).and.returnValue(of(cloudServiceResponse)) - .withArgs(brazilCloudServiceQuery).and.returnValue(of(cloudServiceResponse)) - .withArgs(brazilVMQuery).and.returnValue(of(virtualMachineResponse)) + get: jasmine.createSpy("arm.get").and.returnValue(of(vmSizesResponse)), + }; + + githubDataSpy = { + get: jasmine.createSpy("githubData.get").and.returnValue(of(JSON.stringify(githubDataResponse))), }; accountServiceSpy = { currentAccount: new BehaviorSubject(testWestusAccount), }; - service = new VmSizeService(armSpy, accountServiceSpy); + service = new VmSizeService(armSpy, githubDataSpy, accountServiceSpy); }); afterEach(() => { @@ -62,31 +68,49 @@ describe("VMSizeService", () => { }); it("use the batch account subscription and location for the sizes", async () => { - expect(armSpy.get).toHaveBeenCalledTimes(0); await service.sizes.pipe(take(1)).toPromise(); - expect(armSpy.get).toHaveBeenCalledWith(westusVMQuery); - expect(armSpy.get).toHaveBeenCalledWith(westusCloudServiceQuery); + expect(armSpy.get).toHaveBeenCalledOnce(); + + const expectedOptionsParam = { + params: { + "$filter": `location eq '${testWestusAccount.location}'` + } + }; + + expect(armSpy.get).toHaveBeenCalledWith( + "subscriptions/sub1/providers/Microsoft.Compute/skus", expectedOptionsParam); }); it("only calls the vm sizes api once per account", async () => { await service.sizes.pipe(take(1)).toPromise(); - expect(armSpy.get).toHaveBeenCalledTimes(2); + expect(armSpy.get).toHaveBeenCalledOnce(); await service.sizes.pipe(take(1)).toPromise(); - expect(armSpy.get).toHaveBeenCalledTimes(2); + expect(armSpy.get).toHaveBeenCalledOnce(); }); it("calls again when batch account changes", async () => { - expect(armSpy.get).toHaveBeenCalledTimes(0); - const sizeSub = service.sizes.subscribe(); - expect(armSpy.get).toHaveBeenCalledTimes(2); + expect(armSpy.get).toHaveBeenCalledTimes(1); + + const testBrazilAccount = new ArmBatchAccount({ + id: "/subs/sub-1/batchaccounts/acc-2", + name: "acc-2", + location: "brazilsouth", + properties: {} as any, + subscription: sub1, + }); + + const expectedOptionsParam = { + params: { + "$filter": `location eq '${testBrazilAccount.location}'` + } + }; accountServiceSpy.currentAccount.next(testBrazilAccount); - await service.sizes.pipe(take(1)).toPromise(); - expect(armSpy.get).toHaveBeenCalledTimes(4); - expect(armSpy.get).toHaveBeenCalledWith(brazilCloudServiceQuery); - expect(armSpy.get).toHaveBeenCalledWith(brazilVMQuery); + expect(armSpy.get).toHaveBeenCalledTimes(2); + expect(armSpy.get).toHaveBeenCalledWith( + "subscriptions/sub1/providers/Microsoft.Compute/skus", expectedOptionsParam); sizeSub.unsubscribe(); }); @@ -95,6 +119,16 @@ describe("VMSizeService", () => { expect(sizes).not.toBeFalsy(); expect(sizes!.toJS()).toEqual([ + { + id: "standard_a0", + name: "Standard_A0", + numberOfCores: 1, + numberOfGpus: 0, + osDiskSizeInMB: 1047552, + resourceDiskSizeInMB: 20480, + memoryInMB: 768, + maxDataDiskCount: 1, + }, { id: "standard_a1", name: "Standard_A1", @@ -105,6 +139,16 @@ describe("VMSizeService", () => { memoryInMB: 1792, maxDataDiskCount: 2, }, + { + id: "small", + name: "small", + numberOfCores: 1, + numberOfGpus: 0, + osDiskSizeInMB: 1047552, + resourceDiskSizeInMB: 20480, + memoryInMB: 768, + maxDataDiskCount: 1, + }, { id: "standard_d1", name: "Standard_D1", @@ -122,7 +166,7 @@ describe("VMSizeService", () => { armSpy = { get: jasmine.createSpy("arm.get").and.returnValue(of(badResponseIsNaN)), }; - const serviceWithNaN = new VmSizeService(armSpy, accountServiceSpy); + const serviceWithNaN = new VmSizeService(armSpy, githubDataSpy, accountServiceSpy); const sizes = await serviceWithNaN.sizes.pipe(take(1)).toPromise(); expect(sizes).not.toBeFalsy(); @@ -144,7 +188,7 @@ describe("VMSizeService", () => { armSpy = { get: jasmine.createSpy("arm.get").and.returnValue(of(responseWithExtraCapability)), }; - const serviceWithExtraCap = new VmSizeService(armSpy, accountServiceSpy); + const serviceWithExtraCap = new VmSizeService(armSpy, githubDataSpy, accountServiceSpy); const sizes = await serviceWithExtraCap.sizes.pipe(take(1)).toPromise(); expect(sizes).not.toBeFalsy(); @@ -162,7 +206,7 @@ describe("VMSizeService", () => { ]); }); - it("filters the IAAS sizes", async () => { + it("fitlers the IAAS sizes", async () => { const sizes = await service.virtualMachineSizes.pipe(take(1)).toPromise(); expect(sizes).not.toBeFalsy(); expect(sizes!.toJS().map(x => x.id)).toEqual([ @@ -171,7 +215,7 @@ describe("VMSizeService", () => { ]); }); - it("filters the Cloud Service sizes", async () => { + it("fitlers the Cloud Service sizes", async () => { const sizes = await service.cloudServiceSizes.pipe(take(1)).toPromise(); expect(sizes).not.toBeFalsy(); expect(sizes!.toJS().map(x => x.id)).toEqual([ @@ -182,10 +226,6 @@ describe("VMSizeService", () => { it("returns null for the sizes when using local batch account", async () => { accountServiceSpy.currentAccount.next(new LocalBatchAccount({})); - const vmSizes = await service.virtualMachineSizes.pipe(take(1)).toPromise(); - expect(vmSizes).toBeFalsy(); - const cloudServiceSizes = await service.cloudServiceSizes.pipe(take(1)).toPromise(); - expect(cloudServiceSizes).toBeFalsy(); const sizes = await service.sizes.pipe(take(1)).toPromise(); expect(sizes).toBeFalsy(); }); diff --git a/src/app/services/compute/vm-size.service.ts b/src/app/services/compute/vm-size.service.ts index ae71882838..a0ad9930af 100644 --- a/src/app/services/compute/vm-size.service.ts +++ b/src/app/services/compute/vm-size.service.ts @@ -2,27 +2,32 @@ import { Injectable, OnDestroy } from "@angular/core"; import { log } from "@batch-flask/utils"; import { ArmBatchAccount, VmSize } from "app/models"; import { List } from "immutable"; -import { Observable, Subject, of, combineLatest } from "rxjs"; +import { BehaviorSubject, Observable, Subject, combineLatest, of } from "rxjs"; import { catchError, map, publishReplay, refCount, share, switchMap, take, takeUntil } from "rxjs/operators"; import { ArmHttpService } from "../arm-http.service"; import { BatchAccountService } from "../batch-account"; +import { computeUrl } from "../compute.service"; import { ArmListResponse } from "../core"; +import { GithubDataService } from "../github-data"; import { mapResourceSkuToVmSize } from "../../models/vm-size"; const includedVmsSizesPath = "data/vm-sizes-list.json"; -export function supportedSkusUrl(subscriptionId: string, location: string) { - return `/subscriptions/${subscriptionId}/providers/Microsoft.Batch/locations/${location}` +interface VmSizeData { + category: StringMap; + included: IncludedSizes; } -interface VmSizeCategories { - category: StringMap; +interface IncludedSizes { + all: string[]; + paas: string[]; + iaas: string[]; } @Injectable({ providedIn: "root" }) export class VmSizeService implements OnDestroy { /** - * All sizes combining cloud service and virtual machine sizes supported + * All sizes */ public sizes: Observable | null>; @@ -35,194 +40,7 @@ export class VmSizeService implements OnDestroy { * Only virtual machine sizes supported */ public virtualMachineSizes: Observable>; - - public vmSizeCategories = of({ - all: [".*"], - compute: [ - "^standard_f[0-9a-z]*$", - "^standard_f[0-9a-z]*_[v2]*$", - "^standard_f[0-9a-z]*_[v3]*$", - "standard_fx4mds", - "standard_fx12mds", - "standard_fx24mds", - "standard_fx36mds", - "standard_fx48mds" - ], - memory: [ - "standard_d11_v2", - "standard_d12_v2", - "standard_d13_v2", - "standard_d14_v2", - "standard_d15_v2", - - "standard_ds11_v2", - "standard_ds12_v2", - "standard_ds13_v2", - "standard_ds14_v2", - "standard_ds15_v2", - - "standard_e2_v3", - "standard_e4_v3", - "standard_e8_v3", - "standard_e16_v3", - "standard_e32_v3", - "standard_e64_v3", - - "standard_e2s_v3", - "standard_e4s_v3", - "standard_e8s_v3", - "standard_e16s_v3", - "standard_e32s_v3", - "standard_e48s_v3", - "standard_e64s_v3", - - "standard_e2a_v4", - "standard_e4a_v4", - "standard_e8a_v4", - "standard_e16a_v4", - "standard_e20a_v4", - "standard_e32a_v4", - "standard_e48a_v4", - "standard_e64a_v4", - "standard_e96a_v4", - - "standard_e2as_v4", - "standard_e4as_v4", - "standard_e8as_v4", - "standard_e16as_v4", - "standard_e20as_v4", - "standard_e32as_v4", - "standard_e48as_v4", - "standard_e64as_v4", - "standard_e96as_v4", - - "standard_e2d_v4", - "standard_e4d_v4", - "standard_e8d_v4", - "standard_e16d_v4", - "standard_e20d_v4", - "standard_e32d_v4", - "standard_e48d_v4", - "standard_e64d_v4", - - "standard_e2ds_v4", - "standard_e4ds_v4", - "standard_e8ds_v4", - "standard_e16ds_v4", - "standard_e20ds_v4", - "standard_e32ds_v4", - "standard_e48ds_v4", - "standard_e64ds_v4", - "standard_e80ids_v4", - - "standard_m8ms", - "standard_m16ms", - "standard_m32ms", - "standard_m32ls", - "standard_m32ts", - "standard_m64ls", - "standard_m64", - "standard_m64m", - "standard_m64s", - "standard_m64ms", - "standard_m128", - "standard_m128m", - "standard_m128ms", - "standard_m128s", - - "standard_m208ms_v2", - "standard_m208s_v2", - "standard_m416ms_v2", - "standard_m416s_v2" - ], - gpu: [ - "standard_nc6", - "standard_nc12", - "standard_nc24", - "standard_nc24r", - - "standard_nc6_promo", - "standard_nc12_promo", - "standard_nc24_promo", - "standard_nc24r_promo", - - "standard_nc6s_v2", - "standard_nc12s_v2", - "standard_nc24s_v2", - "standard_nc24rs_v2", - - "standard_nc6s_v3", - "standard_nc12s_v3", - "standard_nc24s_v3", - "standard_nc24rs_v3", - - "standard_nc4as_t4_v3", - "standard_nc8as_t4_v3", - "standard_nc16as_t4_v3", - "standard_nc64as_t4_v3", - - "standard_nd6s", - "standard_nd12s", - "standard_nd24s", - "standard_nd24rs", - - "standard_nd96asr_v4", - - "standard_nv6", - "standard_nv12", - "standard_nv24", - - "standard_nv6_promo", - "standard_nv12_promo", - "standard_nv24_promo", - - "standard_nv12s_v3", - "standard_nv24s_v3", - "standard_nv48s_v3", - - "standard_nv4as_v4", - "standard_nv8as_v4", - "standard_nv16as_v4", - "standard_nv32as_v4" - ], - hpc: [ - "standard_a8_v2", - "standard_a8m_v2", - "^standard_h[0-9a-z]*$", - "^standard_h[0-9a-z]*_promo$", - "^standard_h[bc][0-9a-z]*$", - "^standard_h[bc][0-9a-z]*_promo*$", - "^standard_h[bc][0-9a-z]*_[v2]*$", - "^standard_h[bc][0-9a-z]*_[v2]*_promo*$", - "standard_hb60rs", - "standard_hc44rs", - "standard_hb120rs_v3", - "standard_hb120_16rs_v3", - "standard_hb120_32rs_v3", - "standard_hb120_64rs_v3", - "standard_hb120_96rs_v3" - ], - standard: [ - "^standard_a[0-9a-z]*$", - "^standard_d[0-9a-z]*$", - "^basic_a[0-9a-z]*$", - "small", - "medium", - "large", - "extralarge", - "^a[1-9][0-9]*$" - ], - storage: [ - "^standard_l[0-9]*s_v2*$" - ], - fpga: [ - "standard_np10s", - "standard_np20s", - "standard_np40s" - ] - }) - - // delete bc you can get this information directly through API + public vmSizeCategories: Observable>; public additionalVmSizeCores = { extrasmall: 1, small: 1, @@ -231,54 +49,55 @@ export class VmSizeService implements OnDestroy { extralarge: 8, }; + private _includedSizes = new BehaviorSubject(null); + private _vmSizeCategories = new BehaviorSubject>(null); private _destroy = new Subject(); constructor( private arm: ArmHttpService, + private githubData: GithubDataService, accountService: BatchAccountService) { - this.cloudServiceSizes = accountService.currentAccount.pipe( + this.loadVmSizeData(); + + this.sizes = accountService.currentAccount.pipe( takeUntil(this._destroy), switchMap((account) => { if (!(account instanceof ArmBatchAccount)) { return of(null); } else { - const cloudServiceUrl = `${supportedSkusUrl(account.subscription.subscriptionId, account.location)}/cloudServiceSkus?api-version=2021-06-01` - return this._fetchVmSkusForAccount(account, cloudServiceUrl); + return this._fetchVmSizesForAccount(account); } }), publishReplay(1), refCount(), ); - this.virtualMachineSizes = accountService.currentAccount.pipe( - takeUntil(this._destroy), - switchMap((account) => { - if (!(account instanceof ArmBatchAccount)) { - return of(null); - } else { - const vmUrl = `${supportedSkusUrl(account.subscription.subscriptionId, account.location)}/virtualMachineSkus?api-version=2021-06-01` - return this._fetchVmSkusForAccount(account, vmUrl); + const obs = combineLatest(this.sizes, this._includedSizes); + + this.cloudServiceSizes = obs.pipe( + map(([sizes, included]) => { + if (!included) { + return sizes; } + return this.filterSizes(sizes, included.all.concat(included.paas)); }), publishReplay(1), refCount(), ); - this.sizes = combineLatest([this.cloudServiceSizes, this.virtualMachineSizes]).pipe( - map(([cloudServiceSizes, virtualMachineSizes]) => { - if (cloudServiceSizes && !virtualMachineSizes) { - return cloudServiceSizes; - } else if (!cloudServiceSizes && virtualMachineSizes) { - return virtualMachineSizes; - } else if (!cloudServiceSizes && !virtualMachineSizes) { - return null; + this.virtualMachineSizes = obs.pipe( + map(([sizes, included]) => { + if (!included) { + return sizes; } - return cloudServiceSizes.merge(virtualMachineSizes); + return this.filterSizes(sizes, included.all.concat(included.iaas)); }), publishReplay(1), refCount(), ); + + this.vmSizeCategories = this._vmSizeCategories.asObservable(); } public ngOnDestroy() { @@ -286,6 +105,27 @@ export class VmSizeService implements OnDestroy { this._destroy.complete(); } + public loadVmSizeData() { + this.githubData.get(includedVmsSizesPath).subscribe({ + next: (response: string) => { + const responseJson = JSON.parse(response); + const data: VmSizeData = { + category: responseJson.category, + included: { + all: responseJson.all, + paas: responseJson.paas, + iaas: responseJson.iaas, + }, + }; + this._vmSizeCategories.next(data.category); + this._includedSizes.next(data.included); + }, + error: (error) => { + log.error("Error loading included vm sizes from github", error); + }, + }); + } + public get(vmSize: string): Observable { return this.sizes.pipe( take(1), @@ -299,9 +139,34 @@ export class VmSizeService implements OnDestroy { share(), ); } + /** + * Filter the given list of vm sizes by including any patching the given patterns. + * @param sizes Sizes to filter + * @param includedPatterns List of regex patterns to include + */ + public filterSizes(sizes: List, includedPatterns: string[]): List { + if (!sizes) { + return null; + } + return List(sizes.filter((size) => { + for (const regex of includedPatterns) { + if (new RegExp(regex).test(size.name.toLowerCase())) { + return true; + } + } + return false; + })); + } - private _fetchVmSkusForAccount(account: ArmBatchAccount, query: string): Observable | null> { - return this.arm.get>(query).pipe( + private _fetchVmSizesForAccount(account: ArmBatchAccount): Observable | null> { + const { subscription, location } = account; + const url = `${computeUrl(subscription.subscriptionId)}/skus`; + const options = { + params: { + "$filter": `location eq '${location}'` + } + }; + return this.arm.get>(url, options).pipe( map((response) => { return mapResourceSkuToVmSize(response.value); }), diff --git a/src/app/services/compute/vmsize_sample_responses.ts b/src/app/services/compute/vmsize_sample_responses.ts index 2abf38f87b..f734d1479b 100644 --- a/src/app/services/compute/vmsize_sample_responses.ts +++ b/src/app/services/compute/vmsize_sample_responses.ts @@ -1,4 +1,4 @@ -export const cloudServiceResponse = { +export const vmSizeSampleResponse = { "value": [ { "resourceType": "virtualMachines", @@ -29,20 +29,34 @@ export const cloudServiceResponse = { { "name": "GPUs", "value": "0" - } + }, ], "locationInfo": [ { "location": "westus", "zones": [ - "1", + "2", + "1" + ], + "zoneDetails": [ + { + "name": [ + "2" + ], + "capabilities": [ + { + "name": "UltraSSDAvailable", + "value": "True" + } + ] + } ] } ], - "name": "small", + "name": "Standard_A0", "tier": "Standard", - "size": "small", - "family": "standardSmallFamily" + "size": "A0", + "family": "standardA0_A7Family" }, { "resourceType": "virtualMachines", @@ -52,7 +66,7 @@ export const cloudServiceResponse = { "capabilities": [ { "name": "MaxResourceVolumeMB", - "value": "51200" + "value": "71680" }, { "name": "OSVhdSizeMB", @@ -64,36 +78,32 @@ export const cloudServiceResponse = { }, { "name": "MemoryGB", - "value": "3.5" + "value": "1.75" }, { "name": "MaxDataDiskCount", - "value": "4" + "value": "2" }, { "name": "GPUs", - "value": "2" + "value": "0" } ], "locationInfo": [ { - "location": "eastus", + "location": "westus", "zones": [ "1", - ], - "zoneDetails": [] + "2", + "3" + ] } ], - "name": "Standard_D1", + "name": "Standard_A1", "tier": "Standard", - "size": "D1", - "family": "standardDFamily" - } - ] -} - -export const virtualMachineResponse = { - "value": [ + "size": "A1", + "family": "standardA0_A7Family" + }, { "resourceType": "virtualMachines", "locations": [ @@ -102,7 +112,7 @@ export const virtualMachineResponse = { "capabilities": [ { "name": "MaxResourceVolumeMB", - "value": "71680" + "value": "20480" }, { "name": "OSVhdSizeMB", @@ -114,11 +124,11 @@ export const virtualMachineResponse = { }, { "name": "MemoryGB", - "value": "1.75" + "value": "0.75" }, { "name": "MaxDataDiskCount", - "value": "2" + "value": "1" }, { "name": "GPUs", @@ -130,15 +140,13 @@ export const virtualMachineResponse = { "location": "westus", "zones": [ "1", - "2", - "3" ] } ], - "name": "Standard_A1", + "name": "small", "tier": "Standard", - "size": "A1", - "family": "standardA0_A7Family" + "size": "small", + "family": "standardSmallFamily" }, { "resourceType": "virtualMachines", @@ -185,7 +193,8 @@ export const virtualMachineResponse = { "size": "D1", "family": "standardDFamily" } - ] + ], + "nextLink": null } export const badResponseIsNaN = { From 4e4eb6cb018ab5d82e499b0138d0fa9a9ae701e9 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Fri, 1 Apr 2022 14:04:50 -0400 Subject: [PATCH 02/49] Unrevert "Update to call List Supported Virtual Machine and Cloud Service SKUs (#2400)" 8a7424bb84974e90752e4a480a677c31cdcbc9ed Batch Service supports VM SKU API so reenabling service call. --- .../toggle-filter-button.component.spec.ts | 2 +- ...gallery-application-list.component.spec.ts | 2 +- .../services/compute/vm-size.service.spec.ts | 128 +++----- src/app/services/compute/vm-size.service.ts | 297 +++++++++++++----- .../compute/vmsize_sample_responses.ts | 71 ++--- 5 files changed, 293 insertions(+), 207 deletions(-) diff --git a/src/@batch-flask/ui/browse-layout/toggle-filter-button/toggle-filter-button.component.spec.ts b/src/@batch-flask/ui/browse-layout/toggle-filter-button/toggle-filter-button.component.spec.ts index a77adc26f2..cbd211f14b 100644 --- a/src/@batch-flask/ui/browse-layout/toggle-filter-button/toggle-filter-button.component.spec.ts +++ b/src/@batch-flask/ui/browse-layout/toggle-filter-button/toggle-filter-button.component.spec.ts @@ -48,7 +48,7 @@ describe("ToggleFilterButtonComponent", () => { }); }); - describe("when fitler is empty", () => { + describe("when filter is empty", () => { it("should not show marker", () => { expect(de.query(By.css(".filtering"))).toBeFalsy(); }); diff --git a/src/app/components/gallery/application-list/gallery-application-list.component.spec.ts b/src/app/components/gallery/application-list/gallery-application-list.component.spec.ts index f42281d90d..2f229fc42f 100644 --- a/src/app/components/gallery/application-list/gallery-application-list.component.spec.ts +++ b/src/app/components/gallery/application-list/gallery-application-list.component.spec.ts @@ -88,7 +88,7 @@ describe("GalleryApplicationList", () => { expect(apps[3].query(By.css(".logo")).nativeElement.getAttribute("src")).toEqual(applications[2].icon); }); - it("fitler", () => { + it("filter", () => { testComponent.filter = "m"; fixture.detectChanges(); diff --git a/src/app/services/compute/vm-size.service.spec.ts b/src/app/services/compute/vm-size.service.spec.ts index 5e8a5f617e..98cc779989 100644 --- a/src/app/services/compute/vm-size.service.spec.ts +++ b/src/app/services/compute/vm-size.service.spec.ts @@ -3,9 +3,10 @@ import { BehaviorSubject, of } from "rxjs"; import { take } from "rxjs/operators"; import { VmSizeService } from "./vm-size.service"; import { - vmSizeSampleResponse as vmSizesResponse, badResponseIsNaN, - responseWithExtraCapability + responseWithExtraCapability, + virtualMachineResponse, + cloudServiceResponse } from "./vmsize_sample_responses"; const sub1 = new ArmSubscription({ @@ -13,31 +14,9 @@ const sub1 = new ArmSubscription({ subscriptionId: "sub1", }); -const githubDataResponse = { - category: { - all: [".*"], - memory: [ - "^standard_d[0-9a-z]*$", - ], - }, - all: [ - "^standard_d[0-9]*$", - ], - paas: [ - "small", - "medium", - "large", - "extralarge", - ], - iaas: [ - "^standard_a[1-9][0-9]*$", - ], -}; - describe("VMSizeService", () => { let service: VmSizeService; let armSpy; - let githubDataSpy; let accountServiceSpy; const testWestusAccount = new ArmBatchAccount({ @@ -48,19 +27,34 @@ describe("VMSizeService", () => { subscription: sub1, }); + const testBrazilAccount = new ArmBatchAccount({ + id: "/subs/sub-1/batchaccounts/acc-2", + name: "acc-2", + location: "brazilsouth", + properties: {} as any, + subscription: sub1, + }); + + // westus account + const westusCloudServiceQuery = `/subscriptions/${testWestusAccount.subscription.subscriptionId}/providers/Microsoft.Batch/locations/${testWestusAccount.location}/cloudServiceSkus?api-version=2021-06-01`; + const westusVMQuery = `/subscriptions/${testWestusAccount.subscription.subscriptionId}/providers/Microsoft.Batch/locations/${testWestusAccount.location}/virtualMachineSkus?api-version=2021-06-01`; + // brazilsouth account + const brazilCloudServiceQuery = `/subscriptions/${testBrazilAccount.subscription.subscriptionId}/providers/Microsoft.Batch/locations/${testBrazilAccount.location}/cloudServiceSkus?api-version=2021-06-01` + const brazilVMQuery = `/subscriptions/${testBrazilAccount.subscription.subscriptionId}/providers/Microsoft.Batch/locations/${testBrazilAccount.location}/virtualMachineSkus?api-version=2021-06-01` + beforeEach(() => { armSpy = { - get: jasmine.createSpy("arm.get").and.returnValue(of(vmSizesResponse)), - }; - - githubDataSpy = { - get: jasmine.createSpy("githubData.get").and.returnValue(of(JSON.stringify(githubDataResponse))), + get: jasmine.createSpy("arm.get") + .withArgs(westusVMQuery).and.returnValue(of(virtualMachineResponse)) + .withArgs(westusCloudServiceQuery).and.returnValue(of(cloudServiceResponse)) + .withArgs(brazilCloudServiceQuery).and.returnValue(of(cloudServiceResponse)) + .withArgs(brazilVMQuery).and.returnValue(of(virtualMachineResponse)) }; accountServiceSpy = { currentAccount: new BehaviorSubject(testWestusAccount), }; - service = new VmSizeService(armSpy, githubDataSpy, accountServiceSpy); + service = new VmSizeService(armSpy, accountServiceSpy); }); afterEach(() => { @@ -68,49 +62,31 @@ describe("VMSizeService", () => { }); it("use the batch account subscription and location for the sizes", async () => { + expect(armSpy.get).toHaveBeenCalledTimes(0); await service.sizes.pipe(take(1)).toPromise(); - expect(armSpy.get).toHaveBeenCalledOnce(); - - const expectedOptionsParam = { - params: { - "$filter": `location eq '${testWestusAccount.location}'` - } - }; - - expect(armSpy.get).toHaveBeenCalledWith( - "subscriptions/sub1/providers/Microsoft.Compute/skus", expectedOptionsParam); + expect(armSpy.get).toHaveBeenCalledWith(westusVMQuery); + expect(armSpy.get).toHaveBeenCalledWith(westusCloudServiceQuery); }); it("only calls the vm sizes api once per account", async () => { await service.sizes.pipe(take(1)).toPromise(); - expect(armSpy.get).toHaveBeenCalledOnce(); + expect(armSpy.get).toHaveBeenCalledTimes(2); await service.sizes.pipe(take(1)).toPromise(); - expect(armSpy.get).toHaveBeenCalledOnce(); + expect(armSpy.get).toHaveBeenCalledTimes(2); }); it("calls again when batch account changes", async () => { - const sizeSub = service.sizes.subscribe(); - expect(armSpy.get).toHaveBeenCalledTimes(1); - - const testBrazilAccount = new ArmBatchAccount({ - id: "/subs/sub-1/batchaccounts/acc-2", - name: "acc-2", - location: "brazilsouth", - properties: {} as any, - subscription: sub1, - }); + expect(armSpy.get).toHaveBeenCalledTimes(0); - const expectedOptionsParam = { - params: { - "$filter": `location eq '${testBrazilAccount.location}'` - } - }; + const sizeSub = service.sizes.subscribe(); + expect(armSpy.get).toHaveBeenCalledTimes(2); accountServiceSpy.currentAccount.next(testBrazilAccount); - expect(armSpy.get).toHaveBeenCalledTimes(2); - expect(armSpy.get).toHaveBeenCalledWith( - "subscriptions/sub1/providers/Microsoft.Compute/skus", expectedOptionsParam); + await service.sizes.pipe(take(1)).toPromise(); + expect(armSpy.get).toHaveBeenCalledTimes(4); + expect(armSpy.get).toHaveBeenCalledWith(brazilCloudServiceQuery); + expect(armSpy.get).toHaveBeenCalledWith(brazilVMQuery); sizeSub.unsubscribe(); }); @@ -119,16 +95,6 @@ describe("VMSizeService", () => { expect(sizes).not.toBeFalsy(); expect(sizes!.toJS()).toEqual([ - { - id: "standard_a0", - name: "Standard_A0", - numberOfCores: 1, - numberOfGpus: 0, - osDiskSizeInMB: 1047552, - resourceDiskSizeInMB: 20480, - memoryInMB: 768, - maxDataDiskCount: 1, - }, { id: "standard_a1", name: "Standard_A1", @@ -139,16 +105,6 @@ describe("VMSizeService", () => { memoryInMB: 1792, maxDataDiskCount: 2, }, - { - id: "small", - name: "small", - numberOfCores: 1, - numberOfGpus: 0, - osDiskSizeInMB: 1047552, - resourceDiskSizeInMB: 20480, - memoryInMB: 768, - maxDataDiskCount: 1, - }, { id: "standard_d1", name: "Standard_D1", @@ -166,7 +122,7 @@ describe("VMSizeService", () => { armSpy = { get: jasmine.createSpy("arm.get").and.returnValue(of(badResponseIsNaN)), }; - const serviceWithNaN = new VmSizeService(armSpy, githubDataSpy, accountServiceSpy); + const serviceWithNaN = new VmSizeService(armSpy, accountServiceSpy); const sizes = await serviceWithNaN.sizes.pipe(take(1)).toPromise(); expect(sizes).not.toBeFalsy(); @@ -188,7 +144,7 @@ describe("VMSizeService", () => { armSpy = { get: jasmine.createSpy("arm.get").and.returnValue(of(responseWithExtraCapability)), }; - const serviceWithExtraCap = new VmSizeService(armSpy, githubDataSpy, accountServiceSpy); + const serviceWithExtraCap = new VmSizeService(armSpy, accountServiceSpy); const sizes = await serviceWithExtraCap.sizes.pipe(take(1)).toPromise(); expect(sizes).not.toBeFalsy(); @@ -206,7 +162,7 @@ describe("VMSizeService", () => { ]); }); - it("fitlers the IAAS sizes", async () => { + it("filters the IAAS sizes", async () => { const sizes = await service.virtualMachineSizes.pipe(take(1)).toPromise(); expect(sizes).not.toBeFalsy(); expect(sizes!.toJS().map(x => x.id)).toEqual([ @@ -215,7 +171,7 @@ describe("VMSizeService", () => { ]); }); - it("fitlers the Cloud Service sizes", async () => { + it("filters the Cloud Service sizes", async () => { const sizes = await service.cloudServiceSizes.pipe(take(1)).toPromise(); expect(sizes).not.toBeFalsy(); expect(sizes!.toJS().map(x => x.id)).toEqual([ @@ -226,6 +182,10 @@ describe("VMSizeService", () => { it("returns null for the sizes when using local batch account", async () => { accountServiceSpy.currentAccount.next(new LocalBatchAccount({})); + const vmSizes = await service.virtualMachineSizes.pipe(take(1)).toPromise(); + expect(vmSizes).toBeFalsy(); + const cloudServiceSizes = await service.cloudServiceSizes.pipe(take(1)).toPromise(); + expect(cloudServiceSizes).toBeFalsy(); const sizes = await service.sizes.pipe(take(1)).toPromise(); expect(sizes).toBeFalsy(); }); diff --git a/src/app/services/compute/vm-size.service.ts b/src/app/services/compute/vm-size.service.ts index a0ad9930af..ae71882838 100644 --- a/src/app/services/compute/vm-size.service.ts +++ b/src/app/services/compute/vm-size.service.ts @@ -2,32 +2,27 @@ import { Injectable, OnDestroy } from "@angular/core"; import { log } from "@batch-flask/utils"; import { ArmBatchAccount, VmSize } from "app/models"; import { List } from "immutable"; -import { BehaviorSubject, Observable, Subject, combineLatest, of } from "rxjs"; +import { Observable, Subject, of, combineLatest } from "rxjs"; import { catchError, map, publishReplay, refCount, share, switchMap, take, takeUntil } from "rxjs/operators"; import { ArmHttpService } from "../arm-http.service"; import { BatchAccountService } from "../batch-account"; -import { computeUrl } from "../compute.service"; import { ArmListResponse } from "../core"; -import { GithubDataService } from "../github-data"; import { mapResourceSkuToVmSize } from "../../models/vm-size"; const includedVmsSizesPath = "data/vm-sizes-list.json"; -interface VmSizeData { - category: StringMap; - included: IncludedSizes; +export function supportedSkusUrl(subscriptionId: string, location: string) { + return `/subscriptions/${subscriptionId}/providers/Microsoft.Batch/locations/${location}` } -interface IncludedSizes { - all: string[]; - paas: string[]; - iaas: string[]; +interface VmSizeCategories { + category: StringMap; } @Injectable({ providedIn: "root" }) export class VmSizeService implements OnDestroy { /** - * All sizes + * All sizes combining cloud service and virtual machine sizes supported */ public sizes: Observable | null>; @@ -40,7 +35,194 @@ export class VmSizeService implements OnDestroy { * Only virtual machine sizes supported */ public virtualMachineSizes: Observable>; - public vmSizeCategories: Observable>; + + public vmSizeCategories = of({ + all: [".*"], + compute: [ + "^standard_f[0-9a-z]*$", + "^standard_f[0-9a-z]*_[v2]*$", + "^standard_f[0-9a-z]*_[v3]*$", + "standard_fx4mds", + "standard_fx12mds", + "standard_fx24mds", + "standard_fx36mds", + "standard_fx48mds" + ], + memory: [ + "standard_d11_v2", + "standard_d12_v2", + "standard_d13_v2", + "standard_d14_v2", + "standard_d15_v2", + + "standard_ds11_v2", + "standard_ds12_v2", + "standard_ds13_v2", + "standard_ds14_v2", + "standard_ds15_v2", + + "standard_e2_v3", + "standard_e4_v3", + "standard_e8_v3", + "standard_e16_v3", + "standard_e32_v3", + "standard_e64_v3", + + "standard_e2s_v3", + "standard_e4s_v3", + "standard_e8s_v3", + "standard_e16s_v3", + "standard_e32s_v3", + "standard_e48s_v3", + "standard_e64s_v3", + + "standard_e2a_v4", + "standard_e4a_v4", + "standard_e8a_v4", + "standard_e16a_v4", + "standard_e20a_v4", + "standard_e32a_v4", + "standard_e48a_v4", + "standard_e64a_v4", + "standard_e96a_v4", + + "standard_e2as_v4", + "standard_e4as_v4", + "standard_e8as_v4", + "standard_e16as_v4", + "standard_e20as_v4", + "standard_e32as_v4", + "standard_e48as_v4", + "standard_e64as_v4", + "standard_e96as_v4", + + "standard_e2d_v4", + "standard_e4d_v4", + "standard_e8d_v4", + "standard_e16d_v4", + "standard_e20d_v4", + "standard_e32d_v4", + "standard_e48d_v4", + "standard_e64d_v4", + + "standard_e2ds_v4", + "standard_e4ds_v4", + "standard_e8ds_v4", + "standard_e16ds_v4", + "standard_e20ds_v4", + "standard_e32ds_v4", + "standard_e48ds_v4", + "standard_e64ds_v4", + "standard_e80ids_v4", + + "standard_m8ms", + "standard_m16ms", + "standard_m32ms", + "standard_m32ls", + "standard_m32ts", + "standard_m64ls", + "standard_m64", + "standard_m64m", + "standard_m64s", + "standard_m64ms", + "standard_m128", + "standard_m128m", + "standard_m128ms", + "standard_m128s", + + "standard_m208ms_v2", + "standard_m208s_v2", + "standard_m416ms_v2", + "standard_m416s_v2" + ], + gpu: [ + "standard_nc6", + "standard_nc12", + "standard_nc24", + "standard_nc24r", + + "standard_nc6_promo", + "standard_nc12_promo", + "standard_nc24_promo", + "standard_nc24r_promo", + + "standard_nc6s_v2", + "standard_nc12s_v2", + "standard_nc24s_v2", + "standard_nc24rs_v2", + + "standard_nc6s_v3", + "standard_nc12s_v3", + "standard_nc24s_v3", + "standard_nc24rs_v3", + + "standard_nc4as_t4_v3", + "standard_nc8as_t4_v3", + "standard_nc16as_t4_v3", + "standard_nc64as_t4_v3", + + "standard_nd6s", + "standard_nd12s", + "standard_nd24s", + "standard_nd24rs", + + "standard_nd96asr_v4", + + "standard_nv6", + "standard_nv12", + "standard_nv24", + + "standard_nv6_promo", + "standard_nv12_promo", + "standard_nv24_promo", + + "standard_nv12s_v3", + "standard_nv24s_v3", + "standard_nv48s_v3", + + "standard_nv4as_v4", + "standard_nv8as_v4", + "standard_nv16as_v4", + "standard_nv32as_v4" + ], + hpc: [ + "standard_a8_v2", + "standard_a8m_v2", + "^standard_h[0-9a-z]*$", + "^standard_h[0-9a-z]*_promo$", + "^standard_h[bc][0-9a-z]*$", + "^standard_h[bc][0-9a-z]*_promo*$", + "^standard_h[bc][0-9a-z]*_[v2]*$", + "^standard_h[bc][0-9a-z]*_[v2]*_promo*$", + "standard_hb60rs", + "standard_hc44rs", + "standard_hb120rs_v3", + "standard_hb120_16rs_v3", + "standard_hb120_32rs_v3", + "standard_hb120_64rs_v3", + "standard_hb120_96rs_v3" + ], + standard: [ + "^standard_a[0-9a-z]*$", + "^standard_d[0-9a-z]*$", + "^basic_a[0-9a-z]*$", + "small", + "medium", + "large", + "extralarge", + "^a[1-9][0-9]*$" + ], + storage: [ + "^standard_l[0-9]*s_v2*$" + ], + fpga: [ + "standard_np10s", + "standard_np20s", + "standard_np40s" + ] + }) + + // delete bc you can get this information directly through API public additionalVmSizeCores = { extrasmall: 1, small: 1, @@ -49,55 +231,54 @@ export class VmSizeService implements OnDestroy { extralarge: 8, }; - private _includedSizes = new BehaviorSubject(null); - private _vmSizeCategories = new BehaviorSubject>(null); private _destroy = new Subject(); constructor( private arm: ArmHttpService, - private githubData: GithubDataService, accountService: BatchAccountService) { - this.loadVmSizeData(); - - this.sizes = accountService.currentAccount.pipe( + this.cloudServiceSizes = accountService.currentAccount.pipe( takeUntil(this._destroy), switchMap((account) => { if (!(account instanceof ArmBatchAccount)) { return of(null); } else { - return this._fetchVmSizesForAccount(account); + const cloudServiceUrl = `${supportedSkusUrl(account.subscription.subscriptionId, account.location)}/cloudServiceSkus?api-version=2021-06-01` + return this._fetchVmSkusForAccount(account, cloudServiceUrl); } }), publishReplay(1), refCount(), ); - const obs = combineLatest(this.sizes, this._includedSizes); - - this.cloudServiceSizes = obs.pipe( - map(([sizes, included]) => { - if (!included) { - return sizes; + this.virtualMachineSizes = accountService.currentAccount.pipe( + takeUntil(this._destroy), + switchMap((account) => { + if (!(account instanceof ArmBatchAccount)) { + return of(null); + } else { + const vmUrl = `${supportedSkusUrl(account.subscription.subscriptionId, account.location)}/virtualMachineSkus?api-version=2021-06-01` + return this._fetchVmSkusForAccount(account, vmUrl); } - return this.filterSizes(sizes, included.all.concat(included.paas)); }), publishReplay(1), refCount(), ); - this.virtualMachineSizes = obs.pipe( - map(([sizes, included]) => { - if (!included) { - return sizes; + this.sizes = combineLatest([this.cloudServiceSizes, this.virtualMachineSizes]).pipe( + map(([cloudServiceSizes, virtualMachineSizes]) => { + if (cloudServiceSizes && !virtualMachineSizes) { + return cloudServiceSizes; + } else if (!cloudServiceSizes && virtualMachineSizes) { + return virtualMachineSizes; + } else if (!cloudServiceSizes && !virtualMachineSizes) { + return null; } - return this.filterSizes(sizes, included.all.concat(included.iaas)); + return cloudServiceSizes.merge(virtualMachineSizes); }), publishReplay(1), refCount(), ); - - this.vmSizeCategories = this._vmSizeCategories.asObservable(); } public ngOnDestroy() { @@ -105,27 +286,6 @@ export class VmSizeService implements OnDestroy { this._destroy.complete(); } - public loadVmSizeData() { - this.githubData.get(includedVmsSizesPath).subscribe({ - next: (response: string) => { - const responseJson = JSON.parse(response); - const data: VmSizeData = { - category: responseJson.category, - included: { - all: responseJson.all, - paas: responseJson.paas, - iaas: responseJson.iaas, - }, - }; - this._vmSizeCategories.next(data.category); - this._includedSizes.next(data.included); - }, - error: (error) => { - log.error("Error loading included vm sizes from github", error); - }, - }); - } - public get(vmSize: string): Observable { return this.sizes.pipe( take(1), @@ -139,34 +299,9 @@ export class VmSizeService implements OnDestroy { share(), ); } - /** - * Filter the given list of vm sizes by including any patching the given patterns. - * @param sizes Sizes to filter - * @param includedPatterns List of regex patterns to include - */ - public filterSizes(sizes: List, includedPatterns: string[]): List { - if (!sizes) { - return null; - } - return List(sizes.filter((size) => { - for (const regex of includedPatterns) { - if (new RegExp(regex).test(size.name.toLowerCase())) { - return true; - } - } - return false; - })); - } - private _fetchVmSizesForAccount(account: ArmBatchAccount): Observable | null> { - const { subscription, location } = account; - const url = `${computeUrl(subscription.subscriptionId)}/skus`; - const options = { - params: { - "$filter": `location eq '${location}'` - } - }; - return this.arm.get>(url, options).pipe( + private _fetchVmSkusForAccount(account: ArmBatchAccount, query: string): Observable | null> { + return this.arm.get>(query).pipe( map((response) => { return mapResourceSkuToVmSize(response.value); }), diff --git a/src/app/services/compute/vmsize_sample_responses.ts b/src/app/services/compute/vmsize_sample_responses.ts index f734d1479b..2abf38f87b 100644 --- a/src/app/services/compute/vmsize_sample_responses.ts +++ b/src/app/services/compute/vmsize_sample_responses.ts @@ -1,4 +1,4 @@ -export const vmSizeSampleResponse = { +export const cloudServiceResponse = { "value": [ { "resourceType": "virtualMachines", @@ -29,34 +29,20 @@ export const vmSizeSampleResponse = { { "name": "GPUs", "value": "0" - }, + } ], "locationInfo": [ { "location": "westus", "zones": [ - "2", - "1" - ], - "zoneDetails": [ - { - "name": [ - "2" - ], - "capabilities": [ - { - "name": "UltraSSDAvailable", - "value": "True" - } - ] - } + "1", ] } ], - "name": "Standard_A0", + "name": "small", "tier": "Standard", - "size": "A0", - "family": "standardA0_A7Family" + "size": "small", + "family": "standardSmallFamily" }, { "resourceType": "virtualMachines", @@ -66,7 +52,7 @@ export const vmSizeSampleResponse = { "capabilities": [ { "name": "MaxResourceVolumeMB", - "value": "71680" + "value": "51200" }, { "name": "OSVhdSizeMB", @@ -78,32 +64,36 @@ export const vmSizeSampleResponse = { }, { "name": "MemoryGB", - "value": "1.75" + "value": "3.5" }, { "name": "MaxDataDiskCount", - "value": "2" + "value": "4" }, { "name": "GPUs", - "value": "0" + "value": "2" } ], "locationInfo": [ { - "location": "westus", + "location": "eastus", "zones": [ "1", - "2", - "3" - ] + ], + "zoneDetails": [] } ], - "name": "Standard_A1", + "name": "Standard_D1", "tier": "Standard", - "size": "A1", - "family": "standardA0_A7Family" - }, + "size": "D1", + "family": "standardDFamily" + } + ] +} + +export const virtualMachineResponse = { + "value": [ { "resourceType": "virtualMachines", "locations": [ @@ -112,7 +102,7 @@ export const vmSizeSampleResponse = { "capabilities": [ { "name": "MaxResourceVolumeMB", - "value": "20480" + "value": "71680" }, { "name": "OSVhdSizeMB", @@ -124,11 +114,11 @@ export const vmSizeSampleResponse = { }, { "name": "MemoryGB", - "value": "0.75" + "value": "1.75" }, { "name": "MaxDataDiskCount", - "value": "1" + "value": "2" }, { "name": "GPUs", @@ -140,13 +130,15 @@ export const vmSizeSampleResponse = { "location": "westus", "zones": [ "1", + "2", + "3" ] } ], - "name": "small", + "name": "Standard_A1", "tier": "Standard", - "size": "small", - "family": "standardSmallFamily" + "size": "A1", + "family": "standardA0_A7Family" }, { "resourceType": "virtualMachines", @@ -193,8 +185,7 @@ export const vmSizeSampleResponse = { "size": "D1", "family": "standardDFamily" } - ], - "nextLink": null + ] } export const badResponseIsNaN = { From e7be384e4c9db3eebffb13106f0b1a30894a72c6 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Fri, 1 Apr 2022 11:11:34 -0400 Subject: [PATCH 03/49] Bumps version to 2.14.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23decf9c11..0623080b7b 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "name": "Microsoft Corporation", "email": "batchexplorer@microsoft.com" }, - "version": "2.13.0", + "version": "2.14.0", "main": "build/client/main.prod.js", "scripts": { "ts": "ts-node --project tsconfig.node.json --files", From dc981648624d94b32ea70c9ea037c5bd10fa639f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Apr 2022 10:36:17 -0700 Subject: [PATCH 04/49] Bump plist from 3.0.4 to 3.0.5 (#2493) Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.4 to 3.0.5. - [Release notes](https://github.com/TooTallNate/node-plist/releases) - [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md) - [Commits](https://github.com/TooTallNate/node-plist/commits) --- updated-dependencies: - dependency-name: plist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 76346bc3b2..ad800354f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "batch-explorer", - "version": "2.13.0", + "version": "2.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "batch-explorer", - "version": "2.13.0", + "version": "2.14.0", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -16686,9 +16686,9 @@ } }, "node_modules/plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "dev": true, "dependencies": { "base64-js": "^1.5.1", @@ -36932,9 +36932,9 @@ } }, "plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "dev": true, "requires": { "base64-js": "^1.5.1", From 3bd43c75609c95788a723f8acb423697aee0d52b Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Tue, 19 Apr 2022 16:21:50 -0400 Subject: [PATCH 05/49] Upgrades to Electron 13 Possibly addresses issues with Conditional Access policies that require a minimum Chromium version of 91. (#2446) --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad800354f0..8920f3b819 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,7 @@ "copy-webpack-plugin": "^6.0.3", "cross-env": "^5.2.1", "css-loader": "^2.1.1", - "electron": "12.2.3", + "electron": "^13.6.9", "electron-builder": "22.14.13", "eslint": "^7.19.0", "eslint-config-prettier": "^7.2.0", @@ -7860,9 +7860,9 @@ } }, "node_modules/electron": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-12.2.3.tgz", - "integrity": "sha512-B27c7eqx1bC5kea6An8oVhk1pShNC4VGqWarHMhD47MDtmg54KepHO5AbAvmKKZK/jWN7NTC7wyCYTDElJNtQA==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.9.tgz", + "integrity": "sha512-Es/sBy85NIuqsO9MW41PUCpwIkeinlTQ7g0ainfnmRAM2rmog3GBxVCaoV5dzEjwTF7TKG1Yr/E7Z3qHmlfWAg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -30039,9 +30039,9 @@ } }, "electron": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-12.2.3.tgz", - "integrity": "sha512-B27c7eqx1bC5kea6An8oVhk1pShNC4VGqWarHMhD47MDtmg54KepHO5AbAvmKKZK/jWN7NTC7wyCYTDElJNtQA==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.9.tgz", + "integrity": "sha512-Es/sBy85NIuqsO9MW41PUCpwIkeinlTQ7g0ainfnmRAM2rmog3GBxVCaoV5dzEjwTF7TKG1Yr/E7Z3qHmlfWAg==", "dev": true, "requires": { "@electron/get": "^1.0.1", diff --git a/package.json b/package.json index 0623080b7b..40cebe7a7e 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "copy-webpack-plugin": "^6.0.3", "cross-env": "^5.2.1", "css-loader": "^2.1.1", - "electron": "12.2.3", + "electron": "^13.6.9", "electron-builder": "22.14.13", "eslint": "^7.19.0", "eslint-config-prettier": "^7.2.0", From e0539e3cb1b42119054fde69bbbb56f082db982d Mon Sep 17 00:00:00 2001 From: rechen Date: Wed, 9 Mar 2022 17:32:11 -0800 Subject: [PATCH 06/49] Fix task output warning background color AB#335 --- src/@batch-flask/ui/loading/loading.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/@batch-flask/ui/loading/loading.scss b/src/@batch-flask/ui/loading/loading.scss index d5bfd4ac81..0cf6ed1af8 100644 --- a/src/@batch-flask/ui/loading/loading.scss +++ b/src/@batch-flask/ui/loading/loading.scss @@ -89,7 +89,7 @@ bl-loading { .entity-not-found { width: 600px; margin: 50px auto; - background: $warn-color-light; + background: $warn-color; padding: 10px; color: $warn-contrast-color; white-space: pre; From 73edc393db9cbb50a794ba8f76530ec014a13c30 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Wed, 16 Mar 2022 12:10:33 -0400 Subject: [PATCH 07/49] Fix border contrast of code sample package install inputs Fixes AB#291 --- .../programing-sample/programing-sample.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/components/account/details/programatic-usage/programing-sample/programing-sample.scss b/src/app/components/account/details/programatic-usage/programing-sample/programing-sample.scss index 445a6c3006..c1a5c5ed7f 100644 --- a/src/app/components/account/details/programatic-usage/programing-sample/programing-sample.scss +++ b/src/app/components/account/details/programatic-usage/programing-sample/programing-sample.scss @@ -14,4 +14,8 @@ bl-programing-sample { > bl-editor { flex: 1; } + + bl-tp-cell { + border: 1px solid var(--color-input-border); + } } From 2df167429be22f16f495beaf16d3523151357b3b Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Tue, 15 Mar 2022 18:29:02 -0400 Subject: [PATCH 08/49] Fix for missing image icons Only behavior was spammed errors to the console. --- src/app/utils/pool-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/utils/pool-utils.ts b/src/app/utils/pool-utils.ts index 041c86388d..562ddcc0de 100644 --- a/src/app/utils/pool-utils.ts +++ b/src/app/utils/pool-utils.ts @@ -88,7 +88,7 @@ export class PoolUtils { } public static iconForOffer(offerName: string) { - const icon = iconMapping[offerName.toLowerCase()]; + const icon = iconMapping[offerName?.toLowerCase()]; if (icon) { return icon; } From 23849023c4739b5baf99089ce812a2704a366b91 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Tue, 15 Mar 2022 18:29:48 -0400 Subject: [PATCH 09/49] Fixes AB#315: Native tooltips for gallery actions --- .../components/gallery/application-action/choose-action.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/components/gallery/application-action/choose-action.html b/src/app/components/gallery/application-action/choose-action.html index 18ea60bc35..6b3a7f0ef7 100644 --- a/src/app/components/gallery/application-action/choose-action.html +++ b/src/app/components/gallery/application-action/choose-action.html @@ -4,7 +4,8 @@
{{action.name}}
{{action.description}}
- + From d104b7241bfb5db4c74ee2b32632138cce96ca28 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 16 Mar 2022 13:36:55 -0400 Subject: [PATCH 10/49] Fixes silent DatetimePicker error on midnight value --- .../ui/datetime-picker/datetime-picker.component.spec.ts | 5 +++++ .../ui/datetime-picker/datetime-picker.component.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/@batch-flask/ui/datetime-picker/datetime-picker.component.spec.ts b/src/@batch-flask/ui/datetime-picker/datetime-picker.component.spec.ts index 847900b30c..caadc69f06 100644 --- a/src/@batch-flask/ui/datetime-picker/datetime-picker.component.spec.ts +++ b/src/@batch-flask/ui/datetime-picker/datetime-picker.component.spec.ts @@ -72,6 +72,11 @@ describe("DatetimePickerComponent", () => { expect(testComponent.control.value).toEqual(new Date(2017, 11, 14, 17, 32)); }); + it("correctly handles midnight", () => { + testComponent.control.setValue(new Date(2022, 3, 15, 0, 0)); + expect(timeInputEl.nativeElement.value).toEqual("00:00"); + }); + it("updates the inputs when setting the date time as a string", () => { testComponent.control.setValue(new Date(2017, 11, 14, 17, 32).toISOString()); expect(dateInputEl.nativeElement.value).toEqual("12/14/2017"); diff --git a/src/@batch-flask/ui/datetime-picker/datetime-picker.component.ts b/src/@batch-flask/ui/datetime-picker/datetime-picker.component.ts index 52251fc146..fee36ca605 100644 --- a/src/@batch-flask/ui/datetime-picker/datetime-picker.component.ts +++ b/src/@batch-flask/ui/datetime-picker/datetime-picker.component.ts @@ -106,7 +106,7 @@ export class DatetimePickerComponent implements ControlValueAccessor, OnDestroy const datetime = this._getDate(value).setZone(this.currentTimeZone.name); this.datetime.patchValue({ date: datetime.toJSDate(), - time: `${datetime.hour}:${datetime.minute}`, + time: datetime.toFormat("HH:mm") }); this.changeDetector.markForCheck(); } From c948303afcb4c03d185f5ed6f682510449ab0be3 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 16 Mar 2022 15:35:35 -0400 Subject: [PATCH 11/49] Fixes AB#465: "Unselect All" navigable by keyboard --- .../select-dropdown/select-dropdown.component.ts | 11 ++++++++++- src/@batch-flask/ui/select/select.component.ts | 9 +++++++-- .../data-disk-picker.component.spec.ts | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/@batch-flask/ui/select/select-dropdown/select-dropdown.component.ts b/src/@batch-flask/ui/select/select-dropdown/select-dropdown.component.ts index 5275645251..22098a1467 100644 --- a/src/@batch-flask/ui/select/select-dropdown/select-dropdown.component.ts +++ b/src/@batch-flask/ui/select/select-dropdown/select-dropdown.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, Inject, forwardRef, } from "@angular/core"; +import { ListKeyNavigator } from "@batch-flask/core"; import { SelectOptionComponent } from "@batch-flask/ui/select/option"; import { SelectComponent } from "../select.component"; @@ -64,6 +65,8 @@ export class SelectDropdownComponent { } public rows: any; + public keyNavigator: ListKeyNavigator; + private _displayedOptions: SelectOptionComponent[] = []; private _focusedOption: any; private _multiple: any; @@ -110,9 +113,15 @@ export class SelectDropdownComponent { private _computeOptions() { let fixedOptions = []; if (this.multiple) { - fixedOptions = [{ value: unselectAllOptionId, label: "Unselect all", cssClass: "unselect-all-option" }]; + fixedOptions = [{ + id: unselectAllOptionId, + value: unselectAllOptionId, + label: "Unselect all", + cssClass: "unselect-all-option" + }]; } this.rows = fixedOptions.concat(this._displayedOptions); + this.keyNavigator.items = this.rows; this.changeDetector.markForCheck(); } } diff --git a/src/@batch-flask/ui/select/select.component.ts b/src/@batch-flask/ui/select/select.component.ts index 2983ffcb90..07b007a887 100644 --- a/src/@batch-flask/ui/select/select.component.ts +++ b/src/@batch-flask/ui/select/select.component.ts @@ -132,8 +132,9 @@ export class SelectComponent implements FormFieldControl, Opt public set displayedOptions(displayedOptions: SelectOptionComponent[]) { this._displayedOptions = displayedOptions; - if (this._dropdownRef) { this._dropdownRef.instance.displayedOptions = displayedOptions; } - this._keyNavigator.items = displayedOptions; + if (this._dropdownRef) { + this._dropdownRef.instance.displayedOptions = displayedOptions; + } } public get displayedOptions() { return this._displayedOptions; } @@ -295,6 +296,7 @@ export class SelectComponent implements FormFieldControl, Opt const injector = new SelectInjector(this, this.injector); const portal = new ComponentPortal(SelectDropdownComponent, null, injector); const ref = this._dropdownRef = this._overlayRef.attach(portal); + ref.instance.keyNavigator = this._keyNavigator; ref.instance.id = this.dropdownId; ref.instance.displayedOptions = this.displayedOptions; ref.instance.focusedOption = this.focusedOption; @@ -318,6 +320,7 @@ export class SelectComponent implements FormFieldControl, Opt this._filterInputEl.nativeElement.focus(); }); } + this.changeDetector.markForCheck(); } @@ -455,6 +458,8 @@ export class SelectComponent implements FormFieldControl, Opt // If the filter makes it that we don't see the currently focusesd option fallback to focussing the first item if (!focusedOptionIncluded && this.dropdownOpen && this.filterable && this.filter) { this.focusFirstOption(); + } else { + this._keyNavigator.items = options; } this.changeDetector.markForCheck(); } diff --git a/src/app/components/pool/action/add/os-picker/data-disk-picker/data-disk-picker.component.spec.ts b/src/app/components/pool/action/add/os-picker/data-disk-picker/data-disk-picker.component.spec.ts index 5e0bd87b44..b13a345e40 100644 --- a/src/app/components/pool/action/add/os-picker/data-disk-picker/data-disk-picker.component.spec.ts +++ b/src/app/components/pool/action/add/os-picker/data-disk-picker/data-disk-picker.component.spec.ts @@ -89,7 +89,7 @@ describe("DataDiskPickerComponent", () => { }); }); - it("udpates the editable table with changes", () => { + it("updates the editable table with changes", () => { testComponent.disks.setValue([new DataDiskDto({ caching: CachingType.Readonly, diskSizeGB: 1024, From a1fd01a3ff1b5b0bd155c6b126f7816050483fa6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Apr 2022 14:12:39 -0700 Subject: [PATCH 12/49] Bump moment from 2.29.1 to 2.29.3 (#2496) Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.3. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.3) --- updated-dependencies: - dependency-name: moment dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rena --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8920f3b819..ec09fda2be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14910,9 +14910,9 @@ "dev": true }, "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", "engines": { "node": "*" } @@ -35535,9 +35535,9 @@ "dev": true }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" }, "monaco-editor": { "version": "0.19.3", From 1487abe464f3cdd45542865736b3f2a0caa7662a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Apr 2022 21:39:42 +0000 Subject: [PATCH 13/49] Bump minimist from 1.2.5 to 1.2.6 (#2488) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rena --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec09fda2be..3054cb7558 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14750,9 +14750,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minimist-options": { "version": "4.1.0", @@ -35406,9 +35406,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minimist-options": { "version": "4.1.0", From 319574c267fce60fd625477a4a818cd9a8adce19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Apr 2022 22:33:26 +0000 Subject: [PATCH 14/49] Bump karma from 6.3.14 to 6.3.16 (#2467) Bumps [karma](https://github.com/karma-runner/karma) from 6.3.14 to 6.3.16. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.14...v6.3.16) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rena --- package-lock.json | 16 +++++++++------- package.json | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3054cb7558..9b0c9fcf98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -110,7 +110,7 @@ "jasmine": "~3.5.0", "jasmine-core": "^3.6.0", "jasmine-spec-reporter": "^4.2.1", - "karma": "^6.3.14", + "karma": "^6.3.16", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.3", "karma-electron": "^6.3.4", @@ -13445,9 +13445,9 @@ } }, "node_modules/karma": { - "version": "6.3.14", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.14.tgz", - "integrity": "sha512-SDFoU5F4LdosEiUVWUDRPCV/C1zQRNtIakx7rWkigf7R4sxGADlSEeOma4S1f/js7YAzvqLW92ByoiQptg+8oQ==", + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", + "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==", "dev": true, "dependencies": { "body-parser": "^1.19.0", @@ -13465,6 +13465,7 @@ "log4js": "^6.4.1", "mime": "^2.5.2", "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", @@ -34359,9 +34360,9 @@ } }, "karma": { - "version": "6.3.14", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.14.tgz", - "integrity": "sha512-SDFoU5F4LdosEiUVWUDRPCV/C1zQRNtIakx7rWkigf7R4sxGADlSEeOma4S1f/js7YAzvqLW92ByoiQptg+8oQ==", + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", + "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==", "dev": true, "requires": { "body-parser": "^1.19.0", @@ -34379,6 +34380,7 @@ "log4js": "^6.4.1", "mime": "^2.5.2", "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", diff --git a/package.json b/package.json index 40cebe7a7e..9b8899884e 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "jasmine": "~3.5.0", "jasmine-core": "^3.6.0", "jasmine-spec-reporter": "^4.2.1", - "karma": "^6.3.14", + "karma": "^6.3.16", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.3", "karma-electron": "^6.3.4", From d74c92a9b304da25910d8c97145a2d7eeb5135cc Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 2 Mar 2022 15:26:34 -0500 Subject: [PATCH 15/49] Fixes issue with failed silent auth Batch Explorer would not start when an exception is thrown during silent auth that isn't an authentication error. --- src/client/core/aad/auth-provider.spec.ts | 22 ++++++++++++++++++++++ src/client/core/aad/auth-provider.ts | 4 +++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/client/core/aad/auth-provider.spec.ts b/src/client/core/aad/auth-provider.spec.ts index 4ee00c39e7..082dbdc15d 100644 --- a/src/client/core/aad/auth-provider.spec.ts +++ b/src/client/core/aad/auth-provider.spec.ts @@ -156,6 +156,28 @@ describe("AuthProvider", () => { expectRetryable(["50071", "50133"], false); // One retryable, one not }); + + it("shouldn't fail with non-auth exception", async () => { + spyOn(authProvider, "_createClient").and.callFake(tenantId => { + const spy = makeClientApplicationSpy(); + returnToken(spy.acquireTokenByCode, `${tenantId}-token`); + return spy; + }); + const authCodeSpy = + jasmine.createSpy("authCodeCallback").and.returnValues( + Promise.reject(new Error("Non-auth error")), + ); + + try { + await authProvider.getToken({ + tenantId: "tenant1", + resourceURI: "resourceURI1", + authCodeCallback: authCodeSpy + }); + } catch (e) { + fail(`Should not have thrown error: ${e}`); + } + }); }); const makeTokenCacheSpy = () => jasmine.createSpyObj( diff --git a/src/client/core/aad/auth-provider.ts b/src/client/core/aad/auth-provider.ts index 69f0fed08c..014192ce10 100644 --- a/src/client/core/aad/auth-provider.ts +++ b/src/client/core/aad/auth-provider.ts @@ -101,7 +101,9 @@ export default class AuthProvider { ); code = await authCodeCallback(url, tenantId, true); } catch (silentAuthException) { - if (!this._isTenantAuthRetryable(silentAuthException)) { + log.debug(`[${tenantId}] Silent auth failed (${silentAuthException})`) + if (silentAuthException instanceof AuthorizeError && + !this._isTenantAuthRetryable(silentAuthException)) { log.warn(`Fatal authentication exception for ${tenantId}:` + ` ${silentAuthException} (non-retryable error code ` + silentAuthException.errorCodes.join(";") + `)`); From 7b0a8bd22927e463f16e209515bbba43b70f07d9 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 2 Mar 2022 16:27:27 -0500 Subject: [PATCH 16/49] Updates @azure/msal-node to 1.6.0 Support for proxied environments. --- package-lock.json | 72 +++++++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b0c9fcf98..3707964bb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@angular/platform-browser-dynamic": "^11.0.0", "@angular/platform-server": "^11.0.0", "@angular/router": "^11.0.0", - "@azure/msal-node": "^1.3.1", + "@azure/msal-node": "^1.6.0", "@azure/storage-blob": "^10.5.0", "applicationinsights": "^1.8.5", "azure-storage": "^2.10.4", @@ -494,9 +494,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@azure/msal-common": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-5.0.1.tgz", - "integrity": "sha512-CmPR3XM9+CGUu7V/+bAwDxyN6XqWJJhVLmv7utT3sbgay4l5roVXsD1t4wURTs8PwzxmmnJOrhvvGhoDxUW69g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.1.0.tgz", + "integrity": "sha512-IGjAHttOgKDPQr0Qxx1NjABR635ZNuN7LHjxI0Y7SEA2thcaRGTccy+oaXTFabM/rZLt4F2VrPKUX4BnR9hW9g==", "dependencies": { "debug": "^4.1.1" }, @@ -505,12 +505,13 @@ } }, "node_modules/@azure/msal-node": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.3.2.tgz", - "integrity": "sha512-aKU2lVRKhZa1IJ/Za/Ir6qlythQ3FHz0g0px3SbM4iC1otyr3ANS4mIn/6fmkpZDIHc8eAgJh2KMep1Yn2zpig==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.6.0.tgz", + "integrity": "sha512-RCPXVWsjqYZh7NB1pAJLn4ypHlLBulOjw5nKPLsJiaJJIXnN8kc6SMkK3S9/80DZCEBstvoRMz6zF50QZJUeOQ==", "dependencies": { - "@azure/msal-common": "^5.0.1", + "@azure/msal-common": "^6.1.0", "axios": "^0.21.4", + "https-proxy-agent": "^5.0.0", "jsonwebtoken": "^8.5.1", "uuid": "^8.3.0" }, @@ -518,6 +519,29 @@ "node": "10 || 12 || 14 || 16" } }, + "node_modules/@azure/msal-node/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@azure/msal-node/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@azure/msal-node/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -24015,24 +24039,42 @@ } }, "@azure/msal-common": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-5.0.1.tgz", - "integrity": "sha512-CmPR3XM9+CGUu7V/+bAwDxyN6XqWJJhVLmv7utT3sbgay4l5roVXsD1t4wURTs8PwzxmmnJOrhvvGhoDxUW69g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.1.0.tgz", + "integrity": "sha512-IGjAHttOgKDPQr0Qxx1NjABR635ZNuN7LHjxI0Y7SEA2thcaRGTccy+oaXTFabM/rZLt4F2VrPKUX4BnR9hW9g==", "requires": { "debug": "^4.1.1" } }, "@azure/msal-node": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.3.2.tgz", - "integrity": "sha512-aKU2lVRKhZa1IJ/Za/Ir6qlythQ3FHz0g0px3SbM4iC1otyr3ANS4mIn/6fmkpZDIHc8eAgJh2KMep1Yn2zpig==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.6.0.tgz", + "integrity": "sha512-RCPXVWsjqYZh7NB1pAJLn4ypHlLBulOjw5nKPLsJiaJJIXnN8kc6SMkK3S9/80DZCEBstvoRMz6zF50QZJUeOQ==", "requires": { - "@azure/msal-common": "^5.0.1", + "@azure/msal-common": "^6.1.0", "axios": "^0.21.4", + "https-proxy-agent": "^5.0.0", "jsonwebtoken": "^8.5.1", "uuid": "^8.3.0" }, "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", diff --git a/package.json b/package.json index 9b8899884e..78b32bb324 100644 --- a/package.json +++ b/package.json @@ -172,7 +172,7 @@ "@angular/platform-browser-dynamic": "^11.0.0", "@angular/platform-server": "^11.0.0", "@angular/router": "^11.0.0", - "@azure/msal-node": "^1.3.1", + "@azure/msal-node": "^1.6.0", "@azure/storage-blob": "^10.5.0", "applicationinsights": "^1.8.5", "azure-storage": "^2.10.4", From 8cbb11e3e932ec4469c820dee9be7ca5a77528ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Apr 2022 22:18:54 +0000 Subject: [PATCH 17/49] Bump ejs from 3.1.6 to 3.1.7 Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.7. - [Release notes](https://github.com/mde/ejs/releases) - [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md) - [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.7) --- updated-dependencies: - dependency-name: ejs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 228 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 183 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3707964bb5..8c24ba97ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3895,10 +3895,9 @@ } }, "node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "node_modules/async-each": { "version": "1.0.3", @@ -7869,12 +7868,12 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", + "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", "dev": true, "dependencies": { - "jake": "^10.6.1" + "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" @@ -10110,12 +10109,33 @@ "optional": true }, "node_modules/filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", + "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", "dev": true, "dependencies": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/filename-reserved-regex": { @@ -12908,13 +12928,13 @@ } }, "node_modules/jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "dependencies": { - "async": "0.9.x", - "chalk": "^2.4.2", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, @@ -12922,7 +12942,71 @@ "jake": "bin/cli.js" }, "engines": { - "node": "*" + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/jasmine": { @@ -23454,11 +23538,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/winston/node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, "node_modules/winston/node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -26775,10 +26854,9 @@ "dev": true }, "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "async-each": { "version": "1.0.3", @@ -30073,12 +30151,12 @@ "dev": true }, "ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", + "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", "dev": true, "requires": { - "jake": "^10.6.1" + "jake": "^10.8.5" } }, "electron": { @@ -31849,12 +31927,32 @@ "optional": true }, "filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", + "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", "dev": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "filename-reserved-regex": { @@ -33965,15 +34063,60 @@ } }, "jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", + "async": "^3.2.3", + "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jasmine": { @@ -42330,11 +42473,6 @@ "winston-transport": "^4.4.0" }, "dependencies": { - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", From f7b5fcf346a2fcfd21576aa1f8ce2b0e8ac3b4ff Mon Sep 17 00:00:00 2001 From: Rena Date: Thu, 12 May 2022 10:32:07 -0700 Subject: [PATCH 18/49] Fix heatmap node display issues (#2497) * [WIP] Added new gradient colors to heatmap TODO: update legend to collapse sub-states and pick better naming for the running task slot sub-states * Categories can expand and contract now and are closed by default. * colors of the categories will stay as subitem color * [WIP] need to fix running state error (showing up as black instead of green) * [WIP] need to add dropdown icon next to categories * Fix selectState logic and add caret expansion and collapse identifier on categories * Add logic for handling task slots for running state * Change task slot colors to be more accessible * Add 100% for heatmap legend and picked colors for heatmap * clean up * Fix typo * Comment explaining state counter for running task usages * Remove whitespace * Fix unit tests * [WIP] fix unit tests for running task overlay * Fix async issue and fix state counter unit tests * Add running task slot usage tests and fix percentages * Add a few more tests for task slot usage overlay --- .../node-property-display.component.spec.ts | 2 +- .../pool/graphs/heatmap/heatmap-color.spec.ts | 8 -- .../pool/graphs/heatmap/heatmap-color.ts | 2 +- .../nodes-heatmap-legend.component.spec.ts | 20 ++--- .../legend/nodes-heatmap-legend.component.ts | 21 +++-- .../heatmap/legend/nodes-heatmap-legend.html | 20 +++-- .../heatmap/legend/nodes-heatmap-legend.scss | 8 ++ .../heatmap/nodes-heatmap.component.spec.ts | 72 ++++++++------- .../graphs/heatmap/nodes-heatmap.component.ts | 87 ++++++++----------- .../pool/graphs/heatmap/state-counter.spec.ts | 15 +++- .../pool/graphs/heatmap/state-counter.ts | 31 ++++++- .../pool/graphs/heatmap/state-tree.ts | 1 + .../pool/graphs/pool-graphs.component.ts | 2 +- src/app/models/azure-batch/node/node.ts | 5 ++ src/app/utils/index.ts | 1 + src/app/utils/node-utils.ts | 23 +++++ 16 files changed, 190 insertions(+), 128 deletions(-) create mode 100644 src/app/utils/node-utils.ts diff --git a/src/app/components/node/connect/property-display/node-property-display.component.spec.ts b/src/app/components/node/connect/property-display/node-property-display.component.spec.ts index 232990e855..02b2311eaa 100644 --- a/src/app/components/node/connect/property-display/node-property-display.component.spec.ts +++ b/src/app/components/node/connect/property-display/node-property-display.component.spec.ts @@ -286,7 +286,7 @@ describe("NodePropertyDisplay", () => { click(checkboxEl.query(By.css("input"))); expect(checkboxEl.componentInstance.checked).toBe(false); - await new Promise(r => setTimeout(() => r(), 1000)); + await new Promise(r => setTimeout(() => r(), 1000)); expect(component.userConfig.isAdmin).toEqual(false); }); }); diff --git a/src/app/components/pool/graphs/heatmap/heatmap-color.spec.ts b/src/app/components/pool/graphs/heatmap/heatmap-color.spec.ts index 46017aae3b..7140604035 100644 --- a/src/app/components/pool/graphs/heatmap/heatmap-color.spec.ts +++ b/src/app/components/pool/graphs/heatmap/heatmap-color.spec.ts @@ -29,14 +29,6 @@ describe("Statecounter", () => { expect(colors.get("running")).toEqual("#888888"); }); - it("substate should have category color by default", () => { - expect(colors.get("starting")).toEqual("#777777"); - expect(colors.get("rebooting")).toEqual("#777777"); - - expect(colors.get("startTaskFailed")).toEqual("#5555555"); - expect(colors.get("unusable")).toEqual("#5555555"); - }); - describe("when highlighting a state", () => { beforeEach(() => { colors.updateColors("idle"); diff --git a/src/app/components/pool/graphs/heatmap/heatmap-color.ts b/src/app/components/pool/graphs/heatmap/heatmap-color.ts index 450c74d805..c0323e3798 100644 --- a/src/app/components/pool/graphs/heatmap/heatmap-color.ts +++ b/src/app/components/pool/graphs/heatmap/heatmap-color.ts @@ -49,7 +49,7 @@ export class HeatmapColor { colors[item.state] = item.color; } else { for (const subitem of item.states) { - colors[subitem.state] = item.color; + colors[subitem.state] = subitem.color; } } } diff --git a/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.component.spec.ts b/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.component.spec.ts index 55923f7bf7..bd1d9cf3ec 100644 --- a/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.component.spec.ts +++ b/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.component.spec.ts @@ -54,29 +54,25 @@ describe("NodesHeatmapLegendComponent", () => { fixture.detectChanges(); }); - it("should show all states", () => { + it("should show all states initially", () => { const stateEls = fixture.debugElement.queryAll(By.css(".legend-item.state")); expect(stateEls.length).toBe(2); expect(stateEls[0].nativeElement.textContent).toContain("idle"); expect(stateEls[1].nativeElement.textContent).toContain("running"); }); - it("should show all categories", () => { + it("should not show substates initially", () => { + const substates = fixture.debugElement.queryAll(By.css(".legend-subitem.state")); + expect(substates.length).toBe(0); + }); + + it("should show all categories initially", () => { const categories = fixture.debugElement.queryAll(By.css(".legend-item.category")); expect(categories.length).toBe(2); expect(categories[0].nativeElement.textContent).toContain("Transition states"); expect(categories[1].nativeElement.textContent).toContain("Error states"); }); - it("should show all substates", () => { - const categories = fixture.debugElement.queryAll(By.css(".legend-subitem.state")); - expect(categories.length).toBe(4); - expect(categories[0].nativeElement.textContent).toContain("rebooting"); - expect(categories[1].nativeElement.textContent).toContain("starting"); - expect(categories[2].nativeElement.textContent).toContain("starttaskfailed"); - expect(categories[3].nativeElement.textContent).toContain("unusable"); - }); - it("should set the colors correctly", () => { const stateEls = fixture.debugElement.queryAll(By.css(".legend-item.state .color")); const bgColor1 = stateEls[0].nativeElement.style.backgroundColor; @@ -104,7 +100,7 @@ describe("NodesHeatmapLegendComponent", () => { click(stateEls[0]); expect(selectedStateSpy).toHaveBeenCalledOnce(); - expect(selectedStateSpy).toHaveBeenCalledWith(null); + expect(selectedStateSpy).toHaveBeenCalledWith(''); fixture.detectChanges(); expect(stateEls[0].classes["highlighted"]).toBe(false, "Should not be highlighted anymore"); }); diff --git a/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.component.ts b/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.component.ts index ebfbf45d2f..071847ca02 100644 --- a/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.component.ts +++ b/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.component.ts @@ -18,14 +18,15 @@ export class NodesHeatmapLegendComponent { @Input() public set nodes(nodes: List) { - this.stateCounter.updateCount(nodes); + this.stateCounter.updateCount(nodes, this.pool); } @Input() public colors: any; + public expandedCategory: string; public stateCounter: StateCounter; - public highlightedState: string = null; + public highlightedState: string; @Output() public selectedStateChange = new EventEmitter(); @@ -37,10 +38,20 @@ export class NodesHeatmapLegendComponent { this.stateCounter = new StateCounter(); } - public selectState(state: string) { - if (state === this.highlightedState) { - this.highlightedState = null; + /** + * Emits state changes for when a state, category, or sub-state is selected. + * + * @param state + * @param categoryParent categories and sub-states will have one + */ + public selectState(state: string, categoryParent: string = "") { + if (state === this.expandedCategory) { + this.expandedCategory = ""; + this.highlightedState = ""; + } else if (state === this.highlightedState) { + this.highlightedState = ""; } else { + this.expandedCategory = categoryParent; this.highlightedState = state; } this.selectedStateChange.emit(this.highlightedState); diff --git a/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.html b/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.html index d0ccf8b3bb..a36a8794c3 100644 --- a/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.html +++ b/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.html @@ -5,15 +5,21 @@
{{item.state}} ({{stateCounter.get(item.state) | async}})
-
-
{{item.label}}
-
- -
-
{{subitem.state}} ({{stateCounter.get(subitem.state) | async}})
+
{{item.label}} ({{stateCounter.getCountforCategory(item.category)}})
+
+ +
+
+
{{item.subtitle}}
+ +
+
{{subitem.state}} ({{stateCounter.get(subitem.state) | async}})
+
+
diff --git a/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.scss b/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.scss index ece3fe7bd3..53d6c5f37e 100644 --- a/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.scss +++ b/src/app/components/pool/graphs/heatmap/legend/nodes-heatmap-legend.scss @@ -19,6 +19,10 @@ bl-nodes-heatmap-legend { cursor: pointer; } + .subtitle { + padding-left: 12%; + } + .legend-item, .legend-subitem { display: flex; align-items: center; @@ -44,4 +48,8 @@ bl-nodes-heatmap-legend { width: $color-width; height: $color-width; } + + .category-expansion { + padding-right: 5%; + } } diff --git a/src/app/components/pool/graphs/heatmap/nodes-heatmap.component.spec.ts b/src/app/components/pool/graphs/heatmap/nodes-heatmap.component.spec.ts index 48244b68b0..d4bb83add7 100644 --- a/src/app/components/pool/graphs/heatmap/nodes-heatmap.component.spec.ts +++ b/src/app/components/pool/graphs/heatmap/nodes-heatmap.component.spec.ts @@ -154,41 +154,33 @@ describe("NodesHeatmapComponent", () => { }); }); - describe("Running task overlay", () => { - it("when there is space should show 2 green stripes", () => { - testComponent.nodes = createNodes(2); - testComponent.pool = new Pool({ id: "pool-4", taskSlotsPerNode: 4 }); - fixture.detectChanges(); - const tiles = svg.selectAll("g.node-group"); - expect(tiles.size()).toBe(2); - tiles.each((d, i, groups) => { - const group = d3.select(groups[i]); - const bg = group.select("g.taskslots"); - const taskRects = bg.selectAll("rect"); - expect(taskRects.size()).toBe(2, "Should have 2 rect"); - taskRects.each((d, i, rects) => { - const rect = d3.select(rects[i]); - expect(rect.attr("height")).not.toBe("0"); - expect(rect.attr("style")).toContain("fill: rgb(56, 142, 60);"); - }); - }); - }); - - it("when there is no space should combine green stripes", () => { - testComponent.nodes = createNodes(2); - testComponent.pool = new Pool({ id: "pool-100", taskSlotsPerNode: 300 }); - fixture.detectChanges(); - const tiles = svg.selectAll("g.node-group"); - expect(tiles.size()).toBe(2); - tiles.each((d, i, groups) => { - const group = d3.select(groups[i]); - const bg = group.select("g.taskslots"); - const taskRects = bg.selectAll("rect"); - expect(taskRects.size()).toBe(1, "Should have only 1 rect"); - taskRects.each((d, i, rects) => { - const rect = d3.select(rects[i]); - expect(rect.attr("height")).not.toBe("0"); - expect(rect.attr("style")).toContain("fill: rgb(56, 142, 60);"); + describe("Running task slot usage overlay", () => { + const params = [ + { usagePercent: "0-25%", runningTaskSlotsCount: 0, fill: "fill: rgb(177, 213, 212);" }, + { usagePercent: "0-25%", runningTaskSlotsCount: 25, fill: "fill: rgb(177, 213, 212);" }, + { usagePercent: "26-50%", runningTaskSlotsCount: 26, fill: "fill: rgb(140, 195, 176);" }, + { usagePercent: "26-50%", runningTaskSlotsCount: 50, fill: "fill: rgb(140, 195, 176);" }, + { usagePercent: "51-75%", runningTaskSlotsCount: 51, fill: "fill: rgb(78, 177, 124);" }, + { usagePercent: "51-75%", runningTaskSlotsCount: 75, fill: "fill: rgb(78, 177, 124);" }, + { usagePercent: "76-99%", runningTaskSlotsCount: 76, fill: "fill: rgb(34, 160, 66);" }, + { usagePercent: "76-99%", runningTaskSlotsCount: 99, fill: "fill: rgb(34, 160, 66);" }, + { usagePercent: "100%", runningTaskSlotsCount: 100, fill: "fill: rgb(23, 141, 23);" }, + ]; + params.forEach((param) => { + it(`should be ${ param.usagePercent } task slot usage color`, () => { + testComponent.nodes = createNodes(1, true, 100, param.runningTaskSlotsCount); + testComponent.pool = new Pool({ id: "pool-1", taskSlotsPerNode: 100 }); + fixture.detectChanges(); + const tiles = svg.selectAll("g.node-group"); + expect(tiles.size()).toBe(1); + tiles.each((d, i, groups) => { + const group = d3.select(groups[i]); + const bg = group.select("g.taskslots"); + const taskRects = bg.selectAll("rect"); + expect(taskRects.size()).toBe(1, "Should have 1 rect"); + + expect(taskRects).not.toBeFalsy("Should have a rect in taskslots group"); + expect(taskRects.attr("style")).toContain(param.fill); }); }); }); @@ -343,15 +335,19 @@ describe("NodesHeatmapComponent", () => { }); }); -function createNodes(count: number, dedicated = true) { +function createNodes( + count: number, + dedicated = true, + runningTasksCount = defaultRunningTasksCount, + runningTaskSlotsCount = defaultRunningTaskSlotsCount) { const nodes: Node[] = []; for (let i = 0; i < count; i++) { nodes.push(Fixture.node.create({ id: `node-${i + 1}`, state: NodeState.running, isDedicated: dedicated, - runningTasksCount: defaultRunningTasksCount, - runningTaskSlotsCount: defaultRunningTaskSlotsCount, + runningTasksCount: runningTasksCount, + runningTaskSlotsCount: runningTaskSlotsCount, })); } return List(nodes); diff --git a/src/app/components/pool/graphs/heatmap/nodes-heatmap.component.ts b/src/app/components/pool/graphs/heatmap/nodes-heatmap.component.ts index aa55750365..ad4b76e8a0 100644 --- a/src/app/components/pool/graphs/heatmap/nodes-heatmap.component.ts +++ b/src/app/components/pool/graphs/heatmap/nodes-heatmap.component.ts @@ -7,7 +7,7 @@ import { ContextMenuItem, ContextMenuSeparator, ContextMenuService } from "@batc import { log } from "@batch-flask/utils"; import { NodeCommands } from "app/components/node/action"; import { Node, NodeState, Pool } from "app/models"; -import { ComponentUtils } from "app/utils"; +import { ComponentUtils, NodeUtils } from "app/utils"; import * as d3 from "d3"; import * as elementResizeDetectorMaker from "element-resize-detector"; import { List } from "immutable"; @@ -23,11 +23,27 @@ interface HeatmapTile { } const idleColor = "#edeef2"; -const runningColor = "#388e3c"; +const runningColor = "#178D17"; const stateTree: StateTree = [ { state: NodeState.idle, color: idleColor }, - { state: NodeState.running, color: runningColor }, + { + category: "running", + label: "Running states", + subtitle: "Task Slots Usage", + color: runningColor, + states: [ + /* + The server will not return these states. These are solely for populating + the heatmap for task slot usage. + */ + { state: NodeState.running25, color: "#B1D5D4"}, + { state: NodeState.running50, color: "#8CC3B0"}, + { state: NodeState.running75, color: "#4EB17C"}, + { state: NodeState.running99, color: "#22A042"}, + { state: NodeState.running100, color: runningColor}, + ], + }, { state: NodeState.waitingForStartTask, color: "#be93d9" }, { state: NodeState.offline, color: "#305796" }, { state: NodeState.preempted, color: "#606060" }, @@ -88,6 +104,7 @@ export class NodesHeatmapComponent implements AfterViewInit, OnChanges, OnDestro public selectedNodeId = new BehaviorSubject(null); public selectedNode = new BehaviorSubject(null); public highlightedState: string; + public expandedCategory: string; public dimensions = { tileSize: 0, @@ -224,7 +241,6 @@ export class NodesHeatmapComponent implements AfterViewInit, OnChanges, OnDestro .attr("height", z); const backgroundGroup = nodeEnter.append("g").classed("bg", true).merge(groups.select("g.bg")); - // const runningTaskGroup = nodeEnter.append("g").classed("tasks", true).merge(groups.select("g.tasks")); // tslint:disable-next-line: max-line-length const runningTaskSlotsGroup = nodeEnter.append("g").classed("taskslots", true).merge(groups.select("g.taskslots")); const lowPriOverlayGroup = nodeEnter.append("g").classed("lowpri", true).merge(groups.select("g.lowpri")); @@ -294,45 +310,30 @@ export class NodesHeatmapComponent implements AfterViewInit, OnChanges, OnDestro const runningTaskSlotRects = taskSlotGroup.selectAll("rect").data((d) => { const node: Node = d.node; - return this._computeRunningTaskSlotsTilesDimensions(node, z); + if (node.state !== NodeState.running) { + return []; + }; + const percentageUsed = NodeUtils.getTaskSlotsUsagePercent(node, this.pool); + if (percentageUsed <= 25) { + return [this.colors.get(NodeState.running25)]; + } else if (percentageUsed <= 50) { + return [this.colors.get(NodeState.running50)]; + } else if (percentageUsed <= 75) { + return [this.colors.get(NodeState.running75)]; + } else if (percentageUsed <= 99) { + return [this.colors.get(NodeState.running99)]; + } else { + return [this.colors.get(NodeState.running100)]; + } }); runningTaskSlotRects.enter().append("rect").merge(runningTaskSlotRects) - .attr("transform", (data) => { - // const index = data.index; - const x = z - data.position; - return `translate(0,${x})`; - }) .attr("width", z) - .attr("height", (data) => data.taskSlotsHeight) - .style("fill", runningColor); - + .attr("height", z) + .style("fill", (data) => data); runningTaskSlotRects.exit().remove(); } - private _computeRunningTaskSlotsTilesDimensions(node: Node, tileSize: number) { - if (node.state !== NodeState.running) { - return []; - } - const { taskSlotsHeight, combine, remaining } = this._getTaskSlotsHeight(tileSize, node); - if (combine) { - return [{ node, index: 0, taskSlotsHeight, position: taskSlotsHeight }]; - } - const count = Math.max(node.runningTasksCount, 0); - let extra = remaining; - let position = 0; - const array = new Array(count).fill(0).map((task, index) => { - let height = taskSlotsHeight; - if (extra > 0) { - extra--; - height++; - } - position += height + 1; - return { node, index, taskSlotsHeight: height, position }; - }); - return array; - } - /** * Display either how many tasks are running on a given node or an error code if the node errors. * @param Selection object @@ -357,20 +358,6 @@ export class NodesHeatmapComponent implements AfterViewInit, OnChanges, OnDestro }); } - private _getTaskSlotsHeight(tileSize: number, node: Node) { - const taskSlotsPerNode = this.pool.taskSlotsPerNode; - const taskSlotsCount = node.runningTaskSlotsCount; - const taskSlotsHeight = Math.floor((taskSlotsCount / taskSlotsPerNode) * tileSize); - const remaining = tileSize % taskSlotsPerNode; - let height; - const combine = taskSlotsHeight < 2; - if (combine) { - height = Math.floor(tileSize / taskSlotsPerNode * node.runningTaskSlotsCount); - } else { - height = taskSlotsHeight - 1; - } - return { taskSlotsHeight: Math.max(1, height), combine, remaining }; - } /** * Compute the dimension of the heatmap. * - rows diff --git a/src/app/components/pool/graphs/heatmap/state-counter.spec.ts b/src/app/components/pool/graphs/heatmap/state-counter.spec.ts index 3ea56488b8..bd475579db 100644 --- a/src/app/components/pool/graphs/heatmap/state-counter.spec.ts +++ b/src/app/components/pool/graphs/heatmap/state-counter.spec.ts @@ -1,4 +1,4 @@ -import { Node, NodeState } from "app/models"; +import { Node, NodeState, Pool } from "app/models"; import { List } from "immutable"; import * as Fixtures from "test/fixture"; import { StateCounter } from "./state-counter"; @@ -6,9 +6,14 @@ import { StateCounter } from "./state-counter"; describe("Statecounter", () => { let counter: StateCounter; let nodes: Node[]; + let pool1: Pool; beforeEach(() => { counter = new StateCounter(); + pool1 = new Pool({ + id: "pool-1", vmSize: "standard_a2", + targetDedicatedNodes: 8, + }); nodes = [ Fixtures.node.create({ state: NodeState.idle }), Fixtures.node.create({ state: NodeState.running }), @@ -19,7 +24,7 @@ describe("Statecounter", () => { Fixtures.node.create({ state: NodeState.running }), Fixtures.node.create({ state: NodeState.offline }), ]; - counter.updateCount(List(nodes)); + counter.updateCount(List(nodes), pool1); }); it("should count the right number of states", () => { @@ -36,7 +41,11 @@ describe("Statecounter", () => { nodes.shift(); nodes.push(Fixtures.node.create({ state: NodeState.rebooting })); nodes.push(Fixtures.node.create({ state: NodeState.running })); - counter.updateCount(List(nodes)); + const pool2 = new Pool({ + id: "pool-2", vmSize: "standard_a2", + targetDedicatedNodes: 10, + }); + counter.updateCount(List(nodes), pool2); expect(counter.get(NodeState.idle).getValue()).toBe(2); expect(counter.get(NodeState.running).getValue()).toBe(3); diff --git a/src/app/components/pool/graphs/heatmap/state-counter.ts b/src/app/components/pool/graphs/heatmap/state-counter.ts index 278a90d811..767e7a7f82 100644 --- a/src/app/components/pool/graphs/heatmap/state-counter.ts +++ b/src/app/components/pool/graphs/heatmap/state-counter.ts @@ -1,5 +1,6 @@ import { ObjectUtils, log } from "@batch-flask/utils"; -import { Node, NodeState } from "app/models"; +import { Node, NodeState, Pool } from "app/models"; +import { NodeUtils } from "app/utils"; import { List } from "immutable"; import { BehaviorSubject } from "rxjs"; @@ -19,13 +20,32 @@ export class StateCounter { return this._data[state]; } - public updateCount(nodes: List) { + public updateCount(nodes: List, pool: Pool) { const counts: CountMap = {}; for (const state of ObjectUtils.values(NodeState)) { counts[state] = 0; } nodes.forEach((node) => { if (node.state in counts) { + /** + * Only NodeState.running is a valid state from the service. The rest of the + * running states are for displaying task usage info on the UI side, not states + * from the service. + */ + if (node.state === NodeState.running) { + const percentTaskSlotUsage = NodeUtils.getTaskSlotsUsagePercent(node, pool); + if (percentTaskSlotUsage <= 25) { + counts[NodeState.running25]++; + } else if (percentTaskSlotUsage <= 50) { + counts[NodeState.running50]++; + } else if (percentTaskSlotUsage <= 75) { + counts[NodeState.running75]++; + } else if (percentTaskSlotUsage <= 99) { + counts[NodeState.running99]++; + } else { + counts[NodeState.running100]++; + } + } counts[node.state]++; } else { log.error(`Node '${node.id}' has an unknown state '${node.state}'`); @@ -35,4 +55,11 @@ export class StateCounter { (this._data[state] as BehaviorSubject).next(counts[state]); } } + + public getCountforCategory(category: string): number { + const subStates = NodeUtils.getSubStatesforCategory(category); + const totalCount = subStates.reduce( + (result, curState) => result + this.get(curState).value, 0); + return totalCount; + } } diff --git a/src/app/components/pool/graphs/heatmap/state-tree.ts b/src/app/components/pool/graphs/heatmap/state-tree.ts index 51690f0926..088d5e83ef 100644 --- a/src/app/components/pool/graphs/heatmap/state-tree.ts +++ b/src/app/components/pool/graphs/heatmap/state-tree.ts @@ -8,6 +8,7 @@ export interface StateNode { export interface CategoryNode { category: string; label: string; + subtitle?: string; color: string; states: StateNode[]; } diff --git a/src/app/components/pool/graphs/pool-graphs.component.ts b/src/app/components/pool/graphs/pool-graphs.component.ts index a17511dd4c..268672f6c8 100644 --- a/src/app/components/pool/graphs/pool-graphs.component.ts +++ b/src/app/components/pool/graphs/pool-graphs.component.ts @@ -90,7 +90,7 @@ export class PoolGraphsComponent implements OnChanges, OnDestroy { this.changeDetector.markForCheck(); if (nodes.size !== 0) { - this._stateCounter.updateCount(nodes); + this._stateCounter.updateCount(nodes, this.pool); this.runningNodesHistory.update(this.nodes); this.runningTaskHistory.update(this.nodes); } diff --git a/src/app/models/azure-batch/node/node.ts b/src/app/models/azure-batch/node/node.ts index bb9ac85cad..80da2d6278 100644 --- a/src/app/models/azure-batch/node/node.ts +++ b/src/app/models/azure-batch/node/node.ts @@ -85,6 +85,11 @@ export enum NodeState { leavingPool = "leavingpool", rebooting = "rebooting", reimaging = "reimaging", + running25 = "0-25%", + running50 = "26-50%", + running75 = "51-75%", + running99 = "76-99%", + running100 = "100%", running = "running", unknown = "unknown", unusable = "unusable", diff --git a/src/app/utils/index.ts b/src/app/utils/index.ts index dd78a141b6..f8714497fa 100644 --- a/src/app/utils/index.ts +++ b/src/app/utils/index.ts @@ -8,6 +8,7 @@ export * from "./number-utils"; export * from "./pool-utils"; export * from "./arm-resource-utils"; export * from "./storage-utils"; +export * from "./node-utils"; import * as icons from "./icons"; export const Icons = icons; diff --git a/src/app/utils/node-utils.ts b/src/app/utils/node-utils.ts new file mode 100644 index 0000000000..3d8e2e964d --- /dev/null +++ b/src/app/utils/node-utils.ts @@ -0,0 +1,23 @@ +import { Node, NodeState, Pool } from "app/models"; + +export class NodeUtils { + + public static getSubStatesforCategory(category: string): NodeState[] { + if (category === "error") { + return [NodeState.startTaskFailed, NodeState.unusable, NodeState.unknown]; + } else if (category === "transition") { + return [NodeState.creating, NodeState.starting, NodeState.rebooting, NodeState.reimaging, NodeState.leavingPool]; + } else if (category === "running") { + return [NodeState.running25, NodeState.running50, NodeState.running75, NodeState.running99, NodeState.running100]; + } + return []; + } + + public static getTaskSlotsUsagePercent(node: Node, pool: Pool): number { + const taskSlotsPerNode = pool.taskSlotsPerNode; + const taskSlotsCount = node.runningTaskSlotsCount; + const taskSlotPercentUsed = Math.floor((taskSlotsCount / taskSlotsPerNode) * 100); + return taskSlotPercentUsed; + } + +} From 2787ac930c2c20777a1b42511704d69eacefa9ce Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Fri, 27 May 2022 16:38:32 -0400 Subject: [PATCH 19/49] Restores native menubar on Windows In-release regression caused by upgrade to Electron 13 (3bd43c756). --- src/client/main-window/main-window.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/main-window/main-window.ts b/src/client/main-window/main-window.ts index 22b70b4992..61deb11ba2 100644 --- a/src/client/main-window/main-window.ts +++ b/src/client/main-window/main-window.ts @@ -70,7 +70,7 @@ export class MainWindow extends GenericWindow { minWidth: 1200, minHeight: 300, show: false, // Don't show the window until it is ready - titleBarStyle: "hidden", + titleBarStyle: process.platform === "darwin" ? "hidden" : "default", webPreferences: { webSecurity: false, allowRunningInsecureContent: false, From 3a2c482dcc5ad35f2597f1ccc895aeb167d87316 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 1 Jun 2022 14:01:53 -0400 Subject: [PATCH 20/49] Adding Sanjana as code owner --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6b147b2149..a498482560 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,6 +1,6 @@ # These owners will be the default owners for everything in # the repo. Unless a later match takes precedence, -# they will be requested for review when someone opens a +# they will be requested for review when someone opens a # pull request. -* @cRui861 @dpwatrous @gingi @zfengms @paterasMSFT @seth-barshay @wiboris +* @cRui861 @dpwatrous @gingi @zfengms @paterasMSFT @seth-barshay @wiboris @skapur12 From c44ab215c71ee867f29a42fd5d9fef56456d8cf9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Jun 2022 10:05:13 +0000 Subject: [PATCH 21/49] Bump async from 2.6.3 to 2.6.4 Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c24ba97ae..fdc02de651 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16840,9 +16840,9 @@ } }, "node_modules/portfinder/node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" @@ -37152,9 +37152,9 @@ }, "dependencies": { "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" From 7a374bafa7db9e34fd4a1482be6a57f85d8fd928 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jun 2022 05:53:04 +0000 Subject: [PATCH 22/49] Bump eventsource from 1.0.7 to 1.1.1 Bumps [eventsource](https://github.com/EventSource/eventsource) from 1.0.7 to 1.1.1. - [Release notes](https://github.com/EventSource/eventsource/releases) - [Changelog](https://github.com/EventSource/eventsource/blob/master/HISTORY.md) - [Commits](https://github.com/EventSource/eventsource/compare/v1.0.7...v1.1.1) --- updated-dependencies: - dependency-name: eventsource dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdc02de651..ebb05f39f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9498,9 +9498,9 @@ } }, "node_modules/eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", "dev": true, "dependencies": { "original": "^1.0.0" @@ -31409,9 +31409,9 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", "dev": true, "requires": { "original": "^1.0.0" From 663e1f18949e349609d381f4e85725f3c0670599 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Tue, 7 Jun 2022 13:41:34 -0400 Subject: [PATCH 23/49] Adds security linting --- .eslintrc.json | 3 ++- package-lock.json | 19 +++++++++++++++++++ package.json | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index e5d2a79c84..f6dcee589a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -23,7 +23,8 @@ "extends": [ ".eslintrc.common.json", "prettier", - "prettier/@typescript-eslint" + "prettier/@typescript-eslint", + "plugin:security/recommended" ], "plugins": [ "@angular-eslint/eslint-plugin", diff --git a/package-lock.json b/package-lock.json index ebb05f39f2..8f03c4a814 100644 --- a/package-lock.json +++ b/package-lock.json @@ -101,6 +101,7 @@ "eslint-plugin-jsdoc": "^31.6.0", "eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-security": "^1.5.0", "eslint-plugin-unicorn": "^31.0.0", "eslint-plugin-unused-imports": "^1.1.1", "file-loader": "^3.0.1", @@ -8880,6 +8881,15 @@ } } }, + "node_modules/eslint-plugin-security": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.5.0.tgz", + "integrity": "sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==", + "dev": true, + "dependencies": { + "safe-regex": "^2.1.1" + } + }, "node_modules/eslint-plugin-unicorn": { "version": "31.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-31.0.0.tgz", @@ -31116,6 +31126,15 @@ "prettier-linter-helpers": "^1.0.0" } }, + "eslint-plugin-security": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.5.0.tgz", + "integrity": "sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==", + "dev": true, + "requires": { + "safe-regex": "^2.1.1" + } + }, "eslint-plugin-unicorn": { "version": "31.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-31.0.0.tgz", diff --git a/package.json b/package.json index 78b32bb324..e3fa7e4375 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "eslint-plugin-jsdoc": "^31.6.0", "eslint-plugin-prefer-arrow": "^1.2.3", "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-security": "^1.5.0", "eslint-plugin-unicorn": "^31.0.0", "eslint-plugin-unused-imports": "^1.1.1", "file-loader": "^3.0.1", From caa4a25834576ee6e6c7dbf81186430af6465859 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 25 May 2022 16:56:39 -0400 Subject: [PATCH 24/49] Minor lint fixes --- src/client/proxy/proxy-settings.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/client/proxy/proxy-settings.ts b/src/client/proxy/proxy-settings.ts index 1bb17a71b8..e27a047597 100644 --- a/src/client/proxy/proxy-settings.ts +++ b/src/client/proxy/proxy-settings.ts @@ -15,10 +15,6 @@ export interface ProxySettingConfiguration { credentials: ProxyCredentials | null; } -function allowInsecureRequest() { - process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; -} - @Injectable() export class ProxySettingsManager { private _settings = new BehaviorSubject(null); @@ -36,7 +32,7 @@ export class ProxySettingsManager { return this._settings.pipe( filter(x => x !== null), take(1), - map(x => x!.settings), + map(x => x?.settings), ).toPromise(); } From ebed63304756eb1e226d7f7687dbd4571621e828 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 25 May 2022 16:30:16 -0400 Subject: [PATCH 25/49] Remove obsolete directives from debug config --- .vscode/launch.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 6c64e91c29..0b256a5732 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,6 @@ "name": "Debug: Main", "type": "node", "request": "launch", - "protocol": "inspector", "program": "${workspaceRoot}/src/client/main.ts", "stopOnEntry": false, "args": [ @@ -44,7 +43,6 @@ "request": "attach", "port": 9222, "sourceMaps": true, - "trace": "verbose", "webRoot": "${workspaceRoot}/build", "timeout": 30000, "presentation": { @@ -61,7 +59,6 @@ "name": "Test: Client", "type": "node", "request": "launch", - "protocol": "inspector", "program": "${workspaceRoot}/test/client/run-jasmine.js", "cwd": "${workspaceRoot}", "runtimeExecutable": "node", From ced5f7beb1af520ac19ea7b8a5a28cb8ba5cc55d Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Mon, 9 May 2022 13:18:02 -0400 Subject: [PATCH 26/49] Utility for creating a proxy environment in Azure * Installs Batch Explorer in a restricted network. --- .editorconfig | 2 +- package-lock.json | 6 +- package.json | 6 +- scripts/proxy/initProxyServer.sh | 19 +++ scripts/proxy/initVirtualMachine.ps1 | 81 ++++++++++++ scripts/proxy/main.bicep | 77 +++++++++++ scripts/proxy/peering.bicep | 25 ++++ scripts/proxy/proxy-deployment.bicep | 186 +++++++++++++++++++++++++++ scripts/proxy/proxy-server.bicep | 105 +++++++++++++++ scripts/proxy/readme.md | 80 ++++++++++++ scripts/proxy/virtual-machine.bicep | 97 ++++++++++++++ scripts/proxy/vpn-peerings.bicep | 41 ++++++ 12 files changed, 718 insertions(+), 7 deletions(-) create mode 100644 scripts/proxy/initProxyServer.sh create mode 100644 scripts/proxy/initVirtualMachine.ps1 create mode 100644 scripts/proxy/main.bicep create mode 100644 scripts/proxy/peering.bicep create mode 100644 scripts/proxy/proxy-deployment.bicep create mode 100644 scripts/proxy/proxy-server.bicep create mode 100644 scripts/proxy/readme.md create mode 100644 scripts/proxy/virtual-machine.bicep create mode 100644 scripts/proxy/vpn-peerings.bicep diff --git a/.editorconfig b/.editorconfig index d702904b91..fca5b052ef 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,5 +4,5 @@ indent_size = 4 insert_final_newline = true trim_trailing_whitespace = true -[*.{yml,json}] +[*.{yml,json,bicep}] indent_size = 2 diff --git a/package-lock.json b/package-lock.json index 8f03c4a814..4644fe8bf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,9 +62,9 @@ "zone.js": "^0.11.0" }, "devDependencies": { - "@angular-eslint/eslint-plugin": "^4.0.0", - "@angular-eslint/eslint-plugin-template": "^4.0.0", - "@angular-eslint/template-parser": "^4.0.0", + "@angular-eslint/eslint-plugin": "^4.3.1", + "@angular-eslint/eslint-plugin-template": "^4.3.1", + "@angular-eslint/template-parser": "^4.3.1", "@angular/compiler-cli": "^11.0.0", "@ngtools/webpack": "^11.0.0", "@playwright/test": "^1.18.1", diff --git a/package.json b/package.json index e3fa7e4375..2dcc247d6e 100644 --- a/package.json +++ b/package.json @@ -71,9 +71,9 @@ "node": ">=16.0.0" }, "devDependencies": { - "@angular-eslint/eslint-plugin": "^4.0.0", - "@angular-eslint/eslint-plugin-template": "^4.0.0", - "@angular-eslint/template-parser": "^4.0.0", + "@angular-eslint/eslint-plugin": "^4.3.1", + "@angular-eslint/eslint-plugin-template": "^4.3.1", + "@angular-eslint/template-parser": "^4.3.1", "@angular/compiler-cli": "^11.0.0", "@ngtools/webpack": "^11.0.0", "@playwright/test": "^1.18.1", diff --git a/scripts/proxy/initProxyServer.sh b/scripts/proxy/initProxyServer.sh new file mode 100644 index 0000000000..afd491de4e --- /dev/null +++ b/scripts/proxy/initProxyServer.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +proxyPort=$1 + +apt-get -y update +apt upgrade -y +apt-get -y update +apt-get install -y squid + +systemctl enable squid +cp /etc/squid/squid.conf /etc/squid/squid.conf.orig + +cat < /etc/squid/squid.conf +acl internal src 10.0.0.0/16 +http_port ${proxyPort} +http_access allow internal +EOF + +systemctl restart squid diff --git a/scripts/proxy/initVirtualMachine.ps1 b/scripts/proxy/initVirtualMachine.ps1 new file mode 100644 index 0000000000..16f51c5da8 --- /dev/null +++ b/scripts/proxy/initVirtualMachine.ps1 @@ -0,0 +1,81 @@ +Param( + [Parameter( + Mandatory = $true, + HelpMessage = "Enter the proxy server's IP address" + )][Alias("Address")][string] + $ProxyIpAddress, + [Parameter( + Mandatory = $true, + HelpMessage = "Enter the proxy server's port" + )][Alias("Port")][string] + $ProxyPort, + [Parameter( + HelpMessage = "Enter the Batch Explorer build string (e.g., 2.14.0-insider.602)", + Mandatory = $true + )][Alias("Build")][string] + $BatchExplorerBuild +) + +function Get-Proxy () { + Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select-Object ProxyServer, ProxyEnable +} + +function Set-Proxy { + [CmdletBinding()] + [Alias('proxy')] + [OutputType([string])] + Param + ( + # server address + [Parameter( + Mandatory = $true, + ValueFromPipelineByPropertyName = $true, + Position = 0 + )] + $server, + # port number + [Parameter( + Mandatory = $true, + ValueFromPipelineByPropertyName = $true, + Position = 1 + )] + $port, + [Parameter( + ValueFromPipelineByPropertyName = $true + )][switch] + $test + ) + If ($test) { + #Test if the TCP Port on the server is open before applying the settings + If ((Test-NetConnection -ComputerName $server -Port $port).TcpTestSucceeded) { + Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyServer -Value "$($server):$($port)" + Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyEnable -Value 1 + Get-Proxy #Show the configuration + } + Else { + Write-Error -Message "The proxy address is not valid: $($server):$($port)" + } + } + Else { + Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyServer -Value "$($server):$($port)" + Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyEnable -Value 1 + } +} + +function Remove-Proxy () { + Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyServer -Value "" + Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyEnable -Value 0 +} + +$PSDefaultParameterValues = @{"Set-Proxy:Test" = $true } + +$BuildType = If ($BatchExplorerBuild.Contains("insider")) { "insider" } Else { "stable" } + +$Uri = "https://batchexplorer.azureedge.net/$($BuildType)/$($BatchExplorerBuild)/BatchExplorer%20Setup%20$($BatchExplorerBuild).exe" + +Invoke-WebRequest -Uri $Uri -OutFile BatchExplorer-Setup.exe + +# Run Batch Explorer Setup +./BatchExplorer-Setup.exe + +proxy $ProxyIpAddress $ProxyPort diff --git a/scripts/proxy/main.bicep b/scripts/proxy/main.bicep new file mode 100644 index 0000000000..b0cbdfd07e --- /dev/null +++ b/scripts/proxy/main.bicep @@ -0,0 +1,77 @@ +targetScope = 'subscription' + +@description('The resource group') +param resourceGroupName string + +@description('Whether or not to create the resource group') +param createResourceGroup bool = true + +@maxLength(7) +@description('The prefix for deployment resources') +param prefix string = resourceGroupName + +@description('The location of the deployment') +param location string = deployment().location + +@description('VM Size') +param vmSize string = 'Standard_D2s_v3' + +@description('Proxy port') +param proxyPort string = '3128' + +@description('VM Username') +param username string + +@description('VM Password') +@secure() +param password string + +@description('VM size for proxy server') +param proxyVmSize string = vmSize + +@description('Public key data for proxy server') +param proxyPublicKey string = '' + +@description('A virtual network with a VPN gateway') +param vpnVnetName string + +@description('A virtual network with a VPN gateway') +param vpnVnetResourceGroup string = 'user-whitelisted-rg' + +@description('The Batch Explorer build to fetch (e.g., "2.14.0-insider.602")') +param batchExplorerBuild string + +resource deploymentRG 'Microsoft.Resources/resourceGroups@2021-04-01' = if (createResourceGroup) { + name: resourceGroupName + location: location +} + +module proxyDeployment './proxy-deployment.bicep' = { + name: 'proxy-deployment-module' + scope: deploymentRG + params: { + prefix: prefix + location: location + vmSize: vmSize + proxyPort: proxyPort + username: username + password: password + proxyVmSize: proxyVmSize + proxyPublicKey: proxyPublicKey + batchExplorerBuild: batchExplorerBuild + } +} + +module peerings './vpn-peerings.bicep' = { + name: 'peerings-module' + params: { + prefix: prefix + vnetName: proxyDeployment.outputs.vnetName + vnetResourceGroup: resourceGroupName + vpnVnetName: vpnVnetName + vpnVnetResourceGroup: vpnVnetResourceGroup + } +} + +output virtualMachineIp string = proxyDeployment.outputs.virtualMachineIpAddress +output proxyServerIp string = proxyDeployment.outputs.proxyServerIpAddress diff --git a/scripts/proxy/peering.bicep b/scripts/proxy/peering.bicep new file mode 100644 index 0000000000..960c89e8b7 --- /dev/null +++ b/scripts/proxy/peering.bicep @@ -0,0 +1,25 @@ +targetScope = 'resourceGroup' + +param name string +param remoteVnetId string +param allowGatewayTransit bool = true +param useRemoteGateways bool = true +param vnetName string + +resource vnet 'Microsoft.Network/virtualNetworks@2021-08-01' existing = { + name: vnetName +} + +resource proxyPeering 'Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2021-08-01' = { + name: name + parent: vnet + properties: { + allowVirtualNetworkAccess: true + allowForwardedTraffic: true + allowGatewayTransit: allowGatewayTransit + useRemoteGateways: useRemoteGateways + remoteVirtualNetwork: { + id: remoteVnetId + } + } +} diff --git a/scripts/proxy/proxy-deployment.bicep b/scripts/proxy/proxy-deployment.bicep new file mode 100644 index 0000000000..1d29a32637 --- /dev/null +++ b/scripts/proxy/proxy-deployment.bicep @@ -0,0 +1,186 @@ +targetScope = 'resourceGroup' + +param prefix string +param location string +param vmSize string +param proxyPort string +param username string +param password string +param proxyVmSize string +param proxyPublicKey string +param batchExplorerBuild string + +param internalIpAddressRange string = '10.0.0.0/16' +param defaultSubnetAddressPrefix string = '10.0.100.0/24' +param proxySubnetAddressPrefix string = '10.0.101.0/24' +param vnetAddressPrefixes array = [ + internalIpAddressRange +] + +resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-08-01' = { + name: '${prefix}-vnet' + location: location + properties: { + addressSpace: { + addressPrefixes: vnetAddressPrefixes + } + } +} + +resource restrictedSubnet 'Microsoft.Network/virtualNetworks/subnets@2021-08-01' = { + name: 'default' + parent: virtualNetwork + properties: { + addressPrefix: defaultSubnetAddressPrefix + } +} + +resource proxySubnet 'Microsoft.Network/virtualNetworks/subnets@2021-08-01' = { + name: 'proxy' + parent: virtualNetwork + properties: { + addressPrefix: proxySubnetAddressPrefix + } +} + +resource proxyNsg 'Microsoft.Network/networkSecurityGroups@2021-08-01' = { + name: '${prefix}-open-nsg' + location: location + properties: { + securityRules: [ + { + name: 'SSH-RDP' + properties: { + description: 'Allow SSH & RDP into host' + protocol: 'Tcp' + sourcePortRange: '*' + destinationPortRanges: [ + '22' + '3389' + ] + sourceAddressPrefix: internalIpAddressRange + destinationAddressPrefix: '*' + access: 'Allow' + priority: 100 + direction: 'Inbound' + } + } + { + name: 'AllowHTTPAndHTTPSOutbound' + properties: { + description: 'Allow HTTP/S from host' + protocol: 'Tcp' + sourcePortRanges: [ + '80' + '443' + ] + destinationPortRanges: [ + '80' + '443' + ] + sourceAddressPrefix: '*' + destinationAddressPrefix: '*' + access: 'Allow' + priority: 101 + direction: 'Outbound' + } + } + ] + } +} + +resource restrictedNsg 'Microsoft.Network/networkSecurityGroups@2021-08-01' = { + name: '${prefix}-restricted-nsg' + location: location + properties: { + securityRules: [ + { + name: 'AllowSSHAndRDP' + properties: { + description: 'Allow SSH & RDP into host' + protocol: 'Tcp' + sourcePortRange: '*' + destinationPortRanges: [ + '22' + '3389' + ] + sourceAddressPrefix: internalIpAddressRange + destinationAddressPrefix: '*' + access: 'Allow' + priority: 100 + direction: 'Inbound' + } + } + { + name: 'AllowProxy' + properties: { + description: 'Allow access to proxy server' + protocol: 'Tcp' + sourcePortRange: '*' + destinationPortRange: proxyPort + sourceAddressPrefix: '*' + destinationAddressPrefix: proxyServerIp + access: 'Allow' + priority: 101 + direction: 'Outbound' + } + } + ] + } +} + +module proxyServer './proxy-server.bicep' = { + name: 'proxy-server-module' + params: { + prefix: prefix + location: location + subnetId: proxySubnet.id + nsgId: proxyNsg.id + username: username + vmSize: proxyVmSize + publicKey: proxyPublicKey + proxyPort: proxyPort + } +} + +var proxyServerIp = proxyServer.outputs.ipAddress + +module virtualMachine './virtual-machine.bicep' = { + name: 'vm-module' + params: { + prefix: prefix + location: location + subnetId: restrictedSubnet.id + nsgId: restrictedNsg.id + vmSize: vmSize + username: username + password: password + proxyServer: proxyServerIp + proxyPort: proxyPort + batchExplorerBuild: batchExplorerBuild + } +} + +resource denyNonProxyRule 'Microsoft.Network/networkSecurityGroups/securityRules@2021-08-01' = { + name: 'DenyNonProxyOutbound' + parent: restrictedNsg + dependsOn: [ + virtualMachine + ] + properties: { + description: 'Deny outbound access to all traffic' + protocol: 'Tcp' + sourcePortRange: '*' + destinationPortRange: '*' + sourceAddressPrefix: '*' + destinationAddressPrefix: '*' + access: 'Deny' // Should be updated to `Deny` after deployment + priority: 102 + direction: 'Outbound' + } +} + +output vnetName string = virtualNetwork.name +output virtualMachineId string = virtualMachine.outputs.id +output virtualMachineIpAddress string = virtualMachine.outputs.ipAddress +output proxyServerIpAddress string = proxyServer.outputs.ipAddress diff --git a/scripts/proxy/proxy-server.bicep b/scripts/proxy/proxy-server.bicep new file mode 100644 index 0000000000..db07a05d0a --- /dev/null +++ b/scripts/proxy/proxy-server.bicep @@ -0,0 +1,105 @@ +targetScope = 'resourceGroup' + +param prefix string +param location string +param subnetId string +param nsgId string +param username string +param vmSize string +param publicKey string = '' +param proxyPort string + +/* The proxy server allows the virtual machine to connect to the rest of the + * internet. + */ +resource proxyNic 'Microsoft.Network/networkInterfaces@2021-08-01' = { + name: '${prefix}-proxynic' + location: location + properties: { + ipConfigurations: [ + { + name: 'ipconfig1' + properties: { + privateIPAddress: '192.168.0.5' + privateIPAllocationMethod: 'Dynamic' + primary: true + privateIPAddressVersion: 'IPv4' + subnet: { + id: subnetId + } + } + } + ] + networkSecurityGroup: { + id: nsgId + } + enableAcceleratedNetworking: true + enableIPForwarding: false + } +} + +resource proxyServer 'Microsoft.Compute/virtualMachines@2021-11-01' = { + name: '${prefix}-proxyserver' + location: location + properties: { + storageProfile: { + osDisk: { + createOption: 'FromImage' + managedDisk: { + storageAccountType: 'Premium_LRS' + } + } + imageReference: { + publisher: 'canonical' + offer: '0001-com-ubuntu-server-focal' + sku: '20_04-lts-gen2' + version: 'latest' + } + } + hardwareProfile: { + vmSize: vmSize + } + osProfile: { + computerName: 'proxy' + adminUsername: username + linuxConfiguration: { + disablePasswordAuthentication: true + ssh: (empty(publicKey) ? null : { + publicKeys: [ + { + path: '/home/${username}/.ssh/authorized_keys' + keyData: publicKey + } + ] + }) + } + } + networkProfile: { + networkInterfaces: [ + { + id: proxyNic.id + } + ] + } + } +} + +resource proxyServerExtensions 'Microsoft.Compute/virtualMachines/extensions@2019-07-01' = { + parent: proxyServer + name: '${prefix}-proxyvmext' + location: location + properties: { + publisher: 'Microsoft.Azure.Extensions' + type: 'CustomScript' + typeHandlerVersion: '2.1' + autoUpgradeMinorVersion: true + protectedSettings: { + commandToExecute: 'sh initProxyServer.sh ${proxyPort}' + fileUris: [ + 'https://raw.githubusercontent.com/Azure/BatchExplorer/master/scripts/proxy/initProxyServer.sh' + ] + } + } +} + +output ipAddress string = proxyNic.properties.ipConfigurations[0].properties.privateIPAddress diff --git a/scripts/proxy/readme.md b/scripts/proxy/readme.md new file mode 100644 index 0000000000..6dfd0c3009 --- /dev/null +++ b/scripts/proxy/readme.md @@ -0,0 +1,80 @@ +# Deploying Batch Explorer Within a Proxied Environment + +In order to test how Batch Explorer behaves within a locked-down environment, it's useful to deploy Batch Explorer within a restricted environment in Azure. In this deployment, Batch Explorer is installed within a Windows VM whose connectivity is highly restricted. The VM can receive inbound SSH and RDP connections over private IP, so you can only reach the VM over a VPN connection. The VM can make outbound connetions with the outside world only through a proxy server, which is created using [Squid](http://www.squid-cache.org/) hosted on a Linux Ubuntu VM. + +A template is provided that can create the entire environment with Batch Explorer installed. It also creates peerings from your VPN gateway to the deployment's new virtual network. + +## Prerequisites + +* A valid Azure subscription +* The [`az`](https://docs.microsoft.com/cli/azure/) command-line interface +* [jq](https://stedolan.github.io/jq/) +* An existing virtual network with a VPN gateway that will allow you to connect to the restricted VM +* An existing SSH keypair + +## Steps + +### 1. Create a deployment param file + +Create a `params.json` file that is specific to your subscription + +```json +{ + "parameters": { + "resourceGroupName": { "value": "" }, + "createResourceGroup": { "value": true }, + "prefix": { "value": "" }, + "username": { "value": "" }, + "password": { "value": "" }, + "vpnVnetName": { "value": "" }, + "vpnVnetResourceGroup": { "value": "" }, + "batchExplorerBuild": { "value": "" }, + "proxyPort": { "value": "" }, + "proxyPublicKey": { "value": "" } + } +} +``` + +The parameters are: + +* `resourceGroupName`: A resource group to contain all the resources in the deployment. The resource group will be created. +* `createResourceGroup`: Should the resource group be created? Otherwise, the deployment assumes the resource group exists with no conflicting resources. +* `prefix`: A prefix to identify all deployed resources (e.g., "beproxy"). Cannot be longer than 7 characters to avoid resource name length limits (e.g., Windows VMs). +* `username`: The username for logging into the restricted VM. +* `password`: The password for logging into the restricted VM. +* `vpnVnetName`: The virtual network with the preexisting VPN gateway. +* `vpnVnetResourceGroup`: The resource group of the VPN virtual network. +* `batchExplorerBuild`: The string identifying which Batch Explorer build to fetch (e.g., "2.14.0-insider.602"). The corresponding build must be available to download from the public site, and can be either an insider or stable release. +* `proxyPort`: The port with which the VM communicates with the proxy server. Used both to set up the the proxy server and the connection to it from the restricted VM (default: 3128). +* `proxyPublicKey`: The public key of the SSH key pair in order to access the proxy server over SSH. (_optional_) + +### 2. Create the deployment + +Run the following shell command, supplying the JSON parameter file and a target Azure location for the deployment + +```azurecli + az deployment sub create \ + -f ./scripts/proxy/main.bicep \ + --parameters @params.json \ + --location ${location} +``` + +## Connecting to the restricted and proxy VMs + +When the VPN is active, both the restricted Windows VM and the proxy Linux VM can be accessed using their private IP addresses. The restricted VM can be reached with RDP using the above username and password. Download an RDP configuration file by navigating to the VM on the Azure Portal (will be called `${prefix}-vm`) and then pressing on Connect > RDP > Download RDP File. To connect to the proxy server, SSH into it using the username and SSH key supplied above, or use Bastion from the VM's Connect command on the Azure Portal. + +## Notes + +* On the restricted VM, the setup script is installed in the directory `C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Downloads\0` + +* Failed deployments might be salvaged by passing `--confirm-with-what-if` to `az deployment`, which will prompt you to skip existing resources. + +* Creating the VPN peering may fail if an existing peering already uses the same address space. Remove the existing peering and redeploy with `--confirm-with-what-if`. Alternatively, run the peering module directly using + + ```azurecli + az deployment sub create \ + -f ./scripts/proxy/vpn-peerings.bicep \ + --location ${location} + ``` + + The parameters for the peering module are `prefix`, `vpnVnetName`, `vpnVnetResourceGroup`, `vnetName`, and `vnetResourceGroup`. The first three are the same params as the main deployment. `vnetName` is `${prefix}-vnet` and `vnetResourceGroup` is the `resourceGroupName`. diff --git a/scripts/proxy/virtual-machine.bicep b/scripts/proxy/virtual-machine.bicep new file mode 100644 index 0000000000..6fbe81e60f --- /dev/null +++ b/scripts/proxy/virtual-machine.bicep @@ -0,0 +1,97 @@ +targetScope = 'resourceGroup' + +param prefix string +param location string +param subnetId string +param nsgId string +param username string +param vmSize string +param password string +param proxyServer string +param proxyPort string +param batchExplorerBuild string + +resource vmNic 'Microsoft.Network/networkInterfaces@2021-08-01' = { + name: '${prefix}-vmnic' + location: location + properties: { + ipConfigurations: [ + { + name: 'ipconfig1' + properties: { + privateIPAddress: '192.168.0.4' + privateIPAllocationMethod: 'Dynamic' + primary: true + privateIPAddressVersion: 'IPv4' + subnet: { + id: subnetId + } + } + } + ] + networkSecurityGroup: { + id: nsgId + } + enableAcceleratedNetworking: true + enableIPForwarding: false + } +} + +resource virtualMachine 'Microsoft.Compute/virtualMachines@2021-11-01' = { + name: '${prefix}-vm' + location: location + properties: { + networkProfile: { + networkInterfaces: [ + { + id: vmNic.id + } + ] + } + osProfile: { + computerName: '${prefix}-vm' + adminUsername: username + adminPassword: password + } + storageProfile: { + imageReference: { + publisher: 'MicrosoftWindowsDesktop' + offer: 'Windows-10' + sku: 'win10-21h2-pro-g2' + version: 'latest' + } + osDisk: { + osType: 'Windows' + name: '${prefix}-vmdisk' + createOption: 'FromImage' + caching: 'ReadWrite' + diskSizeGB: 127 + } + } + hardwareProfile: { + vmSize: vmSize + } + licenseType: 'Windows_Client' + } +} + +resource windowsVMExtensions 'Microsoft.Compute/virtualMachines/extensions@2020-12-01' = { + parent: virtualMachine + name: '${prefix}-vmext' + location: location + properties: { + publisher: 'Microsoft.Compute' + type: 'CustomScriptExtension' + typeHandlerVersion: '1.10' + autoUpgradeMinorVersion: true + protectedSettings: { + fileUris: [ + 'https://raw.githubusercontent.com/Azure/BatchExplorer/master/scripts/proxy/initVirtualMachine.ps1' + ] + commandToExecute: 'powershell -ExecutionPolicy Bypass -File initVirtualMachine.ps1 -Address ${proxyServer} -Port ${proxyPort} -Build ${batchExplorerBuild}' + } + } +} + +output id string = virtualMachine.id +output ipAddress string = vmNic.properties.ipConfigurations[0].properties.privateIPAddress diff --git a/scripts/proxy/vpn-peerings.bicep b/scripts/proxy/vpn-peerings.bicep new file mode 100644 index 0000000000..a6f7a89a9d --- /dev/null +++ b/scripts/proxy/vpn-peerings.bicep @@ -0,0 +1,41 @@ +targetScope = 'subscription' + +param prefix string +param vpnVnetName string +param vpnVnetResourceGroup string +param vnetName string +param vnetResourceGroup string + +resource vnet 'Microsoft.Network/virtualNetworks@2021-08-01' existing = { + scope: resourceGroup(vnetResourceGroup) + name: vnetName +} + +resource vpnVnet 'Microsoft.Network/virtualNetworks@2021-08-01' existing = { + scope: resourceGroup(vpnVnetResourceGroup) + name: vpnVnetName +} + +module proxyPeering './peering.bicep' = { + name: 'proxy2vpn-module' + scope: resourceGroup(vnetResourceGroup) + params: { + name: '${prefix}-proxy2vpn' + vnetName: vnetName + remoteVnetId: vpnVnet.id + allowGatewayTransit: false + useRemoteGateways: true + } +} + +module vpnPeering './peering.bicep' = { + name: 'vpn2proxy-module' + scope: resourceGroup(vpnVnetResourceGroup) + params: { + name: '${prefix}-vpn2proxy' + vnetName: vpnVnetName + remoteVnetId: vnet.id + allowGatewayTransit: true + useRemoteGateways: false + } +} From 8258166a1ce242ae2eb6e3be9704e688e8163091 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 25 May 2022 16:53:21 -0400 Subject: [PATCH 27/49] Upgrades to @azure/msal-node 1.9.0 --- package-lock.json | 56 ++++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4644fe8bf4..c72fb70b48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@angular/platform-browser-dynamic": "^11.0.0", "@angular/platform-server": "^11.0.0", "@angular/router": "^11.0.0", - "@azure/msal-node": "^1.6.0", + "@azure/msal-node": "^1.9.0", "@azure/storage-blob": "^10.5.0", "applicationinsights": "^1.8.5", "azure-storage": "^2.10.4", @@ -495,29 +495,26 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@azure/msal-common": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.1.0.tgz", - "integrity": "sha512-IGjAHttOgKDPQr0Qxx1NjABR635ZNuN7LHjxI0Y7SEA2thcaRGTccy+oaXTFabM/rZLt4F2VrPKUX4BnR9hW9g==", - "dependencies": { - "debug": "^4.1.1" - }, + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.3.0.tgz", + "integrity": "sha512-ZyLq9GdnLBi/83YpysE86TFKbA0TuvfNAN5Psqu20cdAjLo/4rw4ttiItdh1G//XeGErHk9qn57gi2AYU1b5/Q==", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.6.0.tgz", - "integrity": "sha512-RCPXVWsjqYZh7NB1pAJLn4ypHlLBulOjw5nKPLsJiaJJIXnN8kc6SMkK3S9/80DZCEBstvoRMz6zF50QZJUeOQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.9.0.tgz", + "integrity": "sha512-lw6ejz1WPqcdjkwp91Gidte98+kfGxHk9eYSmmpUChzrUUrZMFGvrtrvG3Qnr6bp5d4WijVge9LMe+2QQUMhoA==", "dependencies": { - "@azure/msal-common": "^6.1.0", + "@azure/msal-common": "^6.3.0", "axios": "^0.21.4", "https-proxy-agent": "^5.0.0", "jsonwebtoken": "^8.5.1", "uuid": "^8.3.0" }, "engines": { - "node": "10 || 12 || 14 || 16" + "node": "10 || 12 || 14 || 16 || 18" } }, "node_modules/@azure/msal-node/node_modules/agent-base": { @@ -2789,6 +2786,15 @@ "@types/node": "*" } }, + "node_modules/@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/@types/yargs-parser": { "version": "20.2.1", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", @@ -24128,19 +24134,16 @@ } }, "@azure/msal-common": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.1.0.tgz", - "integrity": "sha512-IGjAHttOgKDPQr0Qxx1NjABR635ZNuN7LHjxI0Y7SEA2thcaRGTccy+oaXTFabM/rZLt4F2VrPKUX4BnR9hW9g==", - "requires": { - "debug": "^4.1.1" - } + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.3.0.tgz", + "integrity": "sha512-ZyLq9GdnLBi/83YpysE86TFKbA0TuvfNAN5Psqu20cdAjLo/4rw4ttiItdh1G//XeGErHk9qn57gi2AYU1b5/Q==" }, "@azure/msal-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.6.0.tgz", - "integrity": "sha512-RCPXVWsjqYZh7NB1pAJLn4ypHlLBulOjw5nKPLsJiaJJIXnN8kc6SMkK3S9/80DZCEBstvoRMz6zF50QZJUeOQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.9.0.tgz", + "integrity": "sha512-lw6ejz1WPqcdjkwp91Gidte98+kfGxHk9eYSmmpUChzrUUrZMFGvrtrvG3Qnr6bp5d4WijVge9LMe+2QQUMhoA==", "requires": { - "@azure/msal-common": "^6.1.0", + "@azure/msal-common": "^6.3.0", "axios": "^0.21.4", "https-proxy-agent": "^5.0.0", "jsonwebtoken": "^8.5.1", @@ -25981,6 +25984,15 @@ "@types/node": "*" } }, + "@types/yargs": { + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, "@types/yargs-parser": { "version": "20.2.1", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", diff --git a/package.json b/package.json index 2dcc247d6e..25bcc14d99 100644 --- a/package.json +++ b/package.json @@ -173,7 +173,7 @@ "@angular/platform-browser-dynamic": "^11.0.0", "@angular/platform-server": "^11.0.0", "@angular/router": "^11.0.0", - "@azure/msal-node": "^1.6.0", + "@azure/msal-node": "^1.9.0", "@azure/storage-blob": "^10.5.0", "applicationinsights": "^1.8.5", "azure-storage": "^2.10.4", From 8c099882bcbbccc713291d3ceab251295b34d8e4 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 2 Mar 2022 19:00:18 -0500 Subject: [PATCH 28/49] Uses proxy settings for authentication. --- src/client/core/aad/auth-provider.ts | 29 +++++++++++++++++++++------- src/client/proxy/proxy-settings.ts | 3 +-- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/client/core/aad/auth-provider.ts b/src/client/core/aad/auth-provider.ts index 014192ce10..8581f2a9f0 100644 --- a/src/client/core/aad/auth-provider.ts +++ b/src/client/core/aad/auth-provider.ts @@ -74,7 +74,7 @@ export default class AuthProvider { * * Until this is resolved, we use one client application per tenant. */ - const client = this._getClient(tenantId); + const client = await this._getClient(tenantId); const authRequest = this._authRequest(resourceURI, tenantId); try { @@ -157,11 +157,12 @@ export default class AuthProvider { } } - protected _getClient(tenantId: string): PublicClientApplication { + protected async _getClient(tenantId: string): + Promise { if (tenantId in this._clients) { return this._clients[tenantId]; } - const client = this._createClient(tenantId); + const client = await this._createClient(tenantId); if (!this._primaryClient) { this._primaryClient = client; } @@ -169,12 +170,26 @@ export default class AuthProvider { return client; } - private _createClient(tenantId: string): PublicClientApplication { - return new PublicClientApplication({ + private async _createClient(tenantId: string): + Promise { + const proxySettings = await this.app.proxySettings.settings; + const proxyUrl = proxySettings?.http.toString(); + if (proxyUrl) { + log.info(`[${tenantId}] Proxying auth endpoints through ` + + proxyUrl); + } + + const authority = + `${this.app.properties.azureEnvironment.aadUrl}${tenantId}/`; + + return new PublicClientApplication({ + system: { + proxyUrl + }, auth: { clientId: this.config.clientId, - authority: - `${this.app.properties.azureEnvironment.aadUrl}${tenantId}/` + authority, + knownAuthorities: [authority] }, cache: { cachePlugin: this._cachePlugin diff --git a/src/client/proxy/proxy-settings.ts b/src/client/proxy/proxy-settings.ts index e27a047597..15fb5d2960 100644 --- a/src/client/proxy/proxy-settings.ts +++ b/src/client/proxy/proxy-settings.ts @@ -8,7 +8,7 @@ import { ProxyCredentials, ProxySetting, ProxySettings, } from "get-proxy-settings"; import { BehaviorSubject } from "rxjs"; -import { filter, map, take } from "rxjs/operators"; +import { map, take } from "rxjs/operators"; export interface ProxySettingConfiguration { settings: ProxySettings | null; @@ -30,7 +30,6 @@ export class ProxySettingsManager { public get settings(): Promise { return this._settings.pipe( - filter(x => x !== null), take(1), map(x => x?.settings), ).toPromise(); From f86ce5f9030dbed1051a0d96a51da945545397db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Apr 2022 18:51:44 +0000 Subject: [PATCH 29/49] Bump node-forge from 1.0.0 to 1.3.0 Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.0.0 to 1.3.0. - [Release notes](https://github.com/digitalbazaar/forge/releases) - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.0.0...v1.3.0) --- updated-dependencies: - dependency-name: node-forge dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c72fb70b48..af61a010cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "luxon": "^1.24.1", "make-dir": "^2.1.0", "node-abi": "^2.18.0", - "node-forge": "^1.0.0", + "node-forge": "^1.3.0", "patternomaly": "^1.3.2", "reflect-metadata": "^0.1.13", "rxjs": "^6.6.7", @@ -15224,9 +15224,9 @@ } }, "node_modules/node-forge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.0.0.tgz", - "integrity": "sha512-ShkiiAlzSsgH1IwGlA0jybk9vQTIOLyJ9nBd0JTuP+nzADJFLY0NoDijM2zvD/JaezooGu3G2p2FNxOAK6459g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "engines": { "node": ">= 6.13.0" } @@ -35914,9 +35914,9 @@ } }, "node-forge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.0.0.tgz", - "integrity": "sha512-ShkiiAlzSsgH1IwGlA0jybk9vQTIOLyJ9nBd0JTuP+nzADJFLY0NoDijM2zvD/JaezooGu3G2p2FNxOAK6459g==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==" }, "node-libs-browser": { "version": "2.2.1", diff --git a/package.json b/package.json index 25bcc14d99..ee61e05830 100644 --- a/package.json +++ b/package.json @@ -201,7 +201,7 @@ "luxon": "^1.24.1", "make-dir": "^2.1.0", "node-abi": "^2.18.0", - "node-forge": "^1.0.0", + "node-forge": "^1.3.0", "patternomaly": "^1.3.2", "reflect-metadata": "^0.1.13", "rxjs": "^6.6.7", From 19558c7ae0360241e8bd0e317f07b16a4451ea8d Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Tue, 7 Jun 2022 18:14:09 -0400 Subject: [PATCH 30/49] Fixes cer parsing unit test using updated forge --- .../certificate/certificate.service.spec.ts | 4 +--- src/test/fixtures/certificates/batchtest2.cer | Bin 1140 -> 846 bytes 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/app/services/azure-batch/certificate/certificate.service.spec.ts b/src/app/services/azure-batch/certificate/certificate.service.spec.ts index 0d740e6840..9f381afea3 100644 --- a/src/app/services/azure-batch/certificate/certificate.service.spec.ts +++ b/src/app/services/azure-batch/certificate/certificate.service.spec.ts @@ -132,9 +132,7 @@ describe("CertificateService", () => { it("parse a cer certificate", async (done) => { const file = await loadCertificate("batchtest2.cer"); certificateService.parseCertificate(file, "batchtest").subscribe((certificate) => { - // TODO: Forge actually calculates this thumbprint incorrectly. Replace - // with the correct thumbprint when this is fixed - expect(certificate.thumbprint).toBe("6da50c0bf5100da7cf63f390da15af6569c2dff7"); + expect(certificate.thumbprint).toBe("227341ea44f8deffb6972532818fccf797f7339e"); expect(certificate.thumbprintAlgorithm).toBe("sha1"); expect(certificate.certificateFormat).toBe("cer"); expect(certificate.password).toBeUndefined(); diff --git a/src/test/fixtures/certificates/batchtest2.cer b/src/test/fixtures/certificates/batchtest2.cer index 7cba9e23a0770a089d87caa330dccf0728858847..48386c766215b869a0b002e5214bf75f2d992ce6 100644 GIT binary patch literal 846 zcmXqLV)imvx|$!ab&3P))jZ%{ZjtkjWSIrw1D@CZ7-W zy6RWzs^Ge8-45nC3u7cbc#r;)(mZ)2{PG_2d>f0W!F$yBc0>h>1h1DdU(D(BrR^P4 z$_CdQStf~~`$}$teb+8enI;{=S*n%g8}O|xg59!t?;gb;#>*bPzZ~*2^YzWVJ;}OF zPjhA@ZrbDRFMH#RE->H(@r7BK3>XY#K}=N^F#{1c4sA9@R#tXqMmUSfKprHm%pzeR z)*v#cebFzwpT|1wo^x4Ee1GeVh0_0t5dC~CVl3FDQIiHRei#|5?o{Tk3~?x3*}i|N z(&kCUJGR|AU(b|n@heDvrfgC4eZhMFRIxV`t?&Q+5gH#VG&h&uyV%lc-zMACr`A{f zp8Y--XDR=y-P*n~^p;qNN5=j=n}5%Fv}VqZ&ubpo8y7j>eYeu5)^+~WE!X@iTw=JQ zyecl8u)Mtep43WFC44i7KgxnQ1uteiKRiQzTF9IyC2 zO7o6dA3D5qzmDC)oQN;)Bkbo?%=<0a75=#9X<`4jccPcpPfxrQ@y_1kzsN#`>cV7Z zoj14tvmae?v$`J)!H+kNkDe^)=6?A&_0mG)!`T2O C(pbg- literal 1140 zcmZ9K$F{0k5Jf+Th6ELC+{R8M*}#@0^i&j3GLroI>p5?{&h6D$wJMCNNeu%BK0@GG zWneZS$P7j;s6BG9dak$A#`H3{jITeyhS{sjUxjvgm<{%R}5;8&wCUQ`S`nAsr&)JLK{UF*|y z6P58=g*-J3XgvSjfv5mD2rvcw^@`r`yXH?yaNQ>6vy_`gyk21~`o2pDJ?r<)r z+^W~pthvbr&BgN3eW(p>Wx3v-^qOO_;c3C-IL+NzdW#D|YbmBva*0fPmTb{-K-F=w zB}Na2&A4qNa(c@oe_7V{&ij7UXsTd3fpY&9SRDV_=3%-^HWhT33Y z{`^lrQ39R-P{{v!OvWM#nTF7y0T!rmrVwUX4>O`dcEexq^}jkoei+Dd$R}r;x2k^_ zfXZ(_V`edh7oY-vM+G$?$GTcnBTl0(ZM@}jO&_=aXXA`T5HiB~_9=v@-3=#C)5EU5 zkRht1vxNU;>dW;nQv{4_e+v4PE>-RTDM3_*#@i^M)joIJz3dKNZ`KE-r2Z;6p z^ZjGqSm{7{dhKlx>zlahZi2P9@=V_JDe;H3YuCj^&1sv!V%@wEpK6A$9Mh9_FVB*b z*uh?K-;U&&>8p20h>r)8?KbOYkOQ2w`f~~OdG2t7!us=mM}=4nTix4(SmACfm&TL$ zs%6X^4-iFY+IfAQ`^o2)c-ORQvN*T$Ovhqm`64Ph2>Z@b!KSLXDUS@=NaK~5%qoy{ U_t<)f9ysX)_dYSL1AqSf1@8NHQUCw| From b77ba942b046105e667dbc635d9a489733ad0ef0 Mon Sep 17 00:00:00 2001 From: "microsoft-github-policy-service[bot]" <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Date: Fri, 27 May 2022 21:06:10 +0000 Subject: [PATCH 31/49] Microsoft mandatory file --- SECURITY.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..869fdfe2b2 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + From 6955642ff203e6a4c298f63c4dfd608bb567c341 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Tue, 7 Jun 2022 14:39:43 -0400 Subject: [PATCH 32/49] Excludes auto-generated SECURITY.md from linting --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ee61e05830..88d4cdd067 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "eslint": "eslint -c .eslintrc.json --quiet .", "eslint:verbose": "eslint -c .eslintrc.json .", "stylelint": "stylelint --syntax scss \"src/app/**/*.scss\"", - "markdownlint": "markdownlint-cli2 \"**/*.md\" \"#**/node_modules/**/*\"", + "markdownlint": "markdownlint-cli2 \"**/*.md\" \"#**/node_modules/**/*\" \"#SECURITY.md\"", "lint": "npm run -s eslint && npm run -s stylelint && npm run -s markdownlint", "package": "npm run -s ts scripts/package/package.ts", "start-publish": "npm run -s ts scripts/publish/publish.ts", From 43885851c592701e341c5d0e5627e964ec1fca81 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 8 Jun 2022 10:08:47 -0400 Subject: [PATCH 33/49] Bumps azure-storage from 2.10.4 to 2.10.7 Fixes AB#766, AB#768: Addresses some security vulnerabilities in module dependencies (validator and json-schema). --- package-lock.json | 63 ++++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index af61a010cf..4728ec809e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "@azure/msal-node": "^1.9.0", "@azure/storage-blob": "^10.5.0", "applicationinsights": "^1.8.5", - "azure-storage": "^2.10.4", + "azure-storage": "^2.10.7", "chart.js": "^2.9.3", "chokidar": "^3.4.3", "commander": "^8.0.0", @@ -4039,26 +4039,33 @@ "dev": true }, "node_modules/azure-storage": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.4.tgz", - "integrity": "sha512-zlfRPl4js92JC6+79C2EUmNGYjSknRl8pOiHQF78zy+pbOFOHtlBF6BU/OxPeHQX3gaa6NdEZnVydFxhhndkEw==", + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.7.tgz", + "integrity": "sha512-4oeFGtn3Ziw/fGs/zkoIpKKtygnCVIcZwzJ7UQzKTxhkGQqVCByOFbYqMGYR3L+wOsunX9lNfD0jc51SQuKSSA==", + "deprecated": "Please note: newer packages @azure/storage-blob, @azure/storage-queue and @azure/storage-file are available as of November 2019 and @azure/data-tables is available as of June 2021. While the legacy azure-storage package will continue to receive critical bug fixes, we strongly encourage you to upgrade. Migration guide can be found: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/storage/MigrationGuide.md", "dependencies": { - "browserify-mime": "~1.2.9", + "browserify-mime": "^1.2.9", "extend": "^3.0.2", - "json-edm-parser": "0.1.2", - "md5.js": "1.3.4", - "readable-stream": "~2.0.0", + "json-edm-parser": "~0.1.2", + "json-schema": "~0.4.0", + "md5.js": "^1.3.4", + "readable-stream": "^2.0.0", "request": "^2.86.0", "underscore": "^1.12.1", "uuid": "^3.0.0", - "validator": "~9.4.1", - "xml2js": "0.2.8", + "validator": "^13.7.0", + "xml2js": "~0.2.8", "xmlbuilder": "^9.0.7" }, "engines": { "node": ">= 0.8.26" } }, + "node_modules/azure-storage/node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, "node_modules/azure-storage/node_modules/sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", @@ -22261,9 +22268,9 @@ } }, "node_modules/validator": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", - "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", "engines": { "node": ">= 0.10" } @@ -26986,23 +26993,29 @@ "dev": true }, "azure-storage": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.4.tgz", - "integrity": "sha512-zlfRPl4js92JC6+79C2EUmNGYjSknRl8pOiHQF78zy+pbOFOHtlBF6BU/OxPeHQX3gaa6NdEZnVydFxhhndkEw==", + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.7.tgz", + "integrity": "sha512-4oeFGtn3Ziw/fGs/zkoIpKKtygnCVIcZwzJ7UQzKTxhkGQqVCByOFbYqMGYR3L+wOsunX9lNfD0jc51SQuKSSA==", "requires": { - "browserify-mime": "~1.2.9", + "browserify-mime": "^1.2.9", "extend": "^3.0.2", - "json-edm-parser": "0.1.2", - "md5.js": "1.3.4", - "readable-stream": "~2.0.0", + "json-edm-parser": "~0.1.2", + "json-schema": "~0.4.0", + "md5.js": "^1.3.4", + "readable-stream": "^2.0.0", "request": "^2.86.0", "underscore": "^1.12.1", "uuid": "^3.0.0", - "validator": "~9.4.1", - "xml2js": "0.2.8", + "validator": "^13.7.0", + "xml2js": "~0.2.8", "xmlbuilder": "^9.0.7" }, "dependencies": { + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, "sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", @@ -41521,9 +41534,9 @@ } }, "validator": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", - "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==" + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" }, "vary": { "version": "1.1.2", diff --git a/package.json b/package.json index 88d4cdd067..5b69117284 100644 --- a/package.json +++ b/package.json @@ -176,7 +176,7 @@ "@azure/msal-node": "^1.9.0", "@azure/storage-blob": "^10.5.0", "applicationinsights": "^1.8.5", - "azure-storage": "^2.10.4", + "azure-storage": "^2.10.7", "chart.js": "^2.9.3", "chokidar": "^3.4.3", "commander": "^8.0.0", From 7b5dc09f8ff3a8e372c1b9c74b60a5c1029fd38e Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 8 Jun 2022 10:39:01 -0400 Subject: [PATCH 34/49] Bumps hosted-git-info from 2.8.8 to 2.8.9 --- package-lock.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4728ec809e..ce007d3bbd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17586,9 +17586,9 @@ } }, "node_modules/read-pkg-up/node_modules/hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "node_modules/read-pkg-up/node_modules/load-json-file": { @@ -20315,9 +20315,9 @@ } }, "node_modules/stylelint/node_modules/hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "node_modules/stylelint/node_modules/ignore": { @@ -21099,9 +21099,9 @@ } }, "node_modules/test-exclude/node_modules/hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "node_modules/test-exclude/node_modules/load-json-file": { @@ -37824,9 +37824,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "load-json-file": { @@ -39962,9 +39962,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "ignore": { @@ -40596,9 +40596,9 @@ }, "dependencies": { "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "load-json-file": { From 8ca6238af93424e5531a21853c370d45914276bc Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 8 Jun 2022 11:34:23 -0400 Subject: [PATCH 35/49] Bumps ansi-html, normalize-url --- package-lock.json | 236 ++++++++++++++++++++++------------------------ 1 file changed, 113 insertions(+), 123 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce007d3bbd..034c75327e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1580,9 +1580,9 @@ "dev": true }, "node_modules/@electron/get/node_modules/normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true, "engines": { "node": ">=8" @@ -3351,9 +3351,9 @@ } }, "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -3394,10 +3394,10 @@ "node": ">=6" } }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" @@ -4061,11 +4061,6 @@ "node": ">= 0.8.26" } }, - "node_modules/azure-storage/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "node_modules/azure-storage/node_modules/sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", @@ -6074,9 +6069,9 @@ } }, "node_modules/concurrently/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -12791,7 +12786,7 @@ "node_modules/istanbul-instrumenter-loader/node_modules/ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", "dev": true, "dependencies": { "co": "^4.6.0", @@ -12815,7 +12810,7 @@ "node_modules/istanbul-instrumenter-loader/node_modules/schema-utils": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "integrity": "sha512-QaVYBaD9U8scJw2EBWnCBY+LJ0AD+/2edTaigDs0XLDLBfJmSUK9KGqktg1rb32U3z4j/XwvFwHHH1YfbYFd7Q==", "dev": true, "dependencies": { "ajv": "^5.0.0" @@ -13455,9 +13450,9 @@ "dev": true }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -13543,17 +13538,17 @@ } }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/jwa": { @@ -13848,9 +13843,9 @@ } }, "node_modules/karma-mocha-reporter/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { "node": ">=4" @@ -15231,9 +15226,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "engines": { "node": ">= 6.13.0" } @@ -15526,9 +15521,9 @@ } }, "node_modules/nyc/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -16244,9 +16239,9 @@ "dev": true }, "node_modules/package-json/node_modules/normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true, "engines": { "node": ">=8" @@ -18647,9 +18642,9 @@ "dev": true }, "node_modules/selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", "dev": true, "dependencies": { "node-forge": "^0.10.0" @@ -22497,7 +22492,7 @@ "node_modules/watchpack-chokidar2/node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "optional": true, "dependencies": { @@ -22662,9 +22657,9 @@ } }, "node_modules/webpack-cli/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -22809,12 +22804,12 @@ } }, "node_modules/webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "dependencies": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -22968,9 +22963,9 @@ } }, "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -23037,7 +23032,7 @@ "node_modules/webpack-dev-server/node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "dependencies": { "is-glob": "^3.1.0", @@ -23120,9 +23115,9 @@ } }, "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -23205,9 +23200,9 @@ } }, "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -24951,9 +24946,9 @@ "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, "p-cancelable": { @@ -26439,9 +26434,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "string-width": { @@ -26472,10 +26467,10 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, "ansi-regex": { @@ -27011,11 +27006,6 @@ "xmlbuilder": "^9.0.7" }, "dependencies": { - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", @@ -28664,9 +28654,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "cliui": { @@ -33969,7 +33959,7 @@ "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", "dev": true, "requires": { "co": "^4.6.0", @@ -33993,7 +33983,7 @@ "schema-utils": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "integrity": "sha512-QaVYBaD9U8scJw2EBWnCBY+LJ0AD+/2edTaigDs0XLDLBfJmSUK9KGqktg1rb32U3z4j/XwvFwHHH1YfbYFd7Q==", "dev": true, "requires": { "ajv": "^5.0.0" @@ -34485,9 +34475,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -34559,13 +34549,13 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -34814,9 +34804,9 @@ }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "strip-ansi": { @@ -35927,9 +35917,9 @@ } }, "node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-libs-browser": { "version": "2.2.1", @@ -36176,9 +36166,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "cliui": { @@ -36726,9 +36716,9 @@ "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, "p-cancelable": { @@ -38593,9 +38583,9 @@ "dev": true }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -41717,7 +41707,7 @@ "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "optional": true, "requires": { @@ -41906,9 +41896,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "cliui": { @@ -42030,12 +42020,12 @@ } }, "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -42159,9 +42149,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -42210,7 +42200,7 @@ "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -42277,9 +42267,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { @@ -42343,9 +42333,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "strip-ansi": { From 0b7efde17d7f1876503acc30bcf0ddb7c9bccec3 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Tue, 14 Jun 2022 20:24:08 -0400 Subject: [PATCH 36/49] Bumps @azure/msal-node from 1.9.0 to 1.10.0 Addresses issue with caching multiple tokens for same user (AzureAD/microsoft-authentication-library-for-js#4486). --- package-lock.json | 94 +++++++++-------------------------------------- package.json | 2 +- 2 files changed, 19 insertions(+), 77 deletions(-) diff --git a/package-lock.json b/package-lock.json index 034c75327e..45ae6a51c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@angular/platform-browser-dynamic": "^11.0.0", "@angular/platform-server": "^11.0.0", "@angular/router": "^11.0.0", - "@azure/msal-node": "^1.9.0", + "@azure/msal-node": "^1.10.0", "@azure/storage-blob": "^10.5.0", "applicationinsights": "^1.8.5", "azure-storage": "^2.10.7", @@ -495,21 +495,19 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@azure/msal-common": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.3.0.tgz", - "integrity": "sha512-ZyLq9GdnLBi/83YpysE86TFKbA0TuvfNAN5Psqu20cdAjLo/4rw4ttiItdh1G//XeGErHk9qn57gi2AYU1b5/Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz", + "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA==", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.9.0.tgz", - "integrity": "sha512-lw6ejz1WPqcdjkwp91Gidte98+kfGxHk9eYSmmpUChzrUUrZMFGvrtrvG3Qnr6bp5d4WijVge9LMe+2QQUMhoA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.10.0.tgz", + "integrity": "sha512-oSv9mg199FpRTe+fZ3o9NDYpKShOHqeceaNcCHJcKUaAaCojAbfbxD1Cvsti8BEsLKE6x0HcnjilnM1MKmZekA==", "dependencies": { - "@azure/msal-common": "^6.3.0", - "axios": "^0.21.4", - "https-proxy-agent": "^5.0.0", + "@azure/msal-common": "^7.0.0", "jsonwebtoken": "^8.5.1", "uuid": "^8.3.0" }, @@ -517,29 +515,6 @@ "node": "10 || 12 || 14 || 16 || 18" } }, - "node_modules/@azure/msal-node/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@azure/msal-node/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@azure/msal-node/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -4024,14 +3999,6 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -10484,6 +10451,7 @@ "version": "1.14.8", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "dev": true, "funding": [ { "type": "individual", @@ -24136,39 +24104,20 @@ } }, "@azure/msal-common": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.3.0.tgz", - "integrity": "sha512-ZyLq9GdnLBi/83YpysE86TFKbA0TuvfNAN5Psqu20cdAjLo/4rw4ttiItdh1G//XeGErHk9qn57gi2AYU1b5/Q==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.0.0.tgz", + "integrity": "sha512-EkaHGjv0kw1RljhboeffM91b+v9d5VtmyG+0a/gvdqjbLu3kDzEfoaS5BNM9QqMzbxgZylsjAjQDtxdHLX/ziA==" }, "@azure/msal-node": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.9.0.tgz", - "integrity": "sha512-lw6ejz1WPqcdjkwp91Gidte98+kfGxHk9eYSmmpUChzrUUrZMFGvrtrvG3Qnr6bp5d4WijVge9LMe+2QQUMhoA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.10.0.tgz", + "integrity": "sha512-oSv9mg199FpRTe+fZ3o9NDYpKShOHqeceaNcCHJcKUaAaCojAbfbxD1Cvsti8BEsLKE6x0HcnjilnM1MKmZekA==", "requires": { - "@azure/msal-common": "^6.3.0", - "axios": "^0.21.4", - "https-proxy-agent": "^5.0.0", + "@azure/msal-common": "^7.0.0", "jsonwebtoken": "^8.5.1", "uuid": "^8.3.0" }, "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -26973,14 +26922,6 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -32254,7 +32195,8 @@ "follow-redirects": { "version": "1.14.8", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "dev": true }, "font-awesome": { "version": "4.7.0", diff --git a/package.json b/package.json index 5b69117284..fbc2aef50e 100644 --- a/package.json +++ b/package.json @@ -173,7 +173,7 @@ "@angular/platform-browser-dynamic": "^11.0.0", "@angular/platform-server": "^11.0.0", "@angular/router": "^11.0.0", - "@azure/msal-node": "^1.9.0", + "@azure/msal-node": "^1.10.0", "@azure/storage-blob": "^10.5.0", "applicationinsights": "^1.8.5", "azure-storage": "^2.10.7", From 7e6cf7522b85d035c2c2838b2548409465bc0479 Mon Sep 17 00:00:00 2001 From: Rena Date: Mon, 20 Jun 2022 08:57:58 -0700 Subject: [PATCH 37/49] May a11y Bug Fixes (#2520) * Fix AB#515: Narrator reports wrong Max retry count * Fix AB#516: Graphs are inaccessible in scan mode * Fix AB#517: Label is not associated with control Co-authored-by: Sanjana Kapur Co-authored-by: Shiran Pasternak --- .../programing-sample/programing-sample.html | 2 +- src/app/components/job/action/add/add-job-form.html | 4 ++-- .../job/graphs/all-job-graphs-home/all-job-graphs-home.html | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/components/account/details/programatic-usage/programing-sample/programing-sample.html b/src/app/components/account/details/programatic-usage/programing-sample/programing-sample.html index 60fc3d0a59..3acf3ca5eb 100644 --- a/src/app/components/account/details/programatic-usage/programing-sample/programing-sample.html +++ b/src/app/components/account/details/programatic-usage/programing-sample/programing-sample.html @@ -5,7 +5,7 @@ - + diff --git a/src/app/components/job/action/add/add-job-form.html b/src/app/components/job/action/add/add-job-form.html index fec824ef63..4a288614ea 100644 --- a/src/app/components/job/action/add/add-job-form.html +++ b/src/app/components/job/action/add/add-job-form.html @@ -73,7 +73,7 @@
- + Priority values can range from -1000 to 1000
@@ -82,7 +82,7 @@ - + Retry count values can range from -1 to 100 diff --git a/src/app/components/job/graphs/all-job-graphs-home/all-job-graphs-home.html b/src/app/components/job/graphs/all-job-graphs-home/all-job-graphs-home.html index 3e88490ea9..3414ddb8f3 100644 --- a/src/app/components/job/graphs/all-job-graphs-home/all-job-graphs-home.html +++ b/src/app/components/job/graphs/all-job-graphs-home/all-job-graphs-home.html @@ -19,10 +19,10 @@

- +
- +
From 203b2f37f9d9390fffb2da89d7642906bd72a5a2 Mon Sep 17 00:00:00 2001 From: Rena Date: Wed, 22 Jun 2022 12:42:14 -0700 Subject: [PATCH 38/49] April a11y Bug Fixes (#2523) * Fix AB#502: The Name property of a focusable element must not be null * Fix AB#509: Focusable sibling elements must not have the same Name and LocalizedControlType Co-authored-by: Sanjana Kapur --- .../ui/file/file-explorer/file-tree-view/file-tree-view.html | 2 +- src/@batch-flask/ui/form/editable-table/editable-table.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/@batch-flask/ui/file/file-explorer/file-tree-view/file-tree-view.html b/src/@batch-flask/ui/file/file-explorer/file-tree-view/file-tree-view.html index f9fae1528e..0ffb662255 100644 --- a/src/@batch-flask/ui/file/file-explorer/file-tree-view/file-tree-view.html +++ b/src/@batch-flask/ui/file/file-explorer/file-tree-view/file-tree-view.html @@ -1,5 +1,5 @@ - + {{name}} diff --git a/src/@batch-flask/ui/form/editable-table/editable-table.html b/src/@batch-flask/ui/form/editable-table/editable-table.html index 8a1ae971ae..9c47c6baa1 100644 --- a/src/@batch-flask/ui/form/editable-table/editable-table.html +++ b/src/@batch-flask/ui/form/editable-table/editable-table.html @@ -18,7 +18,7 @@ [rowValue]="item.value"> - + From 908e2b7f4f62a539f8f6ac8e90321fb0f6498cc0 Mon Sep 17 00:00:00 2001 From: Rena Date: Thu, 30 Jun 2022 11:03:18 -0700 Subject: [PATCH 39/49] Prepare for release 2.14.0 (#2534) * Updated changelog and version. * Update changelog Co-authored-by: rechen --- CHANGELOG.md | 21 +++++++ ThirdPartyNotices.txt | 130 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 134 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed980a1670..03a1c5c39c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +# 2.14.0 + +[All items](https://github.com/Azure/BatchExplorer/milestone/48?closed=1) + +### Features + +* Improve proxy support with MSAL authentication [\#2528](https://github.com/Azure/BatchExplorer/issues/2528) +* Add new heatmap node display for better running task visualization and made improvements to the heatmap legend [\#2527](https://github.com/Azure/BatchExplorer/issues/2527) +* Re-land API call for List Supported Virtual Machine and Cloud Service SKUs [\#2525](https://github.com/Azure/BatchExplorer/issues/2525) + +### Bugs + +* April and May accessibility bug fixes and improvements [\#2531](https://github.com/Azure/BatchExplorer/issues/2531) +* Fix issue with menubar not appearing on Windows Insider build [\#2529](https://github.com/Azure/BatchExplorer/issues/2529) +* Fix issue with failed silent auth [\#2524](https://github.com/Azure/BatchExplorer/issues/2524) + +### Other + +* Update dependencies for better security [\#2530](https://github.com/Azure/BatchExplorer/issues/2530) +* Upgrade to Electron 13 [\#2526](https://github.com/Azure/BatchExplorer/issues/2526) + # 2.13.0 [All items](https://github.com/Azure/BatchExplorer/milestone/47?closed=1) diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 3bdbf1abb6..56f298fc5a 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -18,7 +18,7 @@ Microsoft reserves all other rights not expressly granted under this agreement, 8. @angular/platform-browser-dynamic(https://github.com/angular/angular) - MIT 9. @angular/platform-server(https://github.com/angular/angular) - MIT 10. @angular/router(https://github.com/angular/angular/tree/master/packages/router) - MIT -11. @azure/msal-node(https://github.com/AzureAD/microsoft-authentication-library-for-js#readme) - MIT +11. @azure/msal-node(https://github.com/AzureAD/microsoft-authentication-library-for-js) - MIT 12. @azure/storage-blob(https://github.com/Azure/azure-sdk-for-js#readme) - MIT 13. applicationinsights(https://github.com/microsoft/ApplicationInsights-node.js#readme) - MIT 14. azure-storage(http://github.com/Azure/azure-storage-node) - Apache-2.0 @@ -729,7 +729,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ Start license for d3 ------------------------------------------------------------ -Copyright 2010-2021 Mike Bostock +Copyright 2010-2022 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice @@ -1105,12 +1105,6 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -## Glob Logo - -Glob's logo created by Tanya Brassie , licensed -under a Creative Commons Attribution-ShareAlike 4.0 International License -https://creativecommons.org/licenses/by-sa/4.0/ - ------------------------------------------------------------ End license for glob ============================================================ @@ -2848,9 +2842,22 @@ The externally maintained libraries used by Node.js are: - ICU, located at deps/icu-small, is licensed as follows: """ - COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) + UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + + See Terms of Use + for definitions of Unicode Inc.’s Data Files and Software. + + NOTICE TO USER: Carefully read the following legal agreement. + BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S + DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), + YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE + TERMS AND CONDITIONS OF THIS AGREEMENT. + IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE + THE DATA FILES OR SOFTWARE. - Copyright © 1991-2020 Unicode, Inc. All rights reserved. + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2022 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in https://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining @@ -2882,7 +2889,7 @@ The externally maintained libraries used by Node.js are: use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. - --------------------- + ---------------------------------------------------------------------- Third-Party Software Licenses @@ -2890,7 +2897,9 @@ The externally maintained libraries used by Node.js are: terms for licensed third-party software components included within ICU libraries. - 1. ICU License - ICU 1.8.1 to ICU 57.1 + ---------------------------------------------------------------------- + + ICU License - ICU 1.8.1 to ICU 57.1 COPYRIGHT AND PERMISSION NOTICE @@ -2925,7 +2934,9 @@ The externally maintained libraries used by Node.js are: All trademarks and registered trademarks mentioned herein are the property of their respective owners. - 2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt) + ---------------------------------------------------------------------- + + Chinese/Japanese Word Break Dictionary Data (cjdict.txt) # The Google Chrome software developed by Google is licensed under # the BSD license. Other software included in this distribution is @@ -3129,7 +3140,9 @@ The externally maintained libraries used by Node.js are: # # ---------------COPYING.ipadic-----END---------------------------------- - 3. Lao Word Break Dictionary Data (laodict.txt) + ---------------------------------------------------------------------- + + Lao Word Break Dictionary Data (laodict.txt) # Copyright (C) 2016 and later: Unicode, Inc. and others. # License & terms of use: http://www.unicode.org/copyright.html @@ -3169,7 +3182,9 @@ The externally maintained libraries used by Node.js are: # OF THE POSSIBILITY OF SUCH DAMAGE. # -------------------------------------------------------------------------- - 4. Burmese Word Break Dictionary Data (burmesedict.txt) + ---------------------------------------------------------------------- + + Burmese Word Break Dictionary Data (burmesedict.txt) # Copyright (c) 2014 International Business Machines Corporation # and others. All Rights Reserved. @@ -3209,7 +3224,9 @@ The externally maintained libraries used by Node.js are: # SUCH DAMAGE. # -------------------------------------------------------------------------- - 5. Time Zone Database + ---------------------------------------------------------------------- + + Time Zone Database ICU uses the public domain data and code derived from Time Zone Database for its time zone support. The ownership of the TZ database @@ -3232,7 +3249,9 @@ The externally maintained libraries used by Node.js are: # making a contribution to the database or code waives all rights to # future claims in that contribution or in the TZ Database. - 6. Google double-conversion + ---------------------------------------------------------------------- + + Google double-conversion Copyright 2006-2011, the V8 project authors. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -3260,6 +3279,83 @@ The externally maintained libraries used by Node.js are: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ---------------------------------------------------------------------- + + File: aclocal.m4 (only for ICU4C) + Section: pkg.m4 - Macros to locate and utilise pkg-config. + + Copyright © 2004 Scott James Remnant . + Copyright © 2012-2015 Dan Nicholson + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + + As a special exception to the GNU General Public License, if you + distribute this file as part of a program that contains a + configuration script generated by Autoconf, you may include it under + the same distribution terms that you use for the rest of that + program. + + (The condition for the exception is fulfilled because + ICU4C includes a configuration script generated by Autoconf, + namely the `configure` script.) + + ---------------------------------------------------------------------- + + File: config.guess (only for ICU4C) + + This file is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + As a special exception to the GNU General Public License, if you + distribute this file as part of a program that contains a + configuration script generated by Autoconf, you may include it under + the same distribution terms that you use for the rest of that + program. This Exception is an additional permission under section 7 + of the GNU General Public License, version 3 ("GPLv3"). + + (The condition for the exception is fulfilled because + ICU4C includes a configuration script generated by Autoconf, + namely the `configure` script.) + + ---------------------------------------------------------------------- + + File: install-sh (only for ICU4C) + + Copyright 1991 by the Massachusetts Institute of Technology + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in advertising or + publicity pertaining to distribution of the software without specific, + written prior permission. M.I.T. makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. """ - libuv, located at deps/uv, is licensed as follows: From e794177876d12300ff8b6136d21c5c8173b097e9 Mon Sep 17 00:00:00 2001 From: Rena Date: Thu, 7 Jul 2022 12:31:48 -0700 Subject: [PATCH 40/49] Bump version to 2.15.0 (#2535) * Revert "Update to call List Supported Virtual Machine and Cloud Service SKUs (#2400)" This reverts commit 7e9ce2e5dd4becf9892a09db78bf1e1f2b08e57c. * Update patch version for reverting VM SKU API changes * Update changelog with hotfix information * Fix task output warning background color AB#335 * Fix border contrast of code sample package install inputs Fixes AB#291 * Fix for missing image icons Only behavior was spammed errors to the console. * Fixes AB#315: Native tooltips for gallery actions * Bumps version to 2.14.0 * Fixes silent DatetimePicker error on midnight value * Bump plist from 3.0.4 to 3.0.5 (#2493) Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.4 to 3.0.5. - [Release notes](https://github.com/TooTallNate/node-plist/releases) - [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md) - [Commits](https://github.com/TooTallNate/node-plist/commits) --- updated-dependencies: - dependency-name: plist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fixes AB#465: "Unselect All" navigable by keyboard * Upgrades to Electron 13 Possibly addresses issues with Conditional Access policies that require a minimum Chromium version of 91. (#2446) * Bump moment from 2.29.1 to 2.29.3 (#2496) Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.3. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.3) --- updated-dependencies: - dependency-name: moment dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rena * Bump minimist from 1.2.5 to 1.2.6 (#2488) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rena * Bump karma from 6.3.14 to 6.3.16 (#2467) Bumps [karma](https://github.com/karma-runner/karma) from 6.3.14 to 6.3.16. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.14...v6.3.16) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rena * Fixes issue with failed silent auth Batch Explorer would not start when an exception is thrown during silent auth that isn't an authentication error. * Updates @azure/msal-node to 1.6.0 Support for proxied environments. * Bump ejs from 3.1.6 to 3.1.7 Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.7. - [Release notes](https://github.com/mde/ejs/releases) - [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md) - [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.7) --- updated-dependencies: - dependency-name: ejs dependency-type: indirect ... Signed-off-by: dependabot[bot] * Fix heatmap node display issues (#2497) * [WIP] Added new gradient colors to heatmap TODO: update legend to collapse sub-states and pick better naming for the running task slot sub-states * Categories can expand and contract now and are closed by default. * colors of the categories will stay as subitem color * [WIP] need to fix running state error (showing up as black instead of green) * [WIP] need to add dropdown icon next to categories * Fix selectState logic and add caret expansion and collapse identifier on categories * Add logic for handling task slots for running state * Change task slot colors to be more accessible * Add 100% for heatmap legend and picked colors for heatmap * clean up * Fix typo * Comment explaining state counter for running task usages * Remove whitespace * Fix unit tests * [WIP] fix unit tests for running task overlay * Fix async issue and fix state counter unit tests * Add running task slot usage tests and fix percentages * Add a few more tests for task slot usage overlay * Restores native menubar on Windows In-release regression caused by upgrade to Electron 13 (3bd43c756). * Adding Sanjana as code owner * Bump async from 2.6.3 to 2.6.4 Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump eventsource from 1.0.7 to 1.1.1 Bumps [eventsource](https://github.com/EventSource/eventsource) from 1.0.7 to 1.1.1. - [Release notes](https://github.com/EventSource/eventsource/releases) - [Changelog](https://github.com/EventSource/eventsource/blob/master/HISTORY.md) - [Commits](https://github.com/EventSource/eventsource/compare/v1.0.7...v1.1.1) --- updated-dependencies: - dependency-name: eventsource dependency-type: indirect ... Signed-off-by: dependabot[bot] * Adds security linting * Minor lint fixes * Remove obsolete directives from debug config * Utility for creating a proxy environment in Azure * Installs Batch Explorer in a restricted network. * Upgrades to @azure/msal-node 1.9.0 * Uses proxy settings for authentication. * Bump node-forge from 1.0.0 to 1.3.0 Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.0.0 to 1.3.0. - [Release notes](https://github.com/digitalbazaar/forge/releases) - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.0.0...v1.3.0) --- updated-dependencies: - dependency-name: node-forge dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Fixes cer parsing unit test using updated forge * Microsoft mandatory file * Excludes auto-generated SECURITY.md from linting * Bumps azure-storage from 2.10.4 to 2.10.7 Fixes AB#766, AB#768: Addresses some security vulnerabilities in module dependencies (validator and json-schema). * Bumps hosted-git-info from 2.8.8 to 2.8.9 * Bumps ansi-html, normalize-url * Bumps @azure/msal-node from 1.9.0 to 1.10.0 Addresses issue with caching multiple tokens for same user (AzureAD/microsoft-authentication-library-for-js#4486). * May a11y Bug Fixes (#2520) * Fix AB#515: Narrator reports wrong Max retry count * Fix AB#516: Graphs are inaccessible in scan mode * Fix AB#517: Label is not associated with control Co-authored-by: Sanjana Kapur Co-authored-by: Shiran Pasternak * April a11y Bug Fixes (#2523) * Fix AB#502: The Name property of a focusable element must not be null * Fix AB#509: Focusable sibling elements must not have the same Name and LocalizedControlType Co-authored-by: Sanjana Kapur * Prepare for release 2.14.0 (#2534) * Updated changelog and version. * Update changelog Co-authored-by: rechen * Unrevert "Update to call List Supported Virtual Machine and Cloud Service SKUs (#2400)" 8a7424bb84974e90752e4a480a677c31cdcbc9ed Batch Service supports VM SKU API so reenabling service call. * Bump Batch Explorer to version 2.15.0 Co-authored-by: Shiran Pasternak Co-authored-by: rechen Co-authored-by: David Watrous <509299+dpwatrous@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: microsoft-github-policy-service[bot] <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Co-authored-by: Sanjana Kapur --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fbc2aef50e..3ff40a5f49 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "name": "Microsoft Corporation", "email": "batchexplorer@microsoft.com" }, - "version": "2.14.0", + "version": "2.15.0", "main": "build/client/main.prod.js", "scripts": { "ts": "ts-node --project tsconfig.node.json --files", From 06ff2a5bb024d1dba956eb077ed79faf8b1d0852 Mon Sep 17 00:00:00 2001 From: Sanjana Kapur Date: Thu, 14 Jul 2022 17:46:06 -0400 Subject: [PATCH 41/49] Add June Accessibility Bug Fixes (#2541) * Fix AB#684: Required fields not shown on form fields in Create Job dialog * Fix AB#779: Role of textbox for subscription combobox is incorrect * Fix AB#784: Subscription and Resource Group labels are not announced under Batch Account blade * Fix AB#787: Narrator incorrectly describes graphs when they are in focus * Fix AB#796: Aria-label is not defined for "forms in progress" button --- src/@batch-flask/ui/select/select.html | 2 +- .../ui/sidebar/sidebar-bookmarks/sidebar-bookmarks.html | 2 +- .../account-monitoring-section.html | 1 - .../details/account-summary-card/account-summary-card.html | 4 ++-- src/app/components/job/action/add/add-job-form.html | 2 +- src/app/components/job/action/add/add-job-form.scss | 7 +++++++ 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/@batch-flask/ui/select/select.html b/src/@batch-flask/ui/select/select.html index 0fc53c8478..88cbe72e35 100644 --- a/src/@batch-flask/ui/select/select.html +++ b/src/@batch-flask/ui/select/select.html @@ -2,7 +2,7 @@
-
+
{{references.length}}
diff --git a/src/app/components/account/details/account-monitoring-section/account-monitoring-section.html b/src/app/components/account/details/account-monitoring-section/account-monitoring-section.html index 141ba2a2c0..885acf81e9 100644 --- a/src/app/components/account/details/account-monitoring-section/account-monitoring-section.html +++ b/src/app/components/account/details/account-monitoring-section/account-monitoring-section.html @@ -18,7 +18,6 @@

{{'account-details.monitoring' | i18n }}

diff --git a/src/app/components/account/details/account-summary-card/account-summary-card.html b/src/app/components/account/details/account-summary-card/account-summary-card.html index 8a72954274..a5b6aec478 100644 --- a/src/app/components/account/details/account-summary-card/account-summary-card.html +++ b/src/app/components/account/details/account-summary-card/account-summary-card.html @@ -7,11 +7,11 @@
{{'account-summary-card.subscription' | i18n }} - {{subscriptionName}} + {{subscriptionName}}
{{'account-summary-card.resourceGroup' | i18n }} - {{resourceGroup}} + {{resourceGroup}}
diff --git a/src/app/components/job/action/add/add-job-form.html b/src/app/components/job/action/add/add-job-form.html index 4a288614ea..6d06228240 100644 --- a/src/app/components/job/action/add/add-job-form.html +++ b/src/app/components/job/action/add/add-job-form.html @@ -3,7 +3,7 @@
- + {{idInput.value.length}} / 64 diff --git a/src/app/components/job/action/add/add-job-form.scss b/src/app/components/job/action/add/add-job-form.scss index 8164a7fb1b..2461721ce9 100644 --- a/src/app/components/job/action/add/add-job-form.scss +++ b/src/app/components/job/action/add/add-job-form.scss @@ -1,6 +1,13 @@ +@import "app/styles/variables"; + .form-picker { display: inline-block; margin-right: 10px; margin-bottom: 5px; vertical-align: top; } + +.required label:after { + content: "*"; + color: $validation-error-color; +} From 97cba54719ca0a6fb81536faa07f7a73d781b756 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Jul 2022 16:07:25 -0700 Subject: [PATCH 42/49] Bump moment from 2.29.3 to 2.29.4 (#2539) Bumps [moment](https://github.com/moment/moment) from 2.29.3 to 2.29.4. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.3...2.29.4) --- updated-dependencies: - dependency-name: moment dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rena --- package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45ae6a51c6..f213637414 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "batch-explorer", - "version": "2.14.0", + "version": "2.15.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "batch-explorer", - "version": "2.14.0", + "version": "2.15.0", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -15005,9 +15005,9 @@ "dev": true }, "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } @@ -35698,9 +35698,9 @@ "dev": true }, "moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "monaco-editor": { "version": "0.19.3", From 866a9ba7e93ab4f505518d8f7bc9e9a9432b8f15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Jul 2022 14:15:55 +0000 Subject: [PATCH 43/49] Bump terser from 4.8.0 to 4.8.1 Bumps [terser](https://github.com/terser/terser) from 4.8.0 to 4.8.1. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f213637414..e49d42c908 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20884,9 +20884,9 @@ } }, "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "dev": true, "dependencies": { "commander": "^2.20.0", @@ -40373,9 +40373,9 @@ } }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "dev": true, "requires": { "commander": "^2.20.0", From ff8309bd571c9e7643d2f871bc1a95310c3f6b15 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Wed, 20 Jul 2022 16:38:42 -0400 Subject: [PATCH 44/49] Updates MacOS build image * Uses MacOS Big Sur (version 11) since previous image (10.15 Catalina) became unsupported * Bumps Python 3.8 -> 3.9 * Bumps pyenv 1.2.20 -> 2.3.2 --- .vsts/darwin/darwin-dependencies.yml | 7 ++++++- .vsts/distribution.yml | 2 +- .vsts/pipelines.yml | 2 +- .vsts/python-setup.yml | 4 ++-- scripts/azpipelines/setup-python.sh | 9 +++++---- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.vsts/darwin/darwin-dependencies.yml b/.vsts/darwin/darwin-dependencies.yml index 54e17f7dbf..61ac37682a 100644 --- a/.vsts/darwin/darwin-dependencies.yml +++ b/.vsts/darwin/darwin-dependencies.yml @@ -1,8 +1,13 @@ steps: - template: ../dependencies.yml + - script: | + set -e + echo "Homebrew version $(brew --version)" + brew install openssl readline sqlite3 xz zlib tcl-tk + displayName: Install MacOS Python dependencies - script: | set -e echo "Node.js version $(node --version)" echo "NPM version $(npm --version)" npm ci - displayName: Install MacOS dependencies + displayName: Install MacOS JavaScript dependencies diff --git a/.vsts/distribution.yml b/.vsts/distribution.yml index 06447848da..2fb589858b 100644 --- a/.vsts/distribution.yml +++ b/.vsts/distribution.yml @@ -10,7 +10,7 @@ jobs: - job: MacOS pool: - vmImage: macOS-10.15 + vmImage: macOS-11 demands: xcode variables: - name: EOCompliance-Mac diff --git a/.vsts/pipelines.yml b/.vsts/pipelines.yml index fd6c81755c..3d6f19288c 100644 --- a/.vsts/pipelines.yml +++ b/.vsts/pipelines.yml @@ -10,7 +10,7 @@ jobs: - job: MacOS pool: - vmImage: macOS-10.15 + vmImage: macOS-11 demands: xcode variables: - name: EOCompliance-Mac diff --git a/.vsts/python-setup.yml b/.vsts/python-setup.yml index 67817432c7..eff6e3c871 100644 --- a/.vsts/python-setup.yml +++ b/.vsts/python-setup.yml @@ -2,8 +2,8 @@ steps: - task: UsePythonVersion@0 condition: eq( variables['Agent.OS'], 'Windows_NT' ) inputs: - versionSpec: '3.8.x' - displayName: Install Python 3.8 for Batch Explorer + versionSpec: '3.9.x' + displayName: Install Python 3.9 for Batch Explorer - bash: ./scripts/azpipelines/setup-python.sh displayName: Set up Python environment and private feed diff --git a/scripts/azpipelines/setup-python.sh b/scripts/azpipelines/setup-python.sh index f9cd01bd49..7b4b256d34 100755 --- a/scripts/azpipelines/setup-python.sh +++ b/scripts/azpipelines/setup-python.sh @@ -9,21 +9,22 @@ if [ "$AGENT_OS" == "Windows_NT" ]; then conf_file="$pyroot/pip.ini" else conf_file="$pyroot/pip.conf" - python_version=3.8.5 + pyenv_version=2.3.2 + python_version=3.9.4 echo "Installing pyenv..." export PYENV_ROOT="$AGENT_WORKFOLDER/.pyenv" archive="$PYENV_ROOT/pyenv.tar.gz" mkdir -p "$PYENV_ROOT" - curl -s -S -L "https://github.com/pyenv/pyenv/archive/v1.2.20.tar.gz" > "$archive" - echo "5ecd10d3ec502ce9b7d8109fbe8cb2e4a8af8b73ce5c216b8e268452724a65f3 $archive" | shasum -c + curl -s -S -L "https://github.com/pyenv/pyenv/archive/v${pyenv_version}.tar.gz" > "$archive" + echo "f4347e6740e6cd47badc302491b105615a74fbf2 $archive" | shasum -c tar xzf "$archive" -C "$PYENV_ROOT" --strip-components=1 export PATH="$PYENV_ROOT/bin:$PATH" pyenv --version echo "Installing Python $python_version..." env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install $python_version - pyenv global 3.8.5 + pyenv global "$python_version" eval "$(pyenv init -)" echo "##vso[task.prependpath]$PYENV_ROOT/bin" echo "##vso[task.prependpath]$PYENV_ROOT/shims" From 4661a6a423c2230e864e32b600d015e39456fea2 Mon Sep 17 00:00:00 2001 From: Shiran Pasternak Date: Thu, 28 Jul 2022 17:29:33 -0400 Subject: [PATCH 45/49] Fixes a login issue proxy related to proxy config --- src/client/core/aad/auth-provider.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/client/core/aad/auth-provider.ts b/src/client/core/aad/auth-provider.ts index 8581f2a9f0..42181b655c 100644 --- a/src/client/core/aad/auth-provider.ts +++ b/src/client/core/aad/auth-provider.ts @@ -172,8 +172,8 @@ export default class AuthProvider { private async _createClient(tenantId: string): Promise { - const proxySettings = await this.app.proxySettings.settings; - const proxyUrl = proxySettings?.http.toString(); + const proxyUrl = await this._loadProxyUrl(); + if (proxyUrl) { log.info(`[${tenantId}] Proxying auth endpoints through ` + proxyUrl); @@ -197,6 +197,12 @@ export default class AuthProvider { }); } + private async _loadProxyUrl() { + const proxySettings = await this.app.proxySettings.settings; + const protocolUrl = proxySettings?.https ?? proxySettings?.http; + return protocolUrl?.toString(); + } + private async _getAccount(tenantId: string): Promise { if (tenantId in this._accounts) { return this._accounts[tenantId]; From bba20d005c876187a9849e7000798ab48151688c Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Mon, 1 Aug 2022 11:15:34 -0400 Subject: [PATCH 46/49] Ran `npm audit fix` --- package-lock.json | 2675 ++------------------------------------------- 1 file changed, 66 insertions(+), 2609 deletions(-) diff --git a/package-lock.json b/package-lock.json index e49d42c908..bb20a42df9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -648,18 +648,6 @@ "node": ">=0.10.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", @@ -678,27 +666,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz", - "integrity": "sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", @@ -749,18 +716,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", @@ -792,43 +747,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-simple-access": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", @@ -841,18 +759,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", @@ -923,389 +829,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", - "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.13.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.9.tgz", @@ -1443,9 +966,9 @@ } }, "node_modules/@electron/get": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.1.tgz", - "integrity": "sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", + "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -1665,86 +1188,6 @@ "node": ">=8" } }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz", @@ -2018,148 +1461,19 @@ } }, "node_modules/@playwright/test": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.19.0.tgz", - "integrity": "sha512-jDuWUYlasAmEdGZPz1esq8OkYanp/3fMGub4HRn5B0zlwi4aHbwhEi3DvIKjp76Ig8ygb0A9RyhDcs9pZxKWbQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.16.7", - "@babel/core": "7.16.12", - "@babel/plugin-proposal-class-properties": "7.16.7", - "@babel/plugin-proposal-dynamic-import": "7.16.7", - "@babel/plugin-proposal-export-namespace-from": "7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.16.7", - "@babel/plugin-proposal-numeric-separator": "7.16.7", - "@babel/plugin-proposal-optional-chaining": "7.16.7", - "@babel/plugin-proposal-private-methods": "7.16.11", - "@babel/plugin-proposal-private-property-in-object": "7.16.7", - "@babel/plugin-syntax-async-generators": "7.8.4", - "@babel/plugin-syntax-json-strings": "7.8.3", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "7.8.3", - "@babel/plugin-transform-modules-commonjs": "7.16.8", - "@babel/plugin-transform-react-jsx": "7.16.7", - "@babel/preset-typescript": "7.16.7", - "babel-plugin-module-resolver": "4.1.0", - "colors": "1.4.0", - "commander": "8.3.0", - "debug": "4.3.3", - "expect": "27.2.5", - "jest-matcher-utils": "27.2.5", - "jpeg-js": "0.4.3", - "json5": "2.2.0", - "mime": "3.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "open": "8.4.0", - "pirates": "4.0.4", - "pixelmatch": "5.2.1", - "playwright-core": "1.19.0", - "pngjs": "6.0.0", - "rimraf": "3.0.2", - "source-map-support": "0.4.18", - "stack-utils": "2.0.5", - "yazl": "2.5.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@playwright/test/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@playwright/test/node_modules/@babel/core": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", - "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.24.2.tgz", + "integrity": "sha512-Q4X224pRHw4Dtkk5PoNJplZCokLNvVbXD9wDQEMrHcEuvWpJWEQDeJ9gEwkZ3iCWSFSWBshIX177B231XW4wOQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.12", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.10", - "@babel/types": "^7.16.8", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@playwright/test/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@playwright/test/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/@playwright/test/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" + "@types/node": "*", + "playwright-core": "1.24.2" }, "bin": { - "rimraf": "bin.js" + "playwright": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@playwright/test/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@playwright/test/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" + "node": ">=14" } }, "node_modules/@sindresorhus/is": { @@ -2552,30 +1866,6 @@ "integrity": "sha1-Q9VeDXLPMzot/9nE7AQHRVobCTE=", "dev": true }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, "node_modules/@types/jasmine": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.4.tgz", @@ -2704,12 +1994,6 @@ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.4.tgz", "integrity": "sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ==" }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, "node_modules/@types/strip-json-comments": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", @@ -2761,31 +2045,12 @@ "@types/node": "*" } }, - "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/@types/yargs-parser": { "version": "20.2.1", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "dev": true }, - "node_modules/@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.16.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.16.1.tgz", @@ -4156,31 +3421,6 @@ "babel-runtime": "^6.22.0" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-module-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", - "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", - "dev": true, - "dependencies": { - "find-babel-config": "^1.2.0", - "glob": "^7.1.6", - "pkg-up": "^3.1.0", - "reselect": "^4.0.0", - "resolve": "^1.13.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -7218,15 +6458,6 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -7440,15 +6671,6 @@ "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -9697,35 +8919,6 @@ "node": ">=0.10.0" } }, - "node_modules/expect": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", - "integrity": "sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.2.5", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-regex-util": "^27.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -10209,28 +9402,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/find-babel-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", - "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", - "dev": true, - "dependencies": { - "json5": "^0.5.1", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-babel-config/node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -12353,21 +11524,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -12678,18 +11834,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -13038,297 +12182,6 @@ "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", "dev": true }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz", - "integrity": "sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.2.5", - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jpeg-js": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz", - "integrity": "sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==", - "dev": true - }, "node_modules/js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -15894,23 +14747,6 @@ "fn.name": "1.x.x" } }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -16514,36 +15350,6 @@ "node": ">=0.10.0" } }, - "node_modules/pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pixelmatch": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", - "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==", - "dev": true, - "dependencies": { - "pngjs": "^4.0.1" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/pixelmatch/node_modules/pngjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz", - "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -16614,170 +15420,32 @@ "node": ">=4" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/playwright": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.19.0.tgz", - "integrity": "sha512-wEhlkEx4QCzFgl5prkdPOjK5dLK9M3nKJuqZdNtpZirIzkDnbIbVZbEmo2Uh177ZbXTWnt184BkvM+hsIvUFVg==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.24.2.tgz", + "integrity": "sha512-iMWDLgaFRT+7dXsNeYwgl8nhLHsUrzFyaRVC+ftr++P1dVs70mPrFKBZrGp1fOKigHV9d1syC03IpPbqLKlPsg==", "dev": true, "hasInstallScript": true, "dependencies": { - "playwright-core": "1.19.0" + "playwright-core": "1.24.2" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/playwright-core": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.19.0.tgz", - "integrity": "sha512-mlT/2pHUQbcZumVIKD4iwIKtO2k/BFHYmOAwOepdEvHLgqJrmsCgHvDgpehM6wDh5chksh2sJZIp8dZQ6158Yw==", - "dev": true, - "dependencies": { - "commander": "8.3.0", - "debug": "4.3.3", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "jpeg-js": "0.4.3", - "mime": "3.0.0", - "pngjs": "6.0.0", - "progress": "2.0.3", - "proper-lockfile": "4.1.2", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "socks-proxy-agent": "6.1.1", - "stack-utils": "2.0.5", - "ws": "8.4.2", - "yauzl": "2.10.0", - "yazl": "2.5.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-core/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.24.2.tgz", + "integrity": "sha512-zfAoDoPY/0sDLsgSgLZwWmSCevIg1ym7CppBwllguVBNiHeixZkc1AdMuYUPZC6AdEYc4CxWEyLMBTw2YcmRrA==", "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/playwright-core/node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/playwright-core/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-core/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/playwright-core/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" + "playwright": "cli.js" }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/playwright-core/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/playwright-core/node_modules/ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=14" } }, "node_modules/plist": { @@ -16802,15 +15470,6 @@ "node": ">=4" } }, - "node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "dev": true, - "engines": { - "node": ">=12.13.0" - } - }, "node_modules/portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -17109,32 +15768,6 @@ "renderkid": "^2.0.4" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -17164,17 +15797,6 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -17193,12 +15815,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "node_modules/proxyquire": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", @@ -17469,12 +16085,6 @@ "rc": "cli.js" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, "node_modules/read-config-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", @@ -18196,12 +16806,6 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "node_modules/reselect": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.5.tgz", - "integrity": "sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ==", - "dev": true - }, "node_modules/reserved-words": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", @@ -19065,6 +17669,7 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "optional": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -19350,46 +17955,6 @@ "ms": "^2.1.1" } }, - "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dev": true, - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", @@ -19675,27 +18240,6 @@ "node": "*" } }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/stat-mode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", @@ -23817,15 +22361,6 @@ "fd-slicer": "~1.1.0" } }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, "node_modules/yesno": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.0.1.tgz", @@ -24229,15 +22764,6 @@ } } }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-compilation-targets": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", @@ -24250,21 +22776,6 @@ "semver": "^6.3.0" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz", - "integrity": "sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" - } - }, "@babel/helper-environment-visitor": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", @@ -24303,15 +22814,6 @@ "@babel/types": "^7.16.7" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", - "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-module-imports": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", @@ -24337,34 +22839,6 @@ "@babel/types": "^7.16.7" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, "@babel/helper-simple-access": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", @@ -24374,15 +22848,6 @@ "@babel/types": "^7.16.7" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, "@babel/helper-split-export-declaration": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", @@ -24432,263 +22897,6 @@ "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", "dev": true }, - "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", - "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", - "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", - "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", - "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-typescript": "^7.16.7" - } - }, - "@babel/preset-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", - "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.16.7" - } - }, "@babel/runtime": { "version": "7.13.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.9.tgz", @@ -24804,9 +23012,9 @@ } }, "@electron/get": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.1.tgz", - "integrity": "sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", + "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -24982,64 +23190,6 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "@jridgewell/resolve-uri": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz", @@ -25239,119 +23389,13 @@ } }, "@playwright/test": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.19.0.tgz", - "integrity": "sha512-jDuWUYlasAmEdGZPz1esq8OkYanp/3fMGub4HRn5B0zlwi4aHbwhEi3DvIKjp76Ig8ygb0A9RyhDcs9pZxKWbQ==", - "dev": true, - "requires": { - "@babel/code-frame": "7.16.7", - "@babel/core": "7.16.12", - "@babel/plugin-proposal-class-properties": "7.16.7", - "@babel/plugin-proposal-dynamic-import": "7.16.7", - "@babel/plugin-proposal-export-namespace-from": "7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.16.7", - "@babel/plugin-proposal-numeric-separator": "7.16.7", - "@babel/plugin-proposal-optional-chaining": "7.16.7", - "@babel/plugin-proposal-private-methods": "7.16.11", - "@babel/plugin-proposal-private-property-in-object": "7.16.7", - "@babel/plugin-syntax-async-generators": "7.8.4", - "@babel/plugin-syntax-json-strings": "7.8.3", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "7.8.3", - "@babel/plugin-transform-modules-commonjs": "7.16.8", - "@babel/plugin-transform-react-jsx": "7.16.7", - "@babel/preset-typescript": "7.16.7", - "babel-plugin-module-resolver": "4.1.0", - "colors": "1.4.0", - "commander": "8.3.0", - "debug": "4.3.3", - "expect": "27.2.5", - "jest-matcher-utils": "27.2.5", - "jpeg-js": "0.4.3", - "json5": "2.2.0", - "mime": "3.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "open": "8.4.0", - "pirates": "4.0.4", - "pixelmatch": "5.2.1", - "playwright-core": "1.19.0", - "pngjs": "6.0.0", - "rimraf": "3.0.2", - "source-map-support": "0.4.18", - "stack-utils": "2.0.5", - "yazl": "2.5.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/core": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", - "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.12", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.10", - "@babel/types": "^7.16.8", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.24.2.tgz", + "integrity": "sha512-Q4X224pRHw4Dtkk5PoNJplZCokLNvVbXD9wDQEMrHcEuvWpJWEQDeJ9gEwkZ3iCWSFSWBshIX177B231XW4wOQ==", + "dev": true, + "requires": { + "@types/node": "*", + "playwright-core": "1.24.2" } }, "@sindresorhus/is": { @@ -25728,30 +23772,6 @@ "integrity": "sha1-Q9VeDXLPMzot/9nE7AQHRVobCTE=", "dev": true }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, "@types/jasmine": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.4.tgz", @@ -25878,12 +23898,6 @@ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.4.tgz", "integrity": "sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ==" }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, "@types/strip-json-comments": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", @@ -25935,31 +23949,12 @@ "@types/node": "*" } }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, "@types/yargs-parser": { "version": "20.2.1", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "dev": true }, - "@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, "@typescript-eslint/eslint-plugin": { "version": "4.16.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.16.1.tgz", @@ -27060,28 +25055,6 @@ "babel-runtime": "^6.22.0" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-module-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", - "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", - "dev": true, - "requires": { - "find-babel-config": "^1.2.0", - "glob": "^7.1.6", - "pkg-up": "^3.1.0", - "reselect": "^4.0.0", - "resolve": "^1.13.1" - } - }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -29595,12 +27568,6 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -29770,12 +27737,6 @@ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true - }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -31559,28 +29520,6 @@ "homedir-polyfill": "^1.0.1" } }, - "expect": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", - "integrity": "sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA==", - "dev": true, - "requires": { - "@jest/types": "^27.2.5", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-regex-util": "^27.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -32000,24 +29939,6 @@ } } }, - "find-babel-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", - "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", - "dev": true, - "requires": { - "json5": "^0.5.1", - "path-exists": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - } - } - }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -33629,12 +31550,6 @@ "kind-of": "^6.0.2" } }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -33843,15 +31758,6 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, "is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -34095,260 +32001,47 @@ } } }, - "jasmine": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", - "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", - "dev": true, - "requires": { - "glob": "^7.1.4", - "jasmine-core": "~3.5.0" - }, - "dependencies": { - "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", - "dev": true - } - } - }, - "jasmine-core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", - "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", - "dev": true - }, - "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", - "dev": true, - "requires": { - "colors": "1.1.2" - }, - "dependencies": { - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - } - } - }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - }, - "jest-matcher-utils": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz", - "integrity": "sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg==", + "jasmine": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", + "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", "dev": true, "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.2.5", - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" + "glob": "^7.1.4", + "jasmine-core": "~3.5.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "jasmine-core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "colors": "1.1.2" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true - }, - "jpeg-js": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz", - "integrity": "sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==", - "dev": true - }, "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -36423,17 +34116,6 @@ "fn.name": "1.x.x" } }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -36911,29 +34593,6 @@ "pinkie": "^2.0.0" } }, - "pirates": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", - "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", - "dev": true - }, - "pixelmatch": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", - "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==", - "dev": true, - "requires": { - "pngjs": "^4.0.1" - }, - "dependencies": { - "pngjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz", - "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==", - "dev": true - } - } - }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -36988,111 +34647,20 @@ } } }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, "playwright": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.19.0.tgz", - "integrity": "sha512-wEhlkEx4QCzFgl5prkdPOjK5dLK9M3nKJuqZdNtpZirIzkDnbIbVZbEmo2Uh177ZbXTWnt184BkvM+hsIvUFVg==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.24.2.tgz", + "integrity": "sha512-iMWDLgaFRT+7dXsNeYwgl8nhLHsUrzFyaRVC+ftr++P1dVs70mPrFKBZrGp1fOKigHV9d1syC03IpPbqLKlPsg==", "dev": true, "requires": { - "playwright-core": "1.19.0" + "playwright-core": "1.24.2" } }, "playwright-core": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.19.0.tgz", - "integrity": "sha512-mlT/2pHUQbcZumVIKD4iwIKtO2k/BFHYmOAwOepdEvHLgqJrmsCgHvDgpehM6wDh5chksh2sJZIp8dZQ6158Yw==", - "dev": true, - "requires": { - "commander": "8.3.0", - "debug": "4.3.3", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "jpeg-js": "0.4.3", - "mime": "3.0.0", - "pngjs": "6.0.0", - "progress": "2.0.3", - "proper-lockfile": "4.1.2", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "socks-proxy-agent": "6.1.1", - "stack-utils": "2.0.5", - "ws": "8.4.2", - "yauzl": "2.10.0", - "yazl": "2.5.1" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", - "dev": true, - "requires": {} - } - } + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.24.2.tgz", + "integrity": "sha512-zfAoDoPY/0sDLsgSgLZwWmSCevIg1ym7CppBwllguVBNiHeixZkc1AdMuYUPZC6AdEYc4CxWEyLMBTw2YcmRrA==", + "dev": true }, "plist": { "version": "3.0.5", @@ -37110,12 +34678,6 @@ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, - "pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "dev": true - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -37354,25 +34916,6 @@ "renderkid": "^2.0.4" } }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -37396,17 +34939,6 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -37422,12 +34954,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "proxyquire": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", @@ -37647,12 +35173,6 @@ "strip-json-comments": "~2.0.1" } }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, "read-config-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", @@ -38213,12 +35733,6 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "reselect": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.5.tgz", - "integrity": "sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ==", - "dev": true - }, "reserved-words": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", @@ -38896,7 +36410,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true + "dev": true, + "optional": true }, "snapdragon": { "version": "0.8.2", @@ -39139,38 +36654,6 @@ } } }, - "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - } - } - }, "sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", @@ -39408,23 +36891,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, "stat-mode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", @@ -42747,15 +40213,6 @@ "fd-slicer": "~1.1.0" } }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, "yesno": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.0.1.tgz", From 1861743abd230b2ba085f0a9f4b17cd62817773b Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Wed, 17 Aug 2022 11:42:06 -0400 Subject: [PATCH 47/49] Fix UsePythonVersion warning (#2559) Using 3.9.x generated a spurious warning about not specifying an exact Python version --- .vsts/python-setup.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vsts/python-setup.yml b/.vsts/python-setup.yml index eff6e3c871..79df089591 100644 --- a/.vsts/python-setup.yml +++ b/.vsts/python-setup.yml @@ -2,7 +2,7 @@ steps: - task: UsePythonVersion@0 condition: eq( variables['Agent.OS'], 'Windows_NT' ) inputs: - versionSpec: '3.9.x' + versionSpec: '3.9' displayName: Install Python 3.9 for Batch Explorer - bash: ./scripts/azpipelines/setup-python.sh From 856d6a5ef39268cd1f117af9902c120871327a06 Mon Sep 17 00:00:00 2001 From: David Watrous <509299+dpwatrous@users.noreply.github.com> Date: Fri, 26 Aug 2022 17:41:51 -0400 Subject: [PATCH 48/49] Temporarily disable permissions checking on buttons (#2562) Fixes #2077 --- .../buttons/clickable/clickable.component.ts | 7 ++++-- .../entity-command-button.component.spec.ts | 22 ++++++++++--------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/@batch-flask/ui/buttons/clickable/clickable.component.ts b/src/@batch-flask/ui/buttons/clickable/clickable.component.ts index 83269a3fa5..5151904195 100644 --- a/src/@batch-flask/ui/buttons/clickable/clickable.component.ts +++ b/src/@batch-flask/ui/buttons/clickable/clickable.component.ts @@ -56,7 +56,7 @@ export class ClickableComponent implements OnChanges, OnDestroy { // Aria @Input() @HostBinding("attr.role") public role = "button"; @HostBinding("attr.aria-disabled") public get ariaDisabled() { return this.disabled; } - + public subtitle = ""; private permissionService: PermissionService | null; @@ -78,7 +78,10 @@ export class ClickableComponent implements OnChanges, OnDestroy { this._clearSubscription(); if (this.permissionService && this.permission) { this._sub = this.permissionService.hasPermission(this.permission).subscribe((hasPermission) => { - this._permissionDisabled = !hasPermission; + // TODO: Reenable this line when permissions checking is able to handle custom roles + // Also uncomment the test in entity-command-button.component.spec.ts + // this._permissionDisabled = !hasPermission; + this._permissionDisabled = false; if (hasPermission) { this.subtitle = ""; } else { diff --git a/src/@batch-flask/ui/entity-commands-list/button/entity-command-button.component.spec.ts b/src/@batch-flask/ui/entity-commands-list/button/entity-command-button.component.spec.ts index a875093b48..601ed06b31 100644 --- a/src/@batch-flask/ui/entity-commands-list/button/entity-command-button.component.spec.ts +++ b/src/@batch-flask/ui/entity-commands-list/button/entity-command-button.component.spec.ts @@ -138,16 +138,18 @@ describe("EntityCommandButtonComponent", () => { expect(button.disabled).toBe(true); }); - it("should disable button when not having permission", () => { - testComponent.command = newMockCommand({ - permission: "admin", - }); - fixture.detectChanges(); - - const button = getButton(); - expect(button).not.toBeFalsy(); - expect(button.isDisabled).toBe(true); - }); + // TODO: Uncomment this test when permissions checking for buttons + // is re-enabled + // it("should disable button when not having permission", () => { + // testComponent.command = newMockCommand({ + // permission: "admin", + // }); + // fixture.detectChanges(); + + // const button = getButton(); + // expect(button).not.toBeFalsy(); + // expect(button.isDisabled).toBe(true); + // }); it("click on button should trigger execute", () => { const command = testComponent.command = newMockCommand({}); From aa90d16e955a7e7e1f08a94b58f5491e31186fe5 Mon Sep 17 00:00:00 2001 From: Rena Date: Wed, 31 Aug 2022 13:50:54 -0700 Subject: [PATCH 49/49] Prepare for release 2.15.0 (#2564) * Updated changelog and version. * Updated changelog and version. * Rearrange changelog * Update wording Co-authored-by: rechen --- CHANGELOG.md | 8 ++++++++ ThirdPartyNotices.txt | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03a1c5c39c..beaa024cc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# 2.15.0 + +[All items](https://github.com/Azure/BatchExplorer/milestone/49?closed=1) + +### Bugs + +* Users with custom permissions were not able to create pools or jobs [\#2077](https://github.com/Azure/BatchExplorer/issues/2077) + # 2.14.0 [All items](https://github.com/Azure/BatchExplorer/milestone/48?closed=1) diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 56f298fc5a..a58bda8cd7 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -4573,6 +4573,38 @@ The externally maintained libraries used by Node.js are: ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +- base64, located at deps/base64/base64/, is licensed as follows: + """ + Copyright (c) 2005-2007, Nick Galbreath + Copyright (c) 2013-2019, Alfred Klomp + Copyright (c) 2015-2017, Wojciech Mula + Copyright (c) 2016-2017, Matthieu Darbois + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + """ + ------------------------------------------------------------ End license for node.js ============================================================